diff --git a/.github/actions/cleanup-files/action.yaml b/.github/actions/cleanup-files/action.yaml
index d466daf3a8..1818d6094f 100644
--- a/.github/actions/cleanup-files/action.yaml
+++ b/.github/actions/cleanup-files/action.yaml
@@ -15,7 +15,6 @@ runs:
echo "removing zarf sboms, packages, cache"
sudo rm -rf zarf-sbom /tmp/zarf-*
- sudo env "PATH=$PATH" CI=true make delete-packages
sudo build/zarf tools clear-cache
lsblk -f
diff --git a/.github/actions/golang/action.yaml b/.github/actions/golang/action.yaml
deleted file mode 100644
index 890c4bb3cd..0000000000
--- a/.github/actions/golang/action.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-name: setup-go
-description: "Setup Go binary and caching"
-
-runs:
- using: composite
- steps:
- - uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
- with:
- go-version-file: 'go.mod'
- cache: true
diff --git a/.github/workflows/build-rust-injector.yml b/.github/workflows/build-rust-injector.yml
index a302c1dfa0..caa7899b4e 100644
--- a/.github/workflows/build-rust-injector.yml
+++ b/.github/workflows/build-rust-injector.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: "Checkout Repo"
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Install tools
uses: ./.github/actions/install-tools
diff --git a/.github/workflows/check-go-mod.yml b/.github/workflows/check-go-mod.yml
index b7f4c12b97..d4f3147983 100644
--- a/.github/workflows/check-go-mod.yml
+++ b/.github/workflows/check-go-mod.yml
@@ -11,10 +11,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Test go mod
run: |
diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml
index 283059a80b..a166f21181 100644
--- a/.github/workflows/commitlint.yml
+++ b/.github/workflows/commitlint.yml
@@ -16,7 +16,7 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml
index ed74def218..f58b17ac01 100644
--- a/.github/workflows/dependency-review.yml
+++ b/.github/workflows/dependency-review.yml
@@ -10,6 +10,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Dependency Review
- uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.3.4
+ uses: actions/dependency-review-action@a6993e2c61fd5dc440b409aa1d6904921c5e1894 # v4.3.5
diff --git a/.github/workflows/nightly-ecr.yml b/.github/workflows/nightly-ecr.yml
index ca9bf97ca4..4657d7ef15 100644
--- a/.github/workflows/nightly-ecr.yml
+++ b/.github/workflows/nightly-ecr.yml
@@ -19,10 +19,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Build the Zarf binary
run: make build-cli-linux-amd
diff --git a/.github/workflows/nightly-eks.yml b/.github/workflows/nightly-eks.yml
index 35b94721b9..1dddfed7cc 100644
--- a/.github/workflows/nightly-eks.yml
+++ b/.github/workflows/nightly-eks.yml
@@ -27,10 +27,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Build binary and zarf packages
uses: ./.github/actions/packages
diff --git a/.github/workflows/publish-application-packages.yml b/.github/workflows/publish-application-packages.yml
index 680fd2eee4..6a2a7d2f6e 100644
--- a/.github/workflows/publish-application-packages.yml
+++ b/.github/workflows/publish-application-packages.yml
@@ -14,7 +14,7 @@ jobs:
packages: write
steps:
- name: "Checkout Repo"
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Auth with AWS
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e2194a24f9..e6509df9f1 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -17,12 +17,14 @@ jobs:
steps:
# Checkout the repo and setup the tooling for this job
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Install tools
uses: ./.github/actions/install-tools
@@ -84,7 +86,7 @@ jobs:
# Upload the contents of the build directory for later stages to use
- name: Upload build artifacts
- uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: build-artifacts
path: build/
@@ -96,7 +98,7 @@ jobs:
steps:
# Checkout the repo and setup the tooling for this job
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
@@ -107,7 +109,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Make Zarf executable
run: |
@@ -135,12 +139,14 @@ jobs:
steps:
# Checkout the repo and setup the tooling for this job
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Install tools
uses: ./.github/actions/install-tools
@@ -198,7 +204,7 @@ jobs:
HOMEBREW_TAP_GITHUB_TOKEN: ${{ steps.brew-tap-token.outputs.token }}
- name: Save CVE report
- uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: cve-report
path: build/zarf-known-cves.csv
diff --git a/.github/workflows/scan-codeql.yml b/.github/workflows/scan-codeql.yml
index 1a1848f923..452895fa4e 100644
--- a/.github/workflows/scan-codeql.yml
+++ b/.github/workflows/scan-codeql.yml
@@ -36,14 +36,16 @@ jobs:
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9
+ uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
with:
languages: ${{ matrix.language }}
config-file: ./.github/codeql.yaml
@@ -52,6 +54,6 @@ jobs:
run: make build-cli-linux-amd
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9
+ uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
with:
category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/scan-docs-and-schema.yml b/.github/workflows/scan-docs-and-schema.yml
index c4819b6525..8ac1c8cba7 100644
--- a/.github/workflows/scan-docs-and-schema.yml
+++ b/.github/workflows/scan-docs-and-schema.yml
@@ -11,10 +11,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Docs and schemas
run: "make test-docs-and-schema"
diff --git a/.github/workflows/scan-lint.yml b/.github/workflows/scan-lint.yml
index 95642fe5cc..ba430af3af 100644
--- a/.github/workflows/scan-lint.yml
+++ b/.github/workflows/scan-lint.yml
@@ -11,6 +11,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Run golangci-lint
- uses: golangci/golangci-lint-action@aaa42aa0628b4ae2578232a66b541047968fac86 # v6.1.0
+ uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6.1.1
diff --git a/.github/workflows/scorecard.yaml b/.github/workflows/scorecard.yaml
index 6bdb4a7cf4..9c3e8dff39 100644
--- a/.github/workflows/scorecard.yaml
+++ b/.github/workflows/scorecard.yaml
@@ -22,7 +22,7 @@ jobs:
steps:
- name: "Checkout code"
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
@@ -36,7 +36,7 @@ jobs:
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
- uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: SARIF file
path: results.sarif
@@ -44,6 +44,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
- uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9
+ uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0
with:
sarif_file: results.sarif
diff --git a/.github/workflows/test-bigbang.yml b/.github/workflows/test-bigbang.yml
deleted file mode 100644
index 1c0b820ea6..0000000000
--- a/.github/workflows/test-bigbang.yml
+++ /dev/null
@@ -1,119 +0,0 @@
-name: Test Big Bang extension
-on:
- pull_request:
- paths-ignore:
- - "**.md"
- - "**.jpg"
- - "**.png"
- - "**.gif"
- - "**.svg"
- - "adr/**"
- - "docs/**"
- - "CODEOWNERS"
- merge_group:
- paths-ignore:
- - "**.md"
- - "**.jpg"
- - "**.png"
- - "**.gif"
- - "**.svg"
- - "adr/**"
- - "docs/**"
- - "CODEOWNERS"
-
-permissions:
- contents: read
-
-# Abort prior jobs in the same workflow / PR
-concurrency:
- group: e2e-bb-${{ github.ref }}
- cancel-in-progress: true
-
-jobs:
- build-bigbang:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
-
- - name: Setup golang
- uses: ./.github/actions/golang
-
- - name: Build Zarf binary
- uses: ./.github/actions/packages
- with:
- init-package: "false"
- build-examples: "false"
-
- - name: Login to Iron Bank
- uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
- if: ${{ env.IRON_BANK_ROBOT_USERNAME != '' }}
- env:
- IRON_BANK_ROBOT_USERNAME: ${{ secrets.IRON_BANK_ROBOT_USERNAME }}
- with:
- registry: registry1.dso.mil
- username: ${{ secrets.IRON_BANK_ROBOT_USERNAME }}
- password: ${{ secrets.IRON_BANK_ROBOT_PASSWORD }}
-
- - name: Build a registry1.dso.mil Zarf 'init' package
- if: ${{ env.IRON_BANK_ROBOT_USERNAME != '' }}
- env:
- IRON_BANK_ROBOT_USERNAME: ${{ secrets.IRON_BANK_ROBOT_USERNAME }}
- run: make ib-init-package
-
- # Upload the contents of the build directory for later stages to use
- - name: Upload build artifacts
- uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
- with:
- name: build-artifacts
- path: build/
- retention-days: 1
-
- validate-bigbang:
- runs-on: ubuntu-latest
- needs: build-bigbang
- steps:
- - name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
-
- - name: Download build artifacts
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
- with:
- name: build-artifacts
- path: build/
-
- - name: Setup golang
- uses: ./.github/actions/golang
-
- - name: Make Zarf executable
- run: |
- chmod +x build/zarf
-
- # Before we run the tests we need to aggressively cleanup files to reduce disk pressure
- - name: Cleanup files
- uses: ./.github/actions/cleanup-files
-
- - name: Setup K3d
- uses: ./.github/actions/k3d
-
- - name: Login to Iron Bank
- uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
- if: ${{ env.IRON_BANK_ROBOT_USERNAME != '' }}
- env:
- IRON_BANK_ROBOT_USERNAME: ${{ secrets.IRON_BANK_ROBOT_USERNAME }}
- with:
- registry: registry1.dso.mil
- username: ${{ secrets.IRON_BANK_ROBOT_USERNAME }}
- password: ${{ secrets.IRON_BANK_ROBOT_PASSWORD }}
-
- - name: Run tests
- if: ${{ env.IRON_BANK_ROBOT_USERNAME != '' }}
- env:
- IRON_BANK_ROBOT_USERNAME: ${{ secrets.IRON_BANK_ROBOT_USERNAME }}
- run: |
- sudo mkdir /mnt/zarf-tmp
- sudo chown -R runner:runner /mnt/zarf-tmp
- CI=true go test ./src/extensions/bigbang/test -failfast -v -timeout 30m
-
- - name: Save logs
- uses: ./.github/actions/save-logs
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
index 24b5e4bd76..2b2c2b87ce 100644
--- a/.github/workflows/test-e2e.yml
+++ b/.github/workflows/test-e2e.yml
@@ -35,10 +35,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Build binary and zarf packages
uses: ./.github/actions/packages
@@ -47,7 +49,7 @@ jobs:
# Upload the contents of the build directory for later stages to use
- name: Upload build artifacts
- uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: build-artifacts
path: build/
@@ -58,7 +60,7 @@ jobs:
needs: build-e2e
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Download build artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
@@ -67,7 +69,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Make Zarf executable
run: |
@@ -93,7 +97,7 @@ jobs:
needs: build-e2e
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Download build artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
@@ -102,7 +106,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Setup K3d
uses: ./.github/actions/k3d
@@ -135,7 +141,7 @@ jobs:
needs: build-e2e
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Download build artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
@@ -144,7 +150,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Make Zarf executable
run: |
@@ -173,7 +181,7 @@ jobs:
needs: build-e2e
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Download build artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
@@ -182,7 +190,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Setup Kind
run: |
@@ -217,7 +227,7 @@ jobs:
needs: build-e2e
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Download build artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
@@ -226,7 +236,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Setup Minikube
run: minikube start --driver=docker
diff --git a/.github/workflows/test-external.yml b/.github/workflows/test-external.yml
index 8fcb4c5683..fd96da6dc5 100644
--- a/.github/workflows/test-external.yml
+++ b/.github/workflows/test-external.yml
@@ -34,10 +34,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Build binary and zarf packages
uses: ./.github/actions/packages
diff --git a/.github/workflows/test-import.yaml b/.github/workflows/test-import.yaml
index c5571593fe..58878cddef 100644
--- a/.github/workflows/test-import.yaml
+++ b/.github/workflows/test-import.yaml
@@ -15,13 +15,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Go
uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
with:
- go-version-file: 'go.mod'
- cache: true
+ go-version-file: go.mod
- name: Run test Go program that imports Zarf
run: |
diff --git a/.github/workflows/test-package-create.yml b/.github/workflows/test-package-create.yml
new file mode 100644
index 0000000000..0ec2f81a6f
--- /dev/null
+++ b/.github/workflows/test-package-create.yml
@@ -0,0 +1,48 @@
+name: Test Package Create Checksums
+
+on:
+ pull_request:
+ merge_group:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: package-create-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ test-checksums:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
+
+ - name: Build Zarf
+ run: make build
+
+ - name: Build examples
+ run: make build-examples ARCH=amd64
+
+ - name: Compare checksums
+ run: |
+ set -e
+
+ for f in hack/examples-checksums/*.txt
+ do
+ NAME=$(basename $f .txt)
+ CHECKSUM=$(tar Oxf build/$NAME.tar.zst checksums.txt | grep -v sboms.tar)
+ EXPECTED_CHECKSUM=$(cat $f | grep -v sboms.tar)
+ if [[ "$CHECKSUM" != "$EXPECTED_CHECKSUM" ]]
+ then
+ echo "Package $f does not have expected checksum."
+ echo "$CHECKSUM"
+ echo "-----"
+ echo "$EXPECTED_CHECKSUM"
+ exit 1
+ fi
+ done
diff --git a/.github/workflows/test-shim.yml b/.github/workflows/test-shim.yml
index 0b9616930b..b4df3bf4b5 100644
--- a/.github/workflows/test-shim.yml
+++ b/.github/workflows/test-shim.yml
@@ -103,13 +103,6 @@ jobs:
run: |
echo skipped
- validate-bigbang:
- runs-on: ubuntu-latest
- steps:
- - name: Skipped
- run: |
- echo skipped
-
validate-external:
runs-on: ubuntu-latest
steps:
diff --git a/.github/workflows/test-site.yml b/.github/workflows/test-site.yml
index d17f9f6d85..04874a07c1 100644
--- a/.github/workflows/test-site.yml
+++ b/.github/workflows/test-site.yml
@@ -19,7 +19,7 @@ jobs:
working-directory: ./site
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup Node.js
uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4
diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml
index 4690674604..c0f807628a 100644
--- a/.github/workflows/test-unit.yml
+++ b/.github/workflows/test-unit.yml
@@ -38,15 +38,17 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Run unit tests
run: make test-unit
- name: Upload coverage reports to Codecov
- uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0
+ uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0
with:
token: ${{ secrets.CODECOV_TOKEN }}
diff --git a/.github/workflows/test-upgrade.yml b/.github/workflows/test-upgrade.yml
index c060598796..791c9b9bed 100644
--- a/.github/workflows/test-upgrade.yml
+++ b/.github/workflows/test-upgrade.yml
@@ -34,10 +34,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Build PR binary and zarf init package
uses: ./.github/actions/packages
@@ -46,7 +48,7 @@ jobs:
# Upload the contents of the build directory for later stages to use
- name: Upload build artifacts
- uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
+ uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: build-artifacts
path: build/
@@ -57,7 +59,7 @@ jobs:
needs: build-upgrade
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Download build artifacts
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
@@ -66,7 +68,9 @@ jobs:
path: build/
- name: Setup golang
- uses: ./.github/actions/golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Make Zarf executable
run: |
diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml
index d9d9172a75..420eb38b2f 100644
--- a/.github/workflows/test-windows.yml
+++ b/.github/workflows/test-windows.yml
@@ -34,7 +34,12 @@ jobs:
runs-on: windows-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: Setup golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Run Windows unit tests
run: make test-unit
@@ -44,7 +49,12 @@ jobs:
runs-on: windows-latest
steps:
- name: Checkout
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: Setup golang
+ uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
+ with:
+ go-version-file: go.mod
- name: Build Windows binary and zarf packages
uses: ./.github/actions/packages
diff --git a/.golangci.yaml b/.golangci.yaml
index 6423df7732..c947d98999 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -59,6 +59,7 @@ linters-settings:
testifylint:
enable-all: true
errcheck:
+ check-blank: true
check-type-assertions: true
exclude-functions:
- (*github.com/spf13/cobra.Command).Help
@@ -68,10 +69,13 @@ linters-settings:
issues:
# Revive rules that are disabled by default.
include:
+ - EXC0001
- EXC0012
- EXC0013
- EXC0014
- EXC0015
- # Exclude linting code copied from Helm.
exclude-dirs:
- - "src/cmd/tools/helm"
+ - "src/cmd/tools/helm" # Exclude linting code copied from Helm.
+ - "src/internal/packager"
+ - "src/pkg/packager" # TODO(mkcp): Delete packager rules once refactor is complete
+ - "src/internal/packager2" # TODO(mkcp): Delete packager rules once refactor is complete
diff --git a/Makefile b/Makefile
index bdce6970d3..9c3ac5ea18 100644
--- a/Makefile
+++ b/Makefile
@@ -72,9 +72,6 @@ destroy: ## Run `zarf destroy` on the current cluster
$(ZARF_BIN) destroy --confirm --remove-components
rm -fr build
-delete-packages: ## Delete all Zarf package tarballs in the project recursively
- find . -type f -name 'zarf-package-*' -not -path '*/testdata/*' -print -delete
-
# Note: the path to the main.go file is not used due to https://github.com/golang/go/issues/51831#issuecomment-1074188363
.PHONY: build
build: ## Build the Zarf CLI for the machines OS and architecture
@@ -171,8 +168,6 @@ build-examples: ## Build all of the example packages
@test -s ./build/zarf-package-yolo-$(ARCH).tar.zst || $(ZARF_BIN) package create examples/yolo -o build -a $(ARCH) --confirm
- @test -s ./build/zarf-package-component-webhooks-$(ARCH)-0.0.1.tar.zst || $(ZARF_BIN) package create examples/component-webhooks -o build -a $(ARCH) --confirm
-
build-injector-linux: ## Build the Zarf injector for AMD64 and ARM64
docker run --rm --user "$(id -u)":"$(id -g)" -v $$PWD/src/injector:/usr/src/zarf-injector -w /usr/src/zarf-injector rust:1.71.0-bookworm make build-injector-linux list-sizes
@@ -210,7 +205,7 @@ test-upgrade: ## Run the Zarf CLI E2E tests for an external registry and cluster
.PHONY: test-unit
test-unit: ## Run unit tests
- go test -failfast -v -coverprofile=coverage.out -covermode=atomic $$(go list ./... | grep -v '^github.com/zarf-dev/zarf/src/test' | grep -v 'github.com/zarf-dev/zarf/src/extensions/bigbang/test')
+ go test -failfast -v -coverprofile=coverage.out -covermode=atomic $$(go list ./... | grep -v '^github.com/zarf-dev/zarf/src/test')
# INTERNAL: used to test that a dev has ran `make docs-and-schema` in their PR
test-docs-and-schema:
diff --git a/examples/big-bang/config/disable-all.yaml b/examples/big-bang/config/disable-all.yaml
deleted file mode 100644
index 153ce37c80..0000000000
--- a/examples/big-bang/config/disable-all.yaml
+++ /dev/null
@@ -1,58 +0,0 @@
-# Disable everything
-istio:
- enabled: false
-
-istioOperator:
- enabled: false
-
-jaeger:
- enabled: false
-
-kiali:
- enabled: false
-
-clusterAuditor:
- enabled: false
-
-gatekeeper:
- enabled: false
-
-kyverno:
- enabled: false
-
-kyvernoPolicies:
- enabled: false
-
-kyvernoReporter:
- enabled: false
-
-elasticsearchKibana:
- enabled: false
-
-eckOperator:
- enabled: false
-
-fluentbit:
- enabled: false
-
-promtail:
- enabled: false
-
-loki:
- enabled: false
-
-neuvector:
- enabled: false
-
-tempo:
- enabled: false
-
-monitoring:
- enabled: false
-
-twistlock:
- enabled: false
-
-addons:
- metricsServer:
- enabled: false
diff --git a/examples/big-bang/config/ingress.yaml b/examples/big-bang/config/ingress.yaml
deleted file mode 100644
index 0ceaa53056..0000000000
--- a/examples/big-bang/config/ingress.yaml
+++ /dev/null
@@ -1,128 +0,0 @@
-# Configure Istio
-domain: "###ZARF_VAR_DOMAIN###"
-
-istio:
- gateways:
- public:
- tls: # certs for *.bigbang.dev
- key: |
- -----BEGIN PRIVATE KEY-----
- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDDvKUzWiZucm6/
- 8D2Nx4KVe8t6uHtARpw112f4yGv7xKcOJkbxLbVtor8pj/HS5tRSZq2ziIQl9y98
- 8TVAOBezgzPPMDxOqDeyHl5gAtqzpK/eSPmueZIhR88BH2+SMYqa5kxmjn752Rf0
- jVeCrVdQ5MD9rqA00oQi/zO+gQQoz6QSuiEQ2pSKYB3gv9oIoJorIU1n4qLYAezn
- TvFwjmKWPPhRdyslpcAi1rVO+mVX3Y2DKU/CfpWNFVVT+H788Srn4yP6iWUymfQU
- vHOXII1erMnES2H9BDffumrRf3m3IpgueQ3vPhB8ftjFZozURj2t/WSeaKsyQSoZ
- Wr99DWxpAgMBAAECggEAAW8ARsACSAzOgtlfmgo8Cpw9gUiYnn/l5P8O4+OT5uQp
- 1RCytFGBYqwuej9zpffK1k+qNgZp8V0+G8wod6/xfH8Zggr4ZhsVTVirmEhtEaPD
- Jf2i1oRNbbD48yknyApU2Y2WQaoJhArzAfeHDI34db83KqR8x+ZC0X7NAjgvr5zS
- b0OfY2tht4oxEWh2m67FzlFgF+cWyszRYyfvHfOFBqLesuCnSfMoOzmbT3SlnxHo
- 6GSa1e/kCJVzFJNb74BZTIH0w6Ar/a0QG829VXivqj8lRENU/1xUI2JhNz4RdH7F
- 6MeiwQbq4pWjHfh4djuzQFIwOgCnSNRnNuNywOVuAQKBgQDjleEI1XFQawXmHtHu
- 6GMhbgptRoSUyutDDdo2MHGvDbxDOIsczIBjxCuYAM47nmGMuWbDJUN+2VQAX32J
- WZagRxWikxnEqv3B7No7tLSQ42rRo/tDBrZPCCuS9u/ZJM4o7MCa/VzTtbicGOCh
- bTIoTeEtT2piIdkrjHFGGlYOLQKBgQDcLNFHrSJCkHfCoz75+zytfYan+2dIxuV/
- MlnrT8XHt33cst4ZwoIQbsE6mv7J4CJqOgUYDvoJpioLV3InUACDxXd+bVY7RwxP
- j25pXzYL++RctVO3IEOCmFkwlq0fNFdrOn8Y/cnRTwd2e60n08rCKgJS8KhEAaO0
- QvVmAHw4rQKBgQDL7hCAnunzuoLFqpZI8tlpKjaTpp3EynO3WSFQb2ZfCvrIbVFS
- U/kz7KN3iDlEeO5GcBeiA7EQaGN6FhbiTXHIWwoK7K8paGMMM1V2LL2kGvQruDm8
- 3LXd6Z9KCJXxSKanS0ZnW2KjnnE3Bp+6ZqOMNATzWfckydnUyPrza0PzXQKBgEYS
- 1YCUb8Tzqcn+nrp85XDp9INeFh8pfj0fT1L/DpljouEs5Fcaer60ITd/wPuLJCje
- 0mQ30AhmJBd7+07bvW4y2LcaIUm4cQiZQ7CxpsfloWaIJ16vHA1iY3B9ZBf8Vp4/
- /dd8XlEJb/ybnB6C35MwP5EaGtOaGfnzHZsbKG35AoGAWm9tpqhuldQ3MCvoAr5Q
- b42JLSKqwpvVjQDiFZPI/0wZTo3WkWm9Rd7CAACheb8S70K1r/JIzsmIcnj0v4xs
- sfd+R35UE+m8MExbDP4lKFParmvi2/UZfb3VFNMmMPTV6AEIBl6N4PmhHMZOsIRs
- H4RxbE+FpmsMAUCpdrzvFkc=
- -----END PRIVATE KEY-----
- cert: |
- -----BEGIN CERTIFICATE-----
- MIIFHzCCBAegAwIBAgISA5mpYS+M8wSuhJbgCNVoGbYiMA0GCSqGSIb3DQEBCwUA
- MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
- EwJSMzAeFw0yMzAyMjQxMzU1MzBaFw0yMzA1MjUxMzU1MjlaMBgxFjAUBgNVBAMM
- DSouYmlnYmFuZy5kZXYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDD
- vKUzWiZucm6/8D2Nx4KVe8t6uHtARpw112f4yGv7xKcOJkbxLbVtor8pj/HS5tRS
- Zq2ziIQl9y988TVAOBezgzPPMDxOqDeyHl5gAtqzpK/eSPmueZIhR88BH2+SMYqa
- 5kxmjn752Rf0jVeCrVdQ5MD9rqA00oQi/zO+gQQoz6QSuiEQ2pSKYB3gv9oIoJor
- IU1n4qLYAeznTvFwjmKWPPhRdyslpcAi1rVO+mVX3Y2DKU/CfpWNFVVT+H788Srn
- 4yP6iWUymfQUvHOXII1erMnES2H9BDffumrRf3m3IpgueQ3vPhB8ftjFZozURj2t
- /WSeaKsyQSoZWr99DWxpAgMBAAGjggJHMIICQzAOBgNVHQ8BAf8EBAMCBaAwHQYD
- VR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0O
- BBYEFFWw8Antpeyt5+/J//sIHTWkf8MtMB8GA1UdIwQYMBaAFBQusxe3WFbLrlAJ
- QOYfr52LFMLGMFUGCCsGAQUFBwEBBEkwRzAhBggrBgEFBQcwAYYVaHR0cDovL3Iz
- Lm8ubGVuY3Iub3JnMCIGCCsGAQUFBzAChhZodHRwOi8vcjMuaS5sZW5jci5vcmcv
- MBgGA1UdEQQRMA+CDSouYmlnYmFuZy5kZXYwTAYDVR0gBEUwQzAIBgZngQwBAgEw
- NwYLKwYBBAGC3xMBAQEwKDAmBggrBgEFBQcCARYaaHR0cDovL2Nwcy5sZXRzZW5j
- cnlwdC5vcmcwggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQB6MoxU2LcttiDqOOBS
- HumEFnAyE4VNO9IrwTpXo1LrUgAAAYaD7AyTAAAEAwBGMEQCIG1jzmcfMv+DNdJh
- 8gYpo44sgsASNEF8CjWCyHFhvITiAiASh+KhZXLaFXKsKF99fd6CTnKX30nOz2UR
- NfSnXwW5JwB2AOg+0No+9QY1MudXKLyJa8kD08vREWvs62nhd31tBr1uAAABhoPs
- DHAAAAQDAEcwRQIhALnaITI/ItM9FxxA0hc2VAVJ5xk36/FZtjMJyDAx2dmHAiAT
- hnn8YDRB/fPRnv8PUOcubqK2mNwMRCk5wQBjQGYanTANBgkqhkiG9w0BAQsFAAOC
- AQEAeviZDlTw9bzxF9vIZ1F+ijIQmnma6CD32eIEQmD/tIpOeayxuRiNFzIt/ixo
- uC0/hKcC+JbVb7ZJOT9woPDce+g3gbA2i390yf3av3EP7sptV90rTM8gLPAdtHxo
- RW14cSGmGFmaBRhr7ZbaSumztWcqgOF5orBq26wkhPT5bmqn7YX1W/H7/OMjP1Z+
- fQTfgFnfkBtzg1Ib4z3SHIPTqo2kAN3cF+b8AxrUKlk0STwesX2mR9h9jUKTapGg
- Y36zDlKTOI3edM22AZDSmrIiR2LV1qGBDoxrsJmnK/Ci3t0KjwzJz45tyzenk8kO
- imbt/HYVhe8WfukQ/kQdlhsHCw==
- -----END CERTIFICATE-----
- -----BEGIN CERTIFICATE-----
- MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
- TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
- cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw
- WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg
- RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
- AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP
- R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx
- sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm
- NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg
- Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG
- /kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC
- AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB
- Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA
- FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw
- AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw
- Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB
- gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W
- PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl
- ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz
- CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm
- lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4
- avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2
- yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O
- yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids
- hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+
- HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv
- MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX
- nLRbwHOoq7hHwg==
- -----END CERTIFICATE-----
- -----BEGIN CERTIFICATE-----
- MIIFYDCCBEigAwIBAgIQQAF3ITfU6UK47naqPGQKtzANBgkqhkiG9w0BAQsFADA/
- MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
- DkRTVCBSb290IENBIFgzMB4XDTIxMDEyMDE5MTQwM1oXDTI0MDkzMDE4MTQwM1ow
- TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
- cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwggIiMA0GCSqGSIb3DQEB
- AQUAA4ICDwAwggIKAoICAQCt6CRz9BQ385ueK1coHIe+3LffOJCMbjzmV6B493XC
- ov71am72AE8o295ohmxEk7axY/0UEmu/H9LqMZshftEzPLpI9d1537O4/xLxIZpL
- wYqGcWlKZmZsj348cL+tKSIG8+TA5oCu4kuPt5l+lAOf00eXfJlII1PoOK5PCm+D
- LtFJV4yAdLbaL9A4jXsDcCEbdfIwPPqPrt3aY6vrFk/CjhFLfs8L6P+1dy70sntK
- 4EwSJQxwjQMpoOFTJOwT2e4ZvxCzSow/iaNhUd6shweU9GNx7C7ib1uYgeGJXDR5
- bHbvO5BieebbpJovJsXQEOEO3tkQjhb7t/eo98flAgeYjzYIlefiN5YNNnWe+w5y
- sR2bvAP5SQXYgd0FtCrWQemsAXaVCg/Y39W9Eh81LygXbNKYwagJZHduRze6zqxZ
- Xmidf3LWicUGQSk+WT7dJvUkyRGnWqNMQB9GoZm1pzpRboY7nn1ypxIFeFntPlF4
- FQsDj43QLwWyPntKHEtzBRL8xurgUBN8Q5N0s8p0544fAQjQMNRbcTa0B7rBMDBc
- SLeCO5imfWCKoqMpgsy6vYMEG6KDA0Gh1gXxG8K28Kh8hjtGqEgqiNx2mna/H2ql
- PRmP6zjzZN7IKw0KKP/32+IVQtQi0Cdd4Xn+GOdwiK1O5tmLOsbdJ1Fu/7xk9TND
- TwIDAQABo4IBRjCCAUIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
- SwYIKwYBBQUHAQEEPzA9MDsGCCsGAQUFBzAChi9odHRwOi8vYXBwcy5pZGVudHJ1
- c3QuY29tL3Jvb3RzL2RzdHJvb3RjYXgzLnA3YzAfBgNVHSMEGDAWgBTEp7Gkeyxx
- +tvhS5B1/8QVYIWJEDBUBgNVHSAETTBLMAgGBmeBDAECATA/BgsrBgEEAYLfEwEB
- ATAwMC4GCCsGAQUFBwIBFiJodHRwOi8vY3BzLnJvb3QteDEubGV0c2VuY3J5cHQu
- b3JnMDwGA1UdHwQ1MDMwMaAvoC2GK2h0dHA6Ly9jcmwuaWRlbnRydXN0LmNvbS9E
- U1RST09UQ0FYM0NSTC5jcmwwHQYDVR0OBBYEFHm0WeZ7tuXkAXOACIjIGlj26Ztu
- MA0GCSqGSIb3DQEBCwUAA4IBAQAKcwBslm7/DlLQrt2M51oGrS+o44+/yQoDFVDC
- 5WxCu2+b9LRPwkSICHXM6webFGJueN7sJ7o5XPWioW5WlHAQU7G75K/QosMrAdSW
- 9MUgNTP52GE24HGNtLi1qoJFlcDyqSMo59ahy2cI2qBDLKobkx/J3vWraV0T9VuG
- WCLKTVXkcGdtwlfFRjlBz4pYg1htmf5X6DYO8A4jqv2Il9DjXA6USbW1FzXSLr9O
- he8Y4IWS6wY7bCkjCWDcRQJMEhg76fsO3txE+FiYruq9RUWhiF1myv4Q6W+CyBFC
- Dfvp7OOGAN6dEOM4+qR9sdjoSYKEBpsr6GtPAQw4dy753ec5
- -----END CERTIFICATE-----
diff --git a/examples/big-bang/config/kyverno.yaml b/examples/big-bang/config/kyverno.yaml
deleted file mode 100644
index 0270d2975f..0000000000
--- a/examples/big-bang/config/kyverno.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-# Use Kyverno instead of Gatekeeper
-gatekeeper:
- enabled: false
-clusterAuditor:
- enabled: false
-kyverno:
- enabled: true
-kyvernoPolicies:
- enabled: true
- values:
- policies:
- disallow-shared-subpath-volume-writes:
- validationFailureAction: audit
- restrict-host-ports:
- validationFailureAction: audit
- restrict-capabilities:
- validationFailureAction: audit
- restrict-image-registries:
- validationFailureAction: audit
- disallow-host-namespaces:
- validationFailureAction: audit
- disallow-privileged-containers:
- validationFailureAction: audit
- require-non-root-user:
- validationFailureAction: audit
- restrict-host-path-mount-pv:
- validationFailureAction: audit
diff --git a/examples/big-bang/config/loki.yaml b/examples/big-bang/config/loki.yaml
deleted file mode 100644
index 8a85cfd658..0000000000
--- a/examples/big-bang/config/loki.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-# Use Loki instead of EFK
-elasticsearchKibana:
- enabled: false
-
-eckOperator:
- enabled: false
-
-fluentbit:
- enabled: false
-
-loki:
- enabled: true
-
-promtail:
- enabled: true
diff --git a/examples/big-bang/config/neuvector.yaml b/examples/big-bang/config/neuvector.yaml
deleted file mode 100644
index d804274901..0000000000
--- a/examples/big-bang/config/neuvector.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-# If running in k3s, this is needed for Neuvector to start properly
-neuvector:
- values:
- k3s:
- enabled: true
diff --git a/examples/big-bang/virtualservices/gitea.yaml b/examples/big-bang/virtualservices/gitea.yaml
deleted file mode 100644
index 713d683055..0000000000
--- a/examples/big-bang/virtualservices/gitea.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: networking.istio.io/v1alpha3
-kind: VirtualService
-metadata:
- name: gitea
- namespace: zarf
-spec:
- gateways:
- - istio-system/public
- hosts:
- - gitea.###ZARF_VAR_DOMAIN###
- http:
- - route:
- - destination:
- host: zarf-gitea-http.zarf.svc.cluster.local
- port:
- number: 3000
diff --git a/examples/big-bang/yolo/credentials.yaml b/examples/big-bang/yolo/credentials.yaml
deleted file mode 100644
index 40b651da01..0000000000
--- a/examples/big-bang/yolo/credentials.yaml
+++ /dev/null
@@ -1,5 +0,0 @@
-registryCredentials:
- registry: registry1.dso.mil
- username: "###ZARF_VAR_REGISTRY1_USERNAME###"
- password: "###ZARF_VAR_REGISTRY1_CLI_SECRET###"
- email: ""
diff --git a/examples/big-bang/yolo/private-registry.yaml b/examples/big-bang/yolo/private-registry.yaml
deleted file mode 100644
index 11f1449e1c..0000000000
--- a/examples/big-bang/yolo/private-registry.yaml
+++ /dev/null
@@ -1,18 +0,0 @@
-apiVersion: v1
-kind: Secret
-metadata:
- name: private-registry
- namespace: flux-system
-type: kubernetes.io/dockerconfigjson
-stringData:
- .dockerconfigjson: |-
- {
- "auths": {
- "registry1.dso.mil": {
- "username": "###ZARF_VAR_REGISTRY1_USERNAME###",
- "password": "###ZARF_VAR_REGISTRY1_CLI_SECRET###",
- "email": "",
- "auth": "###ZARF_VAR_REGISTRY1_AUTH###"
- }
- }
- }
diff --git a/examples/big-bang/yolo/zarf.yaml b/examples/big-bang/yolo/zarf.yaml
deleted file mode 100644
index 80caf3bfd1..0000000000
--- a/examples/big-bang/yolo/zarf.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-kind: ZarfPackageConfig
-
-metadata:
- name: yolo-big-bang
- description: Deploy Big Bang Core in YOLO mode
- # renovate: datasource=gitlab-releases depName=big-bang/bigbang versioning=semver registryUrl=https://repo1.dso.mil/
- version: 2.19.2
- url: https://p1.dso.mil/products/big-bang
- architecture: amd64
- yolo: true
-
-variables:
- - name: REGISTRY1_USERNAME
- description: The username for pulling images from registry1.dso.mil
- prompt: true
- - name: REGISTRY1_CLI_SECRET
- description: The CLI secret for pulling images from registry1.dso.mil
- prompt: true
- - name: REGISTRY1_AUTH
- description: A base64 encoded concatenation of 'REGISTRY1_USERNAME:REGISTRY1_CLI_SECRET'
- prompt: true
-
-components:
- - name: flux-private-registry
- required: true
- manifests:
- - name: private-registry
- namespace: flux-system
- files:
- - private-registry.yaml
- - name: bigbang
- required: true
- extensions:
- bigbang:
- # renovate: datasource=gitlab-releases depName=big-bang/bigbang versioning=semver registryUrl=https://repo1.dso.mil/
- version: 2.19.2
- valuesFiles:
- - credentials.yaml
- - ../config/ingress.yaml
- - ../config/kyverno.yaml
- - ../config/loki.yaml
diff --git a/examples/big-bang/zarf.yaml b/examples/big-bang/zarf.yaml
deleted file mode 100644
index 672ec4f8d1..0000000000
--- a/examples/big-bang/zarf.yaml
+++ /dev/null
@@ -1,99 +0,0 @@
-kind: ZarfPackageConfig
-metadata:
- name: big-bang-example
- description: Deploy Big Bang Core
- # renovate: datasource=gitlab-releases depName=big-bang/bigbang versioning=semver registryUrl=https://repo1.dso.mil/
- version: 2.19.2
- url: https://p1.dso.mil/products/big-bang
- # Big Bang / Iron Bank are only amd64
- architecture: amd64
-
-variables:
- - name: DOMAIN
- default: bigbang.dev
- prompt: false
-
-components:
- - name: bigbang
- required: true
- actions:
- onRemove:
- before:
- - cmd: |
- ./zarf tools kubectl patch helmrelease -n bigbang bigbang --type=merge -p '{"spec":{"suspend":true}}'
- ./zarf tools kubectl delete helmrelease -n bigbang istio --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang istio-operator --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang monitoring --ignore-not-found
- ./zarf tools kubectl delete providers grafana -n monitoring --ignore-not-found
- ./zarf tools kubectl delete alerts grafana -n monitoring --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang promtail --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang loki --ignore-not-found
- ./zarf tools kubectl delete kiali -n kiali kiali --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang tempo --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang neuvector --ignore-not-found
- ./zarf tools kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io neuvector-validating-crd-webhook --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang kyverno-reporter --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang kyverno-policies --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang kyverno --ignore-not-found
- ./zarf tools kubectl delete validatingwebhookconfigurations.admissionregistration.k8s.io kyverno-policy-validating-webhook-cfg kyverno-resource-validating-webhook-cfg --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang kiali --ignore-not-found
- ./zarf tools kubectl delete helmrelease -n bigbang metrics-server --ignore-not-found
- ./zarf tools kubectl delete apiservices.apiregistration.k8s.io -l helm.toolkit.fluxcd.io/namespace=bigbang,helm.toolkit.fluxcd.io/name=metrics-server --ignore-not-found
- ./zarf tools kubectl delete gitrepositories -n bigbang -l app.kubernetes.io/part-of=bigbang
- description: "Cleaning up Big Bang resources"
- extensions:
- bigbang:
- # renovate: datasource=gitlab-releases depName=big-bang/bigbang versioning=semver registryUrl=https://repo1.dso.mil/
- version: 2.19.2
- valuesFiles:
- # Istio configs
- - config/ingress.yaml
- # Use Kyverno instead of Gatekeeper
- - config/kyverno.yaml
- # Use PLG instead of EFK
- - config/loki.yaml
- # Needed when running in k3s. Otherwise Neuvector fails to start with an error saying it can't detect its runtime
- - config/neuvector.yaml
- # Values are merged in order, so this would override the above and disable everything if uncommented
- # - config/disable-all.yaml
- - name: gitea-virtual-service
- description: >
- Expose the internal Zarf Gitea server through the Big Bang Istio deployment via a virtual service.
- (only applies if you are using the Zarf-provided Gitea deployment - not an externally configured git host)
- manifests:
- - name: gitea
- namespace: zarf
- files:
- - virtualservices/gitea.yaml
-
-# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
-# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
-x-mdx: |
- import Properties from "@components/SchemaItemProperties.astro";
-
- This package deploys [Big Bang](https://repo1.dso.mil/platform-one/big-bang/bigbang) using the Zarf `bigbang` extension.
-
- The `bigbang` noun sits within the `extensions` specification of Zarf and provides the following configuration:
-
-
-
- To see a tutorial for the creation and deployment of this package see the [Big Bang Tutorial](/tutorials/5-big-bang/).
-
- :::caution
-
- `valuesFiles` are processed in the order provided with Zarf adding an initial values file to populate registry
- and git server credentials as the first file. Including credential `values` (even empty ones) will override
- these values. This can be used to our advantage however for things like YOLO mode as described below.
-
- :::
-
- ## Big Bang YOLO Mode Support
-
- The Big Bang extension also supports YOLO mode, provided that you add your own credentials for the image registry.
- This is accomplished below with the `provision-flux-credentials` component and the `credentials.yaml` values file
- which allows images to be pulled from [registry1.dso.mil](https://registry1.dso.mil). We demonstrate providing account
- credentials via Zarf Variables, but there are other ways to populate the data in `private-registry.yaml`.
-
- You can learn about YOLO mode in the [FAQ](/faq#what-is-yolo-mode-and-why-would-i-use-it) or the [YOLO mode example](/ref/examples/yolo/).
-
- [Big Bang YOLO Mode Example](https://github.com/zarf-dev/zarf/tree/main/examples/big-bang/yolo).
diff --git a/examples/component-webhooks/.eslintrc.json b/examples/component-webhooks/.eslintrc.json
deleted file mode 100644
index 0a2ea6e8a7..0000000000
--- a/examples/component-webhooks/.eslintrc.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "env": {
- "browser": false,
- "es2021": true
- },
- "extends": [
- "eslint:recommended",
- "plugin:@typescript-eslint/recommended"
- ],
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaVersion": 2022
- },
- "plugins": [
- "@typescript-eslint"
- ],
- "ignorePatterns": [
- "node_modules",
- "dist",
- "hack",
- "capabilities/zarf-types.ts"
- ],
- "root": true
-}
diff --git a/examples/component-webhooks/.gitignore b/examples/component-webhooks/.gitignore
deleted file mode 100644
index f06235c460..0000000000
--- a/examples/component-webhooks/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-dist
diff --git a/examples/component-webhooks/.prettierrc b/examples/component-webhooks/.prettierrc
deleted file mode 100644
index 7c4c51324c..0000000000
--- a/examples/component-webhooks/.prettierrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "arrowParens": "avoid",
- "bracketSameLine": false,
- "bracketSpacing": true,
- "embeddedLanguageFormatting": "auto",
- "insertPragma": false,
- "printWidth": 80,
- "quoteProps": "as-needed",
- "requirePragma": false,
- "semi": true,
- "tabWidth": 2,
- "useTabs": false
-}
diff --git a/examples/component-webhooks/capabilities/hook.ts b/examples/component-webhooks/capabilities/hook.ts
deleted file mode 100644
index 03ea35856f..0000000000
--- a/examples/component-webhooks/capabilities/hook.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-import { Capability, a, Log, K8s, kind } from "pepr";
-import { DeployedPackage } from "./zarf-types";
-
-/**
- * The Webhook Capability is an example capability to demonstrate using webhooks to interact with Zarf package deployments.
- * To test this capability you run `pepr dev`and then deploy a zarf package!
- */
-export const Webhook = new Capability({
- name: "example-webhook",
- description:
- "A simple example capability to show how webhooks work with Zarf package deployments.",
- namespaces: ["zarf"],
-});
-
-const webhookName = "test-webhook";
-
-const { When } = Webhook;
-
-When(a.Secret)
- .IsCreatedOrUpdated()
- .InNamespace("zarf")
- .WithLabel("package-deploy-info")
- .Mutate(request => {
- const secret = request.Raw;
- let secretData: DeployedPackage;
- let secretString: string;
- let manuallyDecoded = false;
-
- // Pepr does not decode/encode non-ASCII characters in secret data: https://github.com/defenseunicorns/pepr/issues/219
- try {
- secretString = atob(secret.data.data);
- manuallyDecoded = true;
- } catch (err) {
- secretString = secret.data.data;
- }
-
- // Parse the secret object
- try {
- secretData = JSON.parse(secretString);
- } catch (err) {
- throw new Error(`Failed to parse the secret.data.data: ${err}`);
- }
-
- for (const deployedComponent of secretData?.deployedComponents ?? []) {
- if (deployedComponent.status === "Deploying") {
- Log.info(
- `The component ${deployedComponent.name} is currently deploying`,
- );
-
- const componentWebhook =
- secretData.componentWebhooks?.[deployedComponent?.name]?.[
- webhookName
- ];
-
- // Check if the component has a webhook running for the current package generation
- if (componentWebhook?.observedGeneration === secretData.generation) {
- Log.debug(
- `The component ${deployedComponent.name} has already had a webhook executed for it. Not executing another.`,
- );
- } else {
- // Seed the componentWebhooks map/object
- if (!secretData.componentWebhooks) {
- secretData.componentWebhooks = {};
- }
-
- // Update the secret noting that the webhook is running for this component
- secretData.componentWebhooks[deployedComponent.name] = {
- "test-webhook": {
- name: webhookName,
- status: "Running",
- observedGeneration: secretData.generation,
- },
- };
-
- // Call an async function that simulates background processing and then updates the secret with the new status when it's complete
- sleepAndChangeStatus(secret.metadata.name, deployedComponent.name);
- }
- }
- }
-
- if (manuallyDecoded === true) {
- secret.data.data = btoa(JSON.stringify(secretData));
- } else {
- secret.data.data = JSON.stringify(secretData);
- }
- });
-
-// sleepAndChangeStatus sleeps for the specified duration and changes the status of the 'test-webhook' to 'Succeeded'.
-async function sleepAndChangeStatus(secretName: string, componentName: string) {
- await sleep(10);
-
- const ns = "zarf";
-
- let secret: a.Secret;
-
- // Fetch the package secret
- try {
- secret = await K8s(kind.Secret).InNamespace(ns).Get(secretName);
- } catch (err) {
- Log.error(
- `Error: Failed to get package secret '${secretName}' in namespace '${ns}': ${JSON.stringify(
- err,
- )}`,
- );
- }
-
- const secretString = atob(secret.data.data);
- const secretData: DeployedPackage = JSON.parse(secretString);
-
- // Update the webhook status if the observedGeneration matches
- const componentWebhook =
- secretData.componentWebhooks[componentName]?.[webhookName];
-
- if (componentWebhook?.observedGeneration === secretData.generation) {
- componentWebhook.status = "Succeeded";
-
- secretData.componentWebhooks[componentName][webhookName] = componentWebhook;
- }
-
- secret.data.data = btoa(JSON.stringify(secretData));
-
- // Update the status in the package secret
- // Use Server-Side force apply to forcefully take ownership of the package secret data.data field
- // Doing a Server-Side apply without the force option will result in a FieldManagerConflict error due to Zarf owning the object.
- try {
- await K8s(kind.Secret).Apply(
- {
- metadata: {
- name: secretName,
- namespace: ns,
- },
- data: {
- data: secret.data.data,
- },
- },
- { force: true },
- );
- } catch (err) {
- Log.error(
- `Error: Failed to update package secret '${secretName}' in namespace '${ns}': ${JSON.stringify(
- err,
- )}`,
- );
- }
-}
-
-function sleep(seconds: number) {
- return new Promise(resolve => setTimeout(resolve, seconds * 1000));
-}
diff --git a/examples/component-webhooks/capabilities/zarf-types.ts b/examples/component-webhooks/capabilities/zarf-types.ts
deleted file mode 100644
index 4ead23ab96..0000000000
--- a/examples/component-webhooks/capabilities/zarf-types.ts
+++ /dev/null
@@ -1,1490 +0,0 @@
-// To parse this data:
-//
-// import { Convert, ZarfTypes } from "./file";
-//
-// const zarfTypes = Convert.toZarfTypes(json);
-//
-// These functions will throw an error if the JSON doesn't
-// match the expected interface, even if the JSON is valid.
-
-export interface ZarfTypes {
- DeployedPackage: DeployedPackage;
- ZarfPackage: Data;
- ZarfState: ZarfState;
-}
-
-export interface DeployedPackage {
- cliVersion: string;
- componentWebhooks?: { [key: string]: { [key: string]: ComponentWebhookValue } };
- connectStrings?: { [key: string]: ConnectStringValue };
- data: Data;
- deployedComponents: DeployedComponentElement[];
- generation: number;
- name: string;
-}
-
-export interface ComponentWebhookValue {
- name: string;
- observedGeneration: number;
- status: string;
- waitDurationSeconds?: number;
-}
-
-export interface ConnectStringValue {
- /**
- * Descriptive text that explains what the resource you would be connecting to is used for
- */
- description: string;
- /**
- * URL path that gets appended to the k8s port-forward result
- */
- url: string;
-}
-
-export interface Data {
- /**
- * Zarf-generated package build data
- */
- build?: Build;
- /**
- * List of components to deploy in this package
- */
- components: ComponentElement[];
- /**
- * Constant template values applied on deploy for K8s resources
- */
- constants?: ConstantElement[];
- /**
- * The kind of Zarf package
- */
- kind: Kind;
- /**
- * Package metadata
- */
- metadata?: Metadata;
- /**
- * Variable template values applied on deploy for K8s resources
- */
- variables?: ZarfPackageVariable[];
-}
-
-/**
- * Zarf-generated package build data
- */
-export interface Build {
- /**
- * The architecture this package was created on
- */
- architecture: string;
- /**
- * Whether this package was created with differential components
- */
- differential?: boolean;
- /**
- * List of components that were not included in this package due to differential packaging
- */
- differentialMissing?: string[];
- /**
- * Version of a previously built package used as the basis for creating this differential
- * package
- */
- differentialPackageVersion?: string;
- /**
- * The flavor of Zarf used to build this package
- */
- flavor?: string;
- /**
- * The minimum version of Zarf that does not have breaking package structure changes
- */
- lastNonBreakingVersion?: string;
- /**
- * Any migrations that have been run on this package
- */
- migrations?: string[];
- /**
- * Any registry domains that were overridden on package create when pulling images
- */
- registryOverrides?: { [key: string]: string };
- /**
- * The machine name that created this package
- */
- terminal: string;
- /**
- * The timestamp when this package was created
- */
- timestamp: string;
- /**
- * The username who created this package
- */
- user: string;
- /**
- * The version of Zarf used to build this package
- */
- version: string;
-}
-
-export interface ComponentElement {
- /**
- * Custom commands to run at various stages of a package lifecycle
- */
- actions?: Actions;
- /**
- * Helm charts to install during package deploy
- */
- charts?: ChartElement[];
- /**
- * [Deprecated] Specify a path to a public key to validate signed online resources. This
- * will be removed in Zarf v1.0.0.
- */
- cosignKeyPath?: string;
- /**
- * Datasets to inject into a container in the target cluster
- */
- dataInjections?: DataInjectionElement[];
- /**
- * Determines the default Y/N state for installing this component on package deploy
- */
- default?: boolean;
- /**
- * Message to include during package deploy describing the purpose of this component
- */
- description?: string;
- /**
- * Extend component functionality with additional features
- */
- extensions?: Extensions;
- /**
- * Files or folders to place on disk during package deployment
- */
- files?: FileElement[];
- /**
- * [Deprecated] Create a user selector field based on all components in the same group. This
- * will be removed in Zarf v1.0.0. Consider using 'only.flavor' instead.
- */
- group?: string;
- /**
- * List of OCI images to include in the package
- */
- images?: string[];
- /**
- * Import a component from another Zarf package
- */
- import?: Import;
- /**
- * Kubernetes manifests to be included in a generated Helm chart on package deploy
- */
- manifests?: ManifestElement[];
- /**
- * The name of the component
- */
- name: string;
- /**
- * Filter when this component is included in package creation or deployment
- */
- only?: Only;
- /**
- * List of git repos to include in the package
- */
- repos?: string[];
- /**
- * Do not prompt user to install this component
- */
- required?: boolean;
- /**
- * [Deprecated] (replaced by actions) Custom commands to run before or after package
- * deployment. This will be removed in Zarf v1.0.0.
- */
- scripts?: Scripts;
-}
-
-/**
- * Custom commands to run at various stages of a package lifecycle
- */
-export interface Actions {
- /**
- * Actions to run during package creation
- */
- onCreate?: OnCreate;
- /**
- * Actions to run during package deployment
- */
- onDeploy?: OnCreate;
- /**
- * Actions to run during package removal
- */
- onRemove?: OnCreate;
-}
-
-/**
- * Actions to run during package creation
- *
- * Actions to run during package deployment
- *
- * Actions to run during package removal
- */
-export interface OnCreate {
- /**
- * Actions to run at the end of an operation
- */
- after?: AfterElement[];
- /**
- * Actions to run at the start of an operation
- */
- before?: AfterElement[];
- /**
- * Default configuration for all actions in this set
- */
- defaults?: Defaults;
- /**
- * Actions to run if all operations fail
- */
- onFailure?: AfterElement[];
- /**
- * Actions to run if all operations succeed
- */
- onSuccess?: AfterElement[];
-}
-
-export interface AfterElement {
- /**
- * The command to run. Must specify either cmd or wait for the action to do anything.
- */
- cmd?: string;
- /**
- * Description of the action to be displayed during package execution instead of the command
- */
- description?: string;
- /**
- * The working directory to run the command in (default is CWD)
- */
- dir?: string;
- /**
- * Additional environment variables to set for the command
- */
- env?: string[];
- /**
- * Retry the command if it fails up to given number of times (default 0)
- */
- maxRetries?: number;
- /**
- * Timeout in seconds for the command (default to 0
- */
- maxTotalSeconds?: number;
- /**
- * Hide the output of the command during package deployment (default false)
- */
- mute?: boolean;
- /**
- * [Deprecated] (replaced by setVariables) (onDeploy/cmd only) The name of a variable to
- * update with the output of the command. This variable will be available to all remaining
- * actions and components in the package. This will be removed in Zarf v1.0.0
- */
- setVariable?: string;
- /**
- * (onDeploy/cmd only) An array of variables to update with the output of the command. These
- * variables will be available to all remaining actions and components in the package.
- */
- setVariables?: SetVariableElement[];
- /**
- * (cmd only) Indicates a preference for a shell for the provided cmd to be executed in on
- * supported operating systems
- */
- shell?: Shell;
- /**
- * Wait for a condition to be met before continuing. Must specify either cmd or wait for the
- * action. See the 'zarf tools wait-for' command for more info.
- */
- wait?: Wait;
-}
-
-export interface SetVariableElement {
- /**
- * Whether to automatically indent the variable's value (if multiline) when templating.
- * Based on the number of chars before the start of ###ZARF_VAR_.
- */
- autoIndent?: boolean;
- /**
- * The name to be used for the variable
- */
- name: string;
- /**
- * An optional regex pattern that a variable value must match before a package deployment
- * can continue.
- */
- pattern?: string;
- /**
- * Whether to mark this variable as sensitive to not print it in the log
- */
- sensitive?: boolean;
- /**
- * Changes the handling of a variable to load contents differently (i.e. from a file rather
- * than as a raw variable - templated files should be kept below 1 MiB)
- */
- type?: Type;
-}
-
-/**
- * Changes the handling of a variable to load contents differently (i.e. from a file rather
- * than as a raw variable - templated files should be kept below 1 MiB)
- */
-export enum Type {
- File = "file",
- Raw = "raw",
-}
-
-/**
- * (cmd only) Indicates a preference for a shell for the provided cmd to be executed in on
- * supported operating systems
- */
-export interface Shell {
- /**
- * (default 'sh') Indicates a preference for the shell to use on macOS systems
- */
- darwin?: string;
- /**
- * (default 'sh') Indicates a preference for the shell to use on Linux systems
- */
- linux?: string;
- /**
- * (default 'powershell') Indicates a preference for the shell to use on Windows systems
- * (note that choosing 'cmd' will turn off migrations like touch -> New-Item)
- */
- windows?: string;
-}
-
-/**
- * Wait for a condition to be met before continuing. Must specify either cmd or wait for the
- * action. See the 'zarf tools wait-for' command for more info.
- */
-export interface Wait {
- /**
- * Wait for a condition to be met in the cluster before continuing. Only one of cluster or
- * network can be specified.
- */
- cluster?: WaitCluster;
- /**
- * Wait for a condition to be met on the network before continuing. Only one of cluster or
- * network can be specified.
- */
- network?: Network;
-}
-
-/**
- * Wait for a condition to be met in the cluster before continuing. Only one of cluster or
- * network can be specified.
- */
-export interface WaitCluster {
- /**
- * The condition or jsonpath state to wait for; defaults to exist
- */
- condition?: string;
- /**
- * The kind of resource to wait for
- */
- kind: string;
- /**
- * The name of the resource or selector to wait for
- */
- name: string;
- /**
- * The namespace of the resource to wait for
- */
- namespace?: string;
-}
-
-/**
- * Wait for a condition to be met on the network before continuing. Only one of cluster or
- * network can be specified.
- */
-export interface Network {
- /**
- * The address to wait for
- */
- address: string;
- /**
- * The HTTP status code to wait for if using http or https
- */
- code?: number;
- /**
- * The protocol to wait for
- */
- protocol: Protocol;
-}
-
-/**
- * The protocol to wait for
- */
-export enum Protocol {
- HTTP = "http",
- HTTPS = "https",
- TCP = "tcp",
-}
-
-/**
- * Default configuration for all actions in this set
- */
-export interface Defaults {
- /**
- * Working directory for commands (default CWD)
- */
- dir?: string;
- /**
- * Additional environment variables for commands
- */
- env?: string[];
- /**
- * Retry commands given number of times if they fail (default 0)
- */
- maxRetries?: number;
- /**
- * Default timeout in seconds for commands (default to 0
- */
- maxTotalSeconds?: number;
- /**
- * Hide the output of commands during execution (default false)
- */
- mute?: boolean;
- /**
- * (cmd only) Indicates a preference for a shell for the provided cmd to be executed in on
- * supported operating systems
- */
- shell?: Shell;
-}
-
-export interface ChartElement {
- /**
- * (git repo only) The sub directory to the chart within a git repo
- */
- gitPath?: string;
- /**
- * The path to a local chart's folder or .tgz archive
- */
- localPath?: string;
- /**
- * The name of the chart within Zarf; note that this must be unique and does not need to be
- * the same as the name in the chart repo
- */
- name: string;
- /**
- * The namespace to deploy the chart to
- */
- namespace: string;
- /**
- * Whether to not wait for chart resources to be ready before continuing
- */
- noWait?: boolean;
- /**
- * The name of the Helm release to create (defaults to the Zarf name of the chart)
- */
- releaseName?: string;
- /**
- * The name of a chart within a Helm repository (defaults to the Zarf name of the chart)
- */
- repoName?: string;
- /**
- * The URL of the OCI registry, chart repository, or git repo where the helm chart is stored
- */
- url?: string;
- /**
- * List of local values file paths or remote URLs to include in the package; these will be
- * merged together when deployed
- */
- valuesFiles?: string[];
- /**
- * [alpha] List of variables to set in the Helm chart
- */
- variables?: ChartVariable[];
- /**
- * The version of the chart to deploy; for git-based charts this is also the tag of the git
- * repo by default (when not using the '@' syntax for 'repos')
- */
- version?: string;
-}
-
-export interface ChartVariable {
- /**
- * A brief description of what the variable controls
- */
- description: string;
- /**
- * The name of the variable
- */
- name: string;
- /**
- * The path within the Helm chart values where this variable applies
- */
- path: string;
-}
-
-export interface DataInjectionElement {
- /**
- * Compress the data before transmitting using gzip. Note: this requires support for
- * tar/gzip locally and in the target image.
- */
- compress?: boolean;
- /**
- * Either a path to a local folder/file or a remote URL of a file to inject into the given
- * target pod + container
- */
- source: string;
- /**
- * The target pod + container to inject the data into
- */
- target: Target;
-}
-
-/**
- * The target pod + container to inject the data into
- */
-export interface Target {
- /**
- * The container name to target for data injection
- */
- container: string;
- /**
- * The namespace to target for data injection
- */
- namespace: string;
- /**
- * The path within the container to copy the data into
- */
- path: string;
- /**
- * The K8s selector to target for data injection
- */
- selector: string;
-}
-
-/**
- * Extend component functionality with additional features
- */
-export interface Extensions {
- /**
- * Configurations for installing Big Bang and Flux in the cluster
- */
- bigbang?: Bigbang;
-}
-
-/**
- * Configurations for installing Big Bang and Flux in the cluster
- */
-export interface Bigbang {
- /**
- * Optional paths to Flux kustomize strategic merge patch files
- */
- fluxPatchFiles?: string[];
- /**
- * Override repo to pull Big Bang from instead of Repo One
- */
- repo?: string;
- /**
- * Whether to skip deploying flux; Defaults to false
- */
- skipFlux?: boolean;
- /**
- * The list of values files to pass to Big Bang; these will be merged together
- */
- valuesFiles?: string[];
- /**
- * The version of Big Bang to use
- */
- version: string;
-}
-
-export interface FileElement {
- /**
- * (files only) Determines if the file should be made executable during package deploy
- */
- executable?: boolean;
- /**
- * Local folder or file to be extracted from a 'source' archive
- */
- extractPath?: string;
- /**
- * (files only) Optional SHA256 checksum of the file
- */
- shasum?: string;
- /**
- * Local folder or file path or remote URL to pull into the package
- */
- source: string;
- /**
- * List of symlinks to create during package deploy
- */
- symlinks?: string[];
- /**
- * The absolute or relative path where the file or folder should be copied to during package
- * deploy
- */
- target: string;
-}
-
-/**
- * Import a component from another Zarf package
- */
-export interface Import {
- /**
- * The name of the component to import from the referenced zarf.yaml
- */
- name?: string;
- /**
- * The relative path to a directory containing a zarf.yaml to import from
- */
- path?: string;
- /**
- * [beta] The URL to a Zarf package to import via OCI
- */
- url?: string;
-}
-
-export interface ManifestElement {
- /**
- * List of local K8s YAML files or remote URLs to deploy (in order)
- */
- files?: string[];
- /**
- * List of local kustomization paths or remote URLs to include in the package
- */
- kustomizations?: string[];
- /**
- * Allow traversing directory above the current directory if needed for kustomization
- */
- kustomizeAllowAnyDirectory?: boolean;
- /**
- * A name to give this collection of manifests; this will become the name of the
- * dynamically-created helm chart
- */
- name: string;
- /**
- * The namespace to deploy the manifests to
- */
- namespace?: string;
- /**
- * Whether to not wait for manifest resources to be ready before continuing
- */
- noWait?: boolean;
-}
-
-/**
- * Filter when this component is included in package creation or deployment
- */
-export interface Only {
- /**
- * Only deploy component to specified clusters
- */
- cluster?: OnlyCluster;
- /**
- * Only include this component when a matching '--flavor' is specified on 'zarf package
- * create'
- */
- flavor?: string;
- /**
- * Only deploy component to specified OS
- */
- localOS?: LocalOS;
-}
-
-/**
- * Only deploy component to specified clusters
- */
-export interface OnlyCluster {
- /**
- * Only create and deploy to clusters of the given architecture
- */
- architecture?: Architecture;
- /**
- * A list of kubernetes distros this package works with (Reserved for future use)
- */
- distros?: string[];
-}
-
-/**
- * Only create and deploy to clusters of the given architecture
- */
-export enum Architecture {
- Amd64 = "amd64",
- Arm64 = "arm64",
-}
-
-/**
- * Only deploy component to specified OS
- */
-export enum LocalOS {
- Darwin = "darwin",
- Linux = "linux",
- Windows = "windows",
-}
-
-/**
- * [Deprecated] (replaced by actions) Custom commands to run before or after package
- * deployment. This will be removed in Zarf v1.0.0.
- */
-export interface Scripts {
- /**
- * Scripts to run after the component successfully deploys
- */
- after?: string[];
- /**
- * Scripts to run before the component is deployed
- */
- before?: string[];
- /**
- * Scripts to run before the component is added during package create
- */
- prepare?: string[];
- /**
- * Retry the script if it fails
- */
- retry?: boolean;
- /**
- * Show the output of the script during package deployment
- */
- showOutput?: boolean;
- /**
- * Timeout in seconds for the script
- */
- timeoutSeconds?: number;
-}
-
-export interface ConstantElement {
- /**
- * Whether to automatically indent the variable's value (if multiline) when templating.
- * Based on the number of chars before the start of ###ZARF_CONST_.
- */
- autoIndent?: boolean;
- /**
- * A description of the constant to explain its purpose on package create or deploy
- * confirmation prompts
- */
- description?: string;
- /**
- * The name to be used for the constant
- */
- name: string;
- /**
- * An optional regex pattern that a constant value must match before a package can be
- * created.
- */
- pattern?: string;
- /**
- * The value to set for the constant during deploy
- */
- value: string;
-}
-
-/**
- * The kind of Zarf package
- */
-export enum Kind {
- ZarfInitConfig = "ZarfInitConfig",
- ZarfPackageConfig = "ZarfPackageConfig",
-}
-
-/**
- * Package metadata
- */
-export interface Metadata {
- /**
- * Checksum of a checksums.txt file that contains checksums all the layers within the
- * package.
- */
- aggregateChecksum?: string;
- /**
- * The target cluster architecture for this package
- */
- architecture?: string;
- /**
- * Comma-separated list of package authors (including contact info)
- */
- authors?: string;
- /**
- * Additional information about this package
- */
- description?: string;
- /**
- * Link to package documentation when online
- */
- documentation?: string;
- /**
- * Name to identify this Zarf package
- */
- name: string;
- /**
- * Link to package source code when online
- */
- source?: string;
- /**
- * Disable compression of this package
- */
- uncompressed?: boolean;
- /**
- * Link to package information when online
- */
- url?: string;
- /**
- * Name of the distributing entity, organization or individual.
- */
- vendor?: string;
- /**
- * Generic string set by a package author to track the package version (Note:
- * ZarfInitConfigs will always be versioned to the CLIVersion they were created with)
- */
- version?: string;
- /**
- * Yaml OnLy Online (YOLO): True enables deploying a Zarf package without first running zarf
- * init against the cluster. This is ideal for connected environments where you want to use
- * existing VCS and container registries.
- */
- yolo?: boolean;
-}
-
-export interface ZarfPackageVariable {
- /**
- * Whether to automatically indent the variable's value (if multiline) when templating.
- * Based on the number of chars before the start of ###ZARF_VAR_.
- */
- autoIndent?: boolean;
- /**
- * The default value to use for the variable
- */
- default?: string;
- /**
- * A description of the variable to be used when prompting the user a value
- */
- description?: string;
- /**
- * The name to be used for the variable
- */
- name: string;
- /**
- * An optional regex pattern that a variable value must match before a package deployment
- * can continue.
- */
- pattern?: string;
- /**
- * Whether to prompt the user for input for this variable
- */
- prompt?: boolean;
- /**
- * Whether to mark this variable as sensitive to not print it in the log
- */
- sensitive?: boolean;
- /**
- * Changes the handling of a variable to load contents differently (i.e. from a file rather
- * than as a raw variable - templated files should be kept below 1 MiB)
- */
- type?: Type;
-}
-
-export interface DeployedComponentElement {
- installedCharts: InstalledChartElement[];
- name: string;
- observedGeneration: number;
- status: string;
-}
-
-export interface InstalledChartElement {
- chartName: string;
- namespace: string;
-}
-
-export interface ZarfState {
- agentTLS: AgentTLS;
- /**
- * Machine architecture of the k8s node(s)
- */
- architecture: string;
- /**
- * Information about the artifact registry Zarf is configured to use
- */
- artifactServer: ArtifactServer;
- /**
- * K8s distribution of the cluster Zarf was deployed to
- */
- distro: string;
- /**
- * Information about the repository Zarf is configured to use
- */
- gitServer: GitServer;
- /**
- * Information about the container registry Zarf is configured to use
- */
- registryInfo: RegistryInfo;
- storageClass: string;
- /**
- * Indicates if Zarf was initialized while deploying its own k8s cluster
- */
- zarfAppliance: boolean;
-}
-
-export interface AgentTLS {
- ca: string;
- cert: string;
- key: string;
-}
-
-/**
- * Information about the artifact registry Zarf is configured to use
- */
-export interface ArtifactServer {
- /**
- * URL address of the artifact registry
- */
- address: string;
- /**
- * Indicates if we are using a artifact registry that Zarf is directly managing
- */
- internalServer: boolean;
- /**
- * Password of a user with push access to the artifact registry
- */
- pushPassword: string;
- /**
- * Username of a user with push access to the artifact registry
- */
- pushUsername: string;
-}
-
-/**
- * Information about the repository Zarf is configured to use
- */
-export interface GitServer {
- /**
- * URL address of the git server
- */
- address: string;
- /**
- * Indicates if we are using a git server that Zarf is directly managing
- */
- internalServer: boolean;
- /**
- * Password of a user with pull-only access to the git repository. If not provided for an
- * external repository then the push-user is used
- */
- pullPassword: string;
- /**
- * Username of a user with pull-only access to the git repository. If not provided for an
- * external repository then the push-user is used
- */
- pullUsername: string;
- /**
- * Password of a user with push access to the git repository
- */
- pushPassword: string;
- /**
- * Username of a user with push access to the git repository
- */
- pushUsername: string;
-}
-
-/**
- * Information about the container registry Zarf is configured to use
- */
-export interface RegistryInfo {
- /**
- * URL address of the registry
- */
- address: string;
- /**
- * Indicates if we are using a registry that Zarf is directly managing
- */
- internalRegistry: boolean;
- /**
- * Nodeport of the registry. Only needed if the registry is running inside the kubernetes
- * cluster
- */
- nodePort: number;
- /**
- * Password of a user with pull-only access to the registry. If not provided for an external
- * registry than the push-user is used
- */
- pullPassword: string;
- /**
- * Username of a user with pull-only access to the registry. If not provided for an external
- * registry than the push-user is used
- */
- pullUsername: string;
- /**
- * Password of a user with push access to the registry
- */
- pushPassword: string;
- /**
- * Username of a user with push access to the registry
- */
- pushUsername: string;
- /**
- * Secret value that the registry was seeded with
- */
- secret: string;
-}
-
-// Converts JSON strings to/from your types
-// and asserts the results of JSON.parse at runtime
-export class Convert {
- public static toZarfTypes(json: string): ZarfTypes {
- return cast(JSON.parse(json), r("ZarfTypes"));
- }
-
- public static zarfTypesToJson(value: ZarfTypes): string {
- return JSON.stringify(uncast(value, r("ZarfTypes")), null, 2);
- }
-}
-
-function invalidValue(typ: any, val: any, key: any, parent: any = ''): never {
- const prettyTyp = prettyTypeName(typ);
- const parentText = parent ? ` on ${parent}` : '';
- const keyText = key ? ` for key "${key}"` : '';
- throw Error(`Invalid value${keyText}${parentText}. Expected ${prettyTyp} but got ${JSON.stringify(val)}`);
-}
-
-function prettyTypeName(typ: any): string {
- if (Array.isArray(typ)) {
- if (typ.length === 2 && typ[0] === undefined) {
- return `an optional ${prettyTypeName(typ[1])}`;
- } else {
- return `one of [${typ.map(a => { return prettyTypeName(a); }).join(", ")}]`;
- }
- } else if (typeof typ === "object" && typ.literal !== undefined) {
- return typ.literal;
- } else {
- return typeof typ;
- }
-}
-
-function jsonToJSProps(typ: any): any {
- if (typ.jsonToJS === undefined) {
- const map: any = {};
- typ.props.forEach((p: any) => map[p.json] = { key: p.js, typ: p.typ });
- typ.jsonToJS = map;
- }
- return typ.jsonToJS;
-}
-
-function jsToJSONProps(typ: any): any {
- if (typ.jsToJSON === undefined) {
- const map: any = {};
- typ.props.forEach((p: any) => map[p.js] = { key: p.json, typ: p.typ });
- typ.jsToJSON = map;
- }
- return typ.jsToJSON;
-}
-
-function transform(val: any, typ: any, getProps: any, key: any = '', parent: any = ''): any {
- function transformPrimitive(typ: string, val: any): any {
- if (typeof typ === typeof val) return val;
- return invalidValue(typ, val, key, parent);
- }
-
- function transformUnion(typs: any[], val: any): any {
- // val must validate against one typ in typs
- const l = typs.length;
- for (let i = 0; i < l; i++) {
- const typ = typs[i];
- try {
- return transform(val, typ, getProps);
- } catch (_) {}
- }
- return invalidValue(typs, val, key, parent);
- }
-
- function transformEnum(cases: string[], val: any): any {
- if (cases.indexOf(val) !== -1) return val;
- return invalidValue(cases.map(a => { return l(a); }), val, key, parent);
- }
-
- function transformArray(typ: any, val: any): any {
- // val must be an array with no invalid elements
- if (!Array.isArray(val)) return invalidValue(l("array"), val, key, parent);
- return val.map(el => transform(el, typ, getProps));
- }
-
- function transformDate(val: any): any {
- if (val === null) {
- return null;
- }
- const d = new Date(val);
- if (isNaN(d.valueOf())) {
- return invalidValue(l("Date"), val, key, parent);
- }
- return d;
- }
-
- function transformObject(props: { [k: string]: any }, additional: any, val: any): any {
- if (val === null || typeof val !== "object" || Array.isArray(val)) {
- return invalidValue(l(ref || "object"), val, key, parent);
- }
- const result: any = {};
- Object.getOwnPropertyNames(props).forEach(key => {
- const prop = props[key];
- const v = Object.prototype.hasOwnProperty.call(val, key) ? val[key] : undefined;
- result[prop.key] = transform(v, prop.typ, getProps, key, ref);
- });
- Object.getOwnPropertyNames(val).forEach(key => {
- if (!Object.prototype.hasOwnProperty.call(props, key)) {
- result[key] = transform(val[key], additional, getProps, key, ref);
- }
- });
- return result;
- }
-
- if (typ === "any") return val;
- if (typ === null) {
- if (val === null) return val;
- return invalidValue(typ, val, key, parent);
- }
- if (typ === false) return invalidValue(typ, val, key, parent);
- let ref: any = undefined;
- while (typeof typ === "object" && typ.ref !== undefined) {
- ref = typ.ref;
- typ = typeMap[typ.ref];
- }
- if (Array.isArray(typ)) return transformEnum(typ, val);
- if (typeof typ === "object") {
- return typ.hasOwnProperty("unionMembers") ? transformUnion(typ.unionMembers, val)
- : typ.hasOwnProperty("arrayItems") ? transformArray(typ.arrayItems, val)
- : typ.hasOwnProperty("props") ? transformObject(getProps(typ), typ.additional, val)
- : invalidValue(typ, val, key, parent);
- }
- // Numbers can be parsed by Date but shouldn't be.
- if (typ === Date && typeof val !== "number") return transformDate(val);
- return transformPrimitive(typ, val);
-}
-
-function cast(val: any, typ: any): T {
- return transform(val, typ, jsonToJSProps);
-}
-
-function uncast(val: T, typ: any): any {
- return transform(val, typ, jsToJSONProps);
-}
-
-function l(typ: any) {
- return { literal: typ };
-}
-
-function a(typ: any) {
- return { arrayItems: typ };
-}
-
-function u(...typs: any[]) {
- return { unionMembers: typs };
-}
-
-function o(props: any[], additional: any) {
- return { props, additional };
-}
-
-function m(additional: any) {
- return { props: [], additional };
-}
-
-function r(name: string) {
- return { ref: name };
-}
-
-const typeMap: any = {
- "ZarfTypes": o([
- { json: "DeployedPackage", js: "DeployedPackage", typ: r("DeployedPackage") },
- { json: "ZarfPackage", js: "ZarfPackage", typ: r("Data") },
- { json: "ZarfState", js: "ZarfState", typ: r("ZarfState") },
- ], false),
- "DeployedPackage": o([
- { json: "cliVersion", js: "cliVersion", typ: "" },
- { json: "componentWebhooks", js: "componentWebhooks", typ: u(undefined, m(m(r("ComponentWebhookValue")))) },
- { json: "connectStrings", js: "connectStrings", typ: u(undefined, m(r("ConnectStringValue"))) },
- { json: "data", js: "data", typ: r("Data") },
- { json: "deployedComponents", js: "deployedComponents", typ: a(r("DeployedComponentElement")) },
- { json: "generation", js: "generation", typ: 0 },
- { json: "name", js: "name", typ: "" },
- ], false),
- "ComponentWebhookValue": o([
- { json: "name", js: "name", typ: "" },
- { json: "observedGeneration", js: "observedGeneration", typ: 0 },
- { json: "status", js: "status", typ: "" },
- { json: "waitDurationSeconds", js: "waitDurationSeconds", typ: u(undefined, 0) },
- ], false),
- "ConnectStringValue": o([
- { json: "description", js: "description", typ: "" },
- { json: "url", js: "url", typ: "" },
- ], false),
- "Data": o([
- { json: "build", js: "build", typ: u(undefined, r("Build")) },
- { json: "components", js: "components", typ: a(r("ComponentElement")) },
- { json: "constants", js: "constants", typ: u(undefined, a(r("ConstantElement"))) },
- { json: "kind", js: "kind", typ: r("Kind") },
- { json: "metadata", js: "metadata", typ: u(undefined, r("Metadata")) },
- { json: "variables", js: "variables", typ: u(undefined, a(r("ZarfPackageVariable"))) },
- ], false),
- "Build": o([
- { json: "architecture", js: "architecture", typ: "" },
- { json: "differential", js: "differential", typ: u(undefined, true) },
- { json: "differentialMissing", js: "differentialMissing", typ: u(undefined, a("")) },
- { json: "differentialPackageVersion", js: "differentialPackageVersion", typ: u(undefined, "") },
- { json: "flavor", js: "flavor", typ: u(undefined, "") },
- { json: "lastNonBreakingVersion", js: "lastNonBreakingVersion", typ: u(undefined, "") },
- { json: "migrations", js: "migrations", typ: u(undefined, a("")) },
- { json: "registryOverrides", js: "registryOverrides", typ: u(undefined, m("")) },
- { json: "terminal", js: "terminal", typ: "" },
- { json: "timestamp", js: "timestamp", typ: "" },
- { json: "user", js: "user", typ: "" },
- { json: "version", js: "version", typ: "" },
- ], false),
- "ComponentElement": o([
- { json: "actions", js: "actions", typ: u(undefined, r("Actions")) },
- { json: "charts", js: "charts", typ: u(undefined, a(r("ChartElement"))) },
- { json: "cosignKeyPath", js: "cosignKeyPath", typ: u(undefined, "") },
- { json: "dataInjections", js: "dataInjections", typ: u(undefined, a(r("DataInjectionElement"))) },
- { json: "default", js: "default", typ: u(undefined, true) },
- { json: "description", js: "description", typ: u(undefined, "") },
- { json: "extensions", js: "extensions", typ: u(undefined, r("Extensions")) },
- { json: "files", js: "files", typ: u(undefined, a(r("FileElement"))) },
- { json: "group", js: "group", typ: u(undefined, "") },
- { json: "images", js: "images", typ: u(undefined, a("")) },
- { json: "import", js: "import", typ: u(undefined, r("Import")) },
- { json: "manifests", js: "manifests", typ: u(undefined, a(r("ManifestElement"))) },
- { json: "name", js: "name", typ: "" },
- { json: "only", js: "only", typ: u(undefined, r("Only")) },
- { json: "repos", js: "repos", typ: u(undefined, a("")) },
- { json: "required", js: "required", typ: u(undefined, true) },
- { json: "scripts", js: "scripts", typ: u(undefined, r("Scripts")) },
- ], false),
- "Actions": o([
- { json: "onCreate", js: "onCreate", typ: u(undefined, r("OnCreate")) },
- { json: "onDeploy", js: "onDeploy", typ: u(undefined, r("OnCreate")) },
- { json: "onRemove", js: "onRemove", typ: u(undefined, r("OnCreate")) },
- ], false),
- "OnCreate": o([
- { json: "after", js: "after", typ: u(undefined, a(r("AfterElement"))) },
- { json: "before", js: "before", typ: u(undefined, a(r("AfterElement"))) },
- { json: "defaults", js: "defaults", typ: u(undefined, r("Defaults")) },
- { json: "onFailure", js: "onFailure", typ: u(undefined, a(r("AfterElement"))) },
- { json: "onSuccess", js: "onSuccess", typ: u(undefined, a(r("AfterElement"))) },
- ], false),
- "AfterElement": o([
- { json: "cmd", js: "cmd", typ: u(undefined, "") },
- { json: "description", js: "description", typ: u(undefined, "") },
- { json: "dir", js: "dir", typ: u(undefined, "") },
- { json: "env", js: "env", typ: u(undefined, a("")) },
- { json: "maxRetries", js: "maxRetries", typ: u(undefined, 0) },
- { json: "maxTotalSeconds", js: "maxTotalSeconds", typ: u(undefined, 0) },
- { json: "mute", js: "mute", typ: u(undefined, true) },
- { json: "setVariable", js: "setVariable", typ: u(undefined, "") },
- { json: "setVariables", js: "setVariables", typ: u(undefined, a(r("SetVariableElement"))) },
- { json: "shell", js: "shell", typ: u(undefined, r("Shell")) },
- { json: "wait", js: "wait", typ: u(undefined, r("Wait")) },
- ], false),
- "SetVariableElement": o([
- { json: "autoIndent", js: "autoIndent", typ: u(undefined, true) },
- { json: "name", js: "name", typ: "" },
- { json: "pattern", js: "pattern", typ: u(undefined, "") },
- { json: "sensitive", js: "sensitive", typ: u(undefined, true) },
- { json: "type", js: "type", typ: u(undefined, r("Type")) },
- ], false),
- "Shell": o([
- { json: "darwin", js: "darwin", typ: u(undefined, "") },
- { json: "linux", js: "linux", typ: u(undefined, "") },
- { json: "windows", js: "windows", typ: u(undefined, "") },
- ], false),
- "Wait": o([
- { json: "cluster", js: "cluster", typ: u(undefined, r("WaitCluster")) },
- { json: "network", js: "network", typ: u(undefined, r("Network")) },
- ], false),
- "WaitCluster": o([
- { json: "condition", js: "condition", typ: u(undefined, "") },
- { json: "kind", js: "kind", typ: "" },
- { json: "name", js: "name", typ: "" },
- { json: "namespace", js: "namespace", typ: u(undefined, "") },
- ], false),
- "Network": o([
- { json: "address", js: "address", typ: "" },
- { json: "code", js: "code", typ: u(undefined, 0) },
- { json: "protocol", js: "protocol", typ: r("Protocol") },
- ], false),
- "Defaults": o([
- { json: "dir", js: "dir", typ: u(undefined, "") },
- { json: "env", js: "env", typ: u(undefined, a("")) },
- { json: "maxRetries", js: "maxRetries", typ: u(undefined, 0) },
- { json: "maxTotalSeconds", js: "maxTotalSeconds", typ: u(undefined, 0) },
- { json: "mute", js: "mute", typ: u(undefined, true) },
- { json: "shell", js: "shell", typ: u(undefined, r("Shell")) },
- ], false),
- "ChartElement": o([
- { json: "gitPath", js: "gitPath", typ: u(undefined, "") },
- { json: "localPath", js: "localPath", typ: u(undefined, "") },
- { json: "name", js: "name", typ: "" },
- { json: "namespace", js: "namespace", typ: "" },
- { json: "noWait", js: "noWait", typ: u(undefined, true) },
- { json: "releaseName", js: "releaseName", typ: u(undefined, "") },
- { json: "repoName", js: "repoName", typ: u(undefined, "") },
- { json: "url", js: "url", typ: u(undefined, "") },
- { json: "valuesFiles", js: "valuesFiles", typ: u(undefined, a("")) },
- { json: "variables", js: "variables", typ: u(undefined, a(r("ChartVariable"))) },
- { json: "version", js: "version", typ: u(undefined, "") },
- ], false),
- "ChartVariable": o([
- { json: "description", js: "description", typ: "" },
- { json: "name", js: "name", typ: "" },
- { json: "path", js: "path", typ: "" },
- ], false),
- "DataInjectionElement": o([
- { json: "compress", js: "compress", typ: u(undefined, true) },
- { json: "source", js: "source", typ: "" },
- { json: "target", js: "target", typ: r("Target") },
- ], false),
- "Target": o([
- { json: "container", js: "container", typ: "" },
- { json: "namespace", js: "namespace", typ: "" },
- { json: "path", js: "path", typ: "" },
- { json: "selector", js: "selector", typ: "" },
- ], false),
- "Extensions": o([
- { json: "bigbang", js: "bigbang", typ: u(undefined, r("Bigbang")) },
- ], false),
- "Bigbang": o([
- { json: "fluxPatchFiles", js: "fluxPatchFiles", typ: u(undefined, a("")) },
- { json: "repo", js: "repo", typ: u(undefined, "") },
- { json: "skipFlux", js: "skipFlux", typ: u(undefined, true) },
- { json: "valuesFiles", js: "valuesFiles", typ: u(undefined, a("")) },
- { json: "version", js: "version", typ: "" },
- ], false),
- "FileElement": o([
- { json: "executable", js: "executable", typ: u(undefined, true) },
- { json: "extractPath", js: "extractPath", typ: u(undefined, "") },
- { json: "shasum", js: "shasum", typ: u(undefined, "") },
- { json: "source", js: "source", typ: "" },
- { json: "symlinks", js: "symlinks", typ: u(undefined, a("")) },
- { json: "target", js: "target", typ: "" },
- ], false),
- "Import": o([
- { json: "name", js: "name", typ: u(undefined, "") },
- { json: "path", js: "path", typ: u(undefined, "") },
- { json: "url", js: "url", typ: u(undefined, "") },
- ], false),
- "ManifestElement": o([
- { json: "files", js: "files", typ: u(undefined, a("")) },
- { json: "kustomizations", js: "kustomizations", typ: u(undefined, a("")) },
- { json: "kustomizeAllowAnyDirectory", js: "kustomizeAllowAnyDirectory", typ: u(undefined, true) },
- { json: "name", js: "name", typ: "" },
- { json: "namespace", js: "namespace", typ: u(undefined, "") },
- { json: "noWait", js: "noWait", typ: u(undefined, true) },
- ], false),
- "Only": o([
- { json: "cluster", js: "cluster", typ: u(undefined, r("OnlyCluster")) },
- { json: "flavor", js: "flavor", typ: u(undefined, "") },
- { json: "localOS", js: "localOS", typ: u(undefined, r("LocalOS")) },
- ], false),
- "OnlyCluster": o([
- { json: "architecture", js: "architecture", typ: u(undefined, r("Architecture")) },
- { json: "distros", js: "distros", typ: u(undefined, a("")) },
- ], false),
- "Scripts": o([
- { json: "after", js: "after", typ: u(undefined, a("")) },
- { json: "before", js: "before", typ: u(undefined, a("")) },
- { json: "prepare", js: "prepare", typ: u(undefined, a("")) },
- { json: "retry", js: "retry", typ: u(undefined, true) },
- { json: "showOutput", js: "showOutput", typ: u(undefined, true) },
- { json: "timeoutSeconds", js: "timeoutSeconds", typ: u(undefined, 0) },
- ], false),
- "ConstantElement": o([
- { json: "autoIndent", js: "autoIndent", typ: u(undefined, true) },
- { json: "description", js: "description", typ: u(undefined, "") },
- { json: "name", js: "name", typ: "" },
- { json: "pattern", js: "pattern", typ: u(undefined, "") },
- { json: "value", js: "value", typ: "" },
- ], false),
- "Metadata": o([
- { json: "aggregateChecksum", js: "aggregateChecksum", typ: u(undefined, "") },
- { json: "architecture", js: "architecture", typ: u(undefined, "") },
- { json: "authors", js: "authors", typ: u(undefined, "") },
- { json: "description", js: "description", typ: u(undefined, "") },
- { json: "documentation", js: "documentation", typ: u(undefined, "") },
- { json: "name", js: "name", typ: "" },
- { json: "source", js: "source", typ: u(undefined, "") },
- { json: "uncompressed", js: "uncompressed", typ: u(undefined, true) },
- { json: "url", js: "url", typ: u(undefined, "") },
- { json: "vendor", js: "vendor", typ: u(undefined, "") },
- { json: "version", js: "version", typ: u(undefined, "") },
- { json: "yolo", js: "yolo", typ: u(undefined, true) },
- ], false),
- "ZarfPackageVariable": o([
- { json: "autoIndent", js: "autoIndent", typ: u(undefined, true) },
- { json: "default", js: "default", typ: u(undefined, "") },
- { json: "description", js: "description", typ: u(undefined, "") },
- { json: "name", js: "name", typ: "" },
- { json: "pattern", js: "pattern", typ: u(undefined, "") },
- { json: "prompt", js: "prompt", typ: u(undefined, true) },
- { json: "sensitive", js: "sensitive", typ: u(undefined, true) },
- { json: "type", js: "type", typ: u(undefined, r("Type")) },
- ], false),
- "DeployedComponentElement": o([
- { json: "installedCharts", js: "installedCharts", typ: a(r("InstalledChartElement")) },
- { json: "name", js: "name", typ: "" },
- { json: "observedGeneration", js: "observedGeneration", typ: 0 },
- { json: "status", js: "status", typ: "" },
- ], false),
- "InstalledChartElement": o([
- { json: "chartName", js: "chartName", typ: "" },
- { json: "namespace", js: "namespace", typ: "" },
- ], false),
- "ZarfState": o([
- { json: "agentTLS", js: "agentTLS", typ: r("AgentTLS") },
- { json: "architecture", js: "architecture", typ: "" },
- { json: "artifactServer", js: "artifactServer", typ: r("ArtifactServer") },
- { json: "distro", js: "distro", typ: "" },
- { json: "gitServer", js: "gitServer", typ: r("GitServer") },
- { json: "registryInfo", js: "registryInfo", typ: r("RegistryInfo") },
- { json: "storageClass", js: "storageClass", typ: "" },
- { json: "zarfAppliance", js: "zarfAppliance", typ: true },
- ], false),
- "AgentTLS": o([
- { json: "ca", js: "ca", typ: "" },
- { json: "cert", js: "cert", typ: "" },
- { json: "key", js: "key", typ: "" },
- ], false),
- "ArtifactServer": o([
- { json: "address", js: "address", typ: "" },
- { json: "internalServer", js: "internalServer", typ: true },
- { json: "pushPassword", js: "pushPassword", typ: "" },
- { json: "pushUsername", js: "pushUsername", typ: "" },
- ], false),
- "GitServer": o([
- { json: "address", js: "address", typ: "" },
- { json: "internalServer", js: "internalServer", typ: true },
- { json: "pullPassword", js: "pullPassword", typ: "" },
- { json: "pullUsername", js: "pullUsername", typ: "" },
- { json: "pushPassword", js: "pushPassword", typ: "" },
- { json: "pushUsername", js: "pushUsername", typ: "" },
- ], false),
- "RegistryInfo": o([
- { json: "address", js: "address", typ: "" },
- { json: "internalRegistry", js: "internalRegistry", typ: true },
- { json: "nodePort", js: "nodePort", typ: 0 },
- { json: "pullPassword", js: "pullPassword", typ: "" },
- { json: "pullUsername", js: "pullUsername", typ: "" },
- { json: "pushPassword", js: "pushPassword", typ: "" },
- { json: "pushUsername", js: "pushUsername", typ: "" },
- { json: "secret", js: "secret", typ: "" },
- ], false),
- "Type": [
- "file",
- "raw",
- ],
- "Protocol": [
- "http",
- "https",
- "tcp",
- ],
- "Architecture": [
- "amd64",
- "arm64",
- ],
- "LocalOS": [
- "darwin",
- "linux",
- "windows",
- ],
- "Kind": [
- "ZarfInitConfig",
- "ZarfPackageConfig",
- ],
-};
diff --git a/examples/component-webhooks/package-lock.json b/examples/component-webhooks/package-lock.json
deleted file mode 100644
index b50ee40013..0000000000
--- a/examples/component-webhooks/package-lock.json
+++ /dev/null
@@ -1,3374 +0,0 @@
-{
- "name": "example-webhook",
- "version": "0.0.1",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "example-webhook",
- "version": "0.0.1",
- "dependencies": {
- "pepr": "^20.0.0"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.19.4",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz",
- "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
- "peer": true,
- "dependencies": {
- "eslint-visitor-keys": "^3.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
- "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
- "peer": true,
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
- "peer": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/js": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz",
- "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==",
- "peer": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@glideapps/ts-necessities": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz",
- "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA=="
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.12",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.12.tgz",
- "integrity": "sha512-NlGesA1usRNn6ctHCZ21M4/dKPgW9Nn1FypRdIKKgZOKzkVV4T1FlK5mBiLhHBCDmEbdQG0idrcXlbZfksJ+RA==",
- "peer": true,
- "dependencies": {
- "@humanwhocodes/object-schema": "^2.0.0",
- "debug": "^4.1.1",
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "peer": true,
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.0.tgz",
- "integrity": "sha512-9S9QrXY2K0L4AGDcSgTi9vgiCcG8VcBv4Mp7/1hDPYoswIy6Z6KO5blYto82BT8M0MZNRWmCFLpCs3HlpYGGdw==",
- "peer": true
- },
- "node_modules/@kubernetes/client-node": {
- "version": "1.0.0-rc3",
- "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-1.0.0-rc3.tgz",
- "integrity": "sha512-bTYMBZXVrjfi98N5EZbrmPtcT9NY+TddunSEc25DcsRF1c5c93e5jT+zFwId19hG8e/ue5deKe7YDQiRYFpMlQ==",
- "dependencies": {
- "@types/js-yaml": "^4.0.1",
- "@types/node": "^20.3.1",
- "@types/node-fetch": "^2.6.3",
- "@types/stream-buffers": "^3.0.3",
- "@types/tar": "^6.1.1",
- "@types/underscore": "^1.8.9",
- "@types/ws": "^8.5.4",
- "byline": "^5.0.0",
- "form-data": "^4.0.0",
- "isomorphic-ws": "^5.0.0",
- "js-yaml": "^4.1.0",
- "jsonpath-plus": "^7.2.0",
- "node-fetch": "^2.6.9",
- "openid-client": "^5.4.2",
- "rfc4648": "^1.3.0",
- "stream-buffers": "^3.0.2",
- "tar": "^6.1.11",
- "tmp-promise": "^3.0.2",
- "tslib": "^2.5.0",
- "underscore": "^1.9.1",
- "url-parse": "^1.4.3",
- "ws": "^8.13.0"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "peer": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "peer": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "peer": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@opentelemetry/api": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz",
- "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/@types/js-yaml": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
- "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.14",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz",
- "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==",
- "peer": true
- },
- "node_modules/@types/node": {
- "version": "20.9.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz",
- "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==",
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@types/node-fetch": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.9.tgz",
- "integrity": "sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==",
- "dependencies": {
- "@types/node": "*",
- "form-data": "^4.0.0"
- }
- },
- "node_modules/@types/ramda": {
- "version": "0.29.9",
- "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.29.9.tgz",
- "integrity": "sha512-X3yEG6tQCWBcUAql+RPC/O1Hm9BSU+MXu2wJnCETuAgUlrEDwTA1kIOdEEE4YXDtf0zfQLHa9CCE7WYp9kqPIQ==",
- "dependencies": {
- "types-ramda": "^0.29.6"
- }
- },
- "node_modules/@types/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==",
- "peer": true
- },
- "node_modules/@types/stream-buffers": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.7.tgz",
- "integrity": "sha512-azOCy05sXVXrO+qklf0c/B07H/oHaIuDDAiHPVwlk3A9Ek+ksHyTeMajLZl3r76FxpPpxem//4Te61G1iW3Giw==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/tar": {
- "version": "6.1.9",
- "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.9.tgz",
- "integrity": "sha512-T3+O+OQd9cdGmOXuKQY9+B0ceZHRlGVPQ7M5QZqkaPyP/vWnxPXM2aCegq8GP/n1n9dBfq2EBUqCSKKjQAVOPA==",
- "dependencies": {
- "@types/node": "*",
- "minipass": "^4.0.0"
- }
- },
- "node_modules/@types/underscore": {
- "version": "1.11.14",
- "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.14.tgz",
- "integrity": "sha512-13RYuwqoXZgLO3Nu4zsISqYAexCILtKIMGx+7+vY6gEsGFjrcHU57iDxPmaA2E5d4v5NwebNweiXLbaZWHWI9A=="
- },
- "node_modules/@types/urijs": {
- "version": "1.19.25",
- "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz",
- "integrity": "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg=="
- },
- "node_modules/@types/ws": {
- "version": "8.5.9",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz",
- "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz",
- "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==",
- "peer": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.5.1",
- "@typescript-eslint/scope-manager": "6.7.3",
- "@typescript-eslint/type-utils": "6.7.3",
- "@typescript-eslint/utils": "6.7.3",
- "@typescript-eslint/visitor-keys": "6.7.3",
- "debug": "^4.3.4",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.4",
- "natural-compare": "^1.4.0",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz",
- "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==",
- "peer": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "6.7.3",
- "@typescript-eslint/types": "6.7.3",
- "@typescript-eslint/typescript-estree": "6.7.3",
- "@typescript-eslint/visitor-keys": "6.7.3",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz",
- "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==",
- "peer": true,
- "dependencies": {
- "@typescript-eslint/types": "6.7.3",
- "@typescript-eslint/visitor-keys": "6.7.3"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz",
- "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==",
- "peer": true,
- "dependencies": {
- "@typescript-eslint/typescript-estree": "6.7.3",
- "@typescript-eslint/utils": "6.7.3",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz",
- "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==",
- "peer": true,
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz",
- "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==",
- "peer": true,
- "dependencies": {
- "@typescript-eslint/types": "6.7.3",
- "@typescript-eslint/visitor-keys": "6.7.3",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "semver": "^7.5.4",
- "ts-api-utils": "^1.0.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz",
- "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==",
- "peer": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@types/json-schema": "^7.0.12",
- "@types/semver": "^7.5.0",
- "@typescript-eslint/scope-manager": "6.7.3",
- "@typescript-eslint/types": "6.7.3",
- "@typescript-eslint/typescript-estree": "6.7.3",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "6.7.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz",
- "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==",
- "peer": true,
- "dependencies": {
- "@typescript-eslint/types": "6.7.3",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^16.0.0 || >=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "dependencies": {
- "event-target-shim": "^5.0.0"
- },
- "engines": {
- "node": ">=6.5"
- }
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "peer": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "peer": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/atomic-sleep": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
- "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/bintrees": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz",
- "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw=="
- },
- "node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "peer": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browser-or-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz",
- "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg=="
- },
- "node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "node_modules/byline": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
- "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/collection-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz",
- "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg=="
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/commander": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz",
- "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==",
- "peer": true,
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- },
- "node_modules/cross-fetch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
- "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
- "dependencies": {
- "node-fetch": "^2.6.12"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "peer": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/dateformat": {
- "version": "4.6.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
- "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "peer": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "peer": true
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "peer": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "peer": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/esbuild": {
- "version": "0.19.4",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz",
- "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==",
- "hasInstallScript": true,
- "peer": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/android-arm": "0.19.4",
- "@esbuild/android-arm64": "0.19.4",
- "@esbuild/android-x64": "0.19.4",
- "@esbuild/darwin-arm64": "0.19.4",
- "@esbuild/darwin-x64": "0.19.4",
- "@esbuild/freebsd-arm64": "0.19.4",
- "@esbuild/freebsd-x64": "0.19.4",
- "@esbuild/linux-arm": "0.19.4",
- "@esbuild/linux-arm64": "0.19.4",
- "@esbuild/linux-ia32": "0.19.4",
- "@esbuild/linux-loong64": "0.19.4",
- "@esbuild/linux-mips64el": "0.19.4",
- "@esbuild/linux-ppc64": "0.19.4",
- "@esbuild/linux-riscv64": "0.19.4",
- "@esbuild/linux-s390x": "0.19.4",
- "@esbuild/linux-x64": "0.19.4",
- "@esbuild/netbsd-x64": "0.19.4",
- "@esbuild/openbsd-x64": "0.19.4",
- "@esbuild/sunos-x64": "0.19.4",
- "@esbuild/win32-arm64": "0.19.4",
- "@esbuild/win32-ia32": "0.19.4",
- "@esbuild/win32-x64": "0.19.4"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz",
- "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==",
- "peer": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.50.0",
- "@humanwhocodes/config-array": "^0.11.11",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "peer": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "peer": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "peer": true,
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "peer": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "peer": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "peer": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/fast-copy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz",
- "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA=="
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "peer": true
- },
- "node_modules/fast-glob": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
- "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
- "peer": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "peer": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-patch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz",
- "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ=="
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "peer": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "peer": true
- },
- "node_modules/fast-redact": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz",
- "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/fast-safe-stringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
- "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
- },
- "node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "peer": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "peer": true,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "peer": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "peer": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
- "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
- "peer": true,
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
- "peer": true
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "peer": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "13.23.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
- "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
- "peer": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "peer": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "peer": true
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/help-me": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
- "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-status-codes": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
- "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA=="
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "peer": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "peer": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "peer": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "peer": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "peer": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-url": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
- "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "peer": true
- },
- "node_modules/isomorphic-ws": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz",
- "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==",
- "peerDependencies": {
- "ws": "*"
- }
- },
- "node_modules/jose": {
- "version": "4.15.4",
- "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.4.tgz",
- "integrity": "sha512-W+oqK4H+r5sITxfxpSU+MMdr/YSWGvgZMQDIsNoBDGGy4i7GBPTtvFKibQzW06n3U3TqHjhvBJsirShsEJ6eeQ==",
- "funding": {
- "url": "https://github.com/sponsors/panva"
- }
- },
- "node_modules/joycon": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
- "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/js-base64": {
- "version": "3.7.5",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz",
- "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "peer": true
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "peer": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "peer": true
- },
- "node_modules/jsonpath-plus": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz",
- "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "peer": true,
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/kubernetes-fluent-client": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/kubernetes-fluent-client/-/kubernetes-fluent-client-1.9.0.tgz",
- "integrity": "sha512-MbR4stfoaj4gB+JcrYk6vBZzWrTWRnD9iX1JfVRo7sXQpoknPcsm/9YvLeRLblXtvuGOzE3vZZ21MOGQ3+creA==",
- "dependencies": {
- "@kubernetes/client-node": "1.0.0-rc3",
- "byline": "5.0.0",
- "fast-json-patch": "3.1.1",
- "http-status-codes": "2.3.0",
- "node-fetch": "2.7.0",
- "quicktype-core": "23.0.80",
- "type-fest": "4.8.2",
- "yargs": "17.7.2"
- },
- "bin": {
- "kubernetes-fluent-client": "dist/cli.js"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
- "node_modules/kubernetes-fluent-client/node_modules/type-fest": {
- "version": "4.8.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.8.2.tgz",
- "integrity": "sha512-mcvrCjixA5166hSrUoJgGb9gBQN4loMYyj9zxuMs/66ibHNEFd5JXMw37YVDx58L4/QID9jIzdTBB4mDwDJ6KQ==",
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "peer": true,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "peer": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "peer": true
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "peer": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "peer": true,
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minipass": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz",
- "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "peer": true
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "peer": true
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
- "peer": true,
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/object-hash": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
- "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/oidc-token-hash": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz",
- "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==",
- "engines": {
- "node": "^10.13.0 || >=12.0.0"
- }
- },
- "node_modules/on-exit-leak-free": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
- "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/openid-client": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.1.tgz",
- "integrity": "sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ==",
- "dependencies": {
- "jose": "^4.15.1",
- "lru-cache": "^6.0.0",
- "object-hash": "^2.2.0",
- "oidc-token-hash": "^5.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/panva"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "peer": true,
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "peer": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "peer": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "peer": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pepr": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/pepr/-/pepr-20.0.0.tgz",
- "integrity": "sha512-Pb84L0VkK5xtqBzZKjjD6xBJiMnypmvuqPpomL46hANeI0ks81rcWziFupQS4UiLnHcN2H32Il/bCYyzj5vFbQ==",
- "dependencies": {
- "@types/ramda": "0.29.9",
- "express": "4.18.2",
- "fast-json-patch": "3.1.1",
- "kubernetes-fluent-client": "1.9.0",
- "pino": "8.17.1",
- "pino-pretty": "10.3.0",
- "prom-client": "15.0.0",
- "ramda": "0.29.1"
- },
- "bin": {
- "pepr": "dist/cli.js"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "@typescript-eslint/eslint-plugin": "6.7.3",
- "@typescript-eslint/parser": "6.7.3",
- "commander": "11.0.0",
- "esbuild": "0.19.4",
- "eslint": "8.50.0",
- "node-forge": "1.3.1",
- "prettier": "3.0.3",
- "prompts": "2.4.2",
- "typescript": "5.2.2",
- "uuid": "9.0.1"
- }
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "peer": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pino": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz",
- "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==",
- "dependencies": {
- "atomic-sleep": "^1.0.0",
- "fast-redact": "^3.1.1",
- "on-exit-leak-free": "^2.1.0",
- "pino-abstract-transport": "v1.1.0",
- "pino-std-serializers": "^6.0.0",
- "process-warning": "^2.0.0",
- "quick-format-unescaped": "^4.0.3",
- "real-require": "^0.2.0",
- "safe-stable-stringify": "^2.3.1",
- "sonic-boom": "^3.7.0",
- "thread-stream": "^2.0.0"
- },
- "bin": {
- "pino": "bin.js"
- }
- },
- "node_modules/pino-abstract-transport": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz",
- "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==",
- "dependencies": {
- "readable-stream": "^4.0.0",
- "split2": "^4.0.0"
- }
- },
- "node_modules/pino-pretty": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.3.0.tgz",
- "integrity": "sha512-JthvQW289q3454mhM3/38wFYGWPiBMR28T3CpDNABzoTQOje9UKS7XCJQSnjWF9LQGQkGd8D7h0oq+qwiM3jFA==",
- "dependencies": {
- "colorette": "^2.0.7",
- "dateformat": "^4.6.3",
- "fast-copy": "^3.0.0",
- "fast-safe-stringify": "^2.1.1",
- "help-me": "^5.0.0",
- "joycon": "^3.1.1",
- "minimist": "^1.2.6",
- "on-exit-leak-free": "^2.1.0",
- "pino-abstract-transport": "^1.0.0",
- "pump": "^3.0.0",
- "readable-stream": "^4.0.0",
- "secure-json-parse": "^2.4.0",
- "sonic-boom": "^3.0.0",
- "strip-json-comments": "^3.1.1"
- },
- "bin": {
- "pino-pretty": "bin.js"
- }
- },
- "node_modules/pino-std-serializers": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz",
- "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA=="
- },
- "node_modules/pluralize": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
- "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "peer": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prettier": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
- "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
- "peer": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/process-warning": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.3.0.tgz",
- "integrity": "sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g=="
- },
- "node_modules/prom-client": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.0.0.tgz",
- "integrity": "sha512-UocpgIrKyA2TKLVZDSfm8rGkL13C19YrQBAiG3xo3aDFWcHedxRxI3z+cIcucoxpSO0h5lff5iv/SXoxyeopeA==",
- "dependencies": {
- "@opentelemetry/api": "^1.4.0",
- "tdigest": "^0.1.1"
- },
- "engines": {
- "node": "^16 || ^18 || >=20"
- }
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "peer": true,
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
- "peer": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/querystringify": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
- "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "peer": true
- },
- "node_modules/quick-format-unescaped": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
- "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="
- },
- "node_modules/quicktype-core": {
- "version": "23.0.80",
- "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.80.tgz",
- "integrity": "sha512-dd+aJRzAl3MzkaXJMjUu0j60y82gwX/RRr3EvW/aScQKycvkgwliNDN2tIiLB06EKBzjgC9mtlMqKyRg2rYKhQ==",
- "dependencies": {
- "@glideapps/ts-necessities": "2.1.3",
- "@types/urijs": "^1.19.19",
- "browser-or-node": "^2.1.1",
- "collection-utils": "^1.0.1",
- "cross-fetch": "^4.0.0",
- "is-url": "^1.2.4",
- "js-base64": "^3.7.5",
- "lodash": "^4.17.21",
- "pako": "^1.0.6",
- "pluralize": "^8.0.0",
- "readable-stream": "4.4.2",
- "unicode-properties": "^1.4.1",
- "urijs": "^1.19.1",
- "wordwrap": "^1.0.0",
- "yaml": "^2.3.1"
- }
- },
- "node_modules/ramda": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.1.tgz",
- "integrity": "sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/ramda"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/readable-stream": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz",
- "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==",
- "dependencies": {
- "abort-controller": "^3.0.0",
- "buffer": "^6.0.3",
- "events": "^3.3.0",
- "process": "^0.11.10",
- "string_decoder": "^1.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/real-require": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
- "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
- "engines": {
- "node": ">= 12.13.0"
- }
- },
- "node_modules/require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "peer": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rfc4648": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.3.tgz",
- "integrity": "sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ=="
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rimraf/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "peer": true,
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safe-stable-stringify": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
- "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/secure-json-parse": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz",
- "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="
- },
- "node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "peer": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "peer": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "peer": true
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sonic-boom": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz",
- "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==",
- "dependencies": {
- "atomic-sleep": "^1.0.0"
- }
- },
- "node_modules/split2": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
- "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
- "engines": {
- "node": ">= 10.x"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/stream-buffers": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz",
- "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==",
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "peer": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tar": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
- "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/tar/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tdigest": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz",
- "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==",
- "dependencies": {
- "bintrees": "1.0.2"
- }
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "peer": true
- },
- "node_modules/thread-stream": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz",
- "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==",
- "dependencies": {
- "real-require": "^0.2.0"
- }
- },
- "node_modules/tiny-inflate": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
- "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="
- },
- "node_modules/tmp": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
- "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
- "dependencies": {
- "rimraf": "^3.0.0"
- },
- "engines": {
- "node": ">=8.17.0"
- }
- },
- "node_modules/tmp-promise": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
- "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
- "dependencies": {
- "tmp": "^0.2.0"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "peer": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "node_modules/ts-api-utils": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
- "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
- "peer": true,
- "engines": {
- "node": ">=16.13.0"
- },
- "peerDependencies": {
- "typescript": ">=4.2.0"
- }
- },
- "node_modules/ts-toolbelt": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz",
- "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w=="
- },
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "peer": true,
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/types-ramda": {
- "version": "0.29.6",
- "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.29.6.tgz",
- "integrity": "sha512-VJoOk1uYNh9ZguGd3eZvqkdhD4hTGtnjRBUx5Zc0U9ftmnCgiWcSj/lsahzKunbiwRje1MxxNkEy1UdcXRCpYw==",
- "dependencies": {
- "ts-toolbelt": "^9.6.0"
- }
- },
- "node_modules/typescript": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/underscore": {
- "version": "1.13.6",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz",
- "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A=="
- },
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
- },
- "node_modules/unicode-properties": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz",
- "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==",
- "dependencies": {
- "base64-js": "^1.3.0",
- "unicode-trie": "^2.0.0"
- }
- },
- "node_modules/unicode-trie": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz",
- "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==",
- "dependencies": {
- "pako": "^0.2.5",
- "tiny-inflate": "^1.0.0"
- }
- },
- "node_modules/unicode-trie/node_modules/pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "peer": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/urijs": {
- "version": "1.19.11",
- "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz",
- "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="
- },
- "node_modules/url-parse": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
- "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
- "dependencies": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "peer": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "peer": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="
- },
- "node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- },
- "node_modules/ws": {
- "version": "8.14.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
- "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/y18n": {
- "version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/yaml": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
- "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
-}
diff --git a/examples/component-webhooks/package.json b/examples/component-webhooks/package.json
deleted file mode 100644
index 8d91530a8b..0000000000
--- a/examples/component-webhooks/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "name": "example-webhook",
- "version": "0.0.1",
- "description": "",
- "keywords": [
- "pepr",
- "k8s",
- "policy-engine",
- "pepr-module",
- "security"
- ],
- "engines": {
- "node": ">=18.0.0"
- },
- "pepr": {
- "name": "example-webhook",
- "uuid": "cb5693ef-d13c-5fe1-b5ad-c870fd911b3b",
- "onError": "ignore",
- "alwaysIgnore": {
- "namespaces": [],
- "labels": []
- }
- },
- "scripts": {
- "k3d-setup": "k3d cluster delete pepr-dev && k3d cluster create pepr-dev --k3s-arg '--debug@server:0'"
- },
- "dependencies": {
- "pepr": "^20.0.0"
- }
-}
diff --git a/examples/component-webhooks/pepr-module-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b.yaml b/examples/component-webhooks/pepr-module-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b.yaml
deleted file mode 100644
index a08428e469..0000000000
--- a/examples/component-webhooks/pepr-module-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b.yaml
+++ /dev/null
@@ -1,279 +0,0 @@
-apiVersion: v1
-kind: Namespace
-metadata:
- name: pepr-system
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
-rules:
- - apiGroups:
- - '*'
- resources:
- - '*'
- verbs:
- - create
- - delete
- - get
- - list
- - patch
- - update
- - watch
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
-roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
-subjects:
- - kind: ServiceAccount
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- namespace: pepr-system
----
-apiVersion: v1
-kind: ServiceAccount
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- namespace: pepr-system
----
-apiVersion: v1
-kind: Secret
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-api-token
- namespace: pepr-system
-type: Opaque
-data:
- value: >-
- NTkwMzFlMGU3MzJmYTg0ZjE5OTlmZGMzMWExZjY0MWUwZDAyYWMzZjE0NzU2MTUyMmFmYTAzMmI1YzRjM2M2Yg==
----
-apiVersion: v1
-kind: Secret
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-tls
- namespace: pepr-system
-type: kubernetes.io/tls
-data:
- tls.crt: >-
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDd3pDQ0FhdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURBQU1CNFhEVEl6TVRFeE16RTNOREEwDQpObG9YRFRJME1URXhNekUzTkRBME5sb3dBRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DDQpnZ0VCQUtHbWEyVHZNUmdMc01kL2FneFJua0hEeGgxL1YvNFN0Z2VHUkJLK1ZkV01TZlNIdE5UTXFTT2NUeW5vDQo4Z2ZFbnJNQ1ZPWXFqek03YkdEMU9pcGorRktGSkxJcGpaak1HRnhnR2VBSTBwVThTak1HcWMyazRKZ1N5ZDNPDQo5dmZxUk1adjNqd2pJeGMvekxiYzFBZjNKS3NlQTlYc2FzN3R6VmhjSFc0RFVPQnhpNTNLVHBDQzhWbFJoZmI2DQo2THBPVUFueW9pRGU2ZGZ1KzRIeXUzNlZuLzJKNFlMeXdwTXF6RCtzWUxCWXdrcTRiaTZzVk9XeWlsWXFnd2V4DQpmVG9Lbk1xZlExbm4wTVZrb0FkLy9FUXBFKzE1NTVFcTlrUmt4cW5wYzllUlNjT2JOWGxjdng4eDdOaG1GR2xRDQpZQ0hYQVlJZ2xKT01LMzUrZXNnOHNPeEkvUXNDQXdFQUFhTklNRVl3UkFZRFZSMFJCRDB3TzRJNWNHVndjaTFqDQpZalUyT1RObFppMWtNVE5qTFRWbVpURXRZalZoWkMxak9EY3dabVE1TVRGaU0ySXVjR1Z3Y2kxemVYTjBaVzB1DQpjM1pqTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCVDZsYnRQalpnSU9vTHE1SnRMYkphODB6L293QTNoTFZLDQpSMFN4S2xxSjAvdElmb3FKMmZTNTdtT0NFZFJhR2dlK2l3am0zL2xWWnY4QzNRWnB0Yy9sV3FqdU1hTkxUWmQ4DQoveG1vckFiVE5RdElkVXMrRGpPeTlBbDRiU080eG0zUG9VUk0yK1JSdUF5eEZhME9hZjJoTlBMQ1RjOU1qWTBQDQp5VTZNdWFTZ1FpZGlRSExKYzRrT1N5T3Q4ODRxWlZYeHFCRWRidVN0dVRWeDZnY1NjWlNCNXlvaFY0K0JJaEtPDQpNc1E1alEzTlRpQjgrSU1FSHh4KzhZSWhaQjVzYnFPRnl6TTBuaFFMVWVnc01GLzFqYU5LaDNQMDY1OUMxK0Y1DQoyRjRDeVJRN1hlcmJPVEZPbElXY215aU1VUVdpcGNvS0hIYldkNWNNbUg0VWd4QjJqeGtWDQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQo=
- tls.key: >-
- LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ0KTUlJRXBBSUJBQUtDQVFFQW9hWnJaTzh4R0F1d3gzOXFERkdlUWNQR0hYOVgvaEsyQjRaRUVyNVYxWXhKOUllMA0KMU15cEk1eFBLZWp5QjhTZXN3SlU1aXFQTXp0c1lQVTZLbVA0VW9Va3NpbU5tTXdZWEdBWjRBalNsVHhLTXdhcA0KemFUZ21CTEozYzcyOStwRXhtL2VQQ01qRnovTXR0elVCL2NrcXg0RDFleHF6dTNOV0Z3ZGJnTlE0SEdMbmNwTw0Ka0lMeFdWR0Y5dnJvdWs1UUNmS2lJTjdwMSs3N2dmSzdmcFdmL1luaGd2TENreXJNUDZ4Z3NGakNTcmh1THF4VQ0KNWJLS1ZpcURCN0Y5T2dxY3lwOURXZWZReFdTZ0IzLzhSQ2tUN1hubmtTcjJSR1RHcWVsejE1Rkp3NXMxZVZ5Lw0KSHpIczJHWVVhVkJnSWRjQmdpQ1VrNHdyZm41NnlEeXc3RWo5Q3dJREFRQUJBb0lCQURLeDUxSkROVWxPT1VXSA0KYnZHb0V4S2EzQ0hhRXZWcVZzM3JUS1A0THlFR214Ym1ERThFVkRNSHpVZmVkekQ2ZDY2NkYzZ0xkdGRoVm03ZA0KMlR6OEZ4K0NBKzBmM1BsRFlJeHYwdzJRbHNJWW8waDNXWDlWcXQzbVhvcUNZcStETjhobnd2Rm5MNVVWL0JTSg0KRXJIZ3p3NGZIcUxUUHZmZ1doclE0S1hrd2xOd3FOQWRLS2grR29JK0h5NkZHNFhORWhoNXdLc052VGQ1YXVnVg0KUDVRbXptRUhIajdhQTU4WmE4cFdrZUU3VVBxTnRjYnBrR3dLOVJZdFlBSzd2bDEyTHdwT1M4Vm4zKzZHMGRKWA0KcXhhQ080QmZ0UEpHYTFsbENUa2RtSlJMcm5BZE8zZVhuRS94OEhpUlR3d25vMDlTNi9iL3krZXgrQ0twcC8vaA0KdGZ1cThCa0NnWUVBd1hxc29mOTlJUjhHL05ZS2lEWkNKWmMxSnJkQ011bzdNYUtINENUT09ReG1XZEo4dHM5OQ0Ka1VwZVE1NU5oWXJSRXZFNVpCcEkvR29YUmxWNFFHbjdlRWdJdUNmcGRsVXp0a2xkbWp2cGd1UXZ4RnhGSXlpUg0KRUpGb1IxbmVPWkd0YjNScFp3ekF2VXdQY05XdTlHN2ZvUUF0MG01VEhxcm02eDl4OTNFRW9aVUNnWUVBMWVLNA0KaG1UNFg2L2dhOHpZL0IveWFLNmFpdFhDVTczdFdvYWVsdFBUbWh5VDVxMFZHUjJINXZrY3I5L3JqREZ0ajdoZQ0KZS8yblM1SEtpem8zaDZmb2JLSm9icUEzdFFYWkpZUGZsQU9zVVBnMTJ4YkRXaXJJQ0dBamxoRG9zMDIvQzVrNA0KbVM3WnFIeGNVdEk4ZitjTmdjbzdLZnRNZ2dOdnhRekFjQm5RdkI4Q2dZRUFzcUhzbVhVbHRsckxQTXp4MUdraw0KRVVqV0RmVE03ZTFNMGJyWjhKeUt1aWswcG1Hc082eStwbElmVGhidVJBbXlsdWFZc2srQ2Eyb1lLeHZtZHJKag0KTnQ1ckRudnJGUkg5T0tQc0ErYWs1ZkNBR2ErSE5iclNsSlZyemRTdlZEK24vV3RobFg4MHhKRmhBRENKNDZ3cQ0KVkoreHJzT2xnbjhQeksydnIyRnRnVEVDZ1lFQWx2UXk0N2R6aktVbXNTNmNuaVUyQXlmb0xzQjdMSHRKZjdDdg0KVVNnam1nczlYM3NjL3VMV3ZlOW5qY0Z1RHozN1k0bnVOWGhxa0cxUEZFQjhYS1BtNkhVZlc2UjhiS2k1L3o0NQ0KbDgrWDJIVzJIUERONDE5NldsN3Yvc1BrV0ZndzA5REtIMkx2ZjNoMStJWWs2T2g3b2ZUSEdQUWhwVWtqbzJGQw0KbUZ1LzlHVUNnWUJIellZdXZRd011c1ArSndBbWJ1d3NXMWthbllmTTY4OVcvcUpOYXBEQTc2UEJPbWljQ05tdw0KSWdMMTh4bjZCcStWQkFETWQzb1ZzNFFuNWM2TXg2SkVERHAwT09pazVrNjhpQTZHK084L2pRaVR1STZLNWNUSw0KQzgxalhsSWo0QzgxWUlCRWxPS3d4LzUyeGxhM0lRbDJ5QWVKWlhUVWx4WUdxMjc0KzdCT1F3PT0NCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tDQo=
----
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- namespace: pepr-system
- labels:
- app: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
-spec:
- replicas: 2
- selector:
- matchLabels:
- app: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- template:
- metadata:
- labels:
- app: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- spec:
- priorityClassName: system-node-critical
- serviceAccountName: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- containers:
- - name: server
- image: ghcr.io/defenseunicorns/pepr/controller:v0.15.0
- imagePullPolicy: IfNotPresent
- command:
- - node
- - /app/node_modules/pepr/dist/controller.js
- - b947b4974c9919a3983673269d19f548e2d8a99db04d9401a53eb9f0bcc71ff0
- readinessProbe:
- httpGet:
- path: /healthz
- port: 3000
- scheme: HTTPS
- livenessProbe:
- httpGet:
- path: /healthz
- port: 3000
- scheme: HTTPS
- ports:
- - containerPort: 3000
- resources:
- requests:
- memory: 64Mi
- cpu: 100m
- limits:
- memory: 256Mi
- cpu: 500m
- env:
- - name: PEPR_PRETTY_LOG
- value: 'false'
- - name: LOG_LEVEL
- value: debug
- volumeMounts:
- - name: tls-certs
- mountPath: /etc/certs
- readOnly: true
- - name: api-token
- mountPath: /app/api-token
- readOnly: true
- - name: module
- mountPath: /app/load
- readOnly: true
- volumes:
- - name: tls-certs
- secret:
- secretName: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-tls
- - name: api-token
- secret:
- secretName: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-api-token
- - name: module
- secret:
- secretName: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-module
----
-apiVersion: v1
-kind: Service
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- namespace: pepr-system
-spec:
- selector:
- app: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- ports:
- - port: 443
- targetPort: 3000
----
-apiVersion: v1
-kind: Service
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-watcher
- namespace: pepr-system
-spec:
- selector:
- app: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-watcher
- ports:
- - port: 443
- targetPort: 3000
----
-apiVersion: v1
-kind: Secret
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-module
- namespace: pepr-system
-type: Opaque
-data:
- module-b947b4974c9919a3983673269d19f548e2d8a99db04d9401a53eb9f0bcc71ff0.js.gz: >-
- H4sIAAAAAAAAE61WXW/bNhR9769guSKRBkq1EWRLZShekW1Ft34haRFggYdQ4pXNWiY1kornqfrvu6TsxF2TrQ97sEyRl/fjnHNJ3XBDFvnb4iOULhVQSQXvjG7AuM3kBtdEHimm4/x0gf9U8RVQ1t3wuoVMs1KrSs5bw4sassejPg5bitzAH600ENEGGkOH2Trv/O6Mwp981dSQrKFYaL2k7AaMlVpldJSO0jFlAmxpZOPCHGVL2Ky1ETa7Gtwxujyx+Gx0LctNAmqOOft3XExWWrS1f7NQtka6DZ2xwcJmndIC45/m4xMMNKI981uyh9JqWykyWhbH3z07gioR46MyOa5gnBTHXCTlyfejSjwbj4ujgjKtfjJGm4zKudIG4/N6zTf2ZXgbItiGl5jE1YzVvIDaj/qeDZVibnR5JBILrm1o5sekrFvrAAmAGhyQUJ2AG3JwQPaXSwN8fzlJlkc24WZODhOcKNr5DxYMQpyNDrFiAQ0oAaqUHpBQP/0dUT/2ePSBKHcvfatcwZq49Iw3vJA1Ihs9BNxn/D0nVvplsjUj5a0D4jSxC70m/rfdbQlyvSRr6RbkN24qgqgt+RwQhqbWmxUoZ1PK9gGlf6EdnfUxa3LqwLq7TLrLBahs2eeryTJyKU8vAPFycfrSngXcxFvzoRF+EOGkerNzGw1O4/QSE3nl+UIwhkySIZNEqkqjwevW4fZI5acd8kR0rtJzvmbADLP54/HEmU1ncu50EekUI/HwiP3iqC+5Kxe4vLfS+w2Q/3Lx9k3acGMhMvFgF/G4cwuDWHkmgt6i65+5rEF4JIMxcQsgNhR55zIjTzreX8d9hTt8kpzoisA0HSoBcaZXjVYe2un0ahbz1GJNrc3znP4YTKSa04MDRPCVnqe+8Oj6PQYqd/t8gNRz0hNpCTaewcl6syUNd1/HDNJb88st19P0ik/DvhkOG3zoIohVvAAFhnsFYRKQzm9fp0MOQdgPJ7HglvAaGRYbHAsseCsJVCGeC0g3QSyIdCl5o912EtMkXGlE0KTXcRbdk/CnT/fN5l1/b3lXQzqzvPtcltsTp2EDzBk9b5XyELMvy8/2i8fzokIVrcDxQK53w4a/OI4nnrDHo+memPLCaR4FLVlnMISsNhHaZvs2XyzjMc7tRpWkalXp45Iq3AEdX3PpSBuNR/HE6wjyoU2Y2cncG0Qj5tJfT2yMellKJe6abq+/IE5fgIvUTtsStR2YhUHXw3FK7uQ9x3i7s2AQODl80qn+kEhFbo8DPwf9oVf8P8qSse8An7UdutHsdyPfbzgbszLn9/CpB5lOygeEyve4wnYpd31EL9qyBBAg8GK41y96zcuYmf+gjiPLHul/x/l509R4Ou9kspWbujs0M8CLIKyE515UVFiHnVEOt/nXctOGI/R/oKcXUYVXdw3QPFfibMHVHC4ChngL3aqxRdl0GKE1KhyF+L2yksibzk/xAn0vV6BbF2mmvh3DURyj03brFL34DUX6Di+21+FTIarZ1WoWTx49ffoNsbrF2l/zpsG0Ppy/ysO1+jWfAOlHm6548+hvWNCUW08JAAA=
----
-apiVersion: apiextensions.k8s.io/v1
-kind: CustomResourceDefinition
-metadata:
- name: peprstores.pepr.dev
-spec:
- group: pepr.dev
- versions:
- - name: v1
- served: true
- storage: true
- schema:
- openAPIV3Schema:
- type: object
- properties:
- data:
- type: object
- additionalProperties:
- type: string
- scope: Namespaced
- names:
- plural: peprstores
- singular: peprstore
- kind: PeprStore
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-store
- namespace: pepr-system
-rules:
- - apiGroups:
- - pepr.dev
- resources:
- - peprstores
- resourceNames:
- - ''
- verbs:
- - create
- - get
- - patch
- - watch
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-store
- namespace: pepr-system
-roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: Role
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-store
-subjects:
- - kind: ServiceAccount
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b-store
- namespace: pepr-system
----
-apiVersion: admissionregistration.k8s.io/v1
-kind: MutatingWebhookConfiguration
-metadata:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
-webhooks:
- - name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b.pepr.dev
- admissionReviewVersions:
- - v1
- - v1beta1
- clientConfig:
- caBundle: >-
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDdERDQ0FaeWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURBY01Sb3dHQVlEVlFRREV4RlFaWEJ5DQpJRVZ3YUdWdFpYSmhiQ0JEUVRBZUZ3MHlNekV4TVRNeE56UXdORFZhRncweU5ERXhNVE14TnpRd05EVmFNQUF3DQpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEUWIvRkh4TzVlWmUxenZOYTVKUTM5DQp0ZXR2RENXS0duWXRpZlVwTElXR1RKUkhnUnlVY1ArMUdXa3BjK1kzUUhpaGZJOFJLK0w1OVhiTjdTUDR2bFBkDQp1d001M05nYi93b3RkTWd6bG04a243eFR1Y1pTTGs4dUtRZi8wMTUzSVE1OTNhVThRbW9LZ09oMWNNTFNHM29DDQpYZDJmdGk5YTc5dFNwSW5XeVdkaE1hVVIxTGJvSTlMOGR0M2l5bVpMR2pxdlNEOVIvWlRiUVJXMTNENVd0ZnZYDQpVY0hqaVZPZmg3Si9Ga2U4ZzJxZjEvTml2NDZ1M0tacnN4Z1lMQ3pRSDcwdnhjMWZndmx6YnY5SG0xOFQ0bVZjDQpKK2t5cXptNHpjdkV2ZlIzUzJVQmlZZUQxZVZKcTVDdnZ2STlIT25YY3RXTWdpdVRFSE8xb3kzSEQwLytUK1p4DQpBZ01CQUFHakhUQWJNQXdHQTFVZEV3UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnTDBNQTBHQ1NxR1NJYjNEUUVCDQpDd1VBQTRJQkFRQjRmekRLc3hvU3VBcVMrZWhlSUNzek1EdHlrSUp4OTB3RE5lVUQ5NkJSSFN3OHdkZ0NuOThnDQozdEwyeHZ3eloyY0xDUW5mUjhBMHdEU0Q4cWEyTDh2cXVnczZBQ0JSQm9DRFAyOWEySklOQ2RITzdBSnkvVHpvDQp4dTFxeWQ3K2xKUFB4enFHYk9GSGJ5NGhLTi9PSm13NWdrNENENWtPVXJWNzMwbXpxLzNub21SUlJON3JNVUI1DQpaZzl0YzVwNStWNGE0UFpTWDdTZ0J1WDdVTHdOUDFVVWhlTzB1N2pIeDZGdVdUczlhYkdBemM1dUVjYzd3bndlDQp0WWJRYU04YnlzdmM0L2tqL2YrMjFaMld2Z0RqWGJxSDRTcEF3WUQzY2JpQUtWVDU1SkhrUFQ1a0tsVXFVQUZpDQp4c2QzbE9jeE5ndEpueEI1WUVFYXBzWXFqYnBGTWtmNA0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ0K
- service:
- name: pepr-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b
- namespace: pepr-system
- path: >-
- /mutate/59031e0e732fa84f1999fdc31a1f641e0d02ac3f147561522afa032b5c4c3c6b
- failurePolicy: Ignore
- matchPolicy: Equivalent
- timeoutSeconds: 10
- namespaceSelector:
- matchExpressions:
- - key: pepr.dev
- operator: NotIn
- values:
- - ignore
- - key: kubernetes.io/metadata.name
- operator: NotIn
- values:
- - kube-system
- - pepr-system
- objectSelector:
- matchExpressions:
- - key: pepr.dev
- operator: NotIn
- values:
- - ignore
- - key: kubernetes.io/metadata.name
- operator: NotIn
- values:
- - kube-system
- - pepr-system
- rules:
- - apiGroups:
- - ''
- apiVersions:
- - v1
- operations:
- - CREATE
- - UPDATE
- resources:
- - secrets
- sideEffects: None
diff --git a/examples/component-webhooks/pepr.ts b/examples/component-webhooks/pepr.ts
deleted file mode 100644
index 572e4814c1..0000000000
--- a/examples/component-webhooks/pepr.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { PeprModule } from "pepr";
-// cfg loads your pepr configuration from package.json
-import cfg from "./package.json";
-
-// HelloPepr is a demo capability that is included with Pepr. Comment or delete the line below to remove it.
-import { Webhook } from "./capabilities/hook";
-
-/**
- * This is the main entrypoint for this Pepr module. It is run when the module is started.
- * This is where you register your Pepr configurations and capabilities.
- */
-new PeprModule(cfg, [
- // Your additional capabilities go here
- Webhook,
-]);
diff --git a/examples/component-webhooks/tsconfig.json b/examples/component-webhooks/tsconfig.json
deleted file mode 100644
index 27f5485413..0000000000
--- a/examples/component-webhooks/tsconfig.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "compilerOptions": {
- "allowSyntheticDefaultImports": true,
- "declaration": true,
- "declarationMap": true,
- "emitDeclarationOnly": true,
- "esModuleInterop": true,
- "lib": [
- "ES2022"
- ],
- "module": "CommonJS",
- "moduleResolution": "node",
- "outDir": "dist",
- "resolveJsonModule": true,
- "rootDir": ".",
- "strict": false,
- "target": "ES2022",
- "useUnknownInCatchVariables": false
- },
- "include": [
- "**/*.ts"
- ]
-}
diff --git a/examples/component-webhooks/zarf.yaml b/examples/component-webhooks/zarf.yaml
deleted file mode 100644
index 302453fedf..0000000000
--- a/examples/component-webhooks/zarf.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
-kind: ZarfPackageConfig
-metadata:
- name: component-webhooks
- description: Example Pepr Module for Component Webhooks
- url: https://github.com/defenseunicorns/pepr
- version: 0.0.1
-
-components:
- - name: module
- required: true
- manifests:
- - name: module
- namespace: pepr-system
- files:
- - pepr-module-cb5693ef-d13c-5fe1-b5ad-c870fd911b3b.yaml
- images:
- - ghcr.io/defenseunicorns/pepr/controller:v0.15.0
-
-# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
-# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
-x-mdx: |
- :::caution
-
- Component Webhooks is currently an [Alpha Feature](/roadmap#alpha). This feature is not extensively tested and may be affected by breaking changes in the future. We encourage you to experiment with this feature and provide feedback to the Zarf team as we begin to stabilize this feature.
-
- :::
-
- This example demonstrates how to use webhooks to perform actions during the lifecycle of package deployments. Webhooks are similar to [Component Actions](/ref/actions/) such that they both enable complex functionality to be executed during the lifecycle of a package deployment. The key difference between webhooks and actions is that actions are defined within the package's `zarf.yaml` while webhooks are defined within the cluster that you are deploying your package onto.
-
- This example uses Pepr as a mutating webhook that watches for any updates to a zarf package secret. As `zarf` deploys components, it updates a secret in the `zarf` namespace that 'declares' what components are being deployed. Pepr watches for these updates and runs an example operation for each component that gets deployed to the cluster. Since Pepr is a mutating webhook, as `zarf` updates the package secret for each component that is being deployed, Pepr will modify the secret to denote that a webhook operation is executing for that component. To account for this, every time `zarf` updates the package secret, it will check to see if a webhook has modified the secret and will wait if there are any webhooks in a `Running` state. The webhook itself is responsible for updating the secrets when it's operations complete. `zarf` will poll the secret every second to check if the webhook is complete allowing it to continue deploying the rest of the package.
-
- Webhooks have the potential to be extremely powerful. Since they are written in Javascript, they have the capability to do almost anything that you can do with JavaScript. This includes interacting with the Kubernetes API, interacting with other APIs, or even interacting with other systems. Caution should be exercised when deploying webhooks to clusters as they have the potential to run any time a new package is deployed to the cluster, and future package deployers might not be aware that the cluster has webhooks configured.
-
- :::note
-
- If you want to update the capability yourself, you will need to rebuild the Pepr module before creating the package.
-
- This can be completed by running the following commands:
-
- ```bash
- npm ci
- npx pepr build
- zarf package create ./dist
- ```
-
- :::
diff --git a/examples/dos-games/zarf.yaml b/examples/dos-games/zarf.yaml
index 87042ca58d..f3319f8ea7 100644
--- a/examples/dos-games/zarf.yaml
+++ b/examples/dos-games/zarf.yaml
@@ -15,15 +15,6 @@ components:
- manifests/service.yaml
images:
- ghcr.io/zarf-dev/doom-game:0.0.1
- actions:
- onDeploy:
- after:
- - wait:
- cluster:
- kind: deployment
- name: game
- namespace: dos-games
- condition: available
# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
diff --git a/examples/helm-charts/zarf.yaml b/examples/helm-charts/zarf.yaml
index e5e3757717..dbb2648204 100644
--- a/examples/helm-charts/zarf.yaml
+++ b/examples/helm-charts/zarf.yaml
@@ -56,33 +56,6 @@ components:
- ghcr.io/stefanprodan/podinfo:6.4.0
# This is the cosign signature for the podinfo image for image signature verification
- ghcr.io/stefanprodan/podinfo:sha256-57a654ace69ec02ba8973093b6a786faa15640575fbf0dbb603db55aca2ccec8.sig
- actions:
- onDeploy:
- after:
- - wait:
- cluster:
- kind: deployment
- name: podinfo-local
- namespace: podinfo-from-local-chart
- condition: available
- - wait:
- cluster:
- kind: deployment
- name: podinfo-oci
- namespace: podinfo-from-oci
- condition: available
- - wait:
- cluster:
- kind: deployment
- name: podinfo-git
- namespace: podinfo-from-git
- condition: available
- - wait:
- cluster:
- kind: deployment
- name: cool-release-name-podinfo
- namespace: podinfo-from-repo
- condition: available
# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
diff --git a/examples/manifests/zarf.yaml b/examples/manifests/zarf.yaml
index 092f6ca684..7855f0a02b 100644
--- a/examples/manifests/zarf.yaml
+++ b/examples/manifests/zarf.yaml
@@ -12,17 +12,6 @@ components:
files:
# local manifests are specified relative to the `zarf.yaml` that uses them:
- httpd-deployment.yaml
- actions:
- onDeploy:
- # the following checks were computed by viewing the success state of the package deployment
- # and creating `wait` actions that match
- after:
- - wait:
- cluster:
- kind: deployment
- name: httpd-deployment
- namespace: httpd
- condition: "{.status.readyReplicas}=2"
# image discovery is supported in all manifests and charts using:
# zarf prepare find-images
images:
@@ -38,17 +27,6 @@ components:
- https://k8s.io/examples/application/deployment.yaml@c57f73449b26eae02ca2a549c388807d49ef6d3f2dc040a9bbb1290128d97157
# this sha256 can be discovered using:
# zarf prepare sha256sum https://k8s.io/examples/application/deployment.yaml
- actions:
- onDeploy:
- # the following checks were computed by viewing the success state of the package deployment
- # and creating `wait` actions that match
- after:
- - wait:
- cluster:
- kind: deployment
- name: nginx-deployment
- namespace: nginx
- condition: available
# image discovery is supported in all manifests and charts using:
# zarf prepare find-images
images:
@@ -64,17 +42,6 @@ components:
- github.com/stefanprodan/podinfo//kustomize?ref=6.4.0
# while ?ref= is not a requirement, it is recommended to use a specific commit hash / git tag to
# ensure that the kustomization is not changed in a way that breaks your deployment.
- actions:
- onDeploy:
- # the following checks were computed by viewing the success state of the package deployment
- # and creating `wait` actions that match
- after:
- - wait:
- cluster:
- kind: deployment
- name: podinfo
- namespace: podinfo
- condition: available
# image discovery is supported in all manifests and charts using:
# zarf prepare find-images
images:
diff --git a/examples/podinfo-flux/git/podinfo-kustomization.yaml b/examples/podinfo-flux/git/podinfo-kustomization.yaml
index aa251f98ce..bc72ee0aa0 100644
--- a/examples/podinfo-flux/git/podinfo-kustomization.yaml
+++ b/examples/podinfo-flux/git/podinfo-kustomization.yaml
@@ -12,3 +12,4 @@ spec:
kind: GitRepository
name: podinfo
targetNamespace: podinfo-git
+ wait: true
diff --git a/examples/podinfo-flux/oci/podinfo-kustomization.yaml b/examples/podinfo-flux/oci/podinfo-kustomization.yaml
index 57f290e7b6..7acd41f327 100644
--- a/examples/podinfo-flux/oci/podinfo-kustomization.yaml
+++ b/examples/podinfo-flux/oci/podinfo-kustomization.yaml
@@ -12,3 +12,4 @@ spec:
kind: OCIRepository
name: podinfo
targetNamespace: podinfo-oci
+ wait: true
diff --git a/examples/podinfo-flux/zarf.yaml b/examples/podinfo-flux/zarf.yaml
index 4ab41b360e..16b25e3e59 100644
--- a/examples/podinfo-flux/zarf.yaml
+++ b/examples/podinfo-flux/zarf.yaml
@@ -11,14 +11,14 @@ components:
- name: flux-install
namespace: flux
files:
- - https://github.com/fluxcd/flux2/releases/download/v2.3.0/install.yaml
+ - https://github.com/fluxcd/flux2/releases/download/v2.4.0/install.yaml
images:
- - ghcr.io/fluxcd/helm-controller:v1.0.1
- - ghcr.io/fluxcd/image-automation-controller:v0.38.0
- - ghcr.io/fluxcd/image-reflector-controller:v0.32.0
- - ghcr.io/fluxcd/kustomize-controller:v1.3.0
- - ghcr.io/fluxcd/notification-controller:v1.3.0
- - ghcr.io/fluxcd/source-controller:v1.3.0
+ - ghcr.io/fluxcd/helm-controller:v1.1.0
+ - ghcr.io/fluxcd/image-automation-controller:v0.39.0
+ - ghcr.io/fluxcd/image-reflector-controller:v0.33.0
+ - ghcr.io/fluxcd/kustomize-controller:v1.4.0
+ - ghcr.io/fluxcd/notification-controller:v1.4.0
+ - ghcr.io/fluxcd/source-controller:v1.4.1
- name: podinfo-via-flux-git
description: Example deployment via flux (git) using the famous podinfo example
@@ -33,16 +33,6 @@ components:
- https://github.com/stefanprodan/podinfo.git
images:
- ghcr.io/stefanprodan/podinfo:6.4.0
- actions:
- onDeploy:
- after:
- - description: Podinfo pods to be ready via wait action
- wait:
- cluster:
- kind: pod
- name: app=podinfo
- namespace: podinfo-git
- condition: ready
- name: podinfo-via-flux-helm
description: Example deployment via flux (helm oci) using the famous podinfo example
@@ -57,16 +47,6 @@ components:
- ghcr.io/stefanprodan/podinfo:6.4.0
# Note: this is a helm OCI artifact rather than a container image
- ghcr.io/stefanprodan/charts/podinfo:6.4.0
- actions:
- onDeploy:
- after:
- - description: Podinfo pods to be ready via wait action
- wait:
- cluster:
- kind: pod
- name: app.kubernetes.io/name=podinfo
- namespace: podinfo-helm
- condition: ready
- name: podinfo-via-flux-oci
description: Example deployment via flux (native oci) using the famous podinfo example
@@ -81,17 +61,6 @@ components:
- ghcr.io/stefanprodan/podinfo:6.4.0
# Note: this is a flux kustomize OCI artifact rather than a container image
- ghcr.io/stefanprodan/manifests/podinfo:6.4.0
- actions:
- onDeploy:
- after:
- # This will use a wait action to wait for the podinfo pod to be ready
- - description: Podinfo pods to be ready via wait action
- wait:
- cluster:
- kind: pod
- name: app=podinfo
- namespace: podinfo-oci
- condition: ready
# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
@@ -108,6 +77,4 @@ x-mdx: |
The Zarf agent will only automatically add the `insecure` key if the internal registry is used. If you are using a http registry outside of the cluster you will need to manually add this key.
- Due to an upstream bug, HelmRepositories with an insecure registry must use IP address instead of a hostname. This is not an issue with the internal Zarf registry, which is always an IP address, but will cause Flux HelmRepositories to break if Zarf is using an external http registry with a hostname.
-
:::
diff --git a/examples/variables/zarf.yaml b/examples/variables/zarf.yaml
index df2873b1c4..e180acdaa8 100644
--- a/examples/variables/zarf.yaml
+++ b/examples/variables/zarf.yaml
@@ -81,15 +81,6 @@ components:
- nginx-configmap.yaml
- nginx-deployment.yaml
- nginx-service.yaml
- actions:
- onDeploy:
- after:
- - wait:
- cluster:
- kind: pod
- namespace: nginx
- name: app=nginx
- condition: Ready
# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
diff --git a/examples/yolo/zarf.yaml b/examples/yolo/zarf.yaml
index dfa4cf65f1..71a3f7aa95 100644
--- a/examples/yolo/zarf.yaml
+++ b/examples/yolo/zarf.yaml
@@ -13,15 +13,6 @@ components:
files:
- ../dos-games/manifests/deployment.yaml
- ../dos-games/manifests/service.yaml
- actions:
- onDeploy:
- after:
- - wait:
- cluster:
- kind: deployment
- name: game
- namespace: zarf-yolo-example
- condition: available
# YAML keys starting with `x-` are custom keys that are ignored by the Zarf CLI
# The `x-mdx` key is used to render the markdown content for https://docs.zarf.dev/ref/examples
diff --git a/go.mod b/go.mod
index 59185260da..355344a04a 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/zarf-dev/zarf
-go 1.22.4
+go 1.22.8
// TODO (@AABRO): Pending merge into github.com/gojsonschema/gojsonschema (https://github.com/gojsonschema/gojsonschema/pull/5)
replace github.com/xeipuuv/gojsonschema => github.com/defenseunicorns/gojsonschema v0.0.0-20231116163348-e00f069122d6
@@ -13,93 +13,102 @@ require (
github.com/Masterminds/semver/v3 v3.3.0
github.com/agnivade/levenshtein v1.2.0
github.com/anchore/clio v0.0.0-20240705045624-ac88e09ad9d0
- github.com/anchore/stereoscope v0.0.3
- github.com/anchore/syft v1.12.2
+ github.com/anchore/stereoscope v0.0.5-0.20241018131503-a38c93517fc7
+ github.com/anchore/syft v1.14.2
github.com/avast/retry-go/v4 v4.6.0
github.com/defenseunicorns/pkg/helpers/v2 v2.0.1
- github.com/defenseunicorns/pkg/kubernetes v0.3.0
- github.com/defenseunicorns/pkg/oci v1.0.1
+ github.com/defenseunicorns/pkg/oci v1.0.2
github.com/derailed/k9s v0.32.5
- github.com/distribution/distribution/v3 v3.0.0-alpha.1
+ github.com/distribution/distribution/v3 v3.0.0-beta.1
github.com/distribution/reference v0.6.0
- github.com/fairwindsops/pluto/v5 v5.18.4
+ github.com/fairwindsops/pluto/v5 v5.20.3
github.com/fatih/color v1.17.0
github.com/fluxcd/gitkit v0.6.0
- github.com/fluxcd/helm-controller/api v1.0.1
- github.com/fluxcd/pkg/apis/meta v1.5.0
- github.com/fluxcd/source-controller/api v1.3.0
+ github.com/fluxcd/pkg/apis/meta v1.6.1
+ github.com/fluxcd/source-controller/api v1.4.1
github.com/go-git/go-git/v5 v5.12.0
github.com/goccy/go-yaml v1.12.0
- github.com/gofrs/flock v0.8.1
+ github.com/gofrs/flock v0.12.1
github.com/google/go-containerregistry v0.20.2
github.com/gosuri/uitable v0.0.4
github.com/invopop/jsonschema v0.12.0
github.com/mholt/archiver/v3 v3.5.1
- github.com/moby/moby v27.2.1+incompatible
+ github.com/moby/moby v27.3.1+incompatible
github.com/opencontainers/image-spec v1.1.0
github.com/pkg/errors v0.9.1
- github.com/prometheus/client_golang v1.19.1
+ github.com/prometheus/client_golang v1.20.4
github.com/pterm/pterm v0.12.79
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
- github.com/sigstore/cosign/v2 v2.2.3
- github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1
- github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1
- github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.7
- github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.7
+ github.com/sigstore/cosign/v2 v2.4.1
+ github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.9
+ github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.10
+ github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.10
+ github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.10
github.com/spf13/cobra v1.8.1
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.9.0
github.com/xeipuuv/gojsonschema v1.2.0
- golang.org/x/crypto v0.27.0
+ golang.org/x/crypto v0.28.0
golang.org/x/sync v0.8.0
- golang.org/x/term v0.24.0
- helm.sh/helm/v3 v3.15.3
- k8s.io/api v0.31.1
- k8s.io/apimachinery v0.31.1
- k8s.io/client-go v0.31.1
+ golang.org/x/term v0.25.0
+ helm.sh/helm/v3 v3.16.2
+ k8s.io/api v0.31.2
+ k8s.io/apimachinery v0.31.2
+ k8s.io/client-go v0.31.2
k8s.io/component-base v0.31.1
k8s.io/klog/v2 v2.130.1
k8s.io/kubectl v0.31.1
oras.land/oras-go/v2 v2.5.0
- sigs.k8s.io/cli-utils v0.36.0
- sigs.k8s.io/kustomize/api v0.17.3
- sigs.k8s.io/kustomize/kyaml v0.17.2
+ sigs.k8s.io/cli-utils v0.37.2
+ sigs.k8s.io/kustomize/api v0.18.0
+ sigs.k8s.io/kustomize/kyaml v0.18.1
sigs.k8s.io/yaml v1.4.0
)
require (
+ github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/provider v0.14.0 // indirect
github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537 // indirect
github.com/bshuster-repo/logrus-logstash-hook v1.0.0 // indirect
+ github.com/buildkite/roko v1.2.0 // indirect
github.com/charmbracelet/x/ansi v0.2.3 // indirect
github.com/charmbracelet/x/term v0.2.0 // indirect
+ github.com/containerd/containerd/api v1.7.19 // indirect
+ github.com/containerd/errdefs v0.3.0 // indirect
+ github.com/containerd/platforms v0.2.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/elliotchance/phpserialize v1.4.0 // indirect
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
github.com/evanphx/json-patch/v5 v5.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
- github.com/go-jose/go-jose/v4 v4.0.2 // indirect
+ github.com/go-jose/go-jose/v4 v4.0.4 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/gofrs/uuid v4.2.0+incompatible // indirect
- github.com/gorilla/handlers v1.5.1 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
+ github.com/gorilla/handlers v1.5.2 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect
github.com/hashicorp/golang-lru/arc/v2 v2.0.5 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
- github.com/jedib0t/go-pretty/v6 v6.5.9 // indirect
+ github.com/in-toto/attestation v1.1.0 // indirect
+ github.com/jedib0t/go-pretty/v6 v6.6.1 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
+ github.com/moby/sys/userns v0.1.0 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
- github.com/onsi/gomega v1.33.1 // indirect
+ github.com/onsi/gomega v1.34.1 // indirect
github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect
github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 // indirect
- github.com/redis/go-redis/v9 v9.3.0 // indirect
+ github.com/redis/go-redis/v9 v9.6.1 // indirect
+ github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d // indirect
+ github.com/sigstore/protobuf-specs v0.3.2 // indirect
+ github.com/sigstore/sigstore-go v0.6.1 // indirect
+ github.com/theupdateframework/go-tuf/v2 v2.0.1 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/contrib/exporters/autoexport v0.46.1 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 // indirect
go.opentelemetry.io/otel/exporters/prometheus v0.44.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 // indirect
@@ -113,26 +122,25 @@ require (
atomicgo.dev/cursor v0.2.0 // indirect
atomicgo.dev/keyboard v0.2.9 // indirect
atomicgo.dev/schedule v0.1.0 // indirect
- cloud.google.com/go v0.115.0 // indirect
- cloud.google.com/go/auth v0.6.1 // indirect
- cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect
- cloud.google.com/go/compute/metadata v0.3.0 // indirect
- cloud.google.com/go/iam v1.1.9 // indirect
- cloud.google.com/go/kms v1.18.2 // indirect
- cloud.google.com/go/longrunning v0.5.7 // indirect
- cloud.google.com/go/storage v1.42.0 // indirect
- cuelabs.dev/go/oci/ociregistry v0.0.0-20231103182354-93e78c079a13 // indirect
- cuelang.org/go v0.7.0 // indirect
+ cloud.google.com/go v0.115.1 // indirect
+ cloud.google.com/go/auth v0.9.8 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect
+ cloud.google.com/go/compute/metadata v0.5.2 // indirect
+ cloud.google.com/go/iam v1.2.1 // indirect
+ cloud.google.com/go/kms v1.20.0 // indirect
+ cloud.google.com/go/longrunning v0.6.1 // indirect
+ cloud.google.com/go/storage v1.43.0 // indirect
+ cuelabs.dev/go/oci/ociregistry v0.0.0-20240404174027-a39bec0462d2 // indirect
+ cuelang.org/go v0.9.2 // indirect
dario.cat/mergo v1.0.1 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 // indirect
- github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.0 // indirect
- github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.15.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
@@ -145,22 +153,22 @@ require (
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
github.com/BurntSushi/toml v1.4.0 // indirect
- github.com/CycloneDX/cyclonedx-go v0.9.0 // indirect
+ github.com/CycloneDX/cyclonedx-go v0.9.1 // indirect
github.com/DataDog/zstd v1.5.5 // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver v1.5.0 // indirect
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
github.com/Masterminds/squirrel v1.5.4 // indirect
- github.com/Microsoft/go-winio v0.6.1 // indirect
- github.com/Microsoft/hcsshim v0.11.4 // indirect
+ github.com/Microsoft/go-winio v0.6.2 // indirect
+ github.com/Microsoft/hcsshim v0.11.7 // indirect
github.com/OneOfOne/xxhash v1.2.8 // indirect
github.com/ProtonMail/go-crypto v1.0.0 // indirect
github.com/ThalesIgnite/crypto11 v1.2.5 // indirect
github.com/a8m/envsubst v1.4.2 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/acobaugh/osrelease v0.1.0 // indirect
- github.com/adrg/xdg v0.5.0 // indirect
+ github.com/adrg/xdg v0.5.1 // indirect
github.com/alecthomas/participle/v2 v2.1.1 // indirect
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect
github.com/alibabacloud-go/cr-20160607 v1.0.1 // indirect
@@ -172,38 +180,38 @@ require (
github.com/alibabacloud-go/tea v1.2.1 // indirect
github.com/alibabacloud-go/tea-utils v1.4.5 // indirect
github.com/alibabacloud-go/tea-xml v1.1.3 // indirect
- github.com/aliyun/credentials-go v1.3.1 // indirect
+ github.com/aliyun/credentials-go v1.3.2 // indirect
github.com/anchore/bubbly v0.0.0-20231115134915-def0aba654a9 // indirect
- github.com/anchore/fangs v0.0.0-20240508143433-f016b099950f // indirect
+ github.com/anchore/fangs v0.0.0-20240903175602-e716ef12c23d // indirect
github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a // indirect
github.com/anchore/go-macholibre v0.0.0-20220308212642-53e6d0aaf6fb // indirect
github.com/anchore/go-struct-converter v0.0.0-20221118182256-c68fdcfa2092 // indirect
github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 // indirect
github.com/anchore/grype v0.77.0 // indirect
- github.com/anchore/packageurl-go v0.1.1-0.20240507183024-848e011fc24f // indirect
- github.com/andybalholm/brotli v1.0.6 // indirect
+ github.com/anchore/packageurl-go v0.1.1-0.20241018175412-5c22e6360c4f // indirect
+ github.com/andybalholm/brotli v1.1.0 // indirect
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
github.com/aquasecurity/go-pep440-version v0.0.0-20210121094942-22b2f8951d46 // indirect
github.com/aquasecurity/go-version v0.0.0-20210121072130-637058cfe492 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/atotto/clipboard v0.1.4 // indirect
- github.com/aws/aws-sdk-go v1.54.9 // indirect
- github.com/aws/aws-sdk-go-v2 v1.27.2 // indirect
- github.com/aws/aws-sdk-go-v2/config v1.27.18 // indirect
- github.com/aws/aws-sdk-go-v2/credentials v1.17.18 // indirect
- github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 // indirect
- github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 // indirect
- github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 // indirect
- github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
+ github.com/aws/aws-sdk-go v1.55.5 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.30.5 // indirect
+ github.com/aws/aws-sdk-go-v2/config v1.27.33 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.32 // indirect
+ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2 // indirect
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect
- github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 // indirect
- github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 // indirect
- github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 // indirect
- github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 // indirect
- github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 // indirect
- github.com/aws/smithy-go v1.20.2 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 // indirect
+ github.com/aws/aws-sdk-go-v2/service/kms v1.35.7 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 // indirect
+ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 // indirect
+ github.com/aws/smithy-go v1.20.4 // indirect
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
@@ -213,17 +221,16 @@ require (
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/blang/semver/v4 v4.0.0 // indirect
github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect
- github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect
+ github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
- github.com/buildkite/agent/v3 v3.62.0 // indirect
- github.com/buildkite/go-pipeline v0.3.2 // indirect
- github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect
- github.com/cenkalti/backoff/v3 v3.2.2 // indirect
+ github.com/buildkite/agent/v3 v3.81.0 // indirect
+ github.com/buildkite/go-pipeline v0.13.1 // indirect
+ github.com/buildkite/interpolate v0.1.3 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/chai2010/gettext-go v1.0.2 // indirect
github.com/charmbracelet/bubbles v0.20.0 // indirect
- github.com/charmbracelet/bubbletea v1.1.0 // indirect
+ github.com/charmbracelet/bubbletea v1.1.1 // indirect
github.com/charmbracelet/harmonica v0.2.0 // indirect
github.com/charmbracelet/lipgloss v0.13.0 // indirect
github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 // indirect
@@ -233,17 +240,17 @@ require (
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect
github.com/containerd/cgroups v1.1.0 // indirect
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
- github.com/containerd/containerd v1.7.12 // indirect
+ github.com/containerd/containerd v1.7.23 // indirect
github.com/containerd/continuity v0.4.2 // indirect
github.com/containerd/fifo v1.1.0 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect
- github.com/containerd/ttrpc v1.2.2 // indirect
+ github.com/containerd/ttrpc v1.2.5 // indirect
github.com/containerd/typeurl/v2 v2.1.1 // indirect
github.com/coreos/go-oidc/v3 v3.11.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect
github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 // indirect
- github.com/cyphar/filepath-securejoin v0.2.4 // indirect
+ github.com/cyphar/filepath-securejoin v0.3.1 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/daviddengcn/go-colortext v1.0.0 // indirect
github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da // indirect
@@ -253,9 +260,9 @@ require (
github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect
github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
- github.com/docker/cli v27.1.1+incompatible // indirect
+ github.com/docker/cli v27.3.1+incompatible // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
- github.com/docker/docker v27.2.1+incompatible // indirect
+ github.com/docker/docker v27.3.1+incompatible // indirect
github.com/docker/docker-credential-helpers v0.8.0 // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect
@@ -265,42 +272,41 @@ require (
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
github.com/elliotchance/orderedmap v1.6.0 // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/emicklei/proto v1.12.1 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
- github.com/evanphx/json-patch v5.7.0+incompatible // indirect
+ github.com/evanphx/json-patch v5.9.0+incompatible // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
github.com/facebookincubator/nvdtools v0.1.5 // indirect
github.com/fatih/camelcase v1.0.0 // indirect
github.com/felixge/fgprof v0.9.3 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fluxcd/pkg/apis/acl v0.3.0 // indirect
- github.com/fluxcd/pkg/apis/kustomize v1.5.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/fvbommel/sortorder v1.1.0 // indirect
- github.com/gabriel-vasile/mimetype v1.4.4 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.6 // indirect
github.com/gdamore/encoding v1.0.0 // indirect
- github.com/github/go-spdx/v2 v2.3.1 // indirect
+ github.com/github/go-spdx/v2 v2.3.2 // indirect
github.com/glebarez/go-sqlite v1.21.2 // indirect
github.com/glebarez/sqlite v1.11.0 // indirect
github.com/go-chi/chi v4.1.2+incompatible // indirect
github.com/go-errors/errors v1.4.2 // indirect
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
- github.com/go-git/go-billy/v5 v5.5.0
+ github.com/go-git/go-billy/v5 v5.6.0
github.com/go-gorp/gorp/v3 v3.1.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-jose/go-jose/v3 v3.0.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
- github.com/go-openapi/analysis v0.22.0 // indirect
- github.com/go-openapi/errors v0.21.0 // indirect
- github.com/go-openapi/jsonpointer v0.20.2 // indirect
- github.com/go-openapi/jsonreference v0.20.4 // indirect
- github.com/go-openapi/loads v0.21.5 // indirect
- github.com/go-openapi/runtime v0.27.1 // indirect
- github.com/go-openapi/spec v0.20.13 // indirect
- github.com/go-openapi/strfmt v0.22.0 // indirect
- github.com/go-openapi/swag v0.22.9 // indirect
- github.com/go-openapi/validate v0.22.4 // indirect
+ github.com/go-openapi/analysis v0.23.0 // indirect
+ github.com/go-openapi/errors v0.22.0 // indirect
+ github.com/go-openapi/jsonpointer v0.21.0 // indirect
+ github.com/go-openapi/jsonreference v0.21.0 // indirect
+ github.com/go-openapi/loads v0.22.0 // indirect
+ github.com/go-openapi/runtime v0.28.0 // indirect
+ github.com/go-openapi/spec v0.21.0 // indirect
+ github.com/go-openapi/strfmt v0.23.0 // indirect
+ github.com/go-openapi/swag v0.23.0 // indirect
+ github.com/go-openapi/validate v0.24.0 // indirect
github.com/go-piv/piv-go v1.11.0 // indirect
github.com/go-restruct/restruct v1.2.0-alpha // indirect
github.com/go-test/deep v1.1.1 // indirect
@@ -313,19 +319,19 @@ require (
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/btree v1.1.2 // indirect
- github.com/google/certificate-transparency-go v1.1.7 // indirect
+ github.com/google/certificate-transparency-go v1.2.1 // indirect
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/go-github/v55 v55.0.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/licensecheck v0.3.1 // indirect
- github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af // indirect
- github.com/google/s2a-go v0.1.7 // indirect
+ github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
+ github.com/google/s2a-go v0.1.8 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
- github.com/googleapis/gax-go/v2 v2.12.5 // indirect
+ github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
+ github.com/googleapis/gax-go/v2 v2.13.0 // indirect
github.com/gookit/color v1.5.4 // indirect
github.com/gorilla/mux v1.8.1 // indirect
github.com/gorilla/websocket v1.5.0 // indirect
@@ -343,7 +349,7 @@ require (
github.com/hashicorp/go-sockaddr v1.0.5 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
- github.com/hashicorp/vault/api v1.14.0 // indirect
+ github.com/hashicorp/vault/api v1.15.0 // indirect
github.com/huandu/xstrings v1.5.0 // indirect
github.com/iancoleman/strcase v0.3.0 // indirect
github.com/imdario/mergo v0.3.16 // indirect
@@ -351,12 +357,12 @@ require (
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect
- github.com/jellydator/ttlcache/v3 v3.2.0 // indirect
+ github.com/jellydator/ttlcache/v3 v3.3.0 // indirect
github.com/jinzhu/copier v0.4.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
- github.com/jmoiron/sqlx v1.3.5 // indirect
+ github.com/jmoiron/sqlx v1.4.0 // indirect
github.com/jonboulle/clockwork v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
@@ -401,24 +407,23 @@ require (
github.com/moby/sys/mountinfo v0.7.2 // indirect
github.com/moby/sys/sequential v0.5.0 // indirect
github.com/moby/sys/signal v0.7.0 // indirect
- github.com/moby/sys/user v0.1.0 // indirect
+ github.com/moby/sys/user v0.3.0 // indirect
github.com/moby/term v0.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
- github.com/mozillazg/docker-credential-acr-helper v0.3.0 // indirect
- github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect
+ github.com/mozillazg/docker-credential-acr-helper v0.4.0 // indirect
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
github.com/muesli/cancelreader v0.2.2 // indirect
github.com/muesli/termenv v0.15.2 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect
- github.com/nwaples/rardecode v1.1.0 // indirect
+ github.com/nwaples/rardecode v1.1.3 // indirect
github.com/oklog/ulid v1.3.1 // indirect
- github.com/oleiade/reflections v1.0.1 // indirect
+ github.com/oleiade/reflections v1.1.0 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
- github.com/open-policy-agent/opa v0.61.0 // indirect
+ github.com/open-policy-agent/opa v0.68.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/runtime-spec v1.1.0 // indirect
github.com/opencontainers/selinux v1.11.0 // indirect
@@ -432,7 +437,7 @@ require (
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
- github.com/pierrec/lz4/v4 v4.1.19 // indirect
+ github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pjbgf/sha1cd v0.3.0 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/pkg/profile v1.7.0 // indirect
@@ -446,11 +451,11 @@ require (
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rs/zerolog v1.32.0 // indirect
- github.com/rubenv/sql-migrate v1.5.2 // indirect
+ github.com/rubenv/sql-migrate v1.7.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryanuber/go-glob v1.0.0 // indirect
github.com/saferwall/pe v1.5.4 // indirect
- github.com/sagikazarmark/locafero v0.4.0 // indirect
+ github.com/sagikazarmark/locafero v0.6.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sahilm/fuzzy v0.1.1 // indirect
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
@@ -461,10 +466,10 @@ require (
github.com/segmentio/ksuid v1.0.4 // indirect
github.com/shibumi/go-pathspec v1.3.0 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
- github.com/sigstore/fulcio v1.4.3 // indirect
- github.com/sigstore/rekor v1.3.4 // indirect
- github.com/sigstore/sigstore v1.8.7 // indirect
- github.com/sigstore/timestamp-authority v1.2.1 // indirect
+ github.com/sigstore/fulcio v1.6.3 // indirect
+ github.com/sigstore/rekor v1.3.6 // indirect
+ github.com/sigstore/sigstore v1.8.9 // indirect
+ github.com/sigstore/timestamp-authority v1.2.2 // indirect
github.com/sirupsen/logrus v1.9.3
github.com/skeema/knownhosts v1.2.2 // indirect
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
@@ -472,9 +477,9 @@ require (
github.com/spdx/tools-golang v0.5.5 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.7.0 // indirect
- github.com/spiffe/go-spiffe/v2 v2.1.7 // indirect
+ github.com/spiffe/go-spiffe/v2 v2.3.0 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
- github.com/sylabs/sif/v2 v2.17.1 // indirect
+ github.com/sylabs/sif/v2 v2.19.1 // indirect
github.com/sylabs/squashfs v1.0.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/tchap/go-patricia/v2 v2.3.1 // indirect
@@ -492,7 +497,7 @@ require (
github.com/wagoodman/go-presenter v0.0.0-20211015174752-f9c01afc824b // indirect
github.com/wagoodman/go-progress v0.0.0-20230925121702-07e42b3cdba0 // indirect
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
- github.com/xanzy/go-gitlab v0.96.0 // indirect
+ github.com/xanzy/go-gitlab v0.109.0 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
@@ -504,33 +509,31 @@ require (
github.com/zclconf/go-cty v1.14.0 // indirect
github.com/zeebo/errs v1.3.0 // indirect
github.com/zyedidia/generic v1.2.2-0.20230320175451-4410d2372cb1 // indirect
- go.mongodb.org/mongo-driver v1.13.1 // indirect
+ go.mongodb.org/mongo-driver v1.14.0 // indirect
go.opencensus.io v0.24.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
- go.opentelemetry.io/otel v1.28.0 // indirect
- go.opentelemetry.io/otel/metric v1.28.0 // indirect
- go.opentelemetry.io/otel/sdk v1.28.0 // indirect
- go.opentelemetry.io/otel/trace v1.28.0 // indirect
- go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
- go.step.sm/crypto v0.42.1 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
+ go.opentelemetry.io/otel v1.29.0 // indirect
+ go.opentelemetry.io/otel/metric v1.29.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.29.0 // indirect
+ go.opentelemetry.io/otel/trace v1.29.0 // indirect
+ go.step.sm/crypto v0.51.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
- go.uber.org/zap v1.26.0 // indirect
- golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect
+ go.uber.org/zap v1.27.0 // indirect
+ golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect
golang.org/x/mod v0.21.0 // indirect
- golang.org/x/net v0.29.0 // indirect
- golang.org/x/oauth2 v0.21.0 // indirect
- golang.org/x/sys v0.25.0 // indirect
- golang.org/x/text v0.18.0 // indirect
- golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
+ golang.org/x/net v0.30.0 // indirect
+ golang.org/x/oauth2 v0.23.0 // indirect
+ golang.org/x/sys v0.26.0 // indirect
+ golang.org/x/text v0.19.0 // indirect
+ golang.org/x/time v0.7.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
- google.golang.org/api v0.187.0 // indirect
- google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
- google.golang.org/grpc v1.65.0 // indirect
- google.golang.org/protobuf v1.34.2 // indirect
+ google.golang.org/api v0.200.0 // indirect
+ google.golang.org/genproto v0.0.0-20241007155032-5fefd90f89a9 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect
+ google.golang.org/grpc v1.67.1 // indirect
+ google.golang.org/protobuf v1.35.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 // indirect
@@ -538,21 +541,21 @@ require (
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/gorm v1.25.9 // indirect
- k8s.io/apiextensions-apiserver v0.30.1 // indirect
- k8s.io/apiserver v0.30.1 // indirect
+ k8s.io/apiextensions-apiserver v0.31.1 // indirect
+ k8s.io/apiserver v0.31.1 // indirect
k8s.io/cli-runtime v0.31.1 // indirect
k8s.io/component-helpers v0.31.1 // indirect
- k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
+ k8s.io/kube-openapi v0.0.0-20240816214639-573285566f34 // indirect
k8s.io/metrics v0.31.1 // indirect
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
modernc.org/libc v1.55.3 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
- modernc.org/sqlite v1.33.0 // indirect
+ modernc.org/sqlite v1.33.1 // indirect
oras.land/oras-go v1.2.5 // indirect
- sigs.k8s.io/controller-runtime v0.18.1 // indirect
+ sigs.k8s.io/controller-runtime v0.19.0
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
- sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 // indirect
- sigs.k8s.io/release-utils v0.7.7 // indirect
+ sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 // indirect
+ sigs.k8s.io/release-utils v0.8.4 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
)
diff --git a/go.sum b/go.sum
index af5e68a6e5..7d61a5cb9d 100644
--- a/go.sum
+++ b/go.sum
@@ -39,8 +39,8 @@ cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w9
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.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
-cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
+cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ=
+cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc=
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/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
@@ -55,10 +55,10 @@ cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjby
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/auth v0.6.1 h1:T0Zw1XM5c1GlpN2HYr2s+m3vr1p2wy+8VN+Z1FKxW38=
-cloud.google.com/go/auth v0.6.1/go.mod h1:eFHG7zDzbXHKmjJddFG/rBlcGp6t25SwRUiEQSlO4x4=
-cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4=
-cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q=
+cloud.google.com/go/auth v0.9.8 h1:+CSJ0Gw9iVeSENVCKJoLHhdUykDgXSc4Qn+gu2BRtR8=
+cloud.google.com/go/auth v0.9.8/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
+cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY=
+cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc=
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/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
@@ -81,8 +81,8 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz
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/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc=
-cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
+cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
+cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
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/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
@@ -121,16 +121,16 @@ cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y97
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
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 v1.1.9 h1:oSkYLVtVme29uGYrOcKcvJRht7cHJpYD09GM9JaR0TE=
-cloud.google.com/go/iam v1.1.9/go.mod h1:Nt1eDWNYH9nGQg3d/mY7U1hvfGmsaG9o/kLGoLoLXjQ=
-cloud.google.com/go/kms v1.18.2 h1:EGgD0B9k9tOOkbPhYW1PHo2W0teamAUYMOUIcDRMfPk=
-cloud.google.com/go/kms v1.18.2/go.mod h1:YFz1LYrnGsXARuRePL729oINmN5J/5e7nYijgvfiIeY=
+cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU=
+cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g=
+cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY=
+cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM=
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/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/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU=
-cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng=
+cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc=
+cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0=
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/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
@@ -187,8 +187,8 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
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.42.0 h1:4QtGpplCVt1wz6g5o1ifXd656P5z+yNgzdw1tVfp0cU=
-cloud.google.com/go/storage v1.42.0/go.mod h1:HjMXRFq65pGKFn6hxj6x3HCyR41uSB72Z0SO/Vn6JFQ=
+cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
+cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
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/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
@@ -200,10 +200,10 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX
cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
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=
-cuelabs.dev/go/oci/ociregistry v0.0.0-20231103182354-93e78c079a13 h1:zkiIe8AxZ/kDjqQN+mDKc5BxoVJOqioSdqApjc+eB1I=
-cuelabs.dev/go/oci/ociregistry v0.0.0-20231103182354-93e78c079a13/go.mod h1:XGKYSMtsJWfqQYPwq51ZygxAPqpEUj/9bdg16iDPTAA=
-cuelang.org/go v0.7.0 h1:gMztinxuKfJwMIxtboFsNc6s8AxwJGgsJV+3CuLffHI=
-cuelang.org/go v0.7.0/go.mod h1:ix+3dM/bSpdG9xg6qpCgnJnpeLtciZu+O/rDbywoMII=
+cuelabs.dev/go/oci/ociregistry v0.0.0-20240404174027-a39bec0462d2 h1:BnG6pr9TTr6CYlrJznYUDj6V7xldD1W+1iXPum0wT/w=
+cuelabs.dev/go/oci/ociregistry v0.0.0-20240404174027-a39bec0462d2/go.mod h1:pK23AUVXuNzzTpfMCA06sxZGeVQ/75FdVtW249de9Uo=
+cuelang.org/go v0.9.2 h1:pfNiry2PdRBr02G/aKm5k2vhzmqbAOoaB4WurmEbWvs=
+cuelang.org/go v0.9.2/go.mod h1:qpAYsLOf7gTM1YdEg6cxh553uZ4q9ZDWlPbtZr9q1Wk=
dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
@@ -213,22 +213,24 @@ github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA=
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU=
-github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230618160516-e936619f9f18 h1:rd389Q26LMy03gG4anandGFC2LW/xvjga5GezeeaxQk=
-github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230618160516-e936619f9f18/go.mod h1:fgJuSBrJP5qZtKqaMJE0hmhS2tmRH+44IkfZvjtaf1M=
+github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d h1:zjqpY4C7H15HjRPEenkS4SAn3Jy2eRRjkjZbGR30TOg=
+github.com/AdamKorcz/go-fuzz-headers-1 v0.0.0-20230919221257-8b5d3ce2d11d/go.mod h1:XNqJ7hv2kY++g8XEHREpi+JqZo3+0l+CH2egBVN4yqM=
github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ=
github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo=
-github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 h1:8+4G8JaejP8Xa6W46PzJEwisNgBXMvFcz78N6zG/ARw=
-github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0/go.mod h1:GgeIE+1be8Ivm7Sh4RgwI42aTtC9qrcj+Y9Y6CjJhJs=
+github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/provider v0.14.0 h1:kcnfY4vljxXliXDBrA9K9lwF8IoEZ4Up6Eg9kWTIm28=
+github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/provider v0.14.0/go.mod h1:tlqp9mUGbsP+0z3Q+c0Q5MgSdq/OMwQhm5bffR3Q3ss=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0 h1:1nGuui+4POelzDwI7RG56yfQJHCnKvwfMoU7VsEp+Zg=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0/go.mod h1:99EvauvlcJ1U06amZiksfYz/3aFGyIhWGHVyiZXtBAI=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
-github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.0 h1:H+U3Gk9zY56G3u872L82bk4thcsy2Gghb9ExT4Zvm1o=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.0/go.mod h1:mgrmMSgaLp9hmax62XQTd0N4aAqSE5E0DulSpVYK7vc=
-github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw=
-github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.15.0 h1:eXzkOEXbSTOa7cJ7EqeCVi/OFi/ppDrUtQuttCWy74c=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.15.0/go.mod h1:YL1xnZ6QejvQHWJrX/AvhFl4WW4rqHVoKspWNVwFk0M=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJTiW6obBQe3SqZizkuV1PEgfiiGivmVocDy64=
+github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
@@ -256,6 +258,8 @@ github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+Z
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -263,8 +267,8 @@ github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
-github.com/CycloneDX/cyclonedx-go v0.9.0 h1:inaif7qD8bivyxp7XLgxUYtOXWtDez7+j72qKTMQTb8=
-github.com/CycloneDX/cyclonedx-go v0.9.0/go.mod h1:NE/EWvzELOFlG6+ljX/QeMlVt9VKcTwu8u0ccsACEsw=
+github.com/CycloneDX/cyclonedx-go v0.9.1 h1:yffaWOZsv77oTJa/SdVZYdgAgFioCeycBUKkqS2qzQM=
+github.com/CycloneDX/cyclonedx-go v0.9.1/go.mod h1:NE/EWvzELOFlG6+ljX/QeMlVt9VKcTwu8u0ccsACEsw=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
@@ -292,10 +296,10 @@ github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSC
github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
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/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8=
-github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w=
+github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
+github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
+github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ=
+github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
@@ -311,8 +315,8 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpH
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
github.com/acobaugh/osrelease v0.1.0 h1:Yb59HQDGGNhCj4suHaFQQfBps5wyoKLSSX/J/+UifRE=
github.com/acobaugh/osrelease v0.1.0/go.mod h1:4bFEs0MtgHNHBrmHCt67gNisnabCRAlzdVasCEGHTWY=
-github.com/adrg/xdg v0.5.0 h1:dDaZvhMXatArP1NPHhnfaQUqWBLBsmx1h1HXQdMoFCY=
-github.com/adrg/xdg v0.5.0/go.mod h1:dDdY4M4DF9Rjy4kHPeNL+ilVF+p2lK8IdM9/rTSGcI4=
+github.com/adrg/xdg v0.5.1 h1:Im8iDbEFARltY09yOJlSGu4Asjk2vF85+3Dyru8uJ0U=
+github.com/adrg/xdg v0.5.1/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ=
github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY=
github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/alecthomas/assert/v2 v2.3.0 h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0=
@@ -367,14 +371,14 @@ github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCE
github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzYtqw7dgt0=
github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
-github.com/aliyun/credentials-go v1.3.1 h1:uq/0v7kWrxmoLGpqjx7vtQ/s03f0zR//0br/xWDTE28=
-github.com/aliyun/credentials-go v1.3.1/go.mod h1:8jKYhQuDawt8x2+fusqa1Y6mPxemTsBEN04dgcAcYz0=
+github.com/aliyun/credentials-go v1.3.2 h1:L4WppI9rctC8PdlMgyTkF8bBsy9pyKQEzBD1bHMRl+g=
+github.com/aliyun/credentials-go v1.3.2/go.mod h1:tlpz4uys4Rn7Ik4/piGRrTbXy2uLKvePgQJJduE+Y5c=
github.com/anchore/bubbly v0.0.0-20231115134915-def0aba654a9 h1:p0ZIe0htYOX284Y4axJaGBvXHU0VCCzLN5Wf5XbKStU=
github.com/anchore/bubbly v0.0.0-20231115134915-def0aba654a9/go.mod h1:3ZsFB9tzW3vl4gEiUeuSOMDnwroWxIxJelOOHUp8dSw=
github.com/anchore/clio v0.0.0-20240705045624-ac88e09ad9d0 h1:rtO6Bcc5KX1i6Ndj4pFcFUkE5PaiKv0J4hKSlmbEIXQ=
github.com/anchore/clio v0.0.0-20240705045624-ac88e09ad9d0/go.mod h1:U3M+opzBUkSBUIRUXsQj6ZgrX9i7Nn0YLn4CjmhKMNI=
-github.com/anchore/fangs v0.0.0-20240508143433-f016b099950f h1:NOhzafCyNYFi88qxkBFjMzQo4dRa1vDhBzx+0Uovx8Q=
-github.com/anchore/fangs v0.0.0-20240508143433-f016b099950f/go.mod h1:sVpRS2yNCw6tLVpvA1QSDVWTJVpCuAm8JNZgn4Sjz/k=
+github.com/anchore/fangs v0.0.0-20240903175602-e716ef12c23d h1:ZD4wdCBgJJzJybjTUIEiiupLF7B9H3WLuBTjspBO2Mc=
+github.com/anchore/fangs v0.0.0-20240903175602-e716ef12c23d/go.mod h1:Xh4ObY3fmoMzOEVXwDtS1uK44JC7+nRD0n29/1KYFYg=
github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537 h1:GjNGuwK5jWjJMyVppBjYS54eOiiSNv4Ba869k4wh72Q=
github.com/anchore/go-collections v0.0.0-20240216171411-9321230ce537/go.mod h1:1aiktV46ATCkuVg0O573ZrH56BUawTECPETbZyBcqT8=
github.com/anchore/go-logger v0.0.0-20230725134548-c21dafa1ec5a h1:nJ2G8zWKASyVClGVgG7sfM5mwoZlZ2zYpIzN2OhjWkw=
@@ -389,16 +393,16 @@ github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 h1:rmZG77uXgE
github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4/go.mod h1:Bkc+JYWjMCF8OyZ340IMSIi2Ebf3uwByOk6ho4wne1E=
github.com/anchore/grype v0.77.0 h1:HoTdZ67INrEpEiSKL713zY+j77HxoEAcsMPIZDZ4yP4=
github.com/anchore/grype v0.77.0/go.mod h1:k6QLcebOqPm+90y8mMesOJM6A6DYQllOic6Tmz507sc=
-github.com/anchore/packageurl-go v0.1.1-0.20240507183024-848e011fc24f h1:B/E9ixKNCasntpoch61NDaQyGPDXLEJlL+B9B/PbdbA=
-github.com/anchore/packageurl-go v0.1.1-0.20240507183024-848e011fc24f/go.mod h1:Blo6OgJNiYF41ufcgHKkbCKF2MDOMlrqhXv/ij6ocR4=
-github.com/anchore/stereoscope v0.0.3 h1:JRPHySy8S6P+Ff3IDiQ29ap1i8/laUQxDk9K1eFh/2U=
-github.com/anchore/stereoscope v0.0.3/go.mod h1:5DJheGPjVRsSqegTB24Zi6SCHnYQnA519yeIG+RG+I4=
-github.com/anchore/syft v1.12.2 h1:K5YXJ2Ox4C3+Q+rA4jDpsLAoYNd27RMfinvY2JmbEiM=
-github.com/anchore/syft v1.12.2/go.mod h1:xFMGMFmhWTK0CJvaKwz6OPVgRdcyCkl7QO/3O/JAXI0=
+github.com/anchore/packageurl-go v0.1.1-0.20241018175412-5c22e6360c4f h1:dAQPIrQ3a5PBqZeZ+B9NGZsGmodk4NO9OjDIsQmQyQM=
+github.com/anchore/packageurl-go v0.1.1-0.20241018175412-5c22e6360c4f/go.mod h1:KoYIv7tdP5+CC9VGkeZV4/vGCKsY55VvoG+5dadg4YI=
+github.com/anchore/stereoscope v0.0.5-0.20241018131503-a38c93517fc7 h1:CBKDfuMWKRt12EnKtgT/an9FQSQI83mOU1KT57z81IU=
+github.com/anchore/stereoscope v0.0.5-0.20241018131503-a38c93517fc7/go.mod h1:wH79ZauZcd3erKPocg9+qhDC6Q/z125sD+Isi4d61a4=
+github.com/anchore/syft v1.14.2 h1:y/1QIsSUaVDzbT1Q29BkKAAyNivt+2wgWzpCxI0b5yc=
+github.com/anchore/syft v1.14.2/go.mod h1:tyGQPeUSS9498A10nUF1kEVIObsvsnmrWt6hP25EjXE=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/andybalholm/brotli v1.0.1/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
-github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
-github.com/andybalholm/brotli v1.0.6/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=
@@ -425,44 +429,44 @@ github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn
github.com/avast/retry-go/v4 v4.6.0 h1:K9xNA+KeB8HHc2aWFuLb25Offp+0iVRXEvFx8IinRJA=
github.com/avast/retry-go/v4 v4.6.0/go.mod h1:gvWlPhBVsvBbLkVGDg/KwvBv0bEkCOLRRSHKIr2PyOE=
github.com/aws/aws-sdk-go v1.44.122/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
-github.com/aws/aws-sdk-go v1.54.9 h1:e0Czh9AhrCVPuyaIUnibYmih3cYexJKlqlHSJ2eMKbI=
-github.com/aws/aws-sdk-go v1.54.9/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
+github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM=
-github.com/aws/aws-sdk-go-v2 v1.27.2 h1:pLsTXqX93rimAOZG2FIYraDQstZaaGVVN4tNw65v0h8=
-github.com/aws/aws-sdk-go-v2 v1.27.2/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM=
-github.com/aws/aws-sdk-go-v2/config v1.27.18 h1:wFvAnwOKKe7QAyIxziwSKjmer9JBMH1vzIL6W+fYuKk=
-github.com/aws/aws-sdk-go-v2/config v1.27.18/go.mod h1:0xz6cgdX55+kmppvPm2IaKzIXOheGJhAufacPJaXZ7c=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.18 h1:D/ALDWqK4JdY3OFgA2thcPO1c9aYTT5STS/CvnkqY1c=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.18/go.mod h1:JuitCWq+F5QGUrmMPsk945rop6bB57jdscu+Glozdnc=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5 h1:dDgptDO9dxeFkXy+tEgVkzSClHZje/6JkPW5aZyEvrQ=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.5/go.mod h1:gjvE2KBUgUQhcv89jqxrIxH9GaKs1JbZzWejj/DaHGA=
+github.com/aws/aws-sdk-go-v2 v1.30.5 h1:mWSRTwQAb0aLE17dSzztCVJWI9+cRMgqebndjwDyK0g=
+github.com/aws/aws-sdk-go-v2 v1.30.5/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0=
+github.com/aws/aws-sdk-go-v2/config v1.27.33 h1:Nof9o/MsmH4oa0s2q9a0k7tMz5x/Yj5k06lDODWz3BU=
+github.com/aws/aws-sdk-go-v2/config v1.27.33/go.mod h1:kEqdYzRb8dd8Sy2pOdEbExTTF5v7ozEXX0McgPE7xks=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.32 h1:7Cxhp/BnT2RcGy4VisJ9miUPecY+lyE9I8JvcZofn9I=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.32/go.mod h1:P5/QMF3/DCHbXGEGkdbilXHsyTBX5D3HSwcrSc9p20I=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13 h1:pfQ2sqNpMVK6xz2RbqLEL0GH87JOwSxPV2rzm8Zsb74=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.13/go.mod h1:NG7RXPUlqfsCLLFfi0+IpKN4sCB9D9fw/qTaSB+xRoU=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9 h1:cy8ahBJuhtM8GTTSyOkfy6WVPV1IE+SS5/wfXUYuulw=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.9/go.mod h1:CZBXGLaJnEZI6EVNcPd7a6B5IC5cA/GkRWtu9fp3S6Y=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17 h1:pI7Bzt0BJtYA0N/JEC6B8fJ4RBrEMi1LBrkMdFYNSnQ=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.17/go.mod h1:Dh5zzJYMtxfIjYW+/evjQ8uj2OyR/ve2KROHGHlSFqE=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9 h1:A4SYk07ef04+vxZToz9LWvAXl9LW0NClpPpMsi31cz0=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.9/go.mod h1:5jJcHuwDagxN+ErjQ3PU3ocf6Ylc/p9x+BLO/+X4iXw=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17 h1:Mqr/V5gvrhA2gvgnF42Zh5iMiQNcOYthFYwCyrnuWlc=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.17/go.mod h1:aLJpZlCmjE+V+KtN1q1uyZkfnUWpQGpbsn89XPKyzfU=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2 h1:y6LX9GUoEA3mO0qpFl1ZQHj1rFyPWVphlzebiSt2tKE=
github.com/aws/aws-sdk-go-v2/service/ecr v1.20.2/go.mod h1:Q0LcmaN/Qr8+4aSBrdrXXePqoX0eOuYpJLbYpilmWnA=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2 h1:PpbXaecV3sLAS6rjQiaKw4/jyq3Z8gNzmoJupHAoBp0=
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.18.2/go.mod h1:fUHpGXr4DrXkEDpGAjClPsviWf+Bszeb0daKE0blxv8=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11 h1:o4T+fKxA3gTMcluBNZZXE9DNaMkJuUL1O3mffCUjoJo=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.11/go.mod h1:84oZdJ+VjuJKs9v1UTC9NaodRZRseOXCTgku+vQJWR8=
-github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 h1:W9PbZAZAEcelhhjb7KuwUtf+Lbc+i7ByYJRuWLlnxyQ=
-github.com/aws/aws-sdk-go-v2/service/kms v1.27.9/go.mod h1:2tFmR7fQnOdQlM2ZCEPpFnBIQD1U8wmXmduBgZbOag0=
-github.com/aws/aws-sdk-go-v2/service/sso v1.20.11 h1:gEYM2GSpr4YNWc6hCd5nod4+d4kd9vWIAWrmGuLdlMw=
-github.com/aws/aws-sdk-go-v2/service/sso v1.20.11/go.mod h1:gVvwPdPNYehHSP9Rs7q27U1EU+3Or2ZpXvzAYJNh63w=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5 h1:iXjh3uaH3vsVcnyZX7MqCoCfcyxIrVE9iOQruRaWPrQ=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.5/go.mod h1:5ZXesEuy/QcO0WUnt+4sDkxhdXRHTu2yG0uCSH8B6os=
-github.com/aws/aws-sdk-go-v2/service/sts v1.28.12 h1:M/1u4HBpwLuMtjlxuI2y6HoVLzF5e2mfxHCg7ZVMYmk=
-github.com/aws/aws-sdk-go-v2/service/sts v1.28.12/go.mod h1:kcfd+eTdEi/40FIbLq4Hif3XMXnl5b/+t/KTfLt9xIk=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsdzgl7ZL2KlXiUAoJnI/VxfHCvDFr2QDFj6u4=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE=
+github.com/aws/aws-sdk-go-v2/service/kms v1.35.7 h1:v0D1LeMkA/X+JHAZWERrr+sUGOt8KrCZKnJA6KszkcE=
+github.com/aws/aws-sdk-go-v2/service/kms v1.35.7/go.mod h1:K9lwD0Rsx9+NSaJKsdAdlDK4b2G4KKOEve9PzHxPoMI=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7/go.mod h1:bCbAxKDqNvkHxRaIMnyVPXPo+OaPRwvmgzMxbz1VKSA=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.7 h1:NKTa1eqZYw8tiHSRGpP0VtTdub/8KNk8sDkNPFaOKDE=
+github.com/aws/aws-sdk-go-v2/service/sts v1.30.7/go.mod h1:NXi1dIAGteSaRLqYgarlhP/Ij0cFT+qmCwiJqWh/U5o=
github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
-github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q=
-github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E=
+github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4=
+github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8 h1:SoFYaT9UyGkR0+nogNyD/Lj+bsixB+SNuAS4ABlEs6M=
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20231024185945-8841054dbdb8/go.mod h1:2JF49jcDOrLStIXN/j/K1EKRq8a8R2qRnlZA6/o/c7c=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
@@ -484,8 +488,8 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
github.com/bmatcuk/doublestar/v2 v2.0.4 h1:6I6oUiT/sU27eE2OFcWqBhL1SwjyvQuOssxT4a1yidI=
github.com/bmatcuk/doublestar/v2 v2.0.4/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw=
-github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=
-github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
+github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q=
+github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc=
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/bshuster-repo/logrus-logstash-hook v1.0.0 h1:e+C0SB5R1pu//O4MQ3f9cFuPGoOVeF2fE4Og9otCc70=
@@ -498,17 +502,17 @@ github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
-github.com/buildkite/agent/v3 v3.62.0 h1:yvzSjI8Lgifw883I8m9u8/L/Thxt4cLFd5aWPn3gg70=
-github.com/buildkite/agent/v3 v3.62.0/go.mod h1:jN6SokGXrVNNIpI0BGQ+j5aWeI3gin8F+3zwA5Q6gqM=
-github.com/buildkite/go-pipeline v0.3.2 h1:SW4EaXNwfjow7xDRPGgX0Rcx+dPj5C1kV9LKCLjWGtM=
-github.com/buildkite/go-pipeline v0.3.2/go.mod h1:iY5jzs3Afc8yHg6KDUcu3EJVkfaUkd9x/v/OH98qyUA=
-github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 h1:k6UDF1uPYOs0iy1HPeotNa155qXRWrzKnqAaGXHLZCE=
-github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251/go.mod h1:gbPR1gPu9dB96mucYIR7T3B7p/78hRVSOuzIWLHK2Y4=
+github.com/buildkite/agent/v3 v3.81.0 h1:JVfkng2XnsXesFXwiFwLJFkuzVu4zvoJCvedfoIXD6E=
+github.com/buildkite/agent/v3 v3.81.0/go.mod h1:edJeyycODRxaFvpT22rDGwaQ5oa4eB8GjtbjgX5VpFw=
+github.com/buildkite/go-pipeline v0.13.1 h1:Y9p8pQIwPtauVwNrcmTDH6+XK7jE1nLuvWVaK8oymA8=
+github.com/buildkite/go-pipeline v0.13.1/go.mod h1:2HHqlSFTYgHFhzedJu0LhLs9n5c9XkYnHiQFVN5HE4U=
+github.com/buildkite/interpolate v0.1.3 h1:OFEhqji1rNTRg0u9DsSodg63sjJQEb1uWbENq9fUOBM=
+github.com/buildkite/interpolate v0.1.3/go.mod h1:UNVe6A+UfiBNKbhAySrBbZFZFxQ+DXr9nWen6WVt/A8=
+github.com/buildkite/roko v1.2.0 h1:hbNURz//dQqNl6Eo9awjQOVOZwSDJ8VEbBDxSfT9rGQ=
+github.com/buildkite/roko v1.2.0/go.mod h1:23R9e6nHxgedznkwwfmqZ6+0VJZJZ2Sg/uVcp2cP46I=
github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
github.com/bytecodealliance/wasmtime-go/v3 v3.0.2 h1:3uZCA/BLTIu+DqCfguByNMJa2HVHpXvjfy0Dy7g6fuA=
github.com/bytecodealliance/wasmtime-go/v3 v3.0.2/go.mod h1:RnUjnIXxEJcL6BgCvNyzCCRzZcxCgsZCi+RNlvYor5Q=
-github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M=
-github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -524,8 +528,8 @@ github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNS
github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE=
github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU=
-github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69JAK2YJK9c=
-github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4=
+github.com/charmbracelet/bubbletea v1.1.1 h1:KJ2/DnmpfqFtDNVTvYZ6zpPFL9iRCRr0qqKOCvppbPY=
+github.com/charmbracelet/bubbletea v1.1.1/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4=
github.com/charmbracelet/harmonica v0.2.0 h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ=
github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw=
@@ -570,18 +574,24 @@ github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHq
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY=
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
-github.com/containerd/containerd v1.7.12 h1:+KQsnv4VnzyxWcfO9mlxxELaoztsDEjOuCMPAuPqgU0=
-github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk=
+github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ=
+github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw=
+github.com/containerd/containerd/api v1.7.19 h1:VWbJL+8Ap4Ju2mx9c9qS1uFSB1OVYr5JJrW2yT5vFoA=
+github.com/containerd/containerd/api v1.7.19/go.mod h1:fwGavl3LNwAV5ilJ0sbrABL44AQxmNjDRcwheXDb6Ig=
github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM=
github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
+github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4=
+github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY=
github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o=
github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
+github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A=
+github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw=
github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k=
github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o=
-github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs=
-github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak=
+github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU=
+github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o=
github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4=
github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0=
github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI=
@@ -595,12 +605,12 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t
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.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
-github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0=
-github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
+github.com/creack/pty v1.1.19 h1:tUN6H7LWqNx4hQVxomd0CVsDwaDr9gaRQaI4GpSmrsA=
+github.com/creack/pty v1.1.19/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 h1:2Dx4IHfC1yHWI12AxQDJM1QbRCDfk6M+blLzlZCXdrc=
github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw=
-github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
-github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
+github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE=
+github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc=
github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
github.com/danieljoos/wincred v1.2.0/go.mod h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -613,10 +623,8 @@ github.com/defenseunicorns/gojsonschema v0.0.0-20231116163348-e00f069122d6 h1:gw
github.com/defenseunicorns/gojsonschema v0.0.0-20231116163348-e00f069122d6/go.mod h1:StKLYMmPj1R5yIs6CK49EkcW1TvUYuw5Vri+LRk7Dy8=
github.com/defenseunicorns/pkg/helpers/v2 v2.0.1 h1:j08rz9vhyD9Bs+yKiyQMY2tSSejXRMxTqEObZ5M1Wbk=
github.com/defenseunicorns/pkg/helpers/v2 v2.0.1/go.mod h1:u1PAqOICZyiGIVA2v28g55bQH1GiAt0Bc4U9/rnWQvQ=
-github.com/defenseunicorns/pkg/kubernetes v0.3.0 h1:f4VSIaUdvn87/dhiZvRbUfHhcHa8bKia6aU0WcvPbYg=
-github.com/defenseunicorns/pkg/kubernetes v0.3.0/go.mod h1:FsuKQGpPZOnZWifBse7v787+avtIu2lte5LTsaojDkY=
-github.com/defenseunicorns/pkg/oci v1.0.1 h1:WPrWRrae1L19X1vuhy6yYMR2zrTzgBbJHp3ImgUm4ZM=
-github.com/defenseunicorns/pkg/oci v1.0.1/go.mod h1:qZ3up/d0P81taW37fKR4lb19jJhQZJVtNOEJMu00dHQ=
+github.com/defenseunicorns/pkg/oci v1.0.2 h1:JRdFbKnJQiGVsMUWmcmm0ZS8aBmmAORXLGSAGkIGhBQ=
+github.com/defenseunicorns/pkg/oci v1.0.2/go.mod h1:z11UFenAd4HQRucaEp0uhoccor/6zbQiXEQq+Z7vtI0=
github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da h1:ZOjWpVsFZ06eIhnh4mkaceTiVoktdU67+M7KDHJ268M=
github.com/deitch/magic v0.0.0-20230404182410-1ff89d7342da/go.mod h1:B3tI9iGHi4imdLi4Asdha1Sc6feLMTfPLXh9IUYmysk=
github.com/depcheck-test/depcheck-test v0.0.0-20220607135614-199033aaa936 h1:foGzavPWwtoyBvjWyKJYDYsyzy+23iBV7NKTwdk+LRY=
@@ -645,16 +653,16 @@ github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7 h1:lxmTCgmHE1G
github.com/digitorus/timestamp v0.0.0-20231217203849-220c5c2851b7/go.mod h1:GvWntX9qiTlOud0WkQ6ewFm0LPy5JUR1Xo0Ngbd1w6Y=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
-github.com/distribution/distribution/v3 v3.0.0-alpha.1 h1:jn7I1gvjOvmLztH1+1cLiUFud7aeJCIQcgzugtwjyJo=
-github.com/distribution/distribution/v3 v3.0.0-alpha.1/go.mod h1:LCp4JZp1ZalYg0W/TN05jarCQu+h4w7xc7ZfQF4Y/cY=
+github.com/distribution/distribution/v3 v3.0.0-beta.1 h1:X+ELTxPuZ1Xe5MsD3kp2wfGUhc8I+MPfRis8dZ818Ic=
+github.com/distribution/distribution/v3 v3.0.0-beta.1/go.mod h1:O9O8uamhHzWWQVTjuQpyYUVm/ShPHPUDgvQMpHGVBDs=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
-github.com/docker/cli v27.1.1+incompatible h1:goaZxOqs4QKxznZjjBWKONQci/MywhtRv2oNn0GkeZE=
-github.com/docker/cli v27.1.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/cli v27.3.1+incompatible h1:qEGdFBF3Xu6SCvCYhc7CzaQTlBmqDuzxPDpigSyeKQQ=
+github.com/docker/cli v27.3.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk=
github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v27.2.1+incompatible h1:fQdiLfW7VLscyoeYEBz7/J8soYFDZV1u6VW6gJEjNMI=
-github.com/docker/docker v27.2.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI=
+github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8=
github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
@@ -680,8 +688,8 @@ github.com/elliotchance/orderedmap v1.6.0 h1:xjn+kbbKXeDq6v9RVE+WYwRbYfAZKvlWfcJ
github.com/elliotchance/orderedmap v1.6.0/go.mod h1:wsDwEaX5jEoyhbs7x93zk2H/qv0zwuhg4inXhDkYqys=
github.com/elliotchance/phpserialize v1.4.0 h1:cAp/9+KSnEbUC8oYCE32n2n84BeW8HOY3HMDI8hG2OY=
github.com/elliotchance/phpserialize v1.4.0/go.mod h1:gt7XX9+ETUcLXbtTKEuyrqW3lcLUAeS/AnGZ2e49TZs=
-github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.12.1 h1:6n/Z2pZAnBwuhU66Gs8160B8rrrYKo7h2F2sCOnNceE=
github.com/emicklei/proto v1.12.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
@@ -700,8 +708,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
-github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI=
-github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls=
+github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM=
@@ -709,8 +717,8 @@ github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZM
github.com/facebookincubator/flog v0.0.0-20190930132826-d2511d0ce33c/go.mod h1:QGzNH9ujQ2ZUr/CjDGZGWeDAVStrWNjHeEcjJL96Nuk=
github.com/facebookincubator/nvdtools v0.1.5 h1:jbmDT1nd6+k+rlvKhnkgMokrCAzHoASWE5LtHbX2qFQ=
github.com/facebookincubator/nvdtools v0.1.5/go.mod h1:Kh55SAWnjckS96TBSrXI99KrEKH4iB0OJby3N8GRJO4=
-github.com/fairwindsops/pluto/v5 v5.18.4 h1:jwSWs5zl+yu3uRuzsiZ0huKo1U4p/B8lxGBtuDF2jbU=
-github.com/fairwindsops/pluto/v5 v5.18.4/go.mod h1:X1S9WoMBn2bReAYjoGDZpdaoLI2CHb787IlDaDKsYYU=
+github.com/fairwindsops/pluto/v5 v5.20.3 h1:VznhtWQL5YETPOJdQro84cyK/Y0eZthwqTZ2smdWxrI=
+github.com/fairwindsops/pluto/v5 v5.20.3/go.mod h1:EyAsOnv93/1zXAuNjnoq/v3Taxz7YNOpmPPhAPEzb/A=
github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
@@ -722,25 +730,20 @@ github.com/fatih/set v0.2.1 h1:nn2CaJyknWE/6txyUDGwysr3G5QC6xWB/PtVjPBbeaA=
github.com/fatih/set v0.2.1/go.mod h1:+RKtMCH+favT2+3YecHGxcc0b4KyVWA1QWWJUs4E0CI=
github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
-github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/fluxcd/gitkit v0.6.0 h1:iNg5LTx6ePo+Pl0ZwqHTAkhbUHxGVSY3YCxCdw7VIFg=
github.com/fluxcd/gitkit v0.6.0/go.mod h1:svOHuKi0fO9HoawdK4HfHAJJseZDHHjk7I3ihnCIqNo=
-github.com/fluxcd/helm-controller/api v1.0.1 h1:Gn9qEVuif6D5+gHmVwTEZkR4+nmLOcOhKx4Sw2gL2EA=
-github.com/fluxcd/helm-controller/api v1.0.1/go.mod h1:/6AD5a2qjo/ttxVM8GR33syLZwqigta60DCLdy8GrME=
github.com/fluxcd/pkg/apis/acl v0.3.0 h1:UOrKkBTOJK+OlZX7n8rWt2rdBmDCoTK+f5TY2LcZi8A=
github.com/fluxcd/pkg/apis/acl v0.3.0/go.mod h1:WVF9XjSMVBZuU+HTTiSebGAWMgM7IYexFLyVWbK9bNY=
-github.com/fluxcd/pkg/apis/kustomize v1.5.0 h1:ah4sfqccnio+/5Edz/tVz6LetFhiBoDzXAElj6fFCzU=
-github.com/fluxcd/pkg/apis/kustomize v1.5.0/go.mod h1:nEzhnhHafhWOUUV8VMFLojUOH+HHDEsL75y54mt/c30=
-github.com/fluxcd/pkg/apis/meta v1.5.0 h1:/G82d2Az5D9op3F+wJUpD8jw/eTV0suM6P7+cSURoUM=
-github.com/fluxcd/pkg/apis/meta v1.5.0/go.mod h1:Y3u7JomuuKtr5fvP1Iji2/50FdRe5GcBug2jawNVkdM=
-github.com/fluxcd/source-controller/api v1.3.0 h1:Z5Lq0aJY87yg0cQDEuwGLKS60GhdErCHtsi546HUt10=
-github.com/fluxcd/source-controller/api v1.3.0/go.mod h1:+tfd0vltjcVs/bbnq9AlYR9AAHSVfM/Z4v4TpQmdJf4=
+github.com/fluxcd/pkg/apis/meta v1.6.1 h1:maLhcRJ3P/70ArLCY/LF/YovkxXbX+6sTWZwZQBeNq0=
+github.com/fluxcd/pkg/apis/meta v1.6.1/go.mod h1:YndB/gxgGZmKfqpAfFxyCDNFJFP0ikpeJzs66jwq280=
+github.com/fluxcd/source-controller/api v1.4.1 h1:zV01D7xzHOXWbYXr36lXHWWYS7POARsjLt61Nbh3kVY=
+github.com/fluxcd/source-controller/api v1.4.1/go.mod h1:gSjg57T+IG66SsBR0aquv+DFrm4YyBNpKIJVDnu3Ya8=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
-github.com/foxcpp/go-mockdns v1.0.0 h1:7jBqxd3WDWwi/6WhDvacvH1XsN3rOLXyHM1uhvIx6FI=
-github.com/foxcpp/go-mockdns v1.0.0/go.mod h1:lgRN6+KxQBawyIghpnl5CezHFGS9VLzvtVlwxvzXTQ4=
+github.com/foxcpp/go-mockdns v1.1.0 h1:jI0rD8M0wuYAxL7r/ynTrCQQq0BVqfB99Vgk7DlmewI=
+github.com/foxcpp/go-mockdns v1.1.0/go.mod h1:IhLeSFGed3mJIAXPH2aiRQB+kqz7oqu8ld2qVbOu7Wk=
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.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
@@ -753,13 +756,13 @@ github.com/fvbommel/sortorder v1.1.0 h1:fUmoe+HLsBTctBDoaBwpQo5N+nrCp8g/BjKb/6ZQ
github.com/fvbommel/sortorder v1.1.0/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
-github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I=
-github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s=
+github.com/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
+github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/github/go-spdx/v2 v2.3.1 h1:ffGuHTbHuHzWPt53n8f9o8clGutuLPObo3zB4JAjxU8=
-github.com/github/go-spdx/v2 v2.3.1/go.mod h1:2ZxKsOhvBp+OYBDlsGnUMcchLeo2mrpEBn2L1C+U3IQ=
+github.com/github/go-spdx/v2 v2.3.2 h1:IfdyNHTqzs4zAJjXdVQfRnxt1XMfycXoHBE2Vsm1bjs=
+github.com/github/go-spdx/v2 v2.3.2/go.mod h1:2ZxKsOhvBp+OYBDlsGnUMcchLeo2mrpEBn2L1C+U3IQ=
github.com/gkampitakis/ciinfo v0.3.0 h1:gWZlOC2+RYYttL0hBqcoQhM7h1qNkVqvRCV1fOvpAv8=
github.com/gkampitakis/ciinfo v0.3.0/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo=
github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M=
@@ -778,8 +781,8 @@ github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxI
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
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=
-github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow=
+github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8=
+github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM=
github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4=
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=
@@ -793,8 +796,8 @@ github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k=
github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
-github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk=
-github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
+github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E=
+github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
@@ -806,56 +809,50 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg=
-github.com/go-openapi/analysis v0.22.0 h1:wQ/d07nf78HNj4u+KiSY0sT234IAyePPbMgpUjUJQR0=
-github.com/go-openapi/analysis v0.22.0/go.mod h1:acDnkkCI2QxIo8sSIPgmp1wUlRohV7vfGtAIVae73b0=
-github.com/go-openapi/errors v0.21.0 h1:FhChC/duCnfoLj1gZ0BgaBmzhJC2SL/sJr8a2vAobSY=
-github.com/go-openapi/errors v0.21.0/go.mod h1:jxNTMUxRCKj65yb/okJGEtahVd7uvWnuWfj53bse4ho=
-github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
-github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
-github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4=
-github.com/go-openapi/loads v0.21.5 h1:jDzF4dSoHw6ZFADCGltDb2lE4F6De7aWSpe+IcsRzT0=
-github.com/go-openapi/loads v0.21.5/go.mod h1:PxTsnFBoBe+z89riT+wYt3prmSBP6GDAQh2l9H1Flz8=
-github.com/go-openapi/runtime v0.27.1 h1:ae53yaOoh+fx/X5Eaq8cRmavHgDma65XPZuvBqvJYto=
-github.com/go-openapi/runtime v0.27.1/go.mod h1:fijeJEiEclyS8BRurYE1DE5TLb9/KZl6eAdbzjsrlLU=
-github.com/go-openapi/spec v0.20.13 h1:XJDIN+dLH6vqXgafnl5SUIMnzaChQ6QTo0/UPMbkIaE=
-github.com/go-openapi/spec v0.20.13/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
-github.com/go-openapi/strfmt v0.22.0 h1:Ew9PnEYc246TwrEspvBdDHS4BVKXy/AOVsfqGDgAcaI=
-github.com/go-openapi/strfmt v0.22.0/go.mod h1:HzJ9kokGIju3/K6ap8jL+OlGAbjpSv27135Yr9OivU4=
-github.com/go-openapi/swag v0.22.9 h1:XX2DssF+mQKM2DHsbgZK74y/zj4mo9I99+89xUmuZCE=
-github.com/go-openapi/swag v0.22.9/go.mod h1:3/OXnFfnMAwBD099SwYRk7GD3xOrr1iL7d/XNLXVVwE=
-github.com/go-openapi/validate v0.22.4 h1:5v3jmMyIPKTR8Lv9syBAIRxG6lY0RqeBPB1LKEijzk8=
-github.com/go-openapi/validate v0.22.4/go.mod h1:qm6O8ZIcPVdSY5219468Jv7kBdGvkiZLPOmqnqTUZ2A=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
+github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
+github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
+github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
+github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
github.com/go-piv/piv-go v1.11.0 h1:5vAaCdRTFSIW4PeqMbnsDlUZ7odMYWnHBDGdmtU/Zhg=
github.com/go-piv/piv-go v1.11.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE=
-github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U=
+github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI=
github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow=
github.com/go-restruct/restruct v1.2.0-alpha h1:2Lp474S/9660+SJjpVxoKuWX09JsXHSrdV7Nv3/gkvc=
github.com/go-restruct/restruct v1.2.0-alpha/go.mod h1:KqrpKpn4M8OLznErihXTGLlsXFGeLxHUrLRRI/1YjGk=
-github.com/go-rod/rod v0.116.1 h1:BDMZY3qm/14SmvHBV7DoFUhXeJ2MbUYgumQ88b+v2WE=
-github.com/go-rod/rod v0.116.1/go.mod h1:3Ash9fYwznqz9S1uLQgQRStur4fCXjoxxGW+ym6TYjU=
+github.com/go-rod/rod v0.116.2 h1:A5t2Ky2A+5eD/ZJQr1EfsQSe5rms5Xof/qj296e+ZqA=
+github.com/go-rod/rod v0.116.2/go.mod h1:H+CMO9SCNc2TJ2WfrG+pKhITz57uGNYU43qYHh438Mg=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
-github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
-github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU=
-github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs=
-github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0=
-github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY=
-github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY=
-github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
@@ -865,8 +862,8 @@ github.com/goccy/go-yaml v1.12.0/go.mod h1:wKnAMd44+9JAAnGQpWVEgBzGt3YuTaQ4uXoHv
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
-github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
+github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
+github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
@@ -879,8 +876,8 @@ github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4=
-github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
+github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY=
+github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
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=
@@ -914,7 +911,6 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
@@ -928,8 +924,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU=
github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
-github.com/google/certificate-transparency-go v1.1.7 h1:IASD+NtgSTJLPdzkthwvAG1ZVbF2WtFg4IvoA68XGSw=
-github.com/google/certificate-transparency-go v1.1.7/go.mod h1:FSSBo8fyMVgqptbfF6j5p/XNdgQftAhSmXcIxV9iphE=
+github.com/google/certificate-transparency-go v1.2.1 h1:4iW/NwzqOqYEEoCBEFP+jPbBXbLqMpq3CifMyOnDUME=
+github.com/google/certificate-transparency-go v1.2.1/go.mod h1:bvn/ytAccv+I6+DGkqpvSsEdiVGramgaSC6RD3tEmeE=
github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM=
github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 h1:0VpGH+cDhbDtdcweoyCVsF3fhN8kejK6rFe/2FFX2nU=
@@ -985,17 +981,17 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe
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/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
-github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
-github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
+github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
+github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o=
-github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw=
+github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
+github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w=
github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM=
-github.com/google/trillian v1.5.3 h1:3ioA5p09qz+U9/t2riklZtaQdZclaStp0/eQNfewNRg=
-github.com/google/trillian v1.5.3/go.mod h1:p4tcg7eBr7aT6DxrAoILpc3uXNfcuAvZSnQKonVg+Eo=
+github.com/google/trillian v1.6.0 h1:jMBeDBIkINFvS2n6oV5maDqfRlxREAc6CW9QYWQ0qT4=
+github.com/google/trillian v1.6.0/go.mod h1:Yu3nIMITzNhhMJEHjAtp6xKiu+H/iHu2Oq5FjV2mCWI=
github.com/google/uuid v1.0.0/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=
@@ -1004,8 +1000,8 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
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.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs=
-github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0=
+github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
+github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
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=
@@ -1015,8 +1011,8 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99
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.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA=
-github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E=
+github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
+github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ=
@@ -1025,8 +1021,8 @@ github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
-github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
+github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE=
+github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
@@ -1036,8 +1032,8 @@ github.com/gosuri/uitable v0.0.4/go.mod h1:tKR86bXuXPZazfOTG1FIzvjIdXzd0mo4Vtn16
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM=
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I=
github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b h1:wDUNC2eKiL35DbLvsDhiblTUXHxcOPwQSCzi7xpQUN4=
github.com/hako/durafmt v0.0.0-20210608085754-5c1018a4e16b/go.mod h1:VzxiSdG6j1pi7rwGm/xYI5RbtpBgM8sARDXlvEvxlu0=
github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
@@ -1101,8 +1097,8 @@ github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn
github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
-github.com/hashicorp/vault/api v1.14.0 h1:Ah3CFLixD5jmjusOgm8grfN9M0d+Y8fVR2SW0K6pJLU=
-github.com/hashicorp/vault/api v1.14.0/go.mod h1:pV9YLxBGSz+cItFDd8Ii4G17waWOQ32zVjMWHe/cOqk=
+github.com/hashicorp/vault/api v1.15.0 h1:O24FYQCWwhwKnF7CuSqP30S51rTV7vz1iACXE/pj5DA=
+github.com/hashicorp/vault/api v1.15.0/go.mod h1:+5YTO09JGn0u+b6ySD/LLVf8WkJCPLAL2Vkmrn2+CM8=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
@@ -1120,6 +1116,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:
github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
+github.com/in-toto/attestation v1.1.0 h1:oRWzfmZPDSctChD0VaQV7MJrywKOzyNrtpENQFq//2Q=
+github.com/in-toto/attestation v1.1.0/go.mod h1:DB59ytd3z7cIHgXxwpSX2SABrU6WJUKg/grpdgHVgVs=
github.com/in-toto/in-toto-golang v0.9.0 h1:tHny7ac4KgtsfrG6ybU8gVOZux2H8jN05AXJ9EBM1XU=
github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3lUTQd+eF9HdeMo=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
@@ -1129,12 +1127,12 @@ github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10C
github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
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=
-github.com/jedib0t/go-pretty/v6 v6.5.9/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E=
+github.com/jedib0t/go-pretty/v6 v6.6.1 h1:iJ65Xjb680rHcikRj6DSIbzCex2huitmc7bDtxYVWyc=
+github.com/jedib0t/go-pretty/v6 v6.6.1/go.mod h1:zbn98qrYlh95FIhwwsbIip0LYpwSG8SUOScs+v9/t0E=
github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY=
github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E=
-github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE=
-github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4=
+github.com/jellydator/ttlcache/v3 v3.3.0 h1:BdoC9cE81qXfrxeb9eoJi9dWrdhSuwXMAnHTbnBm4Wc=
+github.com/jellydator/ttlcache/v3 v3.3.0/go.mod h1:bj2/e0l4jRnQdrnSTaGTsh4GSXvMjQcy41i7th0GVGw=
github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
@@ -1147,8 +1145,8 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs=
github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI=
-github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
-github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
+github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
+github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -1164,19 +1162,18 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
-github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
github.com/kastenhq/goversion v0.0.0-20230811215019-93b2f8823953 h1:WdAeg/imY2JFPc/9CST4bZ80nNJbiBFCAdSZCSgrS5Y=
github.com/kastenhq/goversion v0.0.0-20230811215019-93b2f8823953/go.mod h1:6o+UrvuZWc4UTyBhQf0LGjW9Ld7qJxLz/OqvSOWWlEc=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
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/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
+github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
github.com/klauspost/compress v1.11.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
@@ -1213,11 +1210,10 @@ github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
-github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
-github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec h1:2tTW6cDth2TSgRbAhD7yjZzTQmcN25sDRPEeinR51yQ=
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec/go.mod h1:TmwEoGCwIti7BCeJ9hescZgRtatxRE+A72pCoPfmcfk=
-github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
@@ -1236,12 +1232,6 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI=
-github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc=
-github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY=
-github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI=
-github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI=
-github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=
github.com/masahiro331/go-mvn-version v0.0.0-20210429150710-d3157d602a08 h1:AevUBW4cc99rAF8q8vmddIP8qd/0J5s/UyltGbp66dg=
@@ -1272,7 +1262,7 @@ 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.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
-github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -1319,8 +1309,8 @@ github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3N
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
-github.com/moby/moby v27.2.1+incompatible h1:mIRBoOsLr+Q6s+h65ZFyi6cXBEVy2RXCWS5HOHlxx54=
-github.com/moby/moby v27.2.1+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
+github.com/moby/moby v27.3.1+incompatible h1:KQbXBjo7PavKpzIl7UkHT31y9lw/e71Uvrqhr4X+zMA=
+github.com/moby/moby v27.3.1+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc=
github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8=
github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI=
github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg=
@@ -1329,8 +1319,10 @@ github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5
github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo=
github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI=
github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
-github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg=
-github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU=
+github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo=
+github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
+github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
+github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -1342,13 +1334,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
-github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
-github.com/mozillazg/docker-credential-acr-helper v0.3.0 h1:DVWFZ3/O8BP6Ue3iS/Olw+G07u1hCq1EOVCDZZjCIBI=
-github.com/mozillazg/docker-credential-acr-helper v0.3.0/go.mod h1:cZlu3tof523ujmLuiNUb6JsjtHcNA70u1jitrrdnuyA=
-github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto=
-github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY=
+github.com/mozillazg/docker-credential-acr-helper v0.4.0 h1:Uoh3Z9CcpEDnLiozDx+D7oDgRq7X+R296vAqAumnOcw=
+github.com/mozillazg/docker-credential-acr-helper v0.4.0/go.mod h1:2kiicb3OlPytmlNC9XGkLvVC+f0qTiJw3f/mhmeeQBg=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
@@ -1365,16 +1354,17 @@ github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJm
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 h1:Up6+btDp321ZG5/zdSLo48H9Iaq0UQGthrhWC6pCxzE=
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481/go.mod h1:yKZQO8QE2bHlgozqWDiRVqTFlLQSj30K/6SAK8EeYFw=
-github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
+github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc=
+github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM=
-github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60=
+github.com/oleiade/reflections v1.1.0 h1:D+I/UsXQB4esMathlt0kkZRJZdUDmhv5zGi/HOwYTWo=
+github.com/oleiade/reflections v1.1.0/go.mod h1:mCxx0QseeVCHs5Um5HhJeCKVC7AwS8kO67tky4rdisA=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -1383,16 +1373,16 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
-github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
+github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw=
+github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
-github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
-github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
-github.com/open-policy-agent/opa v0.61.0 h1:nhncQ2CAYtQTV/SMBhDDPsCpCQsUW+zO/1j+T5V7oZg=
-github.com/open-policy-agent/opa v0.61.0/go.mod h1:7OUuzJnsS9yHf8lw0ApfcbrnaRG1EkN3J2fuuqi4G/E=
+github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
+github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
+github.com/open-policy-agent/opa v0.68.0 h1:Jl3U2vXRjwk7JrHmS19U3HZO5qxQRinQbJ2eCJYSqJQ=
+github.com/open-policy-agent/opa v0.68.0/go.mod h1:5E5SvaPwTpwt2WM177I9Z3eT7qUpmOGjk1ZdHs+TZ4w=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug=
@@ -1431,8 +1421,8 @@ github.com/petergtz/pegomock v2.9.0+incompatible/go.mod h1:nuBLWZpVyv/fLo56qTwt/
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
-github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4=
-github.com/pierrec/lz4/v4 v4.1.19/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=
@@ -1457,8 +1447,8 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
-github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE=
-github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
+github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI=
+github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -1474,7 +1464,6 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
-github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf h1:014O62zIzQwvoD7Ekj3ePDF5bv9Xxy0w6AZk0qYbjUk=
@@ -1497,8 +1486,8 @@ github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5/go.mod h1:fyalQWdtzDBECAQFBJu
github.com/redis/go-redis/extra/redisotel/v9 v9.0.5 h1:EfpWLLCyXw8PSM2/XNJLjI3Pb27yVE+gIAfeqp8LUCc=
github.com/redis/go-redis/extra/redisotel/v9 v9.0.5/go.mod h1:WZjPDy7VNzn77AAfnAfVjZNvfJTYfPetfZk5yoSTLaQ=
github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
-github.com/redis/go-redis/v9 v9.3.0 h1:RiVDjmig62jIWp7Kk4XVLs0hzV6pI3PyTnnL0cnn0u0=
-github.com/redis/go-redis/v9 v9.3.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
+github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4=
+github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
@@ -1511,8 +1500,8 @@ github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0=
github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
-github.com/rubenv/sql-migrate v1.5.2 h1:bMDqOnrJVV/6JQgQ/MxOpU+AdO8uzYYA/TxFUBzFtS0=
-github.com/rubenv/sql-migrate v1.5.2/go.mod h1:H38GW8Vqf8F0Su5XignRyaRcbXbJunSWxs+kmzlg0Is=
+github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI=
+github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
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=
@@ -1523,8 +1512,8 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH
github.com/saferwall/pe v1.5.4 h1:tLmMggEMUfeqrpJ25zS/okUQmyFdD5xWKL2+z9njCqg=
github.com/saferwall/pe v1.5.4/go.mod h1:mJx+PuptmNpoPFBNhWs/uDMFL/kTHVZIkg0d4OUJFbQ=
github.com/sagikazarmark/crypt v0.3.0/go.mod h1:uD/D+6UF4SrIR1uGEv7bBNkNqLGqUr43MRiaGWX1Nig=
-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/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk=
+github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA=
@@ -1537,13 +1526,13 @@ github.com/sassoftware/go-rpmutils v0.4.0 h1:ojND82NYBxgwrV+mX1CWsd5QJvvEZTKddtC
github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jNYPjT5mVcQcIsYzI=
github.com/sassoftware/relic v7.2.1+incompatible h1:Pwyh1F3I0r4clFJXkSI8bOyJINGqpgjJU3DYAZeI05A=
github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq3K9hs5w6FpNMdUT//qR+zk=
-github.com/sassoftware/relic/v7 v7.6.1 h1:O5s8ewCgq5QYNpv45dK4u6IpBmDM9RIcsbf/G1uXepQ=
-github.com/sassoftware/relic/v7 v7.6.1/go.mod h1:NxwtWxWxlUa9as2qZi635Ye6bBT/tGnMALLq7dSfOOU=
+github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4=
+github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k=
github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e h1:7q6NSFZDeGfvvtIRwBrU/aegEYJYmvev0cHAwo17zZQ=
github.com/scylladb/go-set v1.0.3-0.20200225121959-cc7b2070d91e/go.mod h1:DkpGd78rljTxKAnTDPFqXSGxvETQnJyuSOQwsHycqfs=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
-github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
+github.com/sebdah/goldie/v2 v2.5.5 h1:rx1mwF95RxZ3/83sdS4Yp7t2C5TCokvWP4TBRbAyEWY=
+github.com/sebdah/goldie/v2 v2.5.5/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d h1:RQqyEogx5J6wPdoxqL132b100j8KjcVHO1c0KLRoIhc=
github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d/go.mod h1:PegD7EVqlN88z7TpCqH92hHP+GBpfomGCCnw1PFtNOA=
github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA=
@@ -1559,28 +1548,31 @@ github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh
github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/sigstore/cosign/v2 v2.2.3 h1:WX7yawI+EXu9h7S5bZsfYCbB9XW6Jc43ctKy/NoOSiA=
-github.com/sigstore/cosign/v2 v2.2.3/go.mod h1:WpMn4MBt0cI23GdHsePwO4NxhX1FOz1ITGB3ALUjFaI=
-github.com/sigstore/fulcio v1.4.3 h1:9JcUCZjjVhRF9fmhVuz6i1RyhCc/EGCD7MOl+iqCJLQ=
-github.com/sigstore/fulcio v1.4.3/go.mod h1:BQPWo7cfxmJwgaHlphUHUpFkp5+YxeJes82oo39m5og=
-github.com/sigstore/rekor v1.3.4 h1:RGIia1iOZU7fOiiP2UY/WFYhhp50S5aUm7YrM8aiA6E=
-github.com/sigstore/rekor v1.3.4/go.mod h1:1GubPVO2yO+K0m0wt/3SHFqnilr/hWbsjSOe7Vzxrlg=
-github.com/sigstore/sigstore v1.8.7 h1:L7/zKauHTg0d0Hukx7qlR4nifh6T6O6UIt9JBwAmTIg=
-github.com/sigstore/sigstore v1.8.7/go.mod h1:MPiQ/NIV034Fc3Kk2IX9/XmBQdK60wfmpvgK9Z1UjRA=
-github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1 h1:rEDdUefulkIQaMJyzLwtgPDLNXBIltBABiFYfb0YmgQ=
-github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.1/go.mod h1:RCdYCc1IxCYWzh2IdzdA6Yf7JIY0cMRqH08fpQYechw=
-github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1 h1:DvRWG99QGWZC5mp42SEde2Xke/Q384Idnj2da7yB+Mk=
-github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.1/go.mod h1:s13mo3a0UCQS3+PAUUZfvKe48sMDMsHk2GE1b2YfPcU=
-github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.7 h1:zYg1XlbKpQkmE7FpWTkLuUn7RttLAq4FcZ1G9JcqhoY=
-github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.7/go.mod h1:VmUsO1R4OHuyHBEgI4bbSUn0z2nojszrDMvlDxyX/dE=
-github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.7 h1:dbcB9VEddYrvK+y4rHeES5OZ/pMQuucfJ0qCNWQmnp0=
-github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.7/go.mod h1:96MrPJBkHiAvqFyqviuYbwPAdbPCj8CR3V0RJ9bKjrE=
-github.com/sigstore/timestamp-authority v1.2.1 h1:j9RmqSAdvKgSofeltPO4x7d+1M3AXaROBzUJ+AA7L5Q=
-github.com/sigstore/timestamp-authority v1.2.1/go.mod h1:Ce+vWWEf0QaKLY2u6mpwEJbmYXEVeOfUk4fQ69kE6ck=
+github.com/sigstore/cosign/v2 v2.4.1 h1:b8UXEfJFks3hmTwyxrRNrn6racpmccUycBHxDMkEPvU=
+github.com/sigstore/cosign/v2 v2.4.1/go.mod h1:GvzjBeUKigI+XYnsoVQDmMAsMMc6engxztRSuxE+x9I=
+github.com/sigstore/fulcio v1.6.3 h1:Mvm/bP6ELHgazqZehL8TANS1maAkRoM23CRAdkM4xQI=
+github.com/sigstore/fulcio v1.6.3/go.mod h1:5SDgLn7BOUVLKe1DwOEX3wkWFu5qEmhUlWm+SFf0GH8=
+github.com/sigstore/protobuf-specs v0.3.2 h1:nCVARCN+fHjlNCk3ThNXwrZRqIommIeNKWwQvORuRQo=
+github.com/sigstore/protobuf-specs v0.3.2/go.mod h1:RZ0uOdJR4OB3tLQeAyWoJFbNCBFrPQdcokntde4zRBA=
+github.com/sigstore/rekor v1.3.6 h1:QvpMMJVWAp69a3CHzdrLelqEqpTM3ByQRt5B5Kspbi8=
+github.com/sigstore/rekor v1.3.6/go.mod h1:JDTSNNMdQ/PxdsS49DJkJ+pRJCO/83nbR5p3aZQteXc=
+github.com/sigstore/sigstore v1.8.9 h1:NiUZIVWywgYuVTxXmRoTT4O4QAGiTEKup4N1wdxFadk=
+github.com/sigstore/sigstore v1.8.9/go.mod h1:d9ZAbNDs8JJfxJrYmulaTazU3Pwr8uLL9+mii4BNR3w=
+github.com/sigstore/sigstore-go v0.6.1 h1:tGkkv1oDIER+QYU5MrjqlttQOVDWfSkmYwMqkJhB/cg=
+github.com/sigstore/sigstore-go v0.6.1/go.mod h1:Xe5GHmUeACRFbomUWzVkf/xYCn8xVifb9DgqJrV2dIw=
+github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.9 h1:tgpdvjyoEgYFeTBFe4MHvBKsG+J4E7NVtstChIExVT8=
+github.com/sigstore/sigstore/pkg/signature/kms/aws v1.8.9/go.mod h1:wCz6cAZKL/wFumDHX9l8VkVITS2GntrOfs2j/kwH4wo=
+github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.10 h1:9tZEpfIL/ewAG9G87AHe3aVoy8Ujos2F1qLfCckX6jQ=
+github.com/sigstore/sigstore/pkg/signature/kms/azure v1.8.10/go.mod h1:VnIAcitund62R45ezK/dtUeEhuRtB3LsAgJ8m0H34zc=
+github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.10 h1:Xre51HdjIIaVo5ox5zyL+6h0tkrx7Ke9Neh7fLmmZK0=
+github.com/sigstore/sigstore/pkg/signature/kms/gcp v1.8.10/go.mod h1:VNfdklQDbyGJog8S7apdxiEfmYmCkKyxrsCL9xprkTY=
+github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.10 h1:HjfjL3x3dP2kaGqQHVog974cTcKfzFaGjfZyLQ9KXrg=
+github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.10/go.mod h1:jaeEjkTW1p3gUyPjz9lTcT4TydCs208FoyAwIs6bIT4=
+github.com/sigstore/timestamp-authority v1.2.2 h1:X4qyutnCQqJ0apMewFyx+3t7Tws00JQ/JonBiu3QvLE=
+github.com/sigstore/timestamp-authority v1.2.2/go.mod h1:nEah4Eq4wpliDjlY342rXclGSO7Kb9hoRrl9tqLW13A=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
@@ -1614,8 +1606,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
-github.com/spiffe/go-spiffe/v2 v2.1.7 h1:VUkM1yIyg/x8X7u1uXqSRVRCdMdfRIEdFBzpqoeASGk=
-github.com/spiffe/go-spiffe/v2 v2.1.7/go.mod h1:QJDGdhXllxjxvd5B+2XnhhXB/+rC8gr+lNrtOryiWeE=
+github.com/spiffe/go-spiffe/v2 v2.3.0 h1:g2jYNb/PDMB8I7mBGL2Zuq/Ur6hUhoroxGQFyD6tTj8=
+github.com/spiffe/go-spiffe/v2 v2.3.0/go.mod h1:Oxsaio7DBgSNqhAO9i/9tLClaVlfRok7zvJnTV8ZyIY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
@@ -1640,8 +1632,8 @@ github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
-github.com/sylabs/sif/v2 v2.17.1 h1:p6Sl0LWyShXBj2SBsS1dMOMIMrZHe8pwBnBrYt6uo4M=
-github.com/sylabs/sif/v2 v2.17.1/go.mod h1:XUGB6AQUXGkms3qPOPdevctT3lBLRLWZNWHVnt5HMKE=
+github.com/sylabs/sif/v2 v2.19.1 h1:1eeMmFc8elqJe60ZiWwXgL3gMheb0IP4GmNZ4q0IEA0=
+github.com/sylabs/sif/v2 v2.19.1/go.mod h1:U1SUhvl8X1JIxAylC0DYz1fa/Xba6EMZD1dGPGBH83E=
github.com/sylabs/squashfs v1.0.0 h1:xAyMS21ogglkuR5HaY55PCfqY3H32ma9GkasTYo28Zg=
github.com/sylabs/squashfs v1.0.0/go.mod h1:rhWzvgefq1X+R+LZdts10hfMsTg3g74OfGunW8tvg/4=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
@@ -1656,6 +1648,8 @@ github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+x
github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY=
github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qvs5LdxRWqRI=
github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug=
+github.com/theupdateframework/go-tuf/v2 v2.0.1 h1:11p9tXpq10KQEujxjcIjDSivMKCMLguls7erXHZnxJQ=
+github.com/theupdateframework/go-tuf/v2 v2.0.1/go.mod h1:baB22nBHeHBCeuGZcIlctNq4P61PcOdyARlplg5xmLA=
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
@@ -1696,13 +1690,10 @@ github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
-github.com/xanzy/go-gitlab v0.96.0 h1:LGkZ+wSNMRtHIBaYE4Hq3dZVjprwHv3Y1+rhKU3WETs=
-github.com/xanzy/go-gitlab v0.96.0/go.mod h1:ETg8tcj4OhrB84UEgeE8dSuV/0h4BBL1uOV/qK0vlyI=
+github.com/xanzy/go-gitlab v0.109.0 h1:RcRme5w8VpLXTSTTMZdVoQWY37qTJWg+gwdQl4aAttE=
+github.com/xanzy/go-gitlab v0.109.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY=
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/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
-github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
-github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
@@ -1716,7 +1707,6 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavM
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
github.com/yashtewari/glob-intersection v0.2.0 h1:8iuHdN88yYuCzCdjt0gDe+6bAhUwBeEWqThExu54RFg=
github.com/yashtewari/glob-intersection v0.2.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok=
-github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
github.com/ysmood/fetchup v0.2.3 h1:ulX+SonA0Vma5zUFXtv52Kzip/xe7aj4vqT5AJwQ+ZQ=
github.com/ysmood/fetchup v0.2.3/go.mod h1:xhibcRKziSvol0H1/pj33dnKrYyI2ebIvz5cOOkYGns=
github.com/ysmood/goob v0.4.0 h1:HsxXhyLBeGzWXnqVKtmT9qM7EuVs/XOgkX7T6r1o1AQ=
@@ -1725,8 +1715,8 @@ github.com/ysmood/got v0.40.0 h1:ZQk1B55zIvS7zflRrkGfPDrPG3d7+JOza1ZkNxcc74Q=
github.com/ysmood/got v0.40.0/go.mod h1:W7DdpuX6skL3NszLmAsC5hT7JAhuLZhByVzHTq874Qg=
github.com/ysmood/gson v0.7.3 h1:QFkWbTH8MxyUTKPkVWAENJhxqdBa4lYTQWqZCiLG6kE=
github.com/ysmood/gson v0.7.3/go.mod h1:3Kzs5zDl21g5F/BlLTNcuAGAYLKt2lV5G8D1zF3RNmg=
-github.com/ysmood/leakless v0.8.0 h1:BzLrVoiwxikpgEQR0Lk8NyBN5Cit2b1z+u0mgL4ZJak=
-github.com/ysmood/leakless v0.8.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=
+github.com/ysmood/leakless v0.9.0 h1:qxCG5VirSBvmi3uynXFkcnLMzkphdh3xx5FtrORwDCU=
+github.com/ysmood/leakless v0.9.0/go.mod h1:R8iAXPRaG97QJwqxs74RdwzcRHT1SWCGTNqY8q0JvMQ=
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.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1736,8 +1726,8 @@ github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
-github.com/zalando/go-keyring v0.2.2 h1:f0xmpYiSrHtSNAVgwip93Cg8tuF45HJM6rHq/A5RI/4=
-github.com/zalando/go-keyring v0.2.2/go.mod h1:sI3evg9Wvpw3+n4SqplGSJUMwtDeROfD4nsFz4z9PG0=
+github.com/zalando/go-keyring v0.2.3 h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=
+github.com/zalando/go-keyring v0.2.3/go.mod h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=
github.com/zclconf/go-cty v1.14.0 h1:/Xrd39K7DXbHzlisFP9c4pHao4yyf+/Ug9LEz+Y/yhc=
github.com/zclconf/go-cty v1.14.0/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE=
github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
@@ -1747,8 +1737,8 @@ github.com/zyedidia/generic v1.2.2-0.20230320175451-4410d2372cb1/go.mod h1:ly2RB
go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs=
-go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk=
-go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo=
+go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
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=
@@ -1760,20 +1750,20 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/contrib/exporters/autoexport v0.46.1 h1:ysCfPZB9AjUlMa1UHYup3c9dAOCMQX/6sxSfPBUoxHw=
go.opentelemetry.io/contrib/exporters/autoexport v0.46.1/go.mod h1:ha0aiYm+DOPsLHjh0zoQ8W8sLT+LJ58J3j47lGpSLrU=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0 h1:vS1Ao/R55RNV4O7TA2Qopok8yN+X0LIP6RVWLFkprck=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.52.0/go.mod h1:BMsdeOxN04K0L5FNUBfjFdvwWGNe/rkmSwH4Aelu/X0=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg=
-go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo=
-go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
+go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
+go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0 h1:bflGWrfYyuulcdxf14V6n9+CoQcu5SAAdHmDPAJnlps=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.44.0/go.mod h1:qcTO4xHAxZLaLxPd60TdE88rxtItPHgHWqOhOGRr0as=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0/go.mod h1:/OpE/y70qVkndM0TrxT4KBoN3RsFZP0QaofcfYrj76I=
go.opentelemetry.io/otel/exporters/prometheus v0.44.0 h1:08qeJgaPC0YEBu2PQMbqU3rogTlyzpjhCI2b58Yn00w=
@@ -1782,21 +1772,19 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0 h1:dEZWPjVN22urgY
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.44.0/go.mod h1:sTt30Evb7hJB/gEk27qLb1+l9n4Tb8HvHkR0Wx3S6CU=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0 h1:VhlEQAPp9R1ktYfrPk5SOryw1e9LDDTZCbIPFrho0ec=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.21.0/go.mod h1:kB3ufRbfU+CQ4MlUcqtW8Z7YEOBeK2DJ6CmR5rYYF3E=
-go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q=
-go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s=
-go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE=
-go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg=
+go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
+go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
+go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo=
+go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok=
go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08=
go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg=
-go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g=
-go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI=
+go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
+go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
-go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY=
-go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds=
-go.step.sm/crypto v0.42.1 h1:OmwHm3GJO8S4VGWL3k4+I+Q4P/F2s+j8msvTyGnh1Vg=
-go.step.sm/crypto v0.42.1/go.mod h1:yNcTLFQBnYCA75fC5bklBoTAT7y0dRZsB1TkinB8JMs=
+go.step.sm/crypto v0.51.2 h1:5EiCGIMg7IvQTGmJrwRosbXeprtT80OhoS/PJarg60o=
+go.step.sm/crypto v0.51.2/go.mod h1:QK7czLjN2k+uqVp5CHXxJbhc70kVRSP+0CQF3zsR5M0=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
@@ -1804,8 +1792,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
-go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -1827,9 +1815,10 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
+golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
-golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
+golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
+golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1840,8 +1829,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 h1:hNQpMuAJe5CtcUqCXaWga3FHu+kQvCqcsoVaQgSV60o=
-golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
+golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI=
+golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1933,12 +1922,12 @@ golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfS
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.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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
-golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
-golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
+golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
+golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1965,8 +1954,8 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri
golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
+golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1982,6 +1971,7 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/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.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2086,23 +2076,24 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
-golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
+golang.org/x/sys v0.26.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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
+golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
-golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM=
-golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8=
+golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
+golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
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=
@@ -2112,21 +2103,21 @@ 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.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.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
-golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
+golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
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.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
-golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
+golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -2186,8 +2177,8 @@ 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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
-golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
+golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
+golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
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=
@@ -2248,8 +2239,8 @@ google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ
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.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70=
-google.golang.org/api v0.187.0 h1:Mxs7VATVC2v7CY+7Xwm4ndkX71hpElcvx0D1Ji/p1eo=
-google.golang.org/api v0.187.0/go.mod h1:KIHlTc4x7N7gKKuVsdmfBXN13yEEWXWFURWY6SBp2gk=
+google.golang.org/api v0.200.0 h1:0ytfNWn101is6e9VBoct2wrGDjOi5vn7jw5KtaQgDrU=
+google.golang.org/api v0.200.0/go.mod h1:Tc5u9kcbjO7A8SwGlYj4IiVifJU01UqXtEgDMYmBmV8=
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=
@@ -2362,12 +2353,12 @@ google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqw
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-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s=
-google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d h1:PksQg4dV6Sem3/HkBX+Ltq8T0ke0PKIRBNBatoDTVls=
-google.golang.org/genproto v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:s7iA721uChleev562UJO2OYB0PPT9CMFjV+Ce7VJH5M=
-google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d h1:Aqf0fiIdUQEj0Gn9mKFFXoQfTTEaNopWpfVyYADxiSg=
-google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Od4k8V1LQSizPRUK4OzZ7TBE/20k+jPczUDAEyvn69Y=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
+google.golang.org/genproto v0.0.0-20241007155032-5fefd90f89a9 h1:nFS3IivktIU5Mk6KQa+v6RKkHUpdQpphqGNLxqNnbEk=
+google.golang.org/genproto v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:tEzYTYZxbmVNOu0OAFH9HzdJtLn6h4Aj89zzlBCdHms=
+google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f h1:jTm13A2itBi3La6yTGqn8bVSrc3ZZ1r8ENHlIXBfnRA=
+google.golang.org/genproto/googleapis/api v0.0.0-20240930140551-af27646dc61f/go.mod h1:CLGoBuH1VHxAUXVPP8FfPwPEVJB6lz3URE5mY2SuayE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
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=
@@ -2404,8 +2395,8 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu
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.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
-google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
+google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
+google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
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=
@@ -2422,8 +2413,8 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
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.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
-google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
+google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
+google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -2465,8 +2456,8 @@ gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8=
gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
-helm.sh/helm/v3 v3.15.3 h1:HcZDaVFe9uHa6hpsR54mJjYyRy4uz/pc6csg27nxFOc=
-helm.sh/helm/v3 v3.15.3/go.mod h1:FzSIP8jDQaa6WAVg9F+OkKz7J0ZmAga4MABtTbsb9WQ=
+helm.sh/helm/v3 v3.16.2 h1:Y9v7ry+ubQmi+cb5zw1Llx8OKHU9Hk9NQ/+P+LGBe2o=
+helm.sh/helm/v3 v3.16.2/go.mod h1:SyTXgKBjNqi2NPsHCW5dDAsHqvGIu0kdNYNH9gQaw70=
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=
@@ -2474,26 +2465,26 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
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=
-k8s.io/api v0.31.1 h1:Xe1hX/fPW3PXYYv8BlozYqw63ytA92snr96zMW9gWTU=
-k8s.io/api v0.31.1/go.mod h1:sbN1g6eY6XVLeqNsZGLnI5FwVseTrZX7Fv3O26rhAaI=
-k8s.io/apiextensions-apiserver v0.30.1 h1:4fAJZ9985BmpJG6PkoxVRpXv9vmPUOVzl614xarePws=
-k8s.io/apiextensions-apiserver v0.30.1/go.mod h1:R4GuSrlhgq43oRY9sF2IToFh7PVlF1JjfWdoG3pixk4=
-k8s.io/apimachinery v0.31.1 h1:mhcUBbj7KUjaVhyXILglcVjuS4nYXiwC+KKFBgIVy7U=
-k8s.io/apimachinery v0.31.1/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
-k8s.io/apiserver v0.30.1 h1:BEWEe8bzS12nMtDKXzCF5Q5ovp6LjjYkSp8qOPk8LZ8=
-k8s.io/apiserver v0.30.1/go.mod h1:i87ZnQ+/PGAmSbD/iEKM68bm1D5reX8fO4Ito4B01mo=
+k8s.io/api v0.31.2 h1:3wLBbL5Uom/8Zy98GRPXpJ254nEFpl+hwndmk9RwmL0=
+k8s.io/api v0.31.2/go.mod h1:bWmGvrGPssSK1ljmLzd3pwCQ9MgoTsRCuK35u6SygUk=
+k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40=
+k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ=
+k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw=
+k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
+k8s.io/apiserver v0.31.1 h1:Sars5ejQDCRBY5f7R3QFHdqN3s61nhkpaX8/k1iEw1c=
+k8s.io/apiserver v0.31.1/go.mod h1:lzDhpeToamVZJmmFlaLwdYZwd7zB+WYRYIboqA1kGxM=
k8s.io/cli-runtime v0.31.1 h1:/ZmKhmZ6hNqDM+yf9s3Y4KEYakNXUn5sod2LWGGwCuk=
k8s.io/cli-runtime v0.31.1/go.mod h1:pKv1cDIaq7ehWGuXQ+A//1OIF+7DI+xudXtExMCbe9U=
-k8s.io/client-go v0.31.1 h1:f0ugtWSbWpxHR7sjVpQwuvw9a3ZKLXX0u0itkFXufb0=
-k8s.io/client-go v0.31.1/go.mod h1:sKI8871MJN2OyeqRlmA4W4KM9KBdBUpDLu/43eGemCg=
+k8s.io/client-go v0.31.2 h1:Y2F4dxU5d3AQj+ybwSMqQnpZH9F30//1ObxOKlTI9yc=
+k8s.io/client-go v0.31.2/go.mod h1:NPa74jSVR/+eez2dFsEIHNa+3o09vtNaWwWwb1qSxSs=
k8s.io/component-base v0.31.1 h1:UpOepcrX3rQ3ab5NB6g5iP0tvsgJWzxTyAo20sgYSy8=
k8s.io/component-base v0.31.1/go.mod h1:WGeaw7t/kTsqpVTaCoVEtillbqAhF2/JgvO0LDOMa0w=
k8s.io/component-helpers v0.31.1 h1:5hZUf3747atdgtR3gPntrG35rC2CkK7rYq2KUraz6Os=
k8s.io/component-helpers v0.31.1/go.mod h1:ye0Gi8KzFNTfpIuzvVDtxJQMP/0Owkukf1vGf22Hl6U=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag=
-k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
+k8s.io/kube-openapi v0.0.0-20240816214639-573285566f34 h1:/amS69DLm09mtbFtN3+LyygSFohnYGMseF8iv+2zulg=
+k8s.io/kube-openapi v0.0.0-20240816214639-573285566f34/go.mod h1:G0W3eI9gG219NHRq3h5uQaRBl4pj4ZpwzRP5ti8y770=
k8s.io/kubectl v0.31.1 h1:ih4JQJHxsEggFqDJEHSOdJ69ZxZftgeZvYo7M/cpp24=
k8s.io/kubectl v0.31.1/go.mod h1:aNuQoR43W6MLAtXQ/Bu4GDmoHlbhHKuyD49lmTC8eJM=
k8s.io/metrics v0.31.1 h1:h4I4dakgh/zKflWYAOQhwf0EXaqy8LxAIyE/GBvxqRc=
@@ -2533,23 +2524,23 @@ oras.land/oras-go/v2 v2.5.0/go.mod h1:z4eisnLP530vwIOUOJeBIj0aGI0L1C3d53atvCBqZH
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/cli-utils v0.36.0 h1:k7GM6LmIMydtvM6Ad91XuqKk0QEVL9bVbaiX1uvWIrA=
-sigs.k8s.io/cli-utils v0.36.0/go.mod h1:uCFC3BPXB3xHFQyKkWUlTrncVDCKzbdDfqZqRTCrk24=
-sigs.k8s.io/controller-runtime v0.18.1 h1:RpWbigmuiylbxOCLy0tGnq1cU1qWPwNIQzoJk+QeJx4=
-sigs.k8s.io/controller-runtime v0.18.1/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw=
+sigs.k8s.io/cli-utils v0.37.2 h1:GOfKw5RV2HDQZDJlru5KkfLO1tbxqMoyn1IYUxqBpNg=
+sigs.k8s.io/cli-utils v0.37.2/go.mod h1:V+IZZr4UoGj7gMJXklWBg6t5xbdThFBcpj4MrZuCYco=
+sigs.k8s.io/controller-runtime v0.19.0 h1:nWVM7aq+Il2ABxwiCizrVDSlmDcshi9llbaFbC0ji/Q=
+sigs.k8s.io/controller-runtime v0.19.0/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
-sigs.k8s.io/kustomize/api v0.17.3 h1:6GCuHSsxq7fN5yhF2XrC+AAr8gxQwhexgHflOAD/JJU=
-sigs.k8s.io/kustomize/api v0.17.3/go.mod h1:TuDH4mdx7jTfK61SQ/j1QZM/QWR+5rmEiNjvYlhzFhc=
-sigs.k8s.io/kustomize/kustomize/v5 v5.4.2 h1:9Zl5Gqg3XMdBEvkR54pVLCBj7FVO7W+VPNDDEzD6AyE=
-sigs.k8s.io/kustomize/kustomize/v5 v5.4.2/go.mod h1:5ypfJVYlPb2MKKeoGknVLxvHemDlQT+szI4+KOhnD6k=
-sigs.k8s.io/kustomize/kyaml v0.17.2 h1:+AzvoJUY0kq4QAhH/ydPHHMRLijtUKiyVyh7fOSshr0=
-sigs.k8s.io/kustomize/kyaml v0.17.2/go.mod h1:9V0mCjIEYjlXuCdYsSXvyoy2BTsLESH7TlGV81S282U=
-sigs.k8s.io/release-utils v0.7.7 h1:JKDOvhCk6zW8ipEOkpTGDH/mW3TI+XqtPp16aaQ79FU=
-sigs.k8s.io/release-utils v0.7.7/go.mod h1:iU7DGVNi3umZJ8q6aHyUFzsDUIaYwNnNKGHo3YE5E3s=
+sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo=
+sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U=
+sigs.k8s.io/kustomize/kustomize/v5 v5.5.0 h1:o1mtt6vpxsxDYaZKrw3BnEtc+pAjLz7UffnIvHNbvW0=
+sigs.k8s.io/kustomize/kustomize/v5 v5.5.0/go.mod h1:AeFCmgCrXzmvjWWaeZCyBp6XzG1Y0w1svYus8GhJEOE=
+sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E=
+sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo=
+sigs.k8s.io/release-utils v0.8.4 h1:4QVr3UgbyY/d9p74LBhg0njSVQofUsAZqYOzVZBhdBw=
+sigs.k8s.io/release-utils v0.8.4/go.mod h1:m1bHfscTemQp+z+pLCZnkXih9n0+WukIUU70n6nFnU0=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
-software.sslmate.com/src/go-pkcs12 v0.2.0 h1:nlFkj7bTysH6VkC4fGphtjXRbezREPgrHuJG20hBGPE=
-software.sslmate.com/src/go-pkcs12 v0.2.0/go.mod h1:23rNcYsMabIc1otwLpTkCCPwUq6kQsTyowttG/as0kQ=
+software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=
+software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=
diff --git a/hack/examples-checksums/zarf-package-component-actions-amd64.txt b/hack/examples-checksums/zarf-package-component-actions-amd64.txt
new file mode 100644
index 0000000000..24913a26dd
--- /dev/null
+++ b/hack/examples-checksums/zarf-package-component-actions-amd64.txt
@@ -0,0 +1,3 @@
+cfd67a2aeebf13c632207183e1d5cd57146a28aa22b5ddf8896c6ce593c627c2 components/on-deploy-with-wait-action.tar
+d26e18c92ff9f93b296fad6be153f02d4a746f0ec44dbcf4c526f1e121ffe4ec components/on-remove.tar
+fbfcd7215652819a3b03084d2a12ca7594d8c610ac6e2ebed2f229a0019a52e2 components/on-deploy-with-template-use-of-variable.tar
diff --git a/hack/examples-checksums/zarf-package-component-choice-amd64.txt b/hack/examples-checksums/zarf-package-component-choice-amd64.txt
new file mode 100644
index 0000000000..ecce58903a
--- /dev/null
+++ b/hack/examples-checksums/zarf-package-component-choice-amd64.txt
@@ -0,0 +1,2 @@
+fa862d90928e52ccc9faa69b5eae73bb97fa5acb76407ba6a177eb338f7d692d components/first-choice.tar
+fb99083f2881d87f556c1a7a163876aeaaf1e6094526ff50b2775fc85f8858a3 components/second-choice.tar
diff --git a/hack/examples-checksums/zarf-package-dos-games-amd64-1.1.0.txt b/hack/examples-checksums/zarf-package-dos-games-amd64-1.1.0.txt
new file mode 100644
index 0000000000..e0a3ce3493
--- /dev/null
+++ b/hack/examples-checksums/zarf-package-dos-games-amd64-1.1.0.txt
@@ -0,0 +1,8 @@
+0a44b759e219d9d6f3c7cbbf40c57ede71a1f9bf54da65767c4137be74727662 images/blobs/sha256/0a44b759e219d9d6f3c7cbbf40c57ede71a1f9bf54da65767c4137be74727662
+4752b809555b8767401dfd39638f256c2373763a1f2cc421012301bb48481e6d images/blobs/sha256/4752b809555b8767401dfd39638f256c2373763a1f2cc421012301bb48481e6d
+49f63464352d7b53ceea3b60b9cc764c1a810b28217ee9f13ab7f974bb3ed968 components/baseline.tar
+4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 images/blobs/sha256/4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
+b66dbb27a73334db6ac9c030475837bd7f4472d835c72b2360534b203edce6cb images/oci-layout
+c7ee390ce7fc9b525429312617f5fbff5fe195544c1d95b44b72330bff15a615 images/index.json
+cc1421ef2ded4a559feaefe8dc266488d60675fcc995db7e51f0b0a6d893e010 images/blobs/sha256/cc1421ef2ded4a559feaefe8dc266488d60675fcc995db7e51f0b0a6d893e010
+e6886dc0b01f09d19480a3270fd9e7c4b261346cee9490b881b36edf21c7e722 images/blobs/sha256/e6886dc0b01f09d19480a3270fd9e7c4b261346cee9490b881b36edf21c7e722
diff --git a/hack/examples-checksums/zarf-package-manifests-amd64-0.0.1.txt b/hack/examples-checksums/zarf-package-manifests-amd64-0.0.1.txt
new file mode 100644
index 0000000000..3553f82efa
--- /dev/null
+++ b/hack/examples-checksums/zarf-package-manifests-amd64-0.0.1.txt
@@ -0,0 +1,27 @@
+0f23e58bd0b7c74311703e20c21c690a6847e62240ed456f8821f4c067d3659b images/blobs/sha256/0f23e58bd0b7c74311703e20c21c690a6847e62240ed456f8821f4c067d3659b
+12cba3a8e34081029e840e7ac5454c080835cbc5a7adc1620482e939283a3a49 images/blobs/sha256/12cba3a8e34081029e840e7ac5454c080835cbc5a7adc1620482e939283a3a49
+27833a3ba0a545deda33bb01eaf95a14d05d43bf30bce9267d92d17f069fe897 images/blobs/sha256/27833a3ba0a545deda33bb01eaf95a14d05d43bf30bce9267d92d17f069fe897
+27e17b7ec145d38d0be7b5837639a1206f2f3902f7831a6060d0b897f144decd images/index.json
+295c7be079025306c4f1d65997fcf7adb411c88f139ad1d34b537164aa060369 images/blobs/sha256/295c7be079025306c4f1d65997fcf7adb411c88f139ad1d34b537164aa060369
+3a96ca29c7fb133e78765557b2bf29a257467f679c43e4153ad05bcde8a1ce3d images/blobs/sha256/3a96ca29c7fb133e78765557b2bf29a257467f679c43e4153ad05bcde8a1ce3d
+45ef08258efc940f6336384ae1f35224b5bdf89a3b7abbb5effcbb6c5d62cabe components/nginx-remote.tar
+489db2792d7fc3ed75b6970b2e0e73f782bd5c0ed2462ddd683ae92cce04cdb6 images/blobs/sha256/489db2792d7fc3ed75b6970b2e0e73f782bd5c0ed2462ddd683ae92cce04cdb6
+4db1b89c0bd13344176ddce2d093b9da2ae58336823ffed2009a7ea4b62d2a95 images/blobs/sha256/4db1b89c0bd13344176ddce2d093b9da2ae58336823ffed2009a7ea4b62d2a95
+4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 images/blobs/sha256/4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1
+706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078 images/blobs/sha256/706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078
+8ca774778e858d3f97d9ec1bec1de879ac5e10096856dc22ed325a3ad944f78a images/blobs/sha256/8ca774778e858d3f97d9ec1bec1de879ac5e10096856dc22ed325a3ad944f78a
+92974acd1b7d5aec7654a2df3a310f97c56b7449fc5d042ba8442dbace9a0da6 images/blobs/sha256/92974acd1b7d5aec7654a2df3a310f97c56b7449fc5d042ba8442dbace9a0da6
+9926d2e1a82b13f28b6b9c720bb6947b34c8eabc943de113a3fbc8fabee82d94 images/blobs/sha256/9926d2e1a82b13f28b6b9c720bb6947b34c8eabc943de113a3fbc8fabee82d94
+9b61d3667e8d8d1d8f14ebb413c1ac3fe62373fd69af6aafb281b7a8733f50aa images/blobs/sha256/9b61d3667e8d8d1d8f14ebb413c1ac3fe62373fd69af6aafb281b7a8733f50aa
+ae8092b154d705e09bc77523083da3e93200a476ae3aa2b7a5e1747b1cbb8fef images/blobs/sha256/ae8092b154d705e09bc77523083da3e93200a476ae3aa2b7a5e1747b1cbb8fef
+b4cd0df67c961ba7f49c86c2e1e6e89d2fd1b8c40ad6fe59508db060dfac51fe images/blobs/sha256/b4cd0df67c961ba7f49c86c2e1e6e89d2fd1b8c40ad6fe59508db060dfac51fe
+b66dbb27a73334db6ac9c030475837bd7f4472d835c72b2360534b203edce6cb images/oci-layout
+b9c1296647242c2c9c7ffe8cc3a1b9ecde558e8748969ad6a64428ab5922769a images/blobs/sha256/b9c1296647242c2c9c7ffe8cc3a1b9ecde558e8748969ad6a64428ab5922769a
+c398742ba22c44f9bbc08dcbbdf0c978b20928fde49dceacded095bc09a46b84 images/blobs/sha256/c398742ba22c44f9bbc08dcbbdf0c978b20928fde49dceacded095bc09a46b84
+c926b61bad3b94ae7351bafd0c184c159ebf0643b085f7ef1d47ecdc7316833c images/blobs/sha256/c926b61bad3b94ae7351bafd0c184c159ebf0643b085f7ef1d47ecdc7316833c
+cadc8652ff5abccc918746eb742e7b9165a48428b2c8cc6a48eb6ce782ce5405 images/blobs/sha256/cadc8652ff5abccc918746eb742e7b9165a48428b2c8cc6a48eb6ce782ce5405
+d37d27b92cce4fb1383d5fbe32540382ea3d9662c7be3555f5a0f6a044099e1b images/blobs/sha256/d37d27b92cce4fb1383d5fbe32540382ea3d9662c7be3555f5a0f6a044099e1b
+d8173b5b3d825c1c19acf91cb66599f453187705ca9cdb4608d7be5482768cba images/blobs/sha256/d8173b5b3d825c1c19acf91cb66599f453187705ca9cdb4608d7be5482768cba
+d95fa8da986254bcd64c1251b695fe91875383dac1ed1780480fdf70f02cea3b images/blobs/sha256/d95fa8da986254bcd64c1251b695fe91875383dac1ed1780480fdf70f02cea3b
+f55cf5db16c790710ce2cd7b3d4fa00db89bdeea9d516aa83a596e910de103b2 components/podinfo-kustomize.tar
+f59dcac0742ce66d707aed956c25cd0fc20d162ecaca308637197eac1cef13fc components/httpd-local.tar
diff --git a/hack/examples-checksums/zarf-package-variables-amd64.txt b/hack/examples-checksums/zarf-package-variables-amd64.txt
new file mode 100644
index 0000000000..a0fdb11006
--- /dev/null
+++ b/hack/examples-checksums/zarf-package-variables-amd64.txt
@@ -0,0 +1,12 @@
+1ff0f94a80076ab49af75159e23f062a30a75d333a8e9c021bf39669230afcfe images/blobs/sha256/1ff0f94a80076ab49af75159e23f062a30a75d333a8e9c021bf39669230afcfe
+291f5d3c8c1742164379dfd09b17eeec4f70bcb165773d65d450dec5ef94d907 images/index.json
+4b2a24be75c4766f2d20892ddb84841e3773d0e26249ee57eed530da19c07bb2 components/variables-with-nginx.tar
+557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25 images/blobs/sha256/557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25
+84181e80d10e844350789d3324e848cf728df4f3d0f6c978789dd489f493934a images/blobs/sha256/84181e80d10e844350789d3324e848cf728df4f3d0f6c978789dd489f493934a
+a8a737eacb28af35791c2a444d8095ca3d493ba31eca78cd57a6fe3cced79154 components/variables-with-terraform.tar
+ac232364af842735579e922641ae2f67d5b8ea97df33a207c5ea05f60c63a92d images/blobs/sha256/ac232364af842735579e922641ae2f67d5b8ea97df33a207c5ea05f60c63a92d
+b66dbb27a73334db6ac9c030475837bd7f4472d835c72b2360534b203edce6cb images/oci-layout
+d4ceccbfc2696101c94fbf2149036e4ff815e4723e518721ff85105ce5aa8afc images/blobs/sha256/d4ceccbfc2696101c94fbf2149036e4ff815e4723e518721ff85105ce5aa8afc
+d776269cad101c9f8e33e2baa0a05993ed0786604d86ea525f62d5d7ae7b9540 images/blobs/sha256/d776269cad101c9f8e33e2baa0a05993ed0786604d86ea525f62d5d7ae7b9540
+e9427fcfa8642f8ddf5106f742a75eca0dbac676cf8145598623d04fa45dd74e images/blobs/sha256/e9427fcfa8642f8ddf5106f742a75eca0dbac676cf8145598623d04fa45dd74e
+f1f26f5702560b7e591bef5c4d840f76a232bf13fd5aefc4e22077a1ae4440c7 images/blobs/sha256/f1f26f5702560b7e591bef5c4d840f76a232bf13fd5aefc4e22077a1ae4440c7
diff --git a/hack/examples-checksums/zarf-package-yolo-amd64.txt b/hack/examples-checksums/zarf-package-yolo-amd64.txt
new file mode 100644
index 0000000000..e925a4d3d9
--- /dev/null
+++ b/hack/examples-checksums/zarf-package-yolo-amd64.txt
@@ -0,0 +1 @@
+b31cd4195a94c235f6560274fac9efb9934c517381d16593592d02f212e1cd70 components/yolo-games.tar
diff --git a/packages/distros/k3s/common/zarf.yaml b/packages/distros/k3s/common/zarf.yaml
deleted file mode 100644
index 0a2b6b287e..0000000000
--- a/packages/distros/k3s/common/zarf.yaml
+++ /dev/null
@@ -1,55 +0,0 @@
-kind: ZarfInitConfig
-metadata:
- name: distro-k3s
-
-variables:
- - name: K3S_ARGS
- description: Arguments to pass to K3s
- default: --disable traefik
-
-components:
- - name: k3s
- only:
- localOS: linux
- description: >
- *** REQUIRES ROOT (not sudo) ***
- Install K3s, a certified Kubernetes distribution built for IoT & Edge computing.
- K3s provides the cluster need for Zarf running in Appliance Mode as well as can
- host a low-resource Gitops Service if not using an existing Kubernetes platform.
- actions:
- onDeploy:
- defaults:
- maxRetries: 5
- before:
- - cmd: ./zarf internal is-valid-hostname
- maxRetries: 0
- description: Check if the current system has a, RFC1123 compliant hostname
- # If running RHEL variant, disable firewalld
- # https://rancher.com/docs/k3s/latest/en/advanced/#additional-preparation-for-red-hat-centos-enterprise-linux
- # NOTE: The empty echo prevents infinite retry loops on non-RHEL systems where the exit code would be an error
- - cmd: "[ -e /etc/redhat-release ] && systemctl disable firewalld --now || echo ''"
- description: If running a RHEL variant, disable 'firewalld' per k3s docs
- after:
- # Configure K3s systemd service
- - cmd: systemctl daemon-reload
- description: Reload the system services
- - cmd: systemctl enable k3s
- description: Enable 'k3s' to run at system boot
- - cmd: systemctl restart k3s
- description: Start the 'k3s' system service
- onRemove:
- before:
- - cmd: /opt/zarf/zarf-clean-k3s.sh
- description: Remove 'k3s' from the system
- - cmd: rm /opt/zarf/zarf-clean-k3s.sh
- description: Remove the cleanup script
- files:
- # K3s removal script
- - source: zarf-clean-k3s.sh
- target: /opt/zarf/zarf-clean-k3s.sh
- executable: true
- # The K3s systemd service definition
- - source: k3s.service
- target: /etc/systemd/system/k3s.service
- symlinks:
- - /etc/systemd/system/multi-user.target.wants/k3s.service
diff --git a/packages/distros/k3s/common/k3s.service b/packages/distros/k3s/k3s.service
similarity index 100%
rename from packages/distros/k3s/common/k3s.service
rename to packages/distros/k3s/k3s.service
diff --git a/packages/distros/k3s/common/zarf-clean-k3s.sh b/packages/distros/k3s/zarf-clean-k3s.sh
similarity index 100%
rename from packages/distros/k3s/common/zarf-clean-k3s.sh
rename to packages/distros/k3s/zarf-clean-k3s.sh
diff --git a/packages/distros/k3s/zarf.yaml b/packages/distros/k3s/zarf.yaml
index 0813b1ee38..49feef0e85 100644
--- a/packages/distros/k3s/zarf.yaml
+++ b/packages/distros/k3s/zarf.yaml
@@ -3,16 +3,33 @@ metadata:
name: distro-k3s
description: Used to establish a new Zarf cluster
+variables:
+ - name: K3S_ARGS
+ description: Arguments to pass to K3s
+ default: --disable traefik
+
components:
# AMD-64 version of the K3s stack
- name: k3s
- import:
- path: common
- name: k3s
only:
+ localOS: linux
cluster:
architecture: amd64
+ description: >
+ *** REQUIRES ROOT (not sudo) ***
+ Install K3s, a certified Kubernetes distribution built for IoT & Edge computing.
+ K3s provides the cluster need for Zarf running in Appliance Mode as well as can
+ host a low-resource Gitops Service if not using an existing Kubernetes platform.
files:
+ # K3s removal script
+ - source: zarf-clean-k3s.sh
+ target: /opt/zarf/zarf-clean-k3s.sh
+ executable: true
+ # The K3s systemd service definition
+ - source: k3s.service
+ target: /etc/systemd/system/k3s.service
+ symlinks:
+ - /etc/systemd/system/multi-user.target.wants/k3s.service
# Include the actual K3s binary
- source: https://github.com/k3s-io/k3s/releases/download/v1.28.4+k3s2/k3s
shasum: 9014535a4cd20c788282d60398a06279983562093455b53ab76701539ce67acf
@@ -29,20 +46,56 @@ components:
target: /var/lib/rancher/k3s/agent/images/k3s.tar.zst
actions:
onDeploy:
+ defaults:
+ maxRetries: 5
before:
- cmd: if [ "$(uname -m)" != "x86_64" ]; then echo "this package architecture is amd64, but the target system has a different architecture. These architectures must be the same" && exit 1; fi
description: Check that the host architecture matches the package architecture
maxRetries: 0
+ - cmd: ./zarf internal is-valid-hostname
+ maxRetries: 0
+ description: Check if the current system has a, RFC1123 compliant hostname
+ # If running RHEL variant, disable firewalld
+ # https://rancher.com/docs/k3s/latest/en/advanced/#additional-preparation-for-red-hat-centos-enterprise-linux
+ # NOTE: The empty echo prevents infinite retry loops on non-RHEL systems where the exit code would be an error
+ - cmd: "[ -e /etc/redhat-release ] && systemctl disable firewalld --now || echo ''"
+ description: If running a RHEL variant, disable 'firewalld' per k3s docs
+ after:
+ # Configure K3s systemd service
+ - cmd: systemctl daemon-reload
+ description: Reload the system services
+ - cmd: systemctl enable k3s
+ description: Enable 'k3s' to run at system boot
+ - cmd: systemctl restart k3s
+ description: Start the 'k3s' system service
+ onRemove:
+ before:
+ - cmd: /opt/zarf/zarf-clean-k3s.sh
+ description: Remove 'k3s' from the system
+ - cmd: rm /opt/zarf/zarf-clean-k3s.sh
+ description: Remove the cleanup script
# ARM-64 version of the K3s stack
- name: k3s
- import:
- path: common
- name: k3s
only:
+ localOS: linux
cluster:
architecture: arm64
+ description: >
+ *** REQUIRES ROOT (not sudo) ***
+ Install K3s, a certified Kubernetes distribution built for IoT & Edge computing.
+ K3s provides the cluster need for Zarf running in Appliance Mode as well as can
+ host a low-resource Gitops Service if not using an existing Kubernetes platform.
files:
+ # K3s removal script
+ - source: zarf-clean-k3s.sh
+ target: /opt/zarf/zarf-clean-k3s.sh
+ executable: true
+ # The K3s systemd service definition
+ - source: k3s.service
+ target: /etc/systemd/system/k3s.service
+ symlinks:
+ - /etc/systemd/system/multi-user.target.wants/k3s.service
# Include the actual K3s binary
- source: https://github.com/k3s-io/k3s/releases/download/v1.28.4+k3s2/k3s-arm64
shasum: 1ae72ca06d3302f3e86ef92e6e8f84e14a084da69564e87d6e2e75f62e72388d
@@ -59,7 +112,31 @@ components:
target: /var/lib/rancher/k3s/agent/images/k3s.tar.zst
actions:
onDeploy:
+ defaults:
+ maxRetries: 5
before:
- cmd: if [ "$(uname -m)" != "aarch64" ] && [ "$(uname -m)" != "arm64" ]; then echo "this package architecture is arm64, but the target system has a different architecture. These architectures must be the same" && exit 1; fi
description: Check that the host architecture matches the package architecture
maxRetries: 0
+ - cmd: ./zarf internal is-valid-hostname
+ maxRetries: 0
+ description: Check if the current system has a, RFC1123 compliant hostname
+ # If running RHEL variant, disable firewalld
+ # https://rancher.com/docs/k3s/latest/en/advanced/#additional-preparation-for-red-hat-centos-enterprise-linux
+ # NOTE: The empty echo prevents infinite retry loops on non-RHEL systems where the exit code would be an error
+ - cmd: "[ -e /etc/redhat-release ] && systemctl disable firewalld --now || echo ''"
+ description: If running a RHEL variant, disable 'firewalld' per k3s docs
+ after:
+ # Configure K3s systemd service
+ - cmd: systemctl daemon-reload
+ description: Reload the system services
+ - cmd: systemctl enable k3s
+ description: Enable 'k3s' to run at system boot
+ - cmd: systemctl restart k3s
+ description: Start the 'k3s' system service
+ onRemove:
+ before:
+ - cmd: /opt/zarf/zarf-clean-k3s.sh
+ description: Remove 'k3s' from the system
+ - cmd: rm /opt/zarf/zarf-clean-k3s.sh
+ description: Remove the cleanup script
diff --git a/packages/gitea/zarf.yaml b/packages/gitea/zarf.yaml
index 2f59bebdba..6a51afe161 100644
--- a/packages/gitea/zarf.yaml
+++ b/packages/gitea/zarf.yaml
@@ -71,12 +71,6 @@ components:
- name: GIT_SERVER_CREATE_PVC
mute: true
after:
- - wait:
- cluster:
- kind: pod
- namespace: zarf
- name: app=gitea
- condition: Ready
- cmd: ./zarf internal create-read-only-gitea-user --no-progress
maxRetries: 3
maxTotalSeconds: 60
diff --git a/packages/zarf-agent/zarf.yaml b/packages/zarf-agent/zarf.yaml
index 65ee63170f..1e1dac492f 100644
--- a/packages/zarf-agent/zarf.yaml
+++ b/packages/zarf-agent/zarf.yaml
@@ -40,11 +40,3 @@ components:
windows: pwsh
dir: ../..
description: Build the local agent image (if 'AGENT_IMAGE_TAG' was specified as 'local')
- onDeploy:
- after:
- - wait:
- cluster:
- kind: pod
- namespace: zarf
- name: app=agent-hook
- condition: Ready
diff --git a/packages/zarf-registry/chart/templates/deployment.yaml b/packages/zarf-registry/chart/templates/deployment.yaml
index e0e878eb82..f4263ca731 100644
--- a/packages/zarf-registry/chart/templates/deployment.yaml
+++ b/packages/zarf-registry/chart/templates/deployment.yaml
@@ -33,8 +33,11 @@ spec:
{{- end }}
priorityClassName: system-node-critical
securityContext:
- fsGroup: 1000
runAsUser: 1000
+ fsGroup: 2000
+ runAsGroup: 2000
+ seccompProfile:
+ type: "RuntimeDefault"
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
@@ -53,6 +56,12 @@ spec:
httpGet:
path: /
port: 5000
+ securityContext:
+ readOnlyRootFilesystem: true
+ allowPrivilegeEscalation: false
+ runAsNonRoot: true
+ capabilities:
+ drop: ["ALL"]
resources:
{{ toYaml .Values.resources | indent 12 }}
env:
diff --git a/packages/zarf-registry/zarf.yaml b/packages/zarf-registry/zarf.yaml
index 190eeba4c0..2a5b60dbed 100644
--- a/packages/zarf-registry/zarf.yaml
+++ b/packages/zarf-registry/zarf.yaml
@@ -171,12 +171,3 @@ components:
images:
# This image (or images) must match that used for injection (see zarf-config.toml)
- "###ZARF_PKG_TMPL_REGISTRY_IMAGE_DOMAIN######ZARF_PKG_TMPL_REGISTRY_IMAGE###:###ZARF_PKG_TMPL_REGISTRY_IMAGE_TAG###"
- actions:
- onDeploy:
- after:
- - wait:
- cluster:
- kind: deployment
- namespace: zarf
- name: app=docker-registry
- condition: Available
diff --git a/site/src/content/docs/commands/zarf_dev_deploy.md b/site/src/content/docs/commands/zarf_dev_deploy.md
index 7b7131af51..b08c142478 100644
--- a/site/src/content/docs/commands/zarf_dev_deploy.md
+++ b/site/src/content/docs/commands/zarf_dev_deploy.md
@@ -30,7 +30,6 @@ zarf dev deploy [flags]
--no-yolo Disable the YOLO mode default override and create / deploy the package as-defined
--registry-override stringToString Specify a map of domains to override on package create when pulling images (e.g. --registry-override docker.io=dockerio-reg.enterprise.intranet) (default [])
--retries int Number of retries to perform for Zarf deploy operations like git/image pushes or Helm installs (default 3)
- --skip-webhooks [alpha] Skip waiting for external webhooks to execute as each package component is deployed
--timeout duration Timeout for health checks and Helm operations such as installs and rollbacks (default 15m0s)
```
diff --git a/site/src/content/docs/commands/zarf_init.md b/site/src/content/docs/commands/zarf_init.md
index 21758f634c..0f14453100 100644
--- a/site/src/content/docs/commands/zarf_init.md
+++ b/site/src/content/docs/commands/zarf_init.md
@@ -77,7 +77,6 @@ $ zarf init --artifact-push-password={PASSWORD} --artifact-push-username={USERNA
--retries int Number of retries to perform for Zarf deploy operations like git/image pushes or Helm installs (default 3)
--set stringToString Specify deployment variables to set on the command line (KEY=value) (default [])
--skip-signature-validation Skip validating the signature of the Zarf package
- --skip-webhooks [alpha] Skip waiting for external webhooks to execute as each package component is deployed
--storage-class string Specify the storage class to use for the registry and git server. E.g. --storage-class=standard
--timeout duration Timeout for health checks and Helm operations such as installs and rollbacks (default 15m0s)
```
diff --git a/site/src/content/docs/commands/zarf_package_deploy.md b/site/src/content/docs/commands/zarf_package_deploy.md
index 2dda0e6fad..4ebbe054c6 100644
--- a/site/src/content/docs/commands/zarf_package_deploy.md
+++ b/site/src/content/docs/commands/zarf_package_deploy.md
@@ -30,7 +30,6 @@ zarf package deploy [ PACKAGE_SOURCE ] [flags]
--set stringToString Specify deployment variables to set on the command line (KEY=value) (default [])
--shasum string Shasum of the package to deploy. Required if deploying a remote https package.
--skip-signature-validation Skip validating the signature of the Zarf package
- --skip-webhooks [alpha] Skip waiting for external webhooks to execute as each package component is deployed
--timeout duration Timeout for health checks and Helm operations such as installs and rollbacks (default 15m0s)
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm.md b/site/src/content/docs/commands/zarf_tools_helm.md
index 3b836a8cd0..b9eeb8f482 100644
--- a/site/src/content/docs/commands/zarf_tools_helm.md
+++ b/site/src/content/docs/commands/zarf_tools_helm.md
@@ -32,7 +32,7 @@ Subset of the Helm CLI that includes the repo and dependency commands for managi
-n, --namespace string namespace scope for this request
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_dependency.md b/site/src/content/docs/commands/zarf_tools_helm_dependency.md
index fdbb387c52..e1024700f2 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_dependency.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_dependency.md
@@ -85,7 +85,7 @@ for this case.
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_dependency_build.md b/site/src/content/docs/commands/zarf_tools_helm_dependency_build.md
index ff1b47e6fd..15e71f78a9 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_dependency_build.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_dependency_build.md
@@ -55,7 +55,7 @@ zarf tools helm dependency build CHART [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_dependency_list.md b/site/src/content/docs/commands/zarf_tools_helm_dependency_list.md
index 04b786e8d6..b987750c01 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_dependency_list.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_dependency_list.md
@@ -51,7 +51,7 @@ zarf tools helm dependency list CHART [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_dependency_update.md b/site/src/content/docs/commands/zarf_tools_helm_dependency_update.md
index 15486dfabb..97336f3973 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_dependency_update.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_dependency_update.md
@@ -59,7 +59,7 @@ zarf tools helm dependency update CHART [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_repo.md b/site/src/content/docs/commands/zarf_tools_helm_repo.md
index bb890b0631..760651b6ad 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_repo.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_repo.md
@@ -43,7 +43,7 @@ It can be used to add, remove, list, and index chart repositories.
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_repo_add.md b/site/src/content/docs/commands/zarf_tools_helm_repo_add.md
index 427fa498f4..fb2e4af355 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_repo_add.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_repo_add.md
@@ -49,7 +49,7 @@ zarf tools helm repo add [NAME] [URL] [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_repo_index.md b/site/src/content/docs/commands/zarf_tools_helm_repo_index.md
index 2568672be9..d548e3bec2 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_repo_index.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_repo_index.md
@@ -54,7 +54,7 @@ zarf tools helm repo index [DIR] [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_repo_list.md b/site/src/content/docs/commands/zarf_tools_helm_repo_list.md
index 987cd7fe3c..533759d015 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_repo_list.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_repo_list.md
@@ -40,7 +40,7 @@ zarf tools helm repo list [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_repo_remove.md b/site/src/content/docs/commands/zarf_tools_helm_repo_remove.md
index af693c1ad9..2637721ec6 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_repo_remove.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_repo_remove.md
@@ -39,7 +39,7 @@ zarf tools helm repo remove [REPO1 [REPO2 ...]] [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_repo_update.md b/site/src/content/docs/commands/zarf_tools_helm_repo_update.md
index 687c1c01e2..4b9d55387d 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_repo_update.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_repo_update.md
@@ -51,7 +51,7 @@ zarf tools helm repo update [REPO1 [REPO2 ...]] [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_helm_version.md b/site/src/content/docs/commands/zarf_tools_helm_version.md
index 3c70426811..24bdc269b5 100644
--- a/site/src/content/docs/commands/zarf_tools_helm_version.md
+++ b/site/src/content/docs/commands/zarf_tools_helm_version.md
@@ -39,7 +39,7 @@ zarf tools helm version [flags]
--plain-http Force the connections over HTTP instead of HTTPS. This flag should only be used if you have a specific reason and accept the reduced security posture.
--qps float32 queries per second used when communicating with the Kubernetes API, not including bursting
--registry-config string path to the registry config file
- --repository-cache string path to the file containing cached repository indexes
+ --repository-cache string path to the directory containing cached repository indexes
--repository-config string path to the file containing repository names and URLs
```
diff --git a/site/src/content/docs/commands/zarf_tools_sbom.md b/site/src/content/docs/commands/zarf_tools_sbom.md
index eb11240f1d..544b727f47 100644
--- a/site/src/content/docs/commands/zarf_tools_sbom.md
+++ b/site/src/content/docs/commands/zarf_tools_sbom.md
@@ -23,8 +23,9 @@ zarf tools sbom [flags]
```
--base-path string base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
-c, --config string syft configuration file
+ --enrich stringArray enable package data enrichment from local and online sources (options: all, golang, java, javascript)
--exclude stringArray exclude paths from being scanned using a glob expression
- --file string file to write the default report output to (default is STDOUT) (DEPRECATED: use: output)
+ --file string file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
--from stringArray specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
-h, --help help for sbom
-o, --output stringArray report output format (= to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
diff --git a/site/src/content/docs/commands/zarf_tools_sbom_attest.md b/site/src/content/docs/commands/zarf_tools_sbom_attest.md
index 6f8eb94737..e16d898963 100644
--- a/site/src/content/docs/commands/zarf_tools_sbom_attest.md
+++ b/site/src/content/docs/commands/zarf_tools_sbom_attest.md
@@ -22,6 +22,7 @@ zarf tools sbom attest --output [FORMAT] [flags]
```
--base-path string base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
+ --enrich stringArray enable package data enrichment from local and online sources (options: all, golang, java, javascript)
--exclude stringArray exclude paths from being scanned using a glob expression
--from stringArray specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
-h, --help help for attest
diff --git a/site/src/content/docs/commands/zarf_tools_sbom_convert.md b/site/src/content/docs/commands/zarf_tools_sbom_convert.md
index dc08f90913..e239863e6c 100644
--- a/site/src/content/docs/commands/zarf_tools_sbom_convert.md
+++ b/site/src/content/docs/commands/zarf_tools_sbom_convert.md
@@ -21,7 +21,7 @@ zarf tools sbom convert [SOURCE-SBOM] -o [FORMAT] [flags]
### Options
```
- --file string file to write the default report output to (default is STDOUT) (DEPRECATED: use: output)
+ --file string file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
-h, --help help for convert
-o, --output stringArray report output format (= to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
-t, --template string specify the path to a Go template file
diff --git a/site/src/content/docs/commands/zarf_tools_sbom_scan.md b/site/src/content/docs/commands/zarf_tools_sbom_scan.md
index cbb5f732ed..e2098828ad 100644
--- a/site/src/content/docs/commands/zarf_tools_sbom_scan.md
+++ b/site/src/content/docs/commands/zarf_tools_sbom_scan.md
@@ -22,8 +22,9 @@ zarf tools sbom scan [SOURCE] [flags]
```
--base-path string base directory for scanning, no links will be followed above this directory, and all paths will be reported relative to this directory
+ --enrich stringArray enable package data enrichment from local and online sources (options: all, golang, java, javascript)
--exclude stringArray exclude paths from being scanned using a glob expression
- --file string file to write the default report output to (default is STDOUT) (DEPRECATED: use: output)
+ --file string file to write the default report output to (default is STDOUT) (DEPRECATED: use: --output FORMAT=PATH)
--from stringArray specify the source behavior to use (e.g. docker, registry, oci-dir, ...)
-h, --help help for scan
-o, --output stringArray report output format (= to output to a file), formats=[cyclonedx-json cyclonedx-xml github-json spdx-json spdx-tag-value syft-json syft-table syft-text template] (default [syft-table])
diff --git a/site/src/content/docs/contribute/style-guide.mdx b/site/src/content/docs/contribute/style-guide.mdx
index 48ece3aad9..c4b9822b6e 100644
--- a/site/src/content/docs/contribute/style-guide.mdx
+++ b/site/src/content/docs/contribute/style-guide.mdx
@@ -36,8 +36,8 @@ Follow these guidelines for creating Defense Unicorns content:
- Use sentence-style capitalization for all body text.
- Capitalize the first word of a sentence, heading, title, or label.
- - Capitalize proper nouns and Defense Unicorn products.
- - Zarf/Big Bang/K8s/K9s
+ - Capitalize proper nouns
+ - Zarf/K8s/K9s
- When words are joined by a slash, capitalize the word after the slash if the word before it is capitalized.
#### Title/Heading Style Capitalization
@@ -213,17 +213,3 @@ If you're going to use jargon, consider the following questions:
- **Can you write around the term?** If you don't need the term for search engine optimization (SEO), try writing around it. For example, instead of writing Hold a post-mortem, write When the project is finished, review what processes worked or didn't work. Instead of writing Create a back-of-the-envelope design, write Use an informal design process.
- **Are you using the term only once in your document?** If so, describe the term in plain language and refer to it in parentheses, or link to a trusted definition.
- **Are you using the term throughout your document?** If so, briefly describe the term in parentheses on first reference, or link to a trusted definition.
-
-### Word List
-
-Follow these guidelines for standardizing Defense Unicorn's spelling and grammar:
-
-- Zarf
-- Zarf Package
-- Open-source
-- Air gap/Air-gapped
-- K8s
-- K9s
-- K3d
-- K3s
-- High side/Low side
diff --git a/site/src/content/docs/ref/components.mdx b/site/src/content/docs/ref/components.mdx
index 419d43bc6d..debb24517c 100644
--- a/site/src/content/docs/ref/components.mdx
+++ b/site/src/content/docs/ref/components.mdx
@@ -261,12 +261,6 @@ When merging components together Zarf will adopt the following strategies depend
| Un'name'd Primitive Arrays | `actions`, `dataInjections`, `files`, `images`, `repos` | These keys will append the overriding component's version of the array to the end of the base component's array |
| 'name'd Primitive Arrays | `charts`, `manifests` | For any given element in the overriding component, if the element matches based on `name` then its values will be merged with the base element of the same `name`. If not then the element will be appended to the end of the array |
-### Extensions
-
-
-
-
-
### Health Checks
@@ -321,3 +315,7 @@ $ zarf package deploy ./path/to/package.tar.zst --components=optional-component-
```
:::
+
+## Extensions (Removed)
+
+Extensions were removed from Zarf in v0.41.0. To create packages similar to those previously built with extensions, check out https://github.com/defenseunicorns-partnerships/generate-big-bang-zarf-package
diff --git a/site/src/content/docs/ref/deploy.mdx b/site/src/content/docs/ref/deploy.mdx
index 0e700b0083..6286fd350f 100644
--- a/site/src/content/docs/ref/deploy.mdx
+++ b/site/src/content/docs/ref/deploy.mdx
@@ -146,6 +146,8 @@ Deployments will wait for helm [post-install hooks](https://helm.sh/docs/topics/
:::
+After the Helm wait completes successfully, Zarf waits for all resources in the applied chart to fully reconcile. To identify when reconciliation is achieved, Zarf uses [kstatus](https://github.com/kubernetes-sigs/cli-utils/blob/master/pkg/kstatus/README.md#kstatus). Kstatus assesses whether a resource is reconciled by checking the [status](https://kubernetes.io/docs/concepts/overview/working-with-objects/#object-spec-and-status) field. If a resource does not have a status field, kstatus considers it reconciled once it's found.
+
### Timeout Settings
The default timeout for Helm operations in Zarf is 15 minutes.
diff --git a/site/src/content/docs/ref/deployment-ui.mdx b/site/src/content/docs/ref/deployment-ui.mdx
deleted file mode 100644
index b21f028a51..0000000000
--- a/site/src/content/docs/ref/deployment-ui.mdx
+++ /dev/null
@@ -1,110 +0,0 @@
----
-title: Deployment Web UI
-
-sidebar:
- order: 85
- badge:
- text: DEPRECATED
- variant: caution
----
-
-:::caution
-
-The Zarf Deployment Web UI is deprecated and will be removed in a future release. Please use the [Zarf CLI](/commands/zarf) for all Zarf operations.
-
-:::
-
-Zarf is also available in a version that exposes a Deployment Web UI that supports a number of Zarf features used during the package deployment process. For users who prefer not to use the command line tool, the Web UI creates a simple experience to deploy and manage Zarf clusters and packages. The Web UI can be used to connect to existing clusters (via a Kubeconfig), initialize a cluster, deploy packages into a cluster, update packages in the cluster, and remove packages from the cluster.
-
-The Zarf Web UI mirrors the functionality of the Zarf CLI commands, but with a more intuitive flow and familiar web application patterns for non-technical users. The web UI does not offer any additional commands or core functionality to Zarf.
-
-## Open the Zarf Deployment Web UI
-
-The Zarf Deployment Web UI can easily be downloaded from the [Zarf UI Github Project](https://github.com/defenseunicorns/zarf-ui/releases/latest).
-
-Follow these steps to get started using the Web UI
-
-1. Step one: [Download the Zarf UI](https://github.com/zarf-dev/zarf-ui/releases/latest) version that matches your system (i.e. `zarf-ui_v0.1.0-Darwin_arm64`)
-2. Step two: (if applicable) Mark the file as executable with `chmod +x zarf-ui_v0.1.0-Darwin_arm64`
-3. Step three: Run the binary with `./zarf-ui_v0.1.0-Darwin_arm64` or by double clicking the file in your file browser
-
-![GIF showing the Web UI launched from the CLI terminal](../../../assets/dashboard/web-ui-launch.gif)
-
-## Using the Zarf Deployment Web UI
-
-### Cluster Connection Status
-
-When Zarf UI is running it automatically searches for a Kubeconfig on the local machine. If the Kubeconfig is found, it searches the default cluster to determine if it is a Zarf cluster (i.e. initialized). There are two different cluster statuses the Web UI will display based on the state of the cluster found.
-
-#### Cluster not Connected (Not Initialized)
-
-![Web UI shows orange warning status and message "cluster not connected" on the cluster card](../../../assets/dashboard/web-ui-cluster-not-connected.png)
-
-1. Shown when there is no Kubeconfig found on the machine.
-2. Shown when a Kubeconfig is found on the machine, but Zarf has not been deployed and set up in the cluster.
-
-#### Cluster Connected (Initialized)
-
-If Zarf finds a cluster in the Kubeconfig that has Zarf resources in it it will automatically connect to the cluster and display the cluster details on the Web UI.
-
-![Web UI shows cluster meta data in on the cluster card when a connected cluster is found](../../../assets/dashboard/web-ui-cluster-connected.png)
-
-1. Shown when there is a Kubeconfig found on the machine with a default cluster that has Zarf resources in it.
-
-### Connect to Existing Cluster
-
-The Zarf Web UI makes connecting to existing clusters easy. When on the packages page, if there is no Zarf cluster currently connected, select the connect cluster button. If Zarf finds a Kubeconfig it will ask the user if they want to connect to the default cluster context.
-
-:::tip
-
-Zarf can only read the default cluster in your Kubeconfig file, if you wish to connect to a different cluster in the Kubeconfig you will need to change it to the default cluster in the terminal. See the Kubernetes documentation on [how to configure access to multiple clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/).
-
-:::
-
-Follow these steps to connect to an existing cluster:
-
-1. Be sure to have a Kubeconfig on your machine with the cluster you wish to connect to set as the default cluster.
-2. Click connect cluster button on cluster card
-3. Select cluster name in the dialog and click connect
-4. Select a ZarfInitConfig package to deploy into the cluster
-5. Follow Package deployment prompts to deploy package and initialize cluster as a Zarf cluster.
-
-### Deploy a K3s Cluster with the Init Package
-
-If you do not have access to an existing cluster, or would simply like to spin up a new cluster. You can do that by deploying a ZarfInitConfig package and selecting the optional K3s component.
-
-:::note
-
-This option is currently only available for Linux machines with access to the `root` user.
-
-:::
-
-Follow these steps to deploy and initialize a new cluster:
-
-1. Click deploy package button (on the Deployed packages table)
-2. Select a ZarfInitPackage from the list
-3. Toggle the switch on for the K3s component to select it for deployment
-4. Complete package deployment steps to spin up and initialize your new Zarf cluster.
-
-### Deploy additional packages
-
-Once you have a cluster connected to Zarf, you can deploy additional packages into the cluster.
-
-Steps to deploy additional packages into the cluster:
-
-1. Click deploy package button on the Deployed packages table
-2. Select the package you wish to deploy from the list
-3. Complete the package deployment steps
-
-### Additional Package Commands
-
-Once a package is deployed into the cluster, the Web UI offers additional commands that can be executed for a package. To view these commands click on the vertical ellipsis at the end of the table row for the package you wish to act upon. The Web UI currently supports the following package commands:
-
-- Update: Use when you wish to update a package with a new version of the same package.
-- Remove: Use when you wish to remove a package and all of its resources from the cluster. This cannot be undone.
-
-![Web UI deployed packages table with a context menu showing additional package commands](../../../assets/dashboard/web-ui-package-commands.png)
-
-## Technical Details
-
-The web UI is packaged into a separate Go binary using Zarf as a library, so you don't have to worry about additional dependencies or needing to manually hook it into Zarf! The web UI is served through your machine's local browser, running on `localhost`, and utilizes the Go binary as the backend.
diff --git a/site/src/content/docs/ref/init-package.mdx b/site/src/content/docs/ref/init-package.mdx
index 1af8d3d18e..a155549e9a 100644
--- a/site/src/content/docs/ref/init-package.mdx
+++ b/site/src/content/docs/ref/init-package.mdx
@@ -32,8 +32,8 @@ View all init options w/ [`zarf init --help`](/commands/zarf_init/).
An 'init' package requires a series of specially named, and configured components to ensure the cluster is correctly initialized. These components are:
-- [`zarf-injector`](#zarf-injector)
-- [`zarf-seed-registry`](#zarf-seed-registry)
+- [`zarf-injector`](#zarf-injector-and-zarf-seed-registry)
+- [`zarf-seed-registry`](#zarf-injector-and-zarf-seed-registry)
- [`zarf-registry`](#zarf-registry)
- [`zarf-agent`](#zarf-agent)
@@ -157,12 +157,6 @@ The `zarf-agent` modifies the following [flux](https://fluxcd.io/flux/) resource
> Support for mutating OCIRepository and HelmRepository objects is in [`alpha`](/roadmap#alpha) and should be tested on non-production clusters before being deployed to production clusters.
-:::caution
-
-Due to a bug in helm, HelmRepositories with an insecure registry must use IP address instead of a hostname. This is not an issue with the internal Zarf registry, which is always an IP address, but will cause Flux HelmRepositories to break if Zarf is using an external http registry with a hostname.
-
-:::
-
The `zarf-agent` modifies [ArgoCD applications](https://argo-cd.readthedocs.io/en/stable/user-guide/application-specification/) & [ArgoCD Repositories](https://argo-cd.readthedocs.io/en/stable/user-guide/private-repositories/) objects to point to the local Git Server.
> Support for mutating `Application` and `Repository` objects in ArgoCD is in [`beta`](/roadmap#beta) and should be tested on non-production clusters before being deployed to production clusters.
diff --git a/site/src/content/docs/tutorials/5-big-bang.mdx b/site/src/content/docs/tutorials/5-big-bang.mdx
deleted file mode 100644
index bf073df59a..0000000000
--- a/site/src/content/docs/tutorials/5-big-bang.mdx
+++ /dev/null
@@ -1,211 +0,0 @@
----
-title: Using Big Bang with Zarf
-sidebar:
- order: 6
----
-
-## Introduction
-
-This tutorial describes how to use Big Bang with Zarf for Air Gap deployments through the use of the Big Bang Zarf extension. If you are not familiar with Big Bang you can learn more about it here: https://p1.dso.mil/products/big-bang, but in short it is a DevSecOps platform that contains many useful tools for building, managing, and running software projects while adhering to the [United States Department of Defense DevSecOps Reference Design](https://public.cyber.mil/devsecops/).
-
-Zarf integrates with Big Bang through the use of an extension that simplifies the selection of Big Bang packages and the pulling of the required artifacts to deploy those packages in an Air Gap.
-
-### Limitations
-
-The current version of this extension requires Big Bang version `1.54.0` or later, and is not fully integrated into the `zarf package remove` lifecycle (see the [Big Bang example](/ref/examples/big-bang/) for how to introduce those lifecycle hooks manually). Zarf also relies on [helm.sh/images annotations](https://github.com/helm/community/blob/main/hips/hip-0015.md) to discover images within charts (e.g. [GitLab](https://repo1.dso.mil/big-bang/product/packages/gitlab/-/blob/main/chart/Chart.yaml#L61)) - this is a relatively new feature for Big Bang so if you see an `ImagePullBackOff` error, check that these annotations are set correctly for the sub charts you are using. To work around this issue if you come across it, simply add the missing image to the images list on the same component that contains the Big Bang extension like the following:
-
-```yaml
-components:
- - name: bigbang
- required: true
- images:
- - registry1.dso.mil/ironbank/gitlab/gitlab/gitlab-exporter:15.9.2
- extensions:
- bigbang:
- version: 1.54.0
-```
-
-## System Requirements
-
-Big Bang requires a reasonably powerful `amd64` system that scales up with the number of components deployed. We recommend at least `32 GB` of RAM and a high-speed internet connection to complete this tutorial.
-
-To learn more about Big Bang's requirements in general, see their documentation: https://docs-bigbang.dso.mil/latest/docs/prerequisites/minimum-hardware-requirements/
-
-## Prerequisites
-
-Before beginning this tutorial you will need the following:
-
-- A local copy of the Zarf repository
- - `git clone https://github.com/zarf-dev/zarf.git`
-- A kubernetes cluster onto which you can deploy Zarf and Big Bang
-- The latest version of the Zarf `cli`
- - Follow instructions on https://docs.zarf.dev/getting-started/install/
-- An account on `https://registry1.dso.mil` to retrieve Big Bang images
- - You can register for an account [here](https://login.dso.mil/auth/realms/baby-yoda/protocol/openid-connect/registrations?client_id=account&response_type=code)
-
-:::note
-
-If you followed the [Setting Up a Local Kubernetes Cluster](/tutorials/#setting-up-a-local-kubernetes-cluster) instructions for other Zarf tutorials, you will need to pass additional command flags to `k3d` for it to work with Big Bang. See the below to create a working cluster:
-
-```bash
-k3d cluster create
- # Required by the PLG stack
- --volume /etc/machine-id:/etc/machine-id
-
- # Required for Istio ingress
- --k3s-arg "--disable=traefik@server:0"
- --port 80:80@loadbalancer
- --port 443:443@loadbalancer
-
- # Required for TLS to work correctly with kubectl
- --k3s-arg "--tls-san=$SERVER_IP@server:0"
- --api-port 6443
-```
-
-If you tweak the packages that are deployed there may be other configuration options you need to specify, please refer to the [Big Bang documentation](https://docs-bigbang.dso.mil/latest/) for more details.
-
-:::
-
-## Package Creation
-
-The below section covers creating and tuning the Big Bang package:
-
-### Setup
-
-By default, Big Bang uses images from [Iron Bank](https://p1.dso.mil/products/iron-bank) which will require you to set your login credentials for [Registry One](https://registry1.dso.mil) (see [pre-requisites](#prerequisites) for information on account setup).
-
-```bash
-# Authenticate to https://registry1.dso.mil/, then retrieve your CLI secret from your User Profile and run the following:
-set +o history
-export REGISTRY1_USERNAME=
-export REGISTRY1_CLI_SECRET=
-echo $REGISTRY1_CLI_SECRET | zarf tools registry login registry1.dso.mil --username $REGISTRY1_USERNAME --password-stdin
-set -o history
-```
-
-Now navigate to the `examples/big-bang` folder within the Zarf repository you cloned in the [pre-requisites](#prerequisites) section.
-
-### Configure Big Bang
-
-Within the `examples/big-bang` folder you will see a `zarf.yaml` that has the following [component](/ref/components/) defined:
-
-```yaml
-components:
- - name: bigbang
- required: true
- extensions:
- bigbang:
- version: 1.54.0
- skipFlux: false
- valuesFiles:
- - config/minimal.yaml #turns on just istio
- - config/ingress.yaml # adds istio certs for *.bigbang.dev
- - config/kyverno.yaml # turns on kyverno
- - config/loki.yaml # turns on loki and monitoring
-```
-
-This component uses the `bigbang` extension to define the version of Big Bang to use and the values files to apply. Feel free to inspect and configure the values.yaml files as you wish and to learn more about Big Bang's configuration see their values guide: https://docs-bigbang.dso.mil/latest/docs/guides/using-bigbang/values-guide/
-
-:::note
-
-The `valuesFiles` are applied from top to bottom and will apply the last value that was provided for any given key.
-
-:::
-
-:::note
-
-This extension requires Big Bang version `1.54.0` or later.
-
-:::
-
-
-### Package Big Bang
-
-When you're ready to continue you can create a Big Bang package by running the following command in `examples/big-bang`:
-
-```bash
-zarf package create
-```
-
-Now wait for the package creation to complete and you should see a `zarf-package-big-bang-example-amd64-x.x.x.tar.zst` file in the directory.
-
-
-## Package Deployment
-
-The below section covers deploying the Big Bang package from the previous section:
-
-### Initialize Zarf
-
-Before you can deploy the Big Bang package you must first initialize Zarf on the cluster you created in the [pre-requisites](#prerequisites) section. To do so you can run the following:
-
-```bash
-# Initialize Zarf (interactively)
-zarf init
-# Make these choices at the prompts
-# ? Do you want to download this init package? Yes
-# ? Deploy this Zarf package? Yes
-# ? Deploy the k3s component? No
-# ? Deploy the git-server component? Yes
-
-# (Optional) Inspect the results
-zarf tools k9s
-```
-
-:::note
-
-The `git-server` component is required by Big Bang as it uses it as a source for Flux deployments.
-
-:::
-
-
-### Deploy Big Bang
-
-Now you are ready to deploy Big Bang, and can do so with the following in the `examples/big-bang` directory:
-
-```bash
-# Deploy Big Bang (interactively)
-zarf package deploy
-# Make these choices at the prompts
-# ? Choose or type the package file [tab for suggestions] zarf-package-big-bang-example-amd64-x.x.x.tar.zst
-# ? Deploy this Zarf package? Yes
-```
-
-### See The Results
-
-Once the install completes you can inspect the results and watch the Big Bang components deploy using the following:
-
-```bash
-zarf tools k9s
-
-# To view different k8s objects you can use the following:
-
-# Helm Releases:
-# :hr [Enter]
-# Pods:
-# :pods [Enter]
-# Services:
-# :svc [Enter]
-# Secrets:
-# :secret [Enter]
-# ConfigMaps:
-# :configmap [Enter]
-
-# When you are done use the following to quit
-# :q [Enter]
-```
-
-## Package Removal
-
-The Big Bang extension is not fully integrated into the Zarf package remove lifecycle. To get around this limitation, an [`onRemove.before` action](/ref/actions/) has been added to the bigbang component in the zarf.yaml file that ensures all the Big Bang resources are torn down in the correct order when Zarf is used to remove the package:
-
-```bash
-zarf package remove big-bang-example --confirm
-```
-
-## Troubleshooting
-
-See the Troubleshooting section of the Big Bang Quick Start for help troubleshooting the Big Bang deployment: https://repo1.dso.mil/big-bang/bigbang/-/blob/master/docs/guides/deployment-scenarios/quickstart.md#troubleshooting
-
-Also, ensure that you have followed all of the steps required in the [pre-requisites](#prerequisites) section.
-
-If you feel that the error you are encountering is one with Zarf feel free to [open an issue](https://github.com/zarf-dev/zarf/issues/new/choose) or reach out via [slack](https://kubernetes.slack.com/archives/C03B6BJAUJ3).
diff --git a/src/api/v1alpha1/component.go b/src/api/v1alpha1/component.go
index 9827410b43..74ac45251c 100644
--- a/src/api/v1alpha1/component.go
+++ b/src/api/v1alpha1/component.go
@@ -6,7 +6,6 @@ package v1alpha1
import (
"github.com/invopop/jsonschema"
- "github.com/zarf-dev/zarf/src/api/v1alpha1/extensions"
)
// ZarfComponent is the primary functional grouping of assets to deploy by Zarf.
@@ -53,9 +52,6 @@ type ZarfComponent struct {
// List of git repos to include in the package.
Repos []string `json:"repos,omitempty"`
- // Extend component functionality with additional features.
- Extensions extensions.ZarfComponentExtensions `json:"extensions,omitempty"`
-
// [Deprecated] (replaced by actions) Custom commands to run before or after package deployment. This will be removed in Zarf v1.0.0.
DeprecatedScripts DeprecatedZarfComponentScripts `json:"scripts,omitempty" jsonschema:"deprecated=true"`
diff --git a/src/api/v1alpha1/extensions/bigbang.go b/src/api/v1alpha1/extensions/bigbang.go
deleted file mode 100644
index af357d5990..0000000000
--- a/src/api/v1alpha1/extensions/bigbang.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package extensions contains the types for all official extensions.
-package extensions
-
-// BigBang holds the configuration for the Big Bang extension.
-type BigBang struct {
- // The version of Big Bang to use.
- Version string `json:"version"`
- // Override repo to pull Big Bang from instead of Repo One.
- Repo string `json:"repo,omitempty"`
- // The list of values files to pass to Big Bang; these will be merged together.
- ValuesFiles []string `json:"valuesFiles,omitempty"`
- // Whether to skip deploying flux; Defaults to false.
- SkipFlux bool `json:"skipFlux,omitempty"`
- // Optional paths to Flux kustomize strategic merge patch files.
- FluxPatchFiles []string `json:"fluxPatchFiles,omitempty"`
-}
diff --git a/src/api/v1alpha1/extensions/common.go b/src/api/v1alpha1/extensions/common.go
deleted file mode 100644
index 1df82730ab..0000000000
--- a/src/api/v1alpha1/extensions/common.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package extensions contains the types for all official extensions.
-package extensions
-
-// ZarfComponentExtensions is a struct that contains all the official extensions.
-type ZarfComponentExtensions struct {
- // Configurations for installing Big Bang and Flux in the cluster.
- BigBang *BigBang `json:"bigbang,omitempty"`
-}
diff --git a/src/cmd/cmd.go b/src/cmd/cmd.go
new file mode 100644
index 0000000000..169c0747dc
--- /dev/null
+++ b/src/cmd/cmd.go
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package cmd contains the CLI commands for Zarf.
+package cmd
+
+// setBaseDirectory sets the base directory. This is a directory with a zarf.yaml.
+func setBaseDirectory(args []string) string {
+ if len(args) > 0 {
+ return args[0]
+ }
+ return "."
+}
diff --git a/src/cmd/common/setup.go b/src/cmd/common/setup.go
deleted file mode 100644
index ac47d0c95d..0000000000
--- a/src/cmd/common/setup.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package common handles command configuration across all commands
-package common
-
-import (
- "errors"
- "fmt"
- "io"
- "os"
- "time"
-
- "github.com/pterm/pterm"
-
- "github.com/zarf-dev/zarf/src/pkg/message"
-)
-
-// SetupCLI sets up the CLI logging
-func SetupCLI(logLevel string, skipLogFile, noColor bool) error {
- if noColor {
- message.DisableColor()
- }
-
- printViperConfigUsed()
-
- if logLevel != "" {
- match := map[string]message.LogLevel{
- "warn": message.WarnLevel,
- "info": message.InfoLevel,
- "debug": message.DebugLevel,
- "trace": message.TraceLevel,
- }
- lvl, ok := match[logLevel]
- if !ok {
- return errors.New("invalid log level, valid options are warn, info, debug, and trace")
- }
- message.SetLogLevel(lvl)
- message.Debug("Log level set to " + logLevel)
- }
-
- // Disable progress bars for CI envs
- if os.Getenv("CI") == "true" {
- message.Debug("CI environment detected, disabling progress bars")
- message.NoProgress = true
- }
-
- if !skipLogFile {
- ts := time.Now().Format("2006-01-02-15-04-05")
- f, err := os.CreateTemp("", fmt.Sprintf("zarf-%s-*.log", ts))
- if err != nil {
- return fmt.Errorf("could not create a log file in a the temporary directory: %w", err)
- }
- logFile, err := message.UseLogFile(f)
- if err != nil {
- return fmt.Errorf("could not save a log file to the temporary directory: %w", err)
- }
- pterm.SetDefaultOutput(io.MultiWriter(os.Stderr, logFile))
- message.Notef("Saving log file to %s", f.Name())
- }
- return nil
-}
diff --git a/src/cmd/common/utils.go b/src/cmd/common/utils.go
deleted file mode 100644
index 1da7e456ee..0000000000
--- a/src/cmd/common/utils.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package common handles command configuration across all commands
-package common
-
-// SetBaseDirectory sets the base directory. This is a directory with a zarf.yaml.
-func SetBaseDirectory(args []string) string {
- if len(args) > 0 {
- return args[0]
- }
- return "."
-}
diff --git a/src/cmd/common/viper.go b/src/cmd/common/viper.go
index 0e82a33676..cef9456562 100644
--- a/src/cmd/common/viper.go
+++ b/src/cmd/common/viper.go
@@ -5,14 +5,15 @@
package common
import (
+ "context"
"errors"
"os"
"strings"
+ "github.com/zarf-dev/zarf/src/pkg/logger"
+
"github.com/spf13/viper"
"github.com/zarf-dev/zarf/src/config"
- "github.com/zarf-dev/zarf/src/config/lang"
- "github.com/zarf-dev/zarf/src/pkg/message"
)
// Constants for use when loading configurations from viper config files
@@ -20,17 +21,21 @@ const (
// Root config keys
- VLogLevel = "log_level"
VArchitecture = "architecture"
- VNoLogFile = "no_log_file"
- VNoProgress = "no_progress"
- VNoColor = "no_color"
VZarfCache = "zarf_cache"
VTmpDir = "tmp_dir"
VInsecure = "insecure"
VPlainHTTP = "plain_http"
VInsecureSkipTLSVerify = "insecure_skip_tls_verify"
+ // Root config, Logging
+
+ VLogLevel = "log_level"
+ VLogFormat = "log_format"
+ VNoLogFile = "no_log_file"
+ VNoProgress = "no_progress"
+ VNoColor = "no_color"
+
// Init config keys
VInitComponents = "init.components"
@@ -81,13 +86,12 @@ const (
// Package deploy config keys
- VPkgDeploySet = "package.deploy.set"
- VPkgDeployComponents = "package.deploy.components"
- VPkgDeployShasum = "package.deploy.shasum"
- VPkgDeploySget = "package.deploy.sget"
- VPkgDeploySkipWebhooks = "package.deploy.skip_webhooks"
- VPkgDeployTimeout = "package.deploy.timeout"
- VPkgRetries = "package.deploy.retries"
+ VPkgDeploySet = "package.deploy.set"
+ VPkgDeployComponents = "package.deploy.components"
+ VPkgDeployShasum = "package.deploy.shasum"
+ VPkgDeploySget = "package.deploy.sget"
+ VPkgDeployTimeout = "package.deploy.timeout"
+ VPkgRetries = "package.deploy.retries"
// Package publish config keys
@@ -163,7 +167,10 @@ func isVersionCmd() bool {
return len(args) > 1 && (args[1] == "version" || args[1] == "v")
}
-func printViperConfigUsed() {
+// PrintViperConfigUsed informs users when Zarf has detected a config file.
+func PrintViperConfigUsed(ctx context.Context) {
+ l := logger.From(ctx)
+
// Only print config info if viper is initialized.
vInitialized := v != nil
if !vInitialized {
@@ -174,11 +181,11 @@ func printViperConfigUsed() {
return
}
if vConfigError != nil {
- message.WarnErrf(vConfigError, lang.CmdViperErrLoadingConfigFile, vConfigError.Error())
+ l.Error("unable to load config file", "error", vConfigError)
return
}
if cfgFile := v.ConfigFileUsed(); cfgFile != "" {
- message.Notef(lang.CmdViperInfoUsingConfigFile, cfgFile)
+ l.Info("using config file", "location", cfgFile)
}
}
diff --git a/src/cmd/destroy.go b/src/cmd/destroy.go
index 1b71740aa3..6951efd96b 100644
--- a/src/cmd/destroy.go
+++ b/src/cmd/destroy.go
@@ -30,6 +30,7 @@ var destroyCmd = &cobra.Command{
Aliases: []string{"d"},
Short: lang.CmdDestroyShort,
Long: lang.CmdDestroyLong,
+ // TODO(mkcp): refactor and de-nest this function.
RunE: func(cmd *cobra.Command, _ []string) error {
ctx := cmd.Context()
timeoutCtx, cancel := context.WithTimeout(cmd.Context(), cluster.DefaultTimeout)
@@ -57,7 +58,10 @@ var destroyCmd = &cobra.Command{
// Run all the scripts!
pattern := regexp.MustCompile(`(?mi)zarf-clean-.+\.sh$`)
- scripts, _ := helpers.RecursiveFileList(config.ZarfCleanupScriptsPath, pattern, true)
+ scripts, err := helpers.RecursiveFileList(config.ZarfCleanupScriptsPath, pattern, true)
+ if err != nil {
+ return err
+ }
// Iterate over all matching zarf-clean scripts and exec them
for _, script := range scripts {
// Run the matched script
@@ -71,8 +75,11 @@ var destroyCmd = &cobra.Command{
return fmt.Errorf("received an error when executing the script %s: %w", script, err)
}
- // Try to remove the script, but ignore any errors
- _ = os.Remove(script)
+ // Try to remove the script, but ignore any errors and debug log them
+ err = os.Remove(script)
+ if err != nil {
+ message.WarnErr(err, fmt.Sprintf("Unable to remove script. script=%s", script))
+ }
}
} else {
// Perform chart uninstallation
diff --git a/src/cmd/dev.go b/src/cmd/dev.go
index 85f08e9c11..7540c2b365 100644
--- a/src/cmd/dev.go
+++ b/src/cmd/dev.go
@@ -32,6 +32,8 @@ import (
var extractPath string
+var defaultRegistry = fmt.Sprintf("%s:%d", helpers.IPV4Localhost, types.ZarfInClusterContainerRegistryNodePort)
+
var devCmd = &cobra.Command{
Use: "dev",
Aliases: []string{"prepare", "prep"},
@@ -44,7 +46,7 @@ var devDeployCmd = &cobra.Command{
Short: lang.CmdDevDeployShort,
Long: lang.CmdDevDeployLong,
RunE: func(cmd *cobra.Command, args []string) error {
- pkgConfig.CreateOpts.BaseDir = common.SetBaseDirectory(args)
+ pkgConfig.CreateOpts.BaseDir = setBaseDirectory(args)
v := common.GetViper()
pkgConfig.CreateOpts.SetVariables = helpers.TransformAndMergeMap(
@@ -148,14 +150,13 @@ var devSha256SumCmd = &cobra.Command{
Aliases: []string{"s"},
Short: lang.CmdDevSha256sumShort,
Args: cobra.ExactArgs(1),
- RunE: func(cmd *cobra.Command, args []string) error {
+ RunE: func(cmd *cobra.Command, args []string) (err error) {
hashErr := errors.New("unable to compute the SHA256SUM hash")
fileName := args[0]
var tmp string
var data io.ReadCloser
- var err error
if helpers.IsURL(fileName) {
message.Warn(lang.CmdDevSha256sumRemoteWarning)
@@ -182,7 +183,10 @@ var devSha256SumCmd = &cobra.Command{
fileName = downloadPath
- defer os.RemoveAll(tmp)
+ defer func(path string) {
+ errRemove := os.RemoveAll(path)
+ err = errors.Join(err, errRemove)
+ }(tmp)
}
if extractPath != "" {
@@ -191,7 +195,10 @@ var devSha256SumCmd = &cobra.Command{
if err != nil {
return errors.Join(hashErr, err)
}
- defer os.RemoveAll(tmp)
+ defer func(path string) {
+ errRemove := os.RemoveAll(path)
+ err = errors.Join(err, errRemove)
+ }(tmp)
}
extractedFile := filepath.Join(tmp, extractPath)
@@ -208,7 +215,10 @@ var devSha256SumCmd = &cobra.Command{
if err != nil {
return errors.Join(hashErr, err)
}
- defer data.Close()
+ defer func(data io.ReadCloser) {
+ errClose := data.Close()
+ err = errors.Join(err, errClose)
+ }(data)
hash, err := helpers.GetSHA256Hash(data)
if err != nil {
@@ -226,7 +236,7 @@ var devFindImagesCmd = &cobra.Command{
Short: lang.CmdDevFindImagesShort,
Long: lang.CmdDevFindImagesLong,
RunE: func(cmd *cobra.Command, args []string) error {
- pkgConfig.CreateOpts.BaseDir = common.SetBaseDirectory(args)
+ pkgConfig.CreateOpts.BaseDir = setBaseDirectory(args)
v := common.GetViper()
@@ -281,7 +291,7 @@ var devLintCmd = &cobra.Command{
Long: lang.CmdDevLintLong,
RunE: func(cmd *cobra.Command, args []string) error {
config.CommonOptions.Confirm = true
- pkgConfig.CreateOpts.BaseDir = common.SetBaseDirectory(args)
+ pkgConfig.CreateOpts.BaseDir = setBaseDirectory(args)
v := common.GetViper()
pkgConfig.CreateOpts.SetVariables = helpers.TransformAndMergeMap(
v.GetStringMapString(common.VPkgCreateSet), pkgConfig.CreateOpts.SetVariables, strings.ToUpper)
@@ -323,8 +333,14 @@ func init() {
// use the package create config for this and reset it here to avoid overwriting the config.CreateOptions.SetVariables
devFindImagesCmd.Flags().StringToStringVar(&pkgConfig.CreateOpts.SetVariables, "set", v.GetStringMapString(common.VPkgCreateSet), lang.CmdDevFlagSet)
- devFindImagesCmd.Flags().MarkDeprecated("set", "this field is replaced by create-set")
- devFindImagesCmd.Flags().MarkHidden("set")
+ err := devFindImagesCmd.Flags().MarkDeprecated("set", "this field is replaced by create-set")
+ if err != nil {
+ message.Debug("Unable to mark dev-find-images flag as set", "error", err)
+ }
+ err = devFindImagesCmd.Flags().MarkHidden("set")
+ if err != nil {
+ message.Debug("Unable to mark dev-find-images flag as hidden", "error", err)
+ }
devFindImagesCmd.Flags().StringVarP(&pkgConfig.CreateOpts.Flavor, "flavor", "f", v.GetString(common.VPkgCreateFlavor), lang.CmdPackageCreateFlagFlavor)
devFindImagesCmd.Flags().StringToStringVar(&pkgConfig.CreateOpts.SetVariables, "create-set", v.GetStringMapString(common.VPkgCreateSet), lang.CmdDevFlagSet)
devFindImagesCmd.Flags().StringToStringVar(&pkgConfig.PkgOpts.SetVariables, "deploy-set", v.GetStringMapString(common.VPkgDeploySet), lang.CmdPackageDeployFlagSet)
@@ -335,8 +351,7 @@ func init() {
// skip searching cosign artifacts in find images
devFindImagesCmd.Flags().BoolVar(&pkgConfig.FindImagesOpts.SkipCosign, "skip-cosign", false, lang.CmdDevFlagFindImagesSkipCosign)
- defaultRegistry := fmt.Sprintf("%s:%d", helpers.IPV4Localhost, types.ZarfInClusterContainerRegistryNodePort)
- devFindImagesCmd.Flags().StringVar(&pkgConfig.FindImagesOpts.RegistryURL, "registry-url", defaultRegistry, lang.CmdDevFlagFindImagesRegistry)
+ devFindImagesCmd.Flags().StringVar(&pkgConfig.FindImagesOpts.RegistryURL, "registry-url", defaultRegistry, lang.CmdDevFlagRegistry)
devLintCmd.Flags().StringToStringVar(&pkgConfig.CreateOpts.SetVariables, "set", v.GetStringMapString(common.VPkgCreateSet), lang.CmdPackageCreateFlagSet)
devLintCmd.Flags().StringVarP(&pkgConfig.CreateOpts.Flavor, "flavor", "f", v.GetString(common.VPkgCreateFlavor), lang.CmdPackageCreateFlagFlavor)
@@ -350,11 +365,16 @@ func bindDevDeployFlags(v *viper.Viper) {
devDeployFlags.StringToStringVar(&pkgConfig.CreateOpts.RegistryOverrides, "registry-override", v.GetStringMapString(common.VPkgCreateRegistryOverride), lang.CmdPackageCreateFlagRegistryOverride)
devDeployFlags.StringVarP(&pkgConfig.CreateOpts.Flavor, "flavor", "f", v.GetString(common.VPkgCreateFlavor), lang.CmdPackageCreateFlagFlavor)
+ devDeployFlags.StringVar(&pkgConfig.DeployOpts.RegistryURL, "registry-url", defaultRegistry, lang.CmdDevFlagRegistry)
+ err := devDeployFlags.MarkHidden("registry-url")
+ if err != nil {
+ message.Debug("Unable to mark dev-deploy flag as hidden", "error", err)
+ }
+
devDeployFlags.StringToStringVar(&pkgConfig.PkgOpts.SetVariables, "deploy-set", v.GetStringMapString(common.VPkgDeploySet), lang.CmdPackageDeployFlagSet)
// Always require adopt-existing-resources flag (no viper)
devDeployFlags.BoolVar(&pkgConfig.DeployOpts.AdoptExistingResources, "adopt-existing-resources", false, lang.CmdPackageDeployFlagAdoptExistingResources)
- devDeployFlags.BoolVar(&pkgConfig.DeployOpts.SkipWebhooks, "skip-webhooks", v.GetBool(common.VPkgDeploySkipWebhooks), lang.CmdPackageDeployFlagSkipWebhooks)
devDeployFlags.DurationVar(&pkgConfig.DeployOpts.Timeout, "timeout", v.GetDuration(common.VPkgDeployTimeout), lang.CmdPackageDeployFlagTimeout)
devDeployFlags.IntVar(&pkgConfig.PkgOpts.Retries, "retries", v.GetInt(common.VPkgRetries), lang.CmdPackageFlagRetries)
diff --git a/src/cmd/initialize.go b/src/cmd/initialize.go
index 376db85da9..70e73c1223 100644
--- a/src/cmd/initialize.go
+++ b/src/cmd/initialize.go
@@ -8,7 +8,6 @@ import (
"context"
"errors"
"fmt"
- "os"
"path"
"path/filepath"
"strings"
@@ -37,9 +36,6 @@ var initCmd = &cobra.Command{
Long: lang.CmdInitLong,
Example: lang.CmdInitExample,
RunE: func(cmd *cobra.Command, _ []string) error {
- zarfLogo := message.GetLogo()
- _, _ = fmt.Fprintln(os.Stderr, zarfLogo)
-
if err := validateInitFlags(); err != nil {
return fmt.Errorf("invalid command flags were provided: %w", err)
}
@@ -94,19 +90,27 @@ func findInitPackage(ctx context.Context, initPackageName string) (string, error
}
// Create the cache directory if it doesn't exist
- if helpers.InvalidPath(config.GetAbsCachePath()) {
- if err := helpers.CreateDirectory(config.GetAbsCachePath(), helpers.ReadExecuteAllWriteUser); err != nil {
- return "", fmt.Errorf("unable to create the cache directory %s: %w", config.GetAbsCachePath(), err)
+ absCachePath, err := config.GetAbsCachePath()
+ if err != nil {
+ return "", err
+ }
+ // Verify that we can write to the path
+ if helpers.InvalidPath(absCachePath) {
+ // Create the directory if the path is invalid
+ err = helpers.CreateDirectory(absCachePath, helpers.ReadExecuteAllWriteUser)
+ if err != nil {
+ return "", fmt.Errorf("unable to create the cache directory %s: %w", absCachePath, err)
}
}
// Next, look in the cache directory
- if !helpers.InvalidPath(filepath.Join(config.GetAbsCachePath(), initPackageName)) {
- return filepath.Join(config.GetAbsCachePath(), initPackageName), nil
+ if !helpers.InvalidPath(filepath.Join(absCachePath, initPackageName)) {
+ // join and return
+ return filepath.Join(absCachePath, initPackageName), nil
}
// Finally, if the init-package doesn't exist in the cache directory, suggest downloading it
- downloadCacheTarget, err := downloadInitPackage(ctx, config.GetAbsCachePath())
+ downloadCacheTarget, err := downloadInitPackage(ctx, absCachePath)
if err != nil {
if errors.Is(err, lang.ErrInitNotFound) {
return "", err
@@ -121,7 +125,6 @@ func downloadInitPackage(ctx context.Context, cacheDirectory string) (string, er
return "", lang.ErrInitNotFound
}
- var confirmDownload bool
url := zoci.GetInitPackageURL(config.CLIVersion)
// Give the user the choice to download the init-package and note that this does require an internet connection
@@ -129,14 +132,12 @@ func downloadInitPackage(ctx context.Context, cacheDirectory string) (string, er
message.Note(lang.CmdInitPullNote)
- // Prompt the user if --confirm not specified
- if !confirmDownload {
- prompt := &survey.Confirm{
- Message: lang.CmdInitPullConfirm,
- }
- if err := survey.AskOne(prompt, &confirmDownload); err != nil {
- return "", fmt.Errorf("confirm download canceled: %w", err)
- }
+ var confirmDownload bool
+ prompt := &survey.Confirm{
+ Message: lang.CmdInitPullConfirm,
+ }
+ if err := survey.AskOne(prompt, &confirmDownload); err != nil {
+ return "", fmt.Errorf("confirm download canceled: %w", err)
}
// If the user wants to download the init-package, download it
@@ -218,7 +219,6 @@ func init() {
// Flags that control how a deployment proceeds
// Always require adopt-existing-resources flag (no viper)
initCmd.Flags().BoolVar(&pkgConfig.DeployOpts.AdoptExistingResources, "adopt-existing-resources", false, lang.CmdPackageDeployFlagAdoptExistingResources)
- initCmd.Flags().BoolVar(&pkgConfig.DeployOpts.SkipWebhooks, "skip-webhooks", v.GetBool(common.VPkgDeploySkipWebhooks), lang.CmdPackageDeployFlagSkipWebhooks)
initCmd.Flags().DurationVar(&pkgConfig.DeployOpts.Timeout, "timeout", v.GetDuration(common.VPkgDeployTimeout), lang.CmdPackageDeployFlagTimeout)
initCmd.Flags().IntVar(&pkgConfig.PkgOpts.Retries, "retries", v.GetInt(common.VPkgRetries), lang.CmdPackageFlagRetries)
diff --git a/src/cmd/internal.go b/src/cmd/internal.go
index 4a393d01e6..b3bc2c4592 100644
--- a/src/cmd/internal.go
+++ b/src/cmd/internal.go
@@ -348,8 +348,8 @@ var isValidHostname = &cobra.Command{
Short: lang.CmdInternalIsValidHostnameShort,
RunE: func(_ *cobra.Command, _ []string) error {
if valid := helpers.IsValidHostName(); !valid {
- hostname, _ := os.Hostname()
- return fmt.Errorf("the hostname %s is not valid. Ensure the hostname meets RFC1123 requirements https://www.rfc-editor.org/rfc/rfc1123.html", hostname)
+ hostname, err := os.Hostname()
+ return fmt.Errorf("the hostname %s is not valid. Ensure the hostname meets RFC1123 requirements https://www.rfc-editor.org/rfc/rfc1123.html, error=%w", hostname, err)
}
return nil
},
@@ -388,6 +388,9 @@ func addHiddenDummyFlag(cmd *cobra.Command, flagDummy string) {
if cmd.PersistentFlags().Lookup(flagDummy) == nil {
var dummyStr string
cmd.PersistentFlags().StringVar(&dummyStr, flagDummy, "", "")
- cmd.PersistentFlags().MarkHidden(flagDummy)
+ err := cmd.PersistentFlags().MarkHidden(flagDummy)
+ if err != nil {
+ message.Debug("Unable to add hidden dummy flag", "error", err)
+ }
}
}
diff --git a/src/cmd/package.go b/src/cmd/package.go
index 3ae1b0e2ff..58e714a543 100644
--- a/src/cmd/package.go
+++ b/src/cmd/package.go
@@ -47,7 +47,7 @@ var packageCreateCmd = &cobra.Command{
Short: lang.CmdPackageCreateShort,
Long: lang.CmdPackageCreateLong,
RunE: func(cmd *cobra.Command, args []string) error {
- pkgConfig.CreateOpts.BaseDir = common.SetBaseDirectory(args)
+ pkgConfig.CreateOpts.BaseDir = setBaseDirectory(args)
var isCleanPathRegex = regexp.MustCompile(`^[a-zA-Z0-9\_\-\/\.\~\\:]+$`)
if !isCleanPathRegex.MatchString(config.CommonOptions.CachePath) {
@@ -128,7 +128,7 @@ var packageMirrorCmd = &cobra.Command{
pkgConfig.PkgOpts.SkipSignatureValidation = true
}
},
- RunE: func(cmd *cobra.Command, args []string) error {
+ RunE: func(cmd *cobra.Command, args []string) (err error) {
var c *cluster.Cluster
if dns.IsServiceURL(pkgConfig.InitOpts.RegistryInfo.Address) || dns.IsServiceURL(pkgConfig.InitOpts.GitServer.Address) {
var err error
@@ -153,14 +153,18 @@ var packageMirrorCmd = &cobra.Command{
SkipSignatureValidation: pkgConfig.PkgOpts.SkipSignatureValidation,
Filter: filter,
}
- pkgPaths, err := packager2.LoadPackage(cmd.Context(), loadOpt)
+ pkgLayout, err := packager2.LoadPackage(cmd.Context(), loadOpt)
if err != nil {
return err
}
- defer os.RemoveAll(pkgPaths.Base)
+ defer func() {
+ // Cleanup package files
+ err = errors.Join(err, pkgLayout.Cleanup())
+ }()
+
mirrorOpt := packager2.MirrorOptions{
Cluster: c,
- PackagePaths: *pkgPaths,
+ PkgLayout: pkgLayout,
Filter: filter,
RegistryInfo: pkgConfig.InitOpts.RegistryInfo,
GitInfo: pkgConfig.InitOpts.GitServer,
@@ -193,7 +197,7 @@ var packageInspectCmd = &cobra.Command{
return err
}
- cluster, _ := cluster.NewCluster()
+ cluster, _ := cluster.NewCluster() //nolint:errcheck
inspectOpt := packager2.ZarfInspectOptions{
Source: src,
SkipSignatureValidation: pkgConfig.PkgOpts.SkipSignatureValidation,
@@ -210,7 +214,10 @@ var packageInspectCmd = &cobra.Command{
return fmt.Errorf("failed to inspect package: %w", err)
}
for _, image := range output {
- fmt.Fprintln(os.Stdout, "-", image)
+ _, err := fmt.Fprintln(os.Stdout, "-", image)
+ if err != nil {
+ return err
+ }
}
}
@@ -218,7 +225,10 @@ var packageInspectCmd = &cobra.Command{
if err != nil {
return fmt.Errorf("failed to inspect package: %w", err)
}
- utils.ColorPrintYAML(output, nil, false)
+ err = utils.ColorPrintYAML(output, nil, false)
+ if err != nil {
+ return err
+ }
return nil
},
}
@@ -287,7 +297,7 @@ var packageRemoveCmd = &cobra.Command{
filters.ByLocalOS(runtime.GOOS),
filters.BySelectState(pkgConfig.PkgOpts.OptionalComponents),
)
- cluster, _ := cluster.NewCluster()
+ cluster, _ := cluster.NewCluster() //nolint:errcheck
removeOpt := packager2.RemoveOptions{
Source: packageSource,
Cluster: cluster,
@@ -381,9 +391,23 @@ func choosePackage(args []string) (string, error) {
prompt := &survey.Input{
Message: lang.CmdPackageChoose,
Suggest: func(toComplete string) []string {
- files, _ := filepath.Glob(config.ZarfPackagePrefix + toComplete + "*.tar")
- zstFiles, _ := filepath.Glob(config.ZarfPackagePrefix + toComplete + "*.tar.zst")
- splitFiles, _ := filepath.Glob(config.ZarfPackagePrefix + toComplete + "*.part000")
+ tarPath := config.ZarfPackagePrefix + toComplete + "*.tar"
+ files, err := filepath.Glob(tarPath)
+ if err != nil {
+ message.Debug("Unable to glob", "tarPath", tarPath, "error", err)
+ }
+
+ zstPath := config.ZarfPackagePrefix + toComplete + "*.tar.zst"
+ zstFiles, err := filepath.Glob(zstPath)
+ if err != nil {
+ message.Debug("Unable to glob", "zstPath", zstPath, "error", err)
+ }
+
+ splitPath := config.ZarfPackagePrefix + toComplete + "*.part000"
+ splitFiles, err := filepath.Glob(splitPath)
+ if err != nil {
+ message.Debug("Unable to glob", "splitPath", splitPath, "error", err)
+ }
files = append(files, zstFiles...)
files = append(files, splitFiles...)
@@ -408,7 +432,10 @@ func getPackageCompletionArgs(cmd *cobra.Command, _ []string, _ string) ([]strin
ctx := cmd.Context()
- deployedZarfPackages, _ := c.GetDeployedZarfPackages(ctx)
+ deployedZarfPackages, err := c.GetDeployedZarfPackages(ctx)
+ if err != nil {
+ message.Debug("Unable to get deployed zarf packages for package completion args", "error", err)
+ }
// Populate list of package names
for _, pkg := range deployedZarfPackages {
pkgCandidates = append(pkgCandidates, pkg.Name)
@@ -477,9 +504,18 @@ func bindCreateFlags(v *viper.Viper) {
createFlags.IntVar(&pkgConfig.PkgOpts.Retries, "retries", v.GetInt(common.VPkgRetries), lang.CmdPackageFlagRetries)
- createFlags.MarkHidden("output-directory")
- createFlags.MarkHidden("key")
- createFlags.MarkHidden("key-pass")
+ errOD := createFlags.MarkHidden("output-directory")
+ if errOD != nil {
+ message.Debug("Unable to mark flag output-directory", "error", errOD)
+ }
+ errKey := createFlags.MarkHidden("key")
+ if errKey != nil {
+ message.Debug("Unable to mark flag key", "error", errKey)
+ }
+ errKP := createFlags.MarkHidden("key-pass")
+ if errKP != nil {
+ message.Debug("Unable to mark flag key-pass", "error", errKP)
+ }
}
func bindDeployFlags(v *viper.Viper) {
@@ -490,7 +526,6 @@ func bindDeployFlags(v *viper.Viper) {
// Always require adopt-existing-resources flag (no viper)
deployFlags.BoolVar(&pkgConfig.DeployOpts.AdoptExistingResources, "adopt-existing-resources", false, lang.CmdPackageDeployFlagAdoptExistingResources)
- deployFlags.BoolVar(&pkgConfig.DeployOpts.SkipWebhooks, "skip-webhooks", v.GetBool(common.VPkgDeploySkipWebhooks), lang.CmdPackageDeployFlagSkipWebhooks)
deployFlags.DurationVar(&pkgConfig.DeployOpts.Timeout, "timeout", v.GetDuration(common.VPkgDeployTimeout), lang.CmdPackageDeployFlagTimeout)
deployFlags.IntVar(&pkgConfig.PkgOpts.Retries, "retries", v.GetInt(common.VPkgRetries), lang.CmdPackageFlagRetries)
@@ -500,7 +535,10 @@ func bindDeployFlags(v *viper.Viper) {
deployFlags.StringVar(&pkgConfig.PkgOpts.SGetKeyPath, "sget", v.GetString(common.VPkgDeploySget), lang.CmdPackageDeployFlagSget)
deployFlags.BoolVar(&pkgConfig.PkgOpts.SkipSignatureValidation, "skip-signature-validation", false, lang.CmdPackageFlagSkipSignatureValidation)
- deployFlags.MarkHidden("sget")
+ err := deployFlags.MarkHidden("sget")
+ if err != nil {
+ message.Debug("Unable to mark flag sget", "error", err)
+ }
}
func bindMirrorFlags(v *viper.Viper) {
diff --git a/src/cmd/root.go b/src/cmd/root.go
index 188f91e8cc..f72358e288 100644
--- a/src/cmd/root.go
+++ b/src/cmd/root.go
@@ -6,10 +6,17 @@ package cmd
import (
"context"
+ "errors"
"fmt"
+ "io"
+ "log/slog"
"os"
"slices"
"strings"
+ "time"
+
+ "github.com/zarf-dev/zarf/src/cmd/say"
+ "github.com/zarf-dev/zarf/src/pkg/logger"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
@@ -18,7 +25,6 @@ import (
"github.com/zarf-dev/zarf/src/cmd/tools"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/config/lang"
- "github.com/zarf-dev/zarf/src/pkg/layout"
"github.com/zarf-dev/zarf/src/pkg/message"
"github.com/zarf-dev/zarf/src/types"
)
@@ -28,6 +34,8 @@ var (
pkgConfig = types.PackagerConfig{}
// LogLevelCLI holds the log level as input from a command
LogLevelCLI string
+ // LogFormat holds the log format as input from a command
+ LogFormat string
// SkipLogFile is a flag to skip logging to a file
SkipLogFile bool
// NoColor is a flag to disable colors in output
@@ -35,64 +43,75 @@ var (
)
var rootCmd = &cobra.Command{
- Use: "zarf COMMAND",
- PersistentPreRunE: func(cmd *cobra.Command, _ []string) error {
- // If --insecure was provided, set --insecure-skip-tls-verify and --plain-http to match
- if config.CommonOptions.Insecure {
- config.CommonOptions.InsecureSkipTLSVerify = true
- config.CommonOptions.PlainHTTP = true
- }
+ Use: "zarf COMMAND",
+ Short: lang.RootCmdShort,
+ Long: lang.RootCmdLong,
+ Args: cobra.MaximumNArgs(1),
+ SilenceUsage: true,
+ // TODO(mkcp): Do we actually want to silence errors here?
+ SilenceErrors: true,
+ PersistentPreRunE: preRun,
+ Run: run,
+}
- // Skip for vendor only commands
- if common.CheckVendorOnlyFromPath(cmd) {
- return nil
- }
+func preRun(cmd *cobra.Command, _ []string) error {
+ // If --insecure was provided, set --insecure-skip-tls-verify and --plain-http to match
+ if config.CommonOptions.Insecure {
+ config.CommonOptions.InsecureSkipTLSVerify = true
+ config.CommonOptions.PlainHTTP = true
+ }
- skipLogFile := SkipLogFile
+ // Skip for vendor only commands
+ if common.CheckVendorOnlyFromPath(cmd) {
+ return nil
+ }
- // Dont write tool commands to file.
- comps := strings.Split(cmd.CommandPath(), " ")
- if len(comps) > 1 && comps[1] == "tools" {
- skipLogFile = true
- }
- if len(comps) > 1 && comps[1] == "version" {
- skipLogFile = true
- }
+ // Setup message
+ skipLogFile := SkipLogFile
- // Dont write help command to file.
- if cmd.Parent() == nil {
- skipLogFile = true
- }
+ // Don't write tool commands to file.
+ comps := strings.Split(cmd.CommandPath(), " ")
+ if len(comps) > 1 && comps[1] == "tools" {
+ skipLogFile = true
+ }
+ if len(comps) > 1 && comps[1] == "version" {
+ skipLogFile = true
+ }
- err := common.SetupCLI(LogLevelCLI, skipLogFile, NoColor)
- if err != nil {
- return err
- }
- return nil
- },
- Short: lang.RootCmdShort,
- Long: lang.RootCmdLong,
- Args: cobra.MaximumNArgs(1),
- SilenceUsage: true,
- SilenceErrors: true,
- Run: func(cmd *cobra.Command, args []string) {
- zarfLogo := message.GetLogo()
- _, _ = fmt.Fprintln(os.Stderr, zarfLogo)
- cmd.Help()
-
- if len(args) > 0 {
- if strings.Contains(args[0], config.ZarfPackagePrefix) || strings.Contains(args[0], "zarf-init") {
- message.Warnf(lang.RootCmdDeprecatedDeploy, args[0])
- }
- if args[0] == layout.ZarfYAML {
- message.Warn(lang.RootCmdDeprecatedCreate)
- }
- }
- },
+ // Dont write help command to file.
+ if cmd.Parent() == nil {
+ skipLogFile = true
+ }
+ err := setupMessage(LogLevelCLI, skipLogFile, NoColor)
+ if err != nil {
+ return err
+ }
+
+ // Configure logger and add it to cmd context.
+ l, err := setupLogger(LogLevelCLI, LogFormat)
+ if err != nil {
+ return err
+ }
+ ctx := logger.WithContext(cmd.Context(), l)
+ cmd.SetContext(ctx)
+
+ // Print out config location
+ common.PrintViperConfigUsed(cmd.Context())
+ return nil
+}
+
+func run(cmd *cobra.Command, _ []string) {
+ err := cmd.Help()
+ if err != nil {
+ _, _ = fmt.Fprintln(os.Stderr, err)
+ }
}
// Execute is the entrypoint for the CLI.
func Execute(ctx context.Context) {
+ // Add `zarf say`
+ rootCmd.AddCommand(say.Command())
+
cmd, err := rootCmd.ExecuteContextC(ctx)
if err == nil {
return
@@ -119,15 +138,94 @@ func init() {
v := common.InitViper()
+ // Logs
rootCmd.PersistentFlags().StringVarP(&LogLevelCLI, "log-level", "l", v.GetString(common.VLogLevel), lang.RootCmdFlagLogLevel)
- rootCmd.PersistentFlags().StringVarP(&config.CLIArch, "architecture", "a", v.GetString(common.VArchitecture), lang.RootCmdFlagArch)
+ rootCmd.PersistentFlags().StringVar(&LogFormat, "log-format", v.GetString(common.VLogFormat), "Select a logging format. Defaults to 'text'. Valid options are: 'text', 'json'")
rootCmd.PersistentFlags().BoolVar(&SkipLogFile, "no-log-file", v.GetBool(common.VNoLogFile), lang.RootCmdFlagSkipLogFile)
rootCmd.PersistentFlags().BoolVar(&message.NoProgress, "no-progress", v.GetBool(common.VNoProgress), lang.RootCmdFlagNoProgress)
rootCmd.PersistentFlags().BoolVar(&NoColor, "no-color", v.GetBool(common.VNoColor), lang.RootCmdFlagNoColor)
+
+ rootCmd.PersistentFlags().StringVarP(&config.CLIArch, "architecture", "a", v.GetString(common.VArchitecture), lang.RootCmdFlagArch)
rootCmd.PersistentFlags().StringVar(&config.CommonOptions.CachePath, "zarf-cache", v.GetString(common.VZarfCache), lang.RootCmdFlagCachePath)
rootCmd.PersistentFlags().StringVar(&config.CommonOptions.TempDirectory, "tmpdir", v.GetString(common.VTmpDir), lang.RootCmdFlagTempDir)
+
+ // Security
rootCmd.PersistentFlags().BoolVar(&config.CommonOptions.Insecure, "insecure", v.GetBool(common.VInsecure), lang.RootCmdFlagInsecure)
rootCmd.PersistentFlags().MarkDeprecated("insecure", "please use --plain-http, --insecure-skip-tls-verify, or --skip-signature-validation instead.")
rootCmd.PersistentFlags().BoolVar(&config.CommonOptions.PlainHTTP, "plain-http", v.GetBool(common.VPlainHTTP), lang.RootCmdFlagPlainHTTP)
rootCmd.PersistentFlags().BoolVar(&config.CommonOptions.InsecureSkipTLSVerify, "insecure-skip-tls-verify", v.GetBool(common.VInsecureSkipTLSVerify), lang.RootCmdFlagInsecureSkipTLSVerify)
+
+ // HACK(mkcp): This is a workaround for us testing that help output matches to the byte. Undo this and update tests
+ // before release.
+ rootCmd.PersistentFlags().MarkHidden("log-format")
+}
+
+// setup Logger handles creating a logger and setting it as the global default.
+func setupLogger(level, format string) (*slog.Logger, error) {
+ // If we didn't get a level from config, fallback to "info"
+ if level == "" {
+ level = "info"
+ }
+ sLevel, err := logger.ParseLevel(level)
+ if err != nil {
+ return nil, err
+ }
+ cfg := logger.Config{
+ Level: sLevel,
+ Format: logger.Format(format),
+ Destination: logger.DestinationDefault,
+ }
+ l, err := logger.New(cfg)
+ if err != nil {
+ return nil, err
+ }
+ logger.SetDefault(l)
+ l.Debug("logger successfully initialized", "cfg", cfg)
+ return l, nil
+}
+
+// setupMessage configures message while we migrate over to logger.
+func setupMessage(logLevel string, skipLogFile, noColor bool) error {
+ // TODO(mkcp): Delete no-color
+ if noColor {
+ message.DisableColor()
+ }
+
+ if logLevel != "" {
+ match := map[string]message.LogLevel{
+ // NOTE(mkcp): Add error for forwards compatibility with logger
+ "error": message.WarnLevel,
+ "warn": message.WarnLevel,
+ "info": message.InfoLevel,
+ "debug": message.DebugLevel,
+ "trace": message.TraceLevel,
+ }
+ lvl, ok := match[logLevel]
+ if !ok {
+ return errors.New("invalid log level, valid options are warn, info, debug, error, and trace")
+ }
+ message.SetLogLevel(lvl)
+ message.Debug("Log level set to " + logLevel)
+ }
+
+ // Disable progress bars for CI envs
+ if os.Getenv("CI") == "true" {
+ message.Debug("CI environment detected, disabling progress bars")
+ message.NoProgress = true
+ }
+
+ if !skipLogFile {
+ ts := time.Now().Format("2006-01-02-15-04-05")
+ f, err := os.CreateTemp("", fmt.Sprintf("zarf-%s-*.log", ts))
+ if err != nil {
+ return fmt.Errorf("could not create a log file in a the temporary directory: %w", err)
+ }
+ logFile, err := message.UseLogFile(f)
+ if err != nil {
+ return fmt.Errorf("could not save a log file to the temporary directory: %w", err)
+ }
+ pterm.SetDefaultOutput(io.MultiWriter(os.Stderr, logFile))
+ message.Notef("Saving log file to %s", f.Name())
+ }
+ return nil
}
diff --git a/src/cmd/say/say.go b/src/cmd/say/say.go
new file mode 100644
index 0000000000..94daed409f
--- /dev/null
+++ b/src/cmd/say/say.go
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package say prints out the adorable creature we all know and love.
+package say
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/spf13/cobra"
+)
+
+// Command prints out the Zarf logo.
+func Command() *cobra.Command {
+ return &cobra.Command{
+ Use: "say",
+ Short: "Print Zarf logo",
+ Long: "Print out the adorable Zarf logo",
+ // HACK(mkcp): Hidden is a workaround until we update `test-docs-and-schema` for the new command and flags.
+ Hidden: true,
+ RunE: func(_ *cobra.Command, _ []string) error {
+ _, err := fmt.Fprintln(os.Stderr, logo())
+ return err
+ },
+ }
+}
+
+func logo() string {
+ return `
+[107;40m[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;097m([38;5;097m([38;5;097m([38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;m/[38;5;054m*[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;182m%[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;252m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;188m&[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m,[38;5;m*[38;5;m*[38;5;m*[38;5;m*[38;5;m*[38;5;m,[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;054m*[38;5;m%[38;5;252m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;103m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;255m@[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m*[38;5;255m@[38;5;255m@[38;5;255m@[38;5;255m@[38;5;255m@[38;5;254m@[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;188m&[38;5;254m@[38;5;255m@[38;5;255m@[38;5;255m@[38;5;255m@[38;5;m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m/[38;5;252m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;103m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m/[38;5;097m/[38;5;060m/[38;5;097m([38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;255m@[38;5;254m@[38;5;255m@[38;5;255m@[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;254m@[38;5;m/[38;5;m*[38;5;m [38;5;m*[38;5;m%[38;5;252m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;060m/[38;5;060m/[38;5;060m/[38;5;097m/[38;5;097m/[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m([38;5;097m([38;5;097m([38;5;097m/[38;5;097m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;253m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;254m&[38;5;255m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;254m@[38;5;255m@[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;253m&[38;5;m([38;5;m%[38;5;253m&[38;5;253m&[38;5;253m&[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;097m/[38;5;097m/[38;5;097m/[38;5;097m([38;5;m/[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m/[38;5;188m&[38;5;188m&[38;5;188m&[38;5;188m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;188m&[38;5;188m&[38;5;188m&[38;5;188m&[38;5;188m&[38;5;054m*[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;252m&[38;5;m%[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;188m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;253m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m*[38;5;188m&[38;5;152m%[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;188m&[38;5;054m*[38;5;060m*[38;5;054m*[38;5;252m&[38;5;152m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;m*[38;5;060m*[38;5;m*[38;5;054m*[38;5;m/[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;253m&[38;5;252m&[38;5;253m&[38;5;252m&[38;5;252m&[38;5;097m([38;5;m/[38;5;054m*
+[38;5;m [38;5;m*[38;5;m/[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m/[38;5;097m/[38;5;097m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;054m*[38;5;152m%[38;5;152m%[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;060m/[38;5;061m/[38;5;188m&[38;5;015m@[38;5;015m@[38;5;061m*[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;152m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;139m#[38;5;146m%[38;5;252m&[38;5;252m&[38;5;252m&[38;5;252m&[38;5;m*[38;5;060m/[38;5;103m#[38;5;139m#[38;5;139m#[38;5;103m#[38;5;103m([38;5;060m/[38;5;060m/[38;5;097m/[38;5;097m/[38;5;097m/[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;m/[38;5;m.[38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m/[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m/[38;5;097m/[38;5;097m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;m*[38;5;m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;103m([38;5;104m#[38;5;103m#[38;5;015m@[38;5;015m@[38;5;015m@[38;5;061m/[38;5;060m/[38;5;152m%[38;5;152m&[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m&[38;5;152m%[38;5;152m&[38;5;152m%[38;5;152m%[38;5;152m&[38;5;152m&[38;5;060m/[38;5;103m([38;5;015m@[38;5;015m@[38;5;103m([38;5;060m/[38;5;152m&[38;5;152m&[38;5;m([38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;097m/[38;5;097m/[38;5;097m([38;5;097m([38;5;m([38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m*[38;5;m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m/[38;5;097m/[38;5;060m/[38;5;060m/[38;5;m/[38;5;m*[38;5;054m*[38;5;m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;054m*[38;5;054m*[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;097m/[38;5;252m&[38;5;146m%[38;5;054m*[38;5;054m*[38;5;054m*[38;5;061m/[38;5;103m([38;5;103m([38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;103m([38;5;103m#[38;5;254m&[38;5;255m@[38;5;060m*[38;5;146m%[38;5;060m/[38;5;152m%[38;5;152m%[38;5;m*[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;m/[38;5;054m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;253m&[38;5;253m&[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;060m/[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;054m*[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;110m%[38;5;015m@[38;5;255m@[38;5;054m*[38;5;054m*[38;5;054m*[38;5;054m*[38;5;146m%[38;5;146m%[38;5;060m/[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;146m%[38;5;146m%[38;5;054m*[38;5;054m*[38;5;054m*[38;5;255m@[38;5;015m@[38;5;152m%[38;5;152m%[38;5;054m*[38;5;060m*[38;5;103m([38;5;152m%[38;5;152m%[38;5;152m%[38;5;252m&[38;5;252m&[38;5;060m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;253m&[38;5;252m&[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;103m([38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;m*[38;5;061m/[38;5;103m([38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;110m%[38;5;015m@[38;5;015m@[38;5;231m@[38;5;054m*[38;5;054m*[38;5;255m@[38;5;254m@[38;5;252m&[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;152m%[38;5;103m([38;5;255m@[38;5;255m@[38;5;054m*[38;5;251m%[38;5;015m@[38;5;255m@[38;5;152m%[38;5;152m%[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;061m/[38;5;152m%[38;5;252m&[38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;253m&[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;103m#[38;5;097m/[38;5;097m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m*[38;5;060m*[38;5;054m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;061m/[38;5;061m/[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;054m*[38;5;015m@[38;5;015m@[38;5;015m@[38;5;015m@[38;5;015m@[38;5;060m/[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;015m@[38;5;015m@[38;5;015m@[38;5;255m@[38;5;152m%[38;5;152m%[38;5;054m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;097m/[38;5;097m/[38;5;097m/[38;5;097m([38;5;097m([38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m/[38;5;097m/[38;5;097m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;m/[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;060m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m([38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;110m#[38;5;110m#[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;067m([38;5;110m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;060m*[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;m([38;5;m/[38;5;m*[38;5;054m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;110m#[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;110m#[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;m#[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m%[38;5;m%[38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m*[38;5;061m/[38;5;061m/[38;5;061m/[38;5;067m([38;5;067m([38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;067m([38;5;054m*[38;5;054m*[38;5;096m/[38;5;139m#[38;5;146m%[38;5;146m%[38;5;146m%[38;5;140m#[38;5;139m#[38;5;060m*[38;5;054m*[38;5;060m/[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;116m%[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;146m%[38;5;146m%[38;5;251m%[38;5;182m&[38;5;252m&[38;5;253m&[38;5;m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;061m/[38;5;061m/[38;5;m/[38;5;054m*[38;5;m/[38;5;067m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;074m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m#[38;5;061m/[38;5;061m/[38;5;074m#[38;5;116m#[38;5;116m#[38;5;116m#[38;5;116m#[38;5;m#[38;5;054m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;182m%[38;5;252m&[38;5;253m&[38;5;253m&[38;5;188m&[38;5;254m&[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;074m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;068m([38;5;067m([38;5;067m([38;5;067m([38;5;067m([38;5;067m([38;5;067m([38;5;m/[38;5;m/[38;5;m/[38;5;m/[38;5;m/[38;5;m/[38;5;068m([38;5;067m([38;5;067m([38;5;067m([38;5;060m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m#[38;5;080m#[38;5;080m#[38;5;152m%[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m#[38;5;074m([38;5;068m([38;5;068m([38;5;074m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m%[38;5;015m@[38;5;252m&[38;5;m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;252m&[38;5;080m#[38;5;m([38;5;152m%[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m*[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m/[38;5;253m&[38;5;188m&[38;5;m*[38;5;m [38;5;m.[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;252m&[38;5;080m#[38;5;074m([38;5;m/[38;5;152m%[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;067m([38;5;054m*[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;060m/[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;146m#[38;5;146m%[38;5;231m@[38;5;182m%[38;5;252m&[38;5;252m&[38;5;253m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;254m&[38;5;m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m.[38;5;m/[38;5;152m%[38;5;080m#[38;5;074m#[38;5;074m([38;5;074m([38;5;054m*[38;5;252m&[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;061m/[38;5;m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m([38;5;m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m*[38;5;074m([38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m%[38;5;252m&[38;5;252m&[38;5;253m&[38;5;188m&[38;5;188m&[38;5;254m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;146m%[38;5;146m%[38;5;254m@[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;252m&[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m([38;5;074m([38;5;m([38;5;m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m#[38;5;m*[38;5;074m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m#[38;5;074m([38;5;054m*[38;5;080m#[38;5;080m#[38;5;080m#[38;5;068m([38;5;054m*[38;5;074m([38;5;074m#[38;5;074m#[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m [38;5;m [38;5;m%[38;5;255m@[38;5;m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;152m%[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;054m*[38;5;116m%[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m/[38;5;m*[38;5;074m([38;5;074m([38;5;m*[38;5;152m%[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;061m/[38;5;054m*[38;5;074m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;054m*[38;5;m [38;5;m [38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;146m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;146m%[38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;080m#[38;5;074m#[38;5;054m*[38;5;m [38;5;054m*[38;5;m*[38;5;080m#[38;5;m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;068m([38;5;074m([38;5;074m([38;5;m([38;5;m/[38;5;m/[38;5;m/[38;5;080m#[38;5;054m*[38;5;080m#[38;5;054m*[38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;m/[38;5;080m#[38;5;054m*[38;5;m*[38;5;m#[38;5;074m([38;5;m([38;5;054m*[38;5;074m([38;5;080m#[38;5;080m#[38;5;m*[38;5;054m*[38;5;080m#[38;5;m,[38;5;054m*[38;5;m/[38;5;080m#[38;5;080m#[38;5;054m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m%[38;5;015m@[38;5;252m&[38;5;m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;140m%[38;5;140m%[38;5;140m%[38;5;054m*[38;5;140m%[38;5;146m%[38;5;140m%[38;5;054m*[38;5;m [38;5;m [38;5;m*[38;5;054m*[38;5;054m*[38;5;m*[38;5;m,[38;5;054m*[38;5;080m#[38;5;080m#[38;5;m/[38;5;054m*[38;5;080m#[38;5;m*[38;5;080m#[38;5;080m#[38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;074m([38;5;074m([38;5;m/[38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;m/[38;5;074m([38;5;074m([38;5;074m([38;5;054m*[38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m*[38;5;m,[38;5;m [38;5;m [38;5;m#[38;5;253m&[38;5;188m&[38;5;m#[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;140m%[38;5;146m%[38;5;140m%[38;5;054m*[38;5;m([38;5;146m%[38;5;140m%[38;5;140m%[38;5;m/[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m*[38;5;m*[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;m([38;5;080m#[38;5;068m([38;5;068m([38;5;m.[38;5;m.[38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;m*[38;5;m [38;5;m [38;5;m,[38;5;m*[38;5;074m([38;5;080m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;074m#[38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;255m@[38;5;182m%[38;5;140m%[38;5;140m%[38;5;m#[38;5;097m([38;5;m*[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;054m*[38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m*[38;5;054m*[38;5;m/[38;5;074m#[38;5;080m#[38;5;080m#[38;5;080m#[38;5;068m([38;5;m*[38;5;m [38;5;m*[38;5;m/[38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;054m*[38;5;m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;140m%[38;5;140m%[38;5;140m%[38;5;m*[38;5;097m([38;5;m/[38;5;m([38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;m/[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;054m*[38;5;054m*[38;5;m*[38;5;054m*[38;5;m*[38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;054m*[38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;074m([38;5;060m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;254m@[38;5;140m%[38;5;140m%[38;5;140m%[38;5;m#[38;5;m([38;5;097m([38;5;097m([38;5;m*[38;5;m/[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;m#[38;5;m#[38;5;140m%[38;5;140m%[38;5;m*[38;5;m([38;5;067m([38;5;067m([38;5;067m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;054m*[38;5;m*[38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;060m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;255m@[38;5;146m%[38;5;146m%[38;5;146m%[38;5;146m%[38;5;m*[38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;067m([38;5;067m([38;5;067m([38;5;068m([38;5;068m([38;5;068m([38;5;068m([38;5;054m*[38;5;m/[38;5;146m%[38;5;054m*[38;5;068m([38;5;068m([38;5;054m*[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;188m&[38;5;252m&[38;5;188m&[38;5;m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m*[38;5;182m%[38;5;146m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;m*[38;5;m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;103m([38;5;067m([38;5;m*[38;5;054m*[38;5;140m%[38;5;140m%[38;5;140m%[38;5;054m*[38;5;054m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m([38;5;253m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;054m*[38;5;m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;146m%[38;5;140m%[38;5;m([38;5;m/[38;5;054m*[38;5;054m*[38;5;054m*[38;5;054m*[38;5;m*[38;5;m([38;5;m#[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;054m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;253m&[38;5;m%[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;054m*[38;5;m*[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;140m%[38;5;146m%[38;5;140m%[38;5;140m%[38;5;m*[38;5;054m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m([38;5;m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;097m([38;5;m([38;5;m([38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m.[38;5;m.[38;5;m.[38;5;m.[38;5;m.[38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m/[38;5;m/[38;5;m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;061m/[38;5;m/[38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m([38;5;m.[38;5;m.[38;5;m.[38;5;m.[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;m*[38;5;m [38;5;m [38;5;m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m/[38;5;061m/[38;5;061m/[38;5;m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;060m*[38;5;060m*[38;5;060m*[38;5;m [38;5;m [38;5;m*[38;5;060m*[38;5;060m*[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m.[38;5;m [38;5;m [38;5;m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m/[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;060m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;067m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m*[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m*[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m/[38;5;060m/[38;5;060m/[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m.[38;5;067m/[38;5;031m/[38;5;031m/[38;5;031m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;032m/[38;5;m/[38;5;m [38;5;m/[38;5;031m/[38;5;031m/[38;5;067m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;067m/[38;5;067m/[38;5;067m/[38;5;m [38;5;m [38;5;m*[38;5;061m/[38;5;061m/[38;5;061m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;061m/[38;5;061m/[38;5;061m/[38;5;m/[38;5;m [38;5;m [38;5;m [38;5;m/[38;5;061m/[38;5;061m/[38;5;m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
+[0m
+`
+}
diff --git a/src/cmd/tools/helm.go b/src/cmd/tools/helm.go
index 0d37f8d017..9f367b694e 100644
--- a/src/cmd/tools/helm.go
+++ b/src/cmd/tools/helm.go
@@ -7,6 +7,8 @@ package tools
import (
"os"
+ "github.com/zarf-dev/zarf/src/pkg/message"
+
"github.com/zarf-dev/zarf/src/cmd/tools/helm"
"github.com/zarf-dev/zarf/src/config/lang"
"helm.sh/helm/v3/pkg/action"
@@ -24,7 +26,10 @@ func init() {
helmArgs = os.Args[3:]
}
// The inclusion of Helm in this manner should be changed once https://github.com/helm/helm/pull/12725 is merged
- helmCmd, _ := helm.NewRootCmd(actionConfig, os.Stdout, helmArgs)
+ helmCmd, err := helm.NewRootCmd(actionConfig, os.Stdout, helmArgs)
+ if err != nil {
+ message.Debug("Failed to initialize helm command", "error", err)
+ }
helmCmd.Short = lang.CmdToolsHelmShort
helmCmd.Long = lang.CmdToolsHelmLong
helmCmd.AddCommand(newVersionCmd("helm", helmVersion))
diff --git a/src/cmd/tools/zarf.go b/src/cmd/tools/zarf.go
index 5a9cd11718..df516f9506 100644
--- a/src/cmd/tools/zarf.go
+++ b/src/cmd/tools/zarf.go
@@ -205,11 +205,15 @@ var clearCacheCmd = &cobra.Command{
Aliases: []string{"c"},
Short: lang.CmdToolsClearCacheShort,
RunE: func(_ *cobra.Command, _ []string) error {
- message.Notef(lang.CmdToolsClearCacheDir, config.GetAbsCachePath())
- if err := os.RemoveAll(config.GetAbsCachePath()); err != nil {
- return fmt.Errorf("unable to clear the cache directory %s: %w", config.GetAbsCachePath(), err)
+ cachePath, err := config.GetAbsCachePath()
+ if err != nil {
+ return err
+ }
+ message.Notef(lang.CmdToolsClearCacheDir, cachePath)
+ if err := os.RemoveAll(cachePath); err != nil {
+ return fmt.Errorf("unable to clear the cache directory %s: %w", cachePath, err)
}
- message.Successf(lang.CmdToolsClearCacheSuccess, config.GetAbsCachePath())
+ message.Successf(lang.CmdToolsClearCacheSuccess, cachePath)
return nil
},
}
diff --git a/src/config/config.go b/src/config/config.go
index 4a4001dce6..ca80f619b6 100644
--- a/src/config/config.go
+++ b/src/config/config.go
@@ -97,16 +97,19 @@ func GetDataInjectionMarker() string {
}
// GetAbsCachePath gets the absolute cache path for images and git repos.
-func GetAbsCachePath() string {
+func GetAbsCachePath() (string, error) {
return GetAbsHomePath(CommonOptions.CachePath)
}
// GetAbsHomePath replaces ~ with the absolute path to a user's home dir
-func GetAbsHomePath(path string) string {
- homePath, _ := os.UserHomeDir()
+func GetAbsHomePath(path string) (string, error) {
+ homePath, err := os.UserHomeDir()
+ if err != nil {
+ return "", err
+ }
if strings.HasPrefix(path, "~") {
- return strings.Replace(path, "~", homePath, 1)
+ return strings.Replace(path, "~", homePath, 1), nil
}
- return path
+ return path, nil
}
diff --git a/src/config/lang/english.go b/src/config/lang/english.go
index 2e2a7e2177..38717db929 100644
--- a/src/config/lang/english.go
+++ b/src/config/lang/english.go
@@ -278,7 +278,6 @@ $ zarf package mirror-resources \
CmdPackageDeployFlagComponents = "Comma-separated list of components to deploy. Adding this flag will skip the prompts for selected components. Globbing component names with '*' and deselecting 'default' components with a leading '-' are also supported."
CmdPackageDeployFlagShasum = "Shasum of the package to deploy. Required if deploying a remote https package."
CmdPackageDeployFlagSget = "[Deprecated] Path to public sget key file for remote packages signed via cosign. This flag will be removed in v1.0.0 please use the --key flag instead."
- CmdPackageDeployFlagSkipWebhooks = "[alpha] Skip waiting for external webhooks to execute as each package component is deployed"
CmdPackageDeployFlagTimeout = "Timeout for health checks and Helm operations such as installs and rollbacks"
CmdPackageDeployValidateArchitectureErr = "this package architecture is %s, but the target cluster only has the %s architecture(s). These architectures must be compatible when \"images\" are present"
CmdPackageDeployValidateLastNonBreakingVersionWarn = "The version of this Zarf binary '%s' is less than the LastNonBreakingVersion of '%s'. You may need to upgrade your Zarf version to at least '%s' to deploy this package"
@@ -355,7 +354,7 @@ $ zarf package pull oci://ghcr.io/defenseunicorns/packages/dos-games:1.0.0 -a sk
CmdDevFlagRepoChartPath = `If git repos hold helm charts, often found with gitops tools, specify the chart path, e.g. "/" or "/chart"`
CmdDevFlagGitAccount = "User or organization name for the git account that the repos are created under."
CmdDevFlagKubeVersion = "Override the default helm template KubeVersion when performing a package chart template"
- CmdDevFlagFindImagesRegistry = "Override the ###ZARF_REGISTRY### value"
+ CmdDevFlagRegistry = "Override the ###ZARF_REGISTRY### value"
CmdDevFlagFindImagesWhy = "Prints the source manifest for the specified image"
CmdDevFlagFindImagesSkipCosign = "Skip searching for cosign artifacts related to discovered images"
@@ -590,10 +589,6 @@ $ zarf tools update-creds artifact --artifact-push-username={USERNAME} --artifac
// tools version
CmdToolsVersionShort = "Print the version"
-
- // cmd viper setup
- CmdViperErrLoadingConfigFile = "failed to load config file: %s"
- CmdViperInfoUsingConfigFile = "Using config file %s"
)
// Zarf Agent messages
diff --git a/src/extensions/bigbang/banner.go b/src/extensions/bigbang/banner.go
deleted file mode 100644
index e6791eec58..0000000000
--- a/src/extensions/bigbang/banner.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package bigbang contains the logic for installing Big Bang and Flux
-package bigbang
-
-import (
- "github.com/pterm/pterm"
- "github.com/zarf-dev/zarf/src/pkg/message"
-)
-
-func printBanner() {
- // Only print the banner if the terminal is wide enough and no-progress isn't set.
- if message.NoProgress || pterm.GetTerminalWidth() < 125 {
- message.Note("Loading Big Bang extension (this may take a few minutes)")
- return
- }
-
- smokey := `[107;40m[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m([38;5;143m([38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;101m/[38;5;143m([38;5;236m.[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;143m([38;5;101m/[38;5;101m/[38;5;239m*[38;5;101m/[38;5;234m.[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m([38;5;239m,[38;5;101m/[38;5;239m,[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;235m.[38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m,[38;5;237m,[38;5;239m,[38;5;233m [38;5;233m [38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;236m.[38;5;233m [38;5;233m [38;5;235m.[38;5;239m*[38;5;239m,[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;237m,[38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m,[38;5;236m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;240m*[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;238m,[38;5;239m,[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;237m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;237m,[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;238m,[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;180m#[38;5;101m/[38;5;237m,[38;5;233m [38;5;233m [38;5;235m.[38;5;239m,[38;5;101m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;240m*[38;5;237m,[38;5;234m [38;5;233m [38;5;236m.[38;5;241m*[38;5;144m#[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;180m%[38;5;238m,[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m#[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;186m%[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;234m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;137m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;143m([38;5;143m([38;5;143m([38;5;101m*[38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;143m([38;5;238m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;143m([38;5;234m.[38;5;233m [38;5;233m [38;5;143m([38;5;101m*[38;5;233m [38;5;233m [38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;240m*[38;5;233m [38;5;233m [38;5;240m*[38;5;143m([38;5;233m [38;5;233m [38;5;239m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;240m*[38;5;101m/[38;5;240m*[38;5;238m,[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;143m([38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;233m [38;5;233m [38;5;234m.[38;5;143m([38;5;101m/[38;5;233m [38;5;233m [38;5;235m.[38;5;234m.[38;5;233m [38;5;233m [38;5;240m*[38;5;233m [38;5;233m [38;5;101m/[38;5;143m([38;5;233m [38;5;233m [38;5;235m.[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m*[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;239m,[38;5;239m,[38;5;101m*[38;5;101m/[38;5;101m/[38;5;239m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;233m [38;5;233m [38;5;095m*[38;5;233m [38;5;233m [38;5;095m*[38;5;233m [38;5;233m [38;5;239m*[38;5;233m [38;5;233m [38;5;101m/[38;5;233m [38;5;233m [38;5;237m,[38;5;143m([38;5;143m([38;5;233m [38;5;233m [38;5;235m.[38;5;236m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;237m,[38;5;143m([38;5;143m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;240m*[38;5;233m [38;5;233m [38;5;101m/[38;5;238m,[38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;237m,[38;5;233m [38;5;233m [38;5;101m/[38;5;233m [38;5;233m [38;5;237m,[38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;235m.[38;5;238m,[38;5;233m [38;5;233m [38;5;101m/[38;5;233m [38;5;233m [38;5;234m.[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;095m*[38;5;239m*[38;5;101m/[38;5;101m/[38;5;240m*[38;5;233m [38;5;233m [38;5;101m/[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;235m.[38;5;238m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m*[38;5;239m,[38;5;101m*[38;5;234m.[38;5;233m [38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;059m*[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;238m,[38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;239m,[38;5;240m*[38;5;239m,[38;5;239m*[38;5;095m*[38;5;239m*[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;233m [38;5;m
-[38;5;m [38;5;236m.[38;5;142m/[38;5;100m/[38;5;003m*[38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;106m/[38;5;058m,[38;5;233m [38;5;233m [38;5;235m.[38;5;233m [38;5;233m [38;5;237m,[38;5;239m,[38;5;239m*[38;5;095m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;238m,[38;5;234m [38;5;233m [38;5;235m.[38;5;237m,[38;5;238m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;236m.[38;5;233m [38;5;233m [38;5;234m.[38;5;240m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;240m*[38;5;239m,[38;5;239m,[38;5;236m.[38;5;233m [38;5;234m [38;5;237m,[38;5;233m [38;5;235m.[38;5;003m*[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;003m*[38;5;100m/[38;5;148m([38;5;233m
-[38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;003m*[38;5;058m*[38;5;233m [38;5;233m [38;5;235m.[38;5;100m/[38;5;100m/[38;5;100m/[38;5;106m/[38;5;142m/[38;5;148m([38;5;148m([38;5;106m/[38;5;234m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;235m.[38;5;239m,[38;5;239m,[38;5;237m,[38;5;234m.[38;5;233m [38;5;233m [38;5;233m [38;5;235m.[38;5;240m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;137m([38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;137m([38;5;137m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;237m,[38;5;234m.[38;5;233m [38;5;233m [38;5;233m [38;5;235m.[38;5;238m,[38;5;239m,[38;5;238m,[38;5;234m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;058m,[38;5;142m/[38;5;148m([38;5;148m([38;5;106m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m*[38;5;234m.[38;5;233m [38;5;236m,[38;5;058m*[38;5;100m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;237m,[38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;003m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;234m.[38;5;233m [38;5;058m,[38;5;100m/[38;5;100m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;003m*[38;5;234m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;234m.[38;5;237m,[38;5;238m,[38;5;239m,[38;5;239m,[38;5;236m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;236m.[38;5;240m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m*[38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;235m.[38;5;237m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;236m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;058m,[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;233m [38;5;237m,[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;003m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;234m.[38;5;233m [38;5;236m.[38;5;100m/[38;5;106m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;058m,[38;5;058m,[38;5;234m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;234m [38;5;236m.[38;5;058m,[38;5;003m*[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;003m*[38;5;234m [38;5;233m [38;5;236m.[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;003m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m*[38;5;058m*[38;5;058m*[38;5;234m [38;5;235m.[38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;106m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;100m/[38;5;233m [38;5;058m,[38;5;058m*[38;5;058m*[38;5;058m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;003m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;064m*[38;5;058m*[38;5;058m*[38;5;234m [38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;235m.[38;5;100m/[38;5;148m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;178m([38;5;100m/[38;5;100m/[38;5;058m,[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;234m.[38;5;100m/[38;5;142m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;178m([38;5;142m/[38;5;236m.[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;234m.[38;5;058m*[38;5;058m*[38;5;058m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;234m.[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m*[38;5;058m*[38;5;058m*[38;5;233m [38;5;100m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;247m#[38;5;015m@[38;5;015m@[38;5;245m([38;5;236m.[38;5;214m([38;5;178m([38;5;233m [38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;214m([38;5;178m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;246m([38;5;015m@[38;5;015m@[38;5;015m@[38;5;233m [38;5;233m [38;5;236m.[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m*[38;5;236m.[38;5;058m*[38;5;058m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m*[38;5;058m*[38;5;058m*[38;5;233m [38;5;100m/[38;5;148m([38;5;148m([38;5;148m([38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;255m@[38;5;015m@[38;5;015m@[38;5;255m@[38;5;233m [38;5;233m [38;5;233m [38;5;106m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;236m,[38;5;015m@[38;5;015m@[38;5;254m&[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;100m/[38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;233m [38;5;058m*[38;5;058m*[38;5;003m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;233m [38;5;100m/[38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;058m*[38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;233m [38;5;058m*[38;5;058m*[38;5;058m*[38;5;100m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;003m*[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m*[38;5;058m*[38;5;003m*[38;5;100m*[38;5;058m*[38;5;233m [38;5;058m*[38;5;058m*[38;5;058m*[38;5;233m [38;5;100m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;100m/[38;5;100m/[38;5;058m,[38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;148m([38;5;214m([38;5;178m([38;5;142m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;235m.[38;5;100m/[38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;003m*[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;100m/[38;5;100m/[38;5;233m [38;5;058m*[38;5;058m*[38;5;237m,[38;5;233m [38;5;100m*[38;5;100m*[38;5;058m*[38;5;003m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m*[38;5;233m [38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;234m.[38;5;003m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;148m([38;5;148m([38;5;214m([38;5;178m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;106m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;106m/[38;5;106m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;106m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;214m([38;5;148m([38;5;148m([38;5;142m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;058m*[38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;100m/[38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;178m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;233m [38;5;058m,[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m/[38;5;106m/[38;5;234m [38;5;236m.[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;178m([38;5;178m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;148m([38;5;148m([38;5;100m/[38;5;100m/[38;5;100m*[38;5;233m [38;5;m.[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;235m.[38;5;233m [38;5;234m [38;5;100m/[38;5;100m/[38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;148m([38;5;142m/[38;5;142m/[38;5;142m/[38;5;142m/[38;5;003m*[38;5;064m*[38;5;058m,[38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;239m,[38;5;101m/[38;5;143m([38;5;101m/[38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;234m.[38;5;233m [38;5;233m [38;5;234m.[38;5;236m.[38;5;238m,[38;5;239m,[38;5;237m,[38;5;236m.[38;5;235m.[38;5;234m.[38;5;234m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;234m.[38;5;235m.[38;5;236m.[38;5;237m,[38;5;239m,[38;5;237m,[38;5;235m.[38;5;233m [38;5;233m [38;5;240m*[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;234m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;237m,[38;5;101m*[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;101m/[38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;236m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;234m.[38;5;237m,[38;5;238m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;101m/[38;5;101m/[38;5;095m*[38;5;239m,[38;5;233m [38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;238m,[38;5;240m*[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;241m*[38;5;003m*[38;5;214m([38;5;148m([38;5;233m [38;5;238m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;015m@[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;234m.[38;5;058m,[38;5;178m([38;5;214m([38;5;233m [38;5;101m/[38;5;240m*[38;5;239m,[38;5;236m.[38;5;233m [38;5;234m.[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;235m.[38;5;223m&[38;5;143m([38;5;233m [38;5;233m [38;5;236m.[38;5;239m,[38;5;239m*[38;5;101m/[38;5;137m([38;5;143m([38;5;143m([38;5;233m [38;5;106m/[38;5;058m,[38;5;100m*[38;5;237m,[38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;249m#[38;5;253m&[38;5;015m@[38;5;252m&[38;5;239m,[38;5;015m@[38;5;239m*[38;5;255m@[38;5;015m@[38;5;254m&[38;5;247m#[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;003m*[38;5;058m,[38;5;142m/[38;5;233m [38;5;233m [38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;235m.[38;5;223m&[38;5;223m&[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;187m%[38;5;223m&[38;5;236m.[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;058m,[38;5;178m([38;5;214m([38;5;058m,[38;5;233m [38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;240m*[38;5;254m&[38;5;239m,[38;5;254m@[38;5;015m@[38;5;015m@[38;5;015m@[38;5;252m&[38;5;239m,[38;5;255m@[38;5;239m*[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;233m [38;5;178m([38;5;214m([38;5;142m/[38;5;148m([38;5;233m [38;5;233m [38;5;238m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;223m&[38;5;234m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;144m#[38;5;223m&[38;5;237m,[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;148m/[38;5;214m([38;5;148m([38;5;148m([38;5;106m/[38;5;100m*[38;5;148m([38;5;003m*[38;5;234m.[38;5;235m.[38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;015m@[38;5;007m%[38;5;015m@[38;5;239m,[38;5;239m,[38;5;015m@[38;5;015m@[38;5;015m@[38;5;239m,[38;5;239m,[38;5;015m@[38;5;250m%[38;5;015m@[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;235m.[38;5;235m.[38;5;234m [38;5;142m/[38;5;148m([38;5;233m [38;5;178m([38;5;235m.[38;5;148m([38;5;178m([38;5;234m.[38;5;233m [38;5;239m,[38;5;239m,[38;5;239m*[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;223m&[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;223m&[38;5;233m [38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;101m*[38;5;238m,[38;5;235m.[38;5;148m([38;5;148m([38;5;148m([38;5;233m [38;5;214m([38;5;148m([38;5;142m/[38;5;003m*[38;5;234m [38;5;236m.[38;5;233m [38;5;238m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;249m%[38;5;015m@[38;5;015m@[38;5;252m&[38;5;015m@[38;5;015m@[38;5;246m([38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;233m [38;5;237m,[38;5;233m [38;5;100m/[38;5;148m([38;5;214m([38;5;178m([38;5;142m/[38;5;148m([38;5;148m([38;5;148m([38;5;233m [38;5;239m,[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;180m%[38;5;237m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;223m&[38;5;233m [38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;101m/[38;5;238m,[38;5;236m,[38;5;106m/[38;5;142m/[38;5;100m/[38;5;148m([38;5;148m([38;5;100m/[38;5;100m/[38;5;058m*[38;5;233m [38;5;233m [38;5;233m [38;5;236m.[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;058m*[38;5;100m/[38;5;142m/[38;5;148m([38;5;100m/[38;5;100m/[38;5;142m/[38;5;100m/[38;5;233m [38;5;239m,[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;144m#[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;144m#[38;5;233m [38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;239m,[38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;003m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;233m [38;5;233m [38;5;239m,[38;5;239m,[38;5;239m,[38;5;233m [38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;137m([38;5;101m([38;5;101m/[38;5;233m [38;5;237m,[38;5;239m,[38;5;235m.[38;5;101m/[38;5;101m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;236m.[38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;233m [38;5;058m*[38;5;058m*[38;5;058m*[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;101m/[38;5;101m/[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;144m#[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m/[38;5;143m([38;5;101m/[38;5;143m([38;5;143m([38;5;101m/[38;5;101m/[38;5;233m [38;5;058m*[38;5;058m*[38;5;058m*[38;5;058m*[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;239m,[38;5;239m,[38;5;239m*[38;5;237m,[38;5;238m,[38;5;143m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;143m([38;5;233m [38;5;101m/[38;5;239m,[38;5;239m,[38;5;238m,[38;5;233m [38;5;233m [38;5;233m [38;5;058m,[38;5;058m*[38;5;058m*[38;5;058m*[38;5;236m.[38;5;237m,[38;5;101m/[38;5;101m/[38;5;143m([38;5;143m([38;5;101m/[38;5;143m([38;5;101m/[38;5;236m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;143m([38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;238m,[38;5;240m*[38;5;101m/[38;5;101m/[38;5;233m [38;5;143m([38;5;186m%[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;143m([38;5;059m*[38;5;239m,[38;5;101m/[38;5;101m/[38;5;235m.[38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;143m([38;5;143m([38;5;101m/[38;5;143m([38;5;101m/[38;5;238m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;240m*[38;5;233m [38;5;233m [38;5;233m [38;5;239m,[38;5;233m [38;5;101m/[38;5;101m/[38;5;240m*[38;5;239m*[38;5;143m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;233m [38;5;101m/[38;5;101m/[38;5;095m*[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;186m%[38;5;143m([38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;237m,[38;5;235m.[38;5;233m [38;5;233m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;234m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;237m,[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;143m([38;5;143m#[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;233m [38;5;101m/[38;5;101m/[38;5;235m.[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;143m([38;5;143m([38;5;234m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;101m/[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;233m [38;5;100m*[38;5;234m.[38;5;233m [38;5;233m [38;5;143m([38;5;143m([38;5;137m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;144m#[38;5;235m.[38;5;202m/[38;5;058m,[38;5;234m.[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;166m/[38;5;234m [38;5;223m&[38;5;223m&[38;5;143m([38;5;143m([38;5;101m/[38;5;235m.[38;5;233m [38;5;142m/[38;5;233m [38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m/[38;5;223m&[38;5;187m%[38;5;233m [38;5;100m/[38;5;106m/[38;5;058m,[38;5;233m [38;5;233m [38;5;100m/[38;5;142m/[38;5;233m [38;5;052m.[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;235m.[38;5;101m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;233m [38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;058m,[38;5;202m/[38;5;202m/[38;5;235m.[38;5;234m.[38;5;234m.[38;5;233m [38;5;148m([38;5;100m/[38;5;100m/[38;5;233m [38;5;223m&[38;5;101m([38;5;101m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;223m&[38;5;233m [38;5;058m,[38;5;058m,[38;5;233m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;235m.[38;5;202m/[38;5;130m*[38;5;233m [38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;233m [38;5;236m.[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;101m/[38;5;223m&[38;5;234m [38;5;166m*[38;5;166m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;003m*[38;5;100m/[38;5;100m/[38;5;058m,[38;5;003m*[38;5;100m/[38;5;100m/[38;5;233m [38;5;233m [38;5;233m [38;5;100m*[38;5;233m [38;5;144m#[38;5;240m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;223m&[38;5;223m&[38;5;233m [38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;100m/[38;5;100m/[38;5;064m*[38;5;100m/[38;5;235m.[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;094m,[38;5;223m&[38;5;223m&[38;5;180m%[38;5;101m/[38;5;240m*[38;5;202m/[38;5;202m/[38;5;202m/[38;5;166m*[38;5;223m&[38;5;233m [38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;166m/[38;5;058m,[38;5;202m/[38;5;233m [38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;100m/[38;5;233m [38;5;187m%[38;5;223m&[38;5;234m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;223m&[38;5;223m&[38;5;223m&[38;5;233m [38;5;064m*[38;5;058m*[38;5;058m*[38;5;234m.[38;5;202m/[38;5;233m [38;5;202m/[38;5;202m/[38;5;166m/[38;5;094m,[38;5;130m*[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;223m&[38;5;223m&[38;5;242m/[38;5;101m/[38;5;234m [38;5;202m/[38;5;202m/[38;5;202m/[38;5;233m [38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;130m*[38;5;202m/[38;5;202m/[38;5;234m [38;5;003m*[38;5;233m [38;5;233m [38;5;223m&[38;5;223m&[38;5;144m#[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m%[38;5;233m [38;5;058m*[38;5;166m/[38;5;166m*[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;235m.[38;5;202m/[38;5;236m.[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;233m [38;5;223m&[38;5;237m,[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;236m.[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;166m/[38;5;233m [38;5;223m&[38;5;223m&[38;5;223m&[38;5;235m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;101m/[38;5;101m/[38;5;101m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;208m([38;5;202m/[38;5;094m,[38;5;202m/[38;5;233m [38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;235m.[38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;166m*[38;5;166m*[38;5;202m/[38;5;214m([38;5;208m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;202m/[38;5;202m/[38;5;235m.[38;5;101m/[38;5;235m.[38;5;101m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m.[38;5;202m/[38;5;202m/[38;5;208m/[38;5;202m/[38;5;178m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;234m.[38;5;202m/[38;5;202m/[38;5;202m/[38;5;234m [38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;136m/[38;5;214m([38;5;208m([38;5;202m/[38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;202m/[38;5;202m/[38;5;233m [38;5;202m/[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;094m,[38;5;202m/[38;5;202m/[38;5;214m([38;5;202m/[38;5;202m/[38;5;235m.[38;5;202m/[38;5;094m,[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;202m/[38;5;202m/[38;5;233m [38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;208m/[38;5;214m([38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;130m*[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m,[38;5;m [38;5;m.[38;5;202m/[38;5;208m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;166m*[38;5;202m/[38;5;214m([38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;202m/[38;5;202m/[38;5;233m [38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;208m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;166m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;130m*[38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;233m [38;5;202m/[38;5;202m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;202m/[38;5;233m [38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;208m([38;5;214m([38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;202m/[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;233m [38;5;235m.[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;178m([38;5;094m*[38;5;233m [38;5;202m/[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;208m/[38;5;202m/[38;5;094m,[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;208m([38;5;233m [38;5;234m.[38;5;130m*[38;5;m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m.[38;5;m [38;5;233m [38;5;235m.[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m*[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;233m [38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;234m.[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;234m.[38;5;166m/[38;5;202m/[38;5;202m/[38;5;166m/[38;5;235m.[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;233m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;214m([38;5;214m([38;5;214m([38;5;136m/[38;5;234m.[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;094m,[38;5;234m [38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;180m%[38;5;144m#[38;5;234m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;142m/[38;5;233m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;233m [38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;233m [38;5;214m([38;5;235m.[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;233m [38;5;235m.[38;5;214m([38;5;214m([38;5;214m([38;5;214m([38;5;178m([38;5;058m,[38;5;094m,[38;5;178m([38;5;094m*[38;5;059m*[38;5;180m#[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;240m*[38;5;178m([38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;058m,[38;5;187m%[38;5;223m&[38;5;095m*[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;101m/[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;058m,[38;5;058m,[38;5;214m([38;5;214m([38;5;214m([38;5;235m.[38;5;136m/[38;5;214m([38;5;234m.[38;5;235m.[38;5;214m([38;5;136m/[38;5;100m*[38;5;242m/[38;5;101m([38;5;178m/[38;5;214m([38;5;178m([38;5;214m([38;5;172m/[38;5;094m,[38;5;094m,[38;5;214m([38;5;178m([38;5;214m([38;5;214m([38;5;236m,[38;5;052m.[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;172m/[38;5;236m.[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;137m([38;5;223m&[38;5;143m([38;5;234m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;234m [38;5;143m([38;5;223m&[38;5;143m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;180m#[38;5;137m([38;5;241m*[38;5;233m [38;5;234m.[38;5;233m [38;5;233m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;233m [38;5;233m [38;5;130m*[38;5;101m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;186m%[38;5;143m([38;5;143m([38;5;143m([38;5;223m&[38;5;180m#[38;5;214m([38;5;233m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;058m,[38;5;233m [38;5;234m.[38;5;235m.[38;5;143m([38;5;223m&[38;5;239m*[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;143m([38;5;180m%[38;5;101m/[38;5;233m [38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;058m,[38;5;236m.[38;5;239m*[38;5;223m&[38;5;233m [38;5;143m([38;5;144m#[38;5;186m%[38;5;143m([38;5;143m([38;5;233m [38;5;237m,[38;5;094m,[38;5;094m,[38;5;235m.[38;5;234m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;234m.[38;5;143m([38;5;180m%[38;5;143m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;143m([38;5;143m([38;5;240m*[38;5;234m [38;5;233m [38;5;094m,[38;5;094m,[38;5;094m,[38;5;235m.[38;5;235m.[38;5;094m,[38;5;094m,[38;5;233m [38;5;237m,[38;5;143m([38;5;144m#[38;5;143m([38;5;143m([38;5;143m([38;5;237m,[38;5;143m([38;5;101m/[38;5;101m([38;5;094m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;094m,[38;5;233m [38;5;101m/[38;5;234m.[38;5;101m/[38;5;241m*[38;5;236m.[38;5;101m/[38;5;238m,[38;5;058m,[38;5;094m,[38;5;058m.[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;058m,[38;5;237m,[38;5;101m/[38;5;239m*[38;5;143m#[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;186m%[38;5;144m#[38;5;101m/[38;5;143m([38;5;058m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;235m.[38;5;094m,[38;5;094m,[38;5;234m [38;5;143m([38;5;235m.[38;5;241m*[38;5;101m/[38;5;236m.[38;5;240m*[38;5;235m.[38;5;058m,[38;5;235m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;233m [38;5;237m,[38;5;143m([38;5;101m/[38;5;180m#[38;5;143m([38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;223m&[38;5;186m%[38;5;143m#[38;5;180m#[38;5;143m([38;5;236m.[38;5;235m.[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;234m [38;5;234m.[38;5;143m([38;5;233m [38;5;239m*[38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;143m([38;5;101m/[38;5;241m*[38;5;143m([38;5;101m/[38;5;094m,[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;058m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;094m,[38;5;235m.[38;5;233m [38;5;234m [38;5;058m.[38;5;094m,[38;5;094m,[38;5;058m,[38;5;233m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m [38;5;m
-[0m
-
-
- ###### # # ####### ####### ####### ###### # # ####### # # #######
- # # # # # # # # # # # ## ## # # ## # #
- # # # # # # # # # # # # # # # # # # # # #
- ###### # # # # ##### # # ###### # # # # # # # # #####
- # # ####### # # # # # # # # # # # # # #
- # # # # # # # # # # # # # # # ## #
- # ####### # # # # ####### # # # # ####### # # #######
-
- ###### ### ##### ###### # # # #####
- # # # # # # # # # ## # # #
- # # # # # # # # # # # #
- ###### # # #### ###### # # # # # # ####
- # # # # # # # ####### # # # # #
- # # # # # # # # # # ## # #
- ###### ### ##### ###### # # # # #####
-
-`
-
- pterm.Print(smokey)
-}
diff --git a/src/extensions/bigbang/bigbang.go b/src/extensions/bigbang/bigbang.go
deleted file mode 100644
index 6b59d2a829..0000000000
--- a/src/extensions/bigbang/bigbang.go
+++ /dev/null
@@ -1,553 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package bigbang contains the logic for installing Big Bang and Flux
-package bigbang
-
-import (
- "context"
- "fmt"
- "os"
- "path"
- "path/filepath"
- "strings"
- "time"
-
- "github.com/Masterminds/semver/v3"
- "github.com/defenseunicorns/pkg/helpers/v2"
- fluxHelmCtrl "github.com/fluxcd/helm-controller/api/v2beta1"
- fluxSrcCtrl "github.com/fluxcd/source-controller/api/v1beta2"
- "github.com/zarf-dev/zarf/src/api/v1alpha1"
- "github.com/zarf-dev/zarf/src/api/v1alpha1/extensions"
- "github.com/zarf-dev/zarf/src/internal/packager/helm"
- "github.com/zarf-dev/zarf/src/pkg/layout"
- "github.com/zarf-dev/zarf/src/pkg/message"
- "github.com/zarf-dev/zarf/src/pkg/utils"
- "github.com/zarf-dev/zarf/src/pkg/variables"
- "helm.sh/helm/v3/pkg/chartutil"
- corev1 "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "sigs.k8s.io/yaml"
-)
-
-// Default location for pulling Big Bang.
-const (
- bb = "bigbang"
- bbRepo = "https://repo1.dso.mil/big-bang/bigbang.git"
- bbMinRequiredVersion = "1.54.0"
-)
-
-var tenMins = metav1.Duration{
- Duration: 10 * time.Minute,
-}
-
-// Run mutates a component that should deploy Big Bang to a set of manifests
-// that contain the flux deployment of Big Bang
-func Run(ctx context.Context, YOLO bool, tmpPaths *layout.ComponentPaths, c v1alpha1.ZarfComponent) (v1alpha1.ZarfComponent, error) {
- cfg := c.Extensions.BigBang
- manifests := []v1alpha1.ZarfManifest{}
-
- validVersionResponse, err := isValidVersion(cfg.Version)
-
- if err != nil {
- return c, fmt.Errorf("could not parse the Big Bang version %s: %w", cfg.Version, err)
- }
-
- // Make sure the version is valid.
- if !validVersionResponse {
- return c, fmt.Errorf("Big Bang version %s must be at least %s", cfg.Version, bbMinRequiredVersion)
- }
-
- // Print the banner for Big Bang.
- printBanner()
-
- // If no repo is provided, use the default.
- if cfg.Repo == "" {
- cfg.Repo = bbRepo
- }
-
- // By default, we want to deploy flux.
- if !cfg.SkipFlux {
- fluxManifest, images, err := getFlux(tmpPaths.Temp, cfg)
- if err != nil {
- return c, err
- }
-
- // Add the flux manifests to the list of manifests to be pulled down by Zarf.
- manifests = append(manifests, fluxManifest)
-
- if !YOLO {
- // Add the images to the list of images to be pulled down by Zarf.
- c.Images = append(c.Images, images...)
- }
- }
-
- bbRepo := fmt.Sprintf("%s@%s", cfg.Repo, cfg.Version)
-
- // Configure helm to pull down the Big Bang chart.
- helmCfg := helm.New(
- v1alpha1.ZarfChart{
- Name: bb,
- Namespace: bb,
- URL: bbRepo,
- Version: cfg.Version,
- ValuesFiles: cfg.ValuesFiles,
- GitPath: "./chart",
- },
- path.Join(tmpPaths.Temp, bb),
- path.Join(tmpPaths.Temp, bb, "values"),
- helm.WithVariableConfig(&variables.VariableConfig{}),
- )
-
- // Download the chart from Git and save it to a temporary directory.
- err = helmCfg.PackageChartFromGit(ctx, c.DeprecatedCosignKeyPath)
- if err != nil {
- return c, fmt.Errorf("unable to download Big Bang Chart: %w", err)
- }
-
- // Template the chart so we can see what GitRepositories are being referenced in the
- // manifests created with the provided Helm.
- template, _, err := helmCfg.TemplateChart(ctx)
- if err != nil {
- return c, fmt.Errorf("unable to template Big Bang Chart: %w", err)
- }
-
- // Add the Big Bang repo to the list of repos to be pulled down by Zarf.
- if !YOLO {
- bbRepo := fmt.Sprintf("%s@%s", cfg.Repo, cfg.Version)
- c.Repos = append(c.Repos, bbRepo)
- }
- // Parse the template for GitRepository objects and add them to the list of repos to be pulled down by Zarf.
- gitRepos, hrDependencies, hrValues, err := findBBResources(template)
- if err != nil {
- return c, fmt.Errorf("unable to find Big Bang resources: %w", err)
- }
- if !YOLO {
- for _, gitRepo := range gitRepos {
- c.Repos = append(c.Repos, gitRepo)
- }
- }
-
- // Generate a list of HelmReleases that need to be deployed in order.
- dependencies := []utils.Dependency{}
- for _, hrDep := range hrDependencies {
- dependencies = append(dependencies, hrDep)
- }
- namespacedHelmReleaseNames, err := utils.SortDependencies(dependencies)
- if err != nil {
- return c, fmt.Errorf("unable to sort Big Bang HelmReleases: %w", err)
- }
-
- // ten minutes in seconds
- maxTotalSeconds := 10 * 60
-
- defaultMaxTotalSeconds := c.Actions.OnDeploy.Defaults.MaxTotalSeconds
- if defaultMaxTotalSeconds > maxTotalSeconds {
- maxTotalSeconds = defaultMaxTotalSeconds
- }
-
- // Add wait actions for each of the helm releases in generally the order they should be deployed.
- for _, hrNamespacedName := range namespacedHelmReleaseNames {
- hr := hrDependencies[hrNamespacedName]
- action := v1alpha1.ZarfComponentAction{
- Description: fmt.Sprintf("Big Bang Helm Release `%s` to be ready", hrNamespacedName),
- MaxTotalSeconds: &maxTotalSeconds,
- Wait: &v1alpha1.ZarfComponentActionWait{
- Cluster: &v1alpha1.ZarfComponentActionWaitCluster{
- Kind: "HelmRelease",
- Name: hr.Metadata.Name,
- Namespace: hr.Metadata.Namespace,
- Condition: "ready",
- },
- },
- }
-
- // In Big Bang the metrics-server is a special case that only deploy if needed.
- // The check it, we need to look for the existence of APIService instead of the HelmRelease, which
- // may not ever be created. See links below for more details.
- // https://repo1.dso.mil/big-bang/bigbang/-/blob/1.54.0/chart/templates/metrics-server/helmrelease.yaml
- if hr.Metadata.Name == "metrics-server" {
- action.Description = "K8s metric server to exist or be deployed by Big Bang"
- action.Wait.Cluster = &v1alpha1.ZarfComponentActionWaitCluster{
- Kind: "APIService",
- // https://github.com/kubernetes-sigs/metrics-server#compatibility-matrix
- Name: "v1beta1.metrics.k8s.io",
- }
- }
-
- c.Actions.OnDeploy.OnSuccess = append(c.Actions.OnDeploy.OnSuccess, action)
- }
-
- t := true
- failureGeneral := []string{
- "get nodes -o wide",
- "get hr -n bigbang",
- "get gitrepo -n bigbang",
- "get pods -A",
- }
- failureDebug := []string{
- "describe hr -n bigbang",
- "describe gitrepo -n bigbang",
- "describe pods -A",
- "describe nodes",
- "get events -A",
- }
-
- // Add onFailure actions with additional troubleshooting information.
- for _, cmd := range failureGeneral {
- c.Actions.OnDeploy.OnFailure = append(c.Actions.OnDeploy.OnFailure, v1alpha1.ZarfComponentAction{
- Cmd: fmt.Sprintf("./zarf tools kubectl %s", cmd),
- })
- }
-
- for _, cmd := range failureDebug {
- c.Actions.OnDeploy.OnFailure = append(c.Actions.OnDeploy.OnFailure, v1alpha1.ZarfComponentAction{
- Mute: &t,
- Description: "Storing debug information to the log for troubleshooting.",
- Cmd: fmt.Sprintf("./zarf tools kubectl %s", cmd),
- })
- }
-
- // Add a pre-remove action to suspend the Big Bang HelmReleases to prevent reconciliation during removal.
- c.Actions.OnRemove.Before = append(c.Actions.OnRemove.Before, v1alpha1.ZarfComponentAction{
- Description: "Suspend Big Bang HelmReleases to prevent reconciliation during removal.",
- Cmd: `./zarf tools kubectl patch helmrelease -n bigbang bigbang --type=merge -p '{"spec":{"suspend":true}}'`,
- })
-
- // Select the images needed to support the repos for this configuration of Big Bang.
- if !YOLO {
- for _, hr := range hrDependencies {
- namespacedName := getNamespacedNameFromMeta(hr.Metadata)
- gitRepo := gitRepos[hr.NamespacedSource]
- values := hrValues[namespacedName]
-
- images, err := findImagesforBBChartRepo(ctx, gitRepo, values)
- if err != nil {
- return c, fmt.Errorf("unable to find images for chart repo: %w", err)
- }
-
- c.Images = append(c.Images, images...)
- }
-
- // Make sure the list of images is unique.
- c.Images = helpers.Unique(c.Images)
- }
-
- // Create the flux wrapper around Big Bang for deployment.
- manifest, err := addBigBangManifests(YOLO, tmpPaths.Temp, cfg)
- if err != nil {
- return c, err
- }
-
- // Add the Big Bang manifests to the list of manifests to be pulled down by Zarf.
- manifests = append(manifests, manifest)
-
- // Prepend the Big Bang manifests to the list of manifests to be pulled down by Zarf.
- // This is done so that the Big Bang manifests are deployed first.
- c.Manifests = append(manifests, c.Manifests...)
-
- return c, nil
-}
-
-// Skeletonize mutates a component so that the valuesFiles can be contained inside a skeleton package
-func Skeletonize(tmpPaths *layout.ComponentPaths, c v1alpha1.ZarfComponent) (v1alpha1.ZarfComponent, error) {
- for valuesIdx, valuesFile := range c.Extensions.BigBang.ValuesFiles {
- // Get the base file name for this file.
- baseName := filepath.Base(valuesFile)
-
- // Define the name as the file name without the extension.
- baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
-
- // Add the skeleton name prefix.
- skelName := fmt.Sprintf("bb-skel-vals-%d-%s.yaml", valuesIdx, baseName)
-
- rel := filepath.Join(layout.TempDir, skelName)
- dst := filepath.Join(tmpPaths.Base, rel)
-
- if err := helpers.CreatePathAndCopy(valuesFile, dst); err != nil {
- return c, err
- }
-
- c.Extensions.BigBang.ValuesFiles[valuesIdx] = rel
- }
-
- for fluxPatchFileIdx, fluxPatchFile := range c.Extensions.BigBang.FluxPatchFiles {
- // Get the base file name for this file.
- baseName := filepath.Base(fluxPatchFile)
-
- // Define the name as the file name without the extension.
- baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
-
- // Add the skeleton name prefix.
- skelName := fmt.Sprintf("bb-skel-flux-patch-%d-%s.yaml", fluxPatchFileIdx, baseName)
-
- rel := filepath.Join(layout.TempDir, skelName)
- dst := filepath.Join(tmpPaths.Base, rel)
-
- if err := helpers.CreatePathAndCopy(fluxPatchFile, dst); err != nil {
- return c, err
- }
-
- c.Extensions.BigBang.FluxPatchFiles[fluxPatchFileIdx] = rel
- }
-
- return c, nil
-}
-
-// Compose mutates a component so that its local paths are relative to the provided path
-//
-// additionally, it will merge any overrides
-func Compose(c *v1alpha1.ZarfComponent, override v1alpha1.ZarfComponent, relativeTo string) {
- // perform any overrides
- if override.Extensions.BigBang != nil {
- for valuesIdx, valuesFile := range override.Extensions.BigBang.ValuesFiles {
- if helpers.IsURL(valuesFile) {
- continue
- }
-
- fixed := filepath.Join(relativeTo, valuesFile)
- override.Extensions.BigBang.ValuesFiles[valuesIdx] = fixed
- }
-
- for fluxPatchFileIdx, fluxPatchFile := range override.Extensions.BigBang.FluxPatchFiles {
- if helpers.IsURL(fluxPatchFile) {
- continue
- }
-
- fixed := filepath.Join(relativeTo, fluxPatchFile)
- override.Extensions.BigBang.FluxPatchFiles[fluxPatchFileIdx] = fixed
- }
-
- if c.Extensions.BigBang == nil {
- c.Extensions.BigBang = override.Extensions.BigBang
- } else {
- c.Extensions.BigBang.ValuesFiles = append(c.Extensions.BigBang.ValuesFiles, override.Extensions.BigBang.ValuesFiles...)
- c.Extensions.BigBang.FluxPatchFiles = append(c.Extensions.BigBang.FluxPatchFiles, override.Extensions.BigBang.FluxPatchFiles...)
- }
- }
-}
-
-// isValidVersion check if the version is 1.54.0 or greater.
-func isValidVersion(version string) (bool, error) {
- specifiedVersion, err := semver.NewVersion(version)
-
- if err != nil {
- return false, err
- }
-
- minRequiredVersion, _ := semver.NewVersion(bbMinRequiredVersion)
-
- // Evaluating pre-releases too
- c, _ := semver.NewConstraint(fmt.Sprintf(">= %s-0", minRequiredVersion))
-
- // This extension requires BB 1.54.0 or greater.
- return c.Check(specifiedVersion), nil
-}
-
-// findBBResources takes a list of yaml objects (as a string) and
-// parses it for GitRepository objects that it then parses
-// to return the list of git repos and tags needed.
-func findBBResources(t string) (gitRepos map[string]string, helmReleaseDeps map[string]HelmReleaseDependency, helmReleaseValues map[string]map[string]interface{}, err error) {
- // Break the template into separate resources.
- yamls, _ := utils.SplitYAMLToString([]byte(t))
-
- gitRepos = map[string]string{}
- helmReleaseDeps = map[string]HelmReleaseDependency{}
- helmReleaseValues = map[string]map[string]interface{}{}
- secrets := map[string]corev1.Secret{}
- configMaps := map[string]corev1.ConfigMap{}
-
- for _, y := range yamls {
- var (
- h fluxHelmCtrl.HelmRelease
- g fluxSrcCtrl.GitRepository
- s corev1.Secret
- c corev1.ConfigMap
- )
-
- if err := yaml.Unmarshal([]byte(y), &h); err != nil {
- continue
- }
-
- // If the resource is a HelmRelease, parse it for the dependencies.
- if h.Kind == fluxHelmCtrl.HelmReleaseKind {
- var deps []string
- for _, d := range h.Spec.DependsOn {
- depNamespacedName := getNamespacedNameFromStr(d.Namespace, d.Name)
- deps = append(deps, depNamespacedName)
- }
-
- namespacedName := getNamespacedNameFromMeta(h.ObjectMeta)
- srcNamespacedName := getNamespacedNameFromStr(h.Spec.Chart.Spec.SourceRef.Namespace,
- h.Spec.Chart.Spec.SourceRef.Name)
-
- helmReleaseDeps[namespacedName] = HelmReleaseDependency{
- Metadata: h.ObjectMeta,
- NamespacedDependencies: deps,
- NamespacedSource: srcNamespacedName,
- ValuesFrom: h.Spec.ValuesFrom,
- }
-
- // Skip the rest as this is not a GitRepository.
- continue
- }
-
- if err := yaml.Unmarshal([]byte(y), &g); err != nil {
- continue
- }
-
- // If the resource is a GitRepository, parse it for the URL and tag.
- if g.Kind == fluxSrcCtrl.GitRepositoryKind && g.Spec.URL != "" {
- ref := "master"
-
- switch {
- case g.Spec.Reference.Commit != "":
- ref = g.Spec.Reference.Commit
-
- case g.Spec.Reference.SemVer != "":
- ref = g.Spec.Reference.SemVer
-
- case g.Spec.Reference.Tag != "":
- ref = g.Spec.Reference.Tag
-
- case g.Spec.Reference.Branch != "":
- ref = g.Spec.Reference.Branch
- }
-
- // Set the URL and tag in the repo map
- namespacedName := getNamespacedNameFromMeta(g.ObjectMeta)
- gitRepos[namespacedName] = fmt.Sprintf("%s@%s", g.Spec.URL, ref)
- }
-
- if err := yaml.Unmarshal([]byte(y), &s); err != nil {
- continue
- }
-
- // If the resource is a Secret, parse it so it can be used later for value templating.
- if s.Kind == "Secret" {
- namespacedName := getNamespacedNameFromMeta(s.ObjectMeta)
- secrets[namespacedName] = s
- }
-
- if err := yaml.Unmarshal([]byte(y), &c); err != nil {
- continue
- }
-
- // If the resource is a Secret, parse it so it can be used later for value templating.
- if c.Kind == "ConfigMap" {
- namespacedName := getNamespacedNameFromMeta(c.ObjectMeta)
- configMaps[namespacedName] = c
- }
- }
-
- for _, hr := range helmReleaseDeps {
- namespacedName := getNamespacedNameFromMeta(hr.Metadata)
- values, err := composeValues(hr, secrets, configMaps)
- if err != nil {
- return nil, nil, nil, err
- }
- helmReleaseValues[namespacedName] = values
- }
-
- return gitRepos, helmReleaseDeps, helmReleaseValues, nil
-}
-
-// addBigBangManifests creates the manifests component for deploying Big Bang.
-func addBigBangManifests(YOLO bool, manifestDir string, cfg *extensions.BigBang) (v1alpha1.ZarfManifest, error) {
- // Create a manifest component that we add to the zarf package for bigbang.
- manifest := v1alpha1.ZarfManifest{
- Name: bb,
- Namespace: bb,
- }
-
- // Helper function to marshal and write a manifest and add it to the component.
- addManifest := func(name string, data any) error {
- path := path.Join(manifestDir, name)
- out, err := yaml.Marshal(data)
- if err != nil {
- return err
- }
-
- if err := os.WriteFile(path, out, helpers.ReadWriteUser); err != nil {
- return err
- }
-
- manifest.Files = append(manifest.Files, path)
- return nil
- }
-
- // Create the GitRepository manifest.
- if err := addManifest("bb-ext-gitrepository.yaml", manifestGitRepo(cfg)); err != nil {
- return manifest, err
- }
-
- var hrValues []fluxHelmCtrl.ValuesReference
-
- // If YOLO mode is enabled, do not include the zarf-credentials secret
- if !YOLO {
- // Create the zarf-credentials secret manifest.
- if err := addManifest("bb-ext-zarf-credentials.yaml", manifestZarfCredentials(cfg.Version)); err != nil {
- return manifest, err
- }
-
- // Create the list of values manifests starting with zarf-credentials.
- hrValues = []fluxHelmCtrl.ValuesReference{{
- Kind: "Secret",
- Name: "zarf-credentials",
- }}
- }
-
- // Loop through the valuesFrom list and create a manifest for each.
- for valuesIdx, valuesFile := range cfg.ValuesFiles {
- data, err := manifestValuesFile(valuesIdx, valuesFile)
- if err != nil {
- return manifest, err
- }
-
- path := fmt.Sprintf("%s.yaml", data.Name)
- if err := addManifest(path, data); err != nil {
- return manifest, err
- }
-
- // Add it to the list of valuesFrom for the HelmRelease
- hrValues = append(hrValues, fluxHelmCtrl.ValuesReference{
- Kind: "Secret",
- Name: data.Name,
- })
- }
-
- if err := addManifest("bb-ext-helmrelease.yaml", manifestHelmRelease(hrValues)); err != nil {
- return manifest, err
- }
-
- return manifest, nil
-}
-
-// findImagesforBBChartRepo finds and returns the images for the Big Bang chart repo
-func findImagesforBBChartRepo(ctx context.Context, repo string, values chartutil.Values) (images []string, err error) {
- matches := strings.Split(repo, "@")
- if len(matches) < 2 {
- return images, fmt.Errorf("cannot convert git repo %s to helm chart without a version tag", repo)
- }
-
- spinner := message.NewProgressSpinner("Discovering images in %s", repo)
- defer spinner.Stop()
-
- gitPath, err := helm.DownloadChartFromGitToTemp(ctx, repo)
- if err != nil {
- return images, err
- }
- defer os.RemoveAll(gitPath)
-
- // Set the directory for the chart
- chartPath := filepath.Join(gitPath, "chart")
-
- images, err = helm.FindAnnotatedImagesForChart(chartPath, values)
- if err != nil {
- return images, err
- }
-
- spinner.Success()
-
- return images, err
-}
diff --git a/src/extensions/bigbang/bigbang_test.go b/src/extensions/bigbang/bigbang_test.go
deleted file mode 100644
index 9d17e49831..0000000000
--- a/src/extensions/bigbang/bigbang_test.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-package bigbang
-
-import (
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-func TestRequiredBigBangVersions(t *testing.T) {
- // Support 1.54.0 and beyond
- vv, err := isValidVersion("1.54.0")
- require.NoError(t, err)
- require.True(t, vv)
-
- // Do not support earlier than 1.54.0
- vv, err = isValidVersion("1.53.0")
- require.NoError(t, err)
- require.False(t, vv)
-
- // Support for Big Bang release candidates
- vv, err = isValidVersion("1.57.0-rc.0")
- require.NoError(t, err)
- require.True(t, vv)
-
- // Support for Big Bang 2.0.0
- vv, err = isValidVersion("2.0.0")
- require.NoError(t, err)
- require.True(t, vv)
-
- // Fail on non-semantic versions
- vv, err = isValidVersion("1.57b")
- require.EqualError(t, err, "Invalid Semantic Version")
- require.False(t, vv)
-}
diff --git a/src/extensions/bigbang/flux.go b/src/extensions/bigbang/flux.go
deleted file mode 100644
index 2acdee4f99..0000000000
--- a/src/extensions/bigbang/flux.go
+++ /dev/null
@@ -1,180 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package bigbang contains the logic for installing Big Bang and Flux
-package bigbang
-
-import (
- "fmt"
- "os"
- "path"
- "path/filepath"
-
- "github.com/defenseunicorns/pkg/helpers/v2"
- fluxHelmCtrl "github.com/fluxcd/helm-controller/api/v2beta1"
- "github.com/zarf-dev/zarf/src/api/v1alpha1"
- "github.com/zarf-dev/zarf/src/api/v1alpha1/extensions"
- "github.com/zarf-dev/zarf/src/internal/packager/kustomize"
- "github.com/zarf-dev/zarf/src/pkg/utils"
- "helm.sh/helm/v3/pkg/chartutil"
- v1 "k8s.io/api/apps/v1"
- corev1 "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime"
- krustytypes "sigs.k8s.io/kustomize/api/types"
-)
-
-// HelmReleaseDependency is a struct that represents a Flux Helm Release from an HR DependsOn list.
-type HelmReleaseDependency struct {
- Metadata metav1.ObjectMeta
- NamespacedDependencies []string
- NamespacedSource string
- ValuesFrom []fluxHelmCtrl.ValuesReference
-}
-
-// Name returns a namespaced name for the HelmRelease for dependency sorting.
-func (h HelmReleaseDependency) Name() string {
- return getNamespacedNameFromMeta(h.Metadata)
-}
-
-// Dependencies returns a list of namespaced dependencies for the HelmRelease for dependency sorting.
-func (h HelmReleaseDependency) Dependencies() []string {
- return h.NamespacedDependencies
-}
-
-// getFlux Creates a component to deploy Flux.
-func getFlux(baseDir string, cfg *extensions.BigBang) (manifest v1alpha1.ZarfManifest, images []string, err error) {
- localPath := path.Join(baseDir, "bb-ext-flux.yaml")
- kustomizePath := path.Join(baseDir, "kustomization.yaml")
-
- if cfg.Repo == "" {
- cfg.Repo = bbRepo
- }
-
- remotePath := fmt.Sprintf("%s//base/flux?ref=%s", cfg.Repo, cfg.Version)
-
- fluxKustomization := krustytypes.Kustomization{
- Resources: []string{remotePath},
- }
-
- for _, path := range cfg.FluxPatchFiles {
- absFluxPatchPath, _ := filepath.Abs(path)
- fluxKustomization.Patches = append(fluxKustomization.Patches, krustytypes.Patch{Path: absFluxPatchPath})
- }
-
- if err := utils.WriteYaml(kustomizePath, fluxKustomization, helpers.ReadWriteUser); err != nil {
- return manifest, images, fmt.Errorf("unable to write kustomization: %w", err)
- }
-
- // Perform Kustomization now to get the flux.yaml file.
- if err := kustomize.Build(baseDir, localPath, true); err != nil {
- return manifest, images, fmt.Errorf("unable to build kustomization: %w", err)
- }
-
- // Add the flux.yaml file to the component manifests.
- manifest = v1alpha1.ZarfManifest{
- Name: "flux-system",
- Namespace: "flux-system",
- Files: []string{localPath},
- }
-
- // Read the flux.yaml file to get the images.
- if images, err = readFluxImages(localPath); err != nil {
- return manifest, images, fmt.Errorf("unable to read flux images: %w", err)
- }
-
- return manifest, images, nil
-}
-
-// readFluxImages finds the images Flux needs to deploy
-func readFluxImages(localPath string) (images []string, err error) {
- contents, err := os.ReadFile(localPath)
- if err != nil {
- return images, fmt.Errorf("unable to read flux manifest: %w", err)
- }
-
- // Break the manifest into separate resources.
- yamls, _ := utils.SplitYAML(contents)
-
- // Loop through each resource and find the images.
- for _, yaml := range yamls {
- // Flux controllers are Deployments.
- if yaml.GetKind() == "Deployment" {
- deployment := v1.Deployment{}
- content := yaml.UnstructuredContent()
-
- // Convert the unstructured content into a Deployment.
- if err := runtime.DefaultUnstructuredConverter.FromUnstructured(content, &deployment); err != nil {
- return nil, fmt.Errorf("could not parse deployment: %w", err)
- }
-
- // Get the pod spec.
- pod := deployment.Spec.Template.Spec
-
- // Flux controllers do not have init containers today, but this is future proofing.
- for _, container := range pod.InitContainers {
- images = append(images, container.Image)
- }
-
- // Add the main containers.
- for _, container := range pod.Containers {
- images = append(images, container.Image)
- }
- }
- }
-
- return images, nil
-}
-
-// composeValues composes values from a Flux HelmRelease and Secrets Map
-// (loosely based on upstream https://github.com/fluxcd/helm-controller/blob/main/controllers/helmrelease_controller.go#L551)
-func composeValues(hr HelmReleaseDependency, secrets map[string]corev1.Secret, configMaps map[string]corev1.ConfigMap) (valuesMap chartutil.Values, err error) {
- valuesMap = chartutil.Values{}
-
- for _, v := range hr.ValuesFrom {
- var valuesData string
- namespacedName := getNamespacedNameFromStr(hr.Metadata.Namespace, v.Name)
-
- switch v.Kind {
- case "ConfigMap":
- cm, ok := configMaps[namespacedName]
- if !ok {
- return nil, fmt.Errorf("could not find values %s '%s'", v.Kind, namespacedName)
- }
-
- valuesData, ok = cm.Data[v.GetValuesKey()]
- if !ok {
- return nil, fmt.Errorf("missing key '%s' in %s '%s'", v.GetValuesKey(), v.Kind, namespacedName)
- }
- case "Secret":
- sec, ok := secrets[namespacedName]
- if !ok {
- return nil, fmt.Errorf("could not find values %s '%s'", v.Kind, namespacedName)
- }
-
- valuesData, ok = sec.StringData[v.GetValuesKey()]
- if !ok {
- return nil, fmt.Errorf("missing key '%s' in %s '%s'", v.GetValuesKey(), v.Kind, namespacedName)
- }
- default:
- return nil, fmt.Errorf("unsupported ValuesReference kind '%s'", v.Kind)
- }
-
- values, err := chartutil.ReadValues([]byte(valuesData))
- if err != nil {
- return nil, fmt.Errorf("unable to read values from key '%s' in %s '%s': %w", v.GetValuesKey(), v.Kind, hr.Name(), err)
- }
-
- valuesMap = helpers.MergeMapRecursive(valuesMap, values)
- }
-
- return valuesMap, nil
-}
-
-func getNamespacedNameFromMeta(o metav1.ObjectMeta) string {
- return getNamespacedNameFromStr(o.Namespace, o.Name)
-}
-
-func getNamespacedNameFromStr(namespace, name string) string {
- return fmt.Sprintf("%s.%s", namespace, name)
-}
diff --git a/src/extensions/bigbang/manifests.go b/src/extensions/bigbang/manifests.go
deleted file mode 100644
index c10d81390a..0000000000
--- a/src/extensions/bigbang/manifests.go
+++ /dev/null
@@ -1,195 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package bigbang contains the logic for installing Big Bang and Flux
-package bigbang
-
-import (
- "fmt"
- "os"
- "path/filepath"
- "strings"
-
- "github.com/Masterminds/semver/v3"
- fluxHelmCtrl "github.com/fluxcd/helm-controller/api/v2beta1"
- fluxSrcCtrl "github.com/fluxcd/source-controller/api/v1"
- "github.com/zarf-dev/zarf/src/api/v1alpha1/extensions"
- corev1 "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-)
-
-const bbV1ZarfCredentialsValues = `
-registryCredentials:
- registry: "###ZARF_REGISTRY###"
- username: "zarf-pull"
- password: "###ZARF_REGISTRY_AUTH_PULL###"
-git:
- existingSecret: "private-git-server" # -- Chart created secrets with user defined values
- credentials:
- # -- HTTP git credentials, both username and password must be provided
- username: "###ZARF_GIT_PUSH###"
- password: "###ZARF_GIT_AUTH_PUSH###"
-# -- Big Bang v1 Kyverno Support
-kyvernopolicies:
- values:
- exclude:
- any:
- - resources:
- namespaces:
- - zarf # don't have Kyverno prevent Zarf from doing zarf things
- `
-
-const bbV2ZarfCredentialsValues = `
-registryCredentials:
- registry: "###ZARF_REGISTRY###"
- username: "zarf-pull"
- password: "###ZARF_REGISTRY_AUTH_PULL###"
-git:
- existingSecret: "private-git-server" # -- Chart created secrets with user defined values
- credentials:
- # -- HTTP git credentials, both username and password must be provided
- username: "###ZARF_GIT_PUSH###"
- password: "###ZARF_GIT_AUTH_PUSH###"
-# -- Big Bang v2 Kyverno Support
-kyvernoPolicies:
- values:
- exclude:
- any:
- - resources:
- namespaces:
- - zarf # don't have Kyverno prevent Zarf from doing zarf things
- `
-
-func manifestZarfCredentials(version string) corev1.Secret {
- values := bbV1ZarfCredentialsValues
-
- semverVersion, err := semver.NewVersion(version)
- if err == nil && semverVersion.Major() == 2 {
- values = bbV2ZarfCredentialsValues
- }
-
- return corev1.Secret{
- TypeMeta: metav1.TypeMeta{
- Kind: "Secret",
- APIVersion: "v1",
- },
- ObjectMeta: metav1.ObjectMeta{
- Namespace: bb,
- Name: "zarf-credentials",
- },
- StringData: map[string]string{
- "values.yaml": values,
- },
- }
-}
-
-// manifestGitRepo generates a GitRepository object for the Big Bang umbrella repo.
-func manifestGitRepo(cfg *extensions.BigBang) fluxSrcCtrl.GitRepository {
- apiVersion := "source.toolkit.fluxcd.io/v1beta2"
-
- // Set apiVersion to v1 on BB v2.7.0 or higher falling back to v1beta2 as needed
- semverVersion, _ := semver.NewVersion(cfg.Version)
- if semverVersion != nil {
- c, _ := semver.NewConstraint(">= 2.7.0")
- if c != nil {
- updateFlux, _ := c.Validate(semverVersion)
- if updateFlux && !cfg.SkipFlux {
- apiVersion = "source.toolkit.fluxcd.io/v1"
- }
- }
- }
-
- return fluxSrcCtrl.GitRepository{
- TypeMeta: metav1.TypeMeta{
- Kind: fluxSrcCtrl.GitRepositoryKind,
- APIVersion: apiVersion,
- },
- ObjectMeta: metav1.ObjectMeta{
- Name: bb,
- Namespace: bb,
- },
- Spec: fluxSrcCtrl.GitRepositorySpec{
- URL: cfg.Repo,
- Interval: tenMins,
- Reference: &fluxSrcCtrl.GitRepositoryRef{
- Tag: cfg.Version,
- },
- },
- }
-}
-
-// manifestValuesFile generates a Secret object for the Big Bang umbrella repo.
-func manifestValuesFile(idx int, path string) (secret corev1.Secret, err error) {
- // Read the file from the path.
- file, err := os.ReadFile(path)
- if err != nil {
- return secret, err
- }
-
- // Get the base file name for this file.
- baseName := filepath.Base(path)
-
- // Define the name as the file name without the extension.
- baseName = strings.TrimSuffix(baseName, filepath.Ext(baseName))
-
- // Add the name prefix.
- name := fmt.Sprintf("bb-usr-vals-%d-%s", idx, baseName)
-
- // Create a secret with the file contents.
- secret = corev1.Secret{
- TypeMeta: metav1.TypeMeta{
- Kind: "Secret",
- APIVersion: "v1",
- },
- ObjectMeta: metav1.ObjectMeta{
- Namespace: bb,
- Name: name,
- },
- StringData: map[string]string{
- "values.yaml": string(file),
- },
- }
-
- return secret, nil
-}
-
-// manifestHelmRelease generates a HelmRelease object for the Big Bang umbrella repo.
-func manifestHelmRelease(values []fluxHelmCtrl.ValuesReference) fluxHelmCtrl.HelmRelease {
- return fluxHelmCtrl.HelmRelease{
- TypeMeta: metav1.TypeMeta{
- Kind: fluxHelmCtrl.HelmReleaseKind,
- APIVersion: "helm.toolkit.fluxcd.io/v2beta1",
- },
- ObjectMeta: metav1.ObjectMeta{
- Name: bb,
- Namespace: bb,
- },
- Spec: fluxHelmCtrl.HelmReleaseSpec{
- Timeout: &tenMins,
- Chart: &fluxHelmCtrl.HelmChartTemplate{
- Spec: fluxHelmCtrl.HelmChartTemplateSpec{
- Chart: "./chart",
- SourceRef: fluxHelmCtrl.CrossNamespaceObjectReference{
- Kind: fluxSrcCtrl.GitRepositoryKind,
- Name: bb,
- },
- },
- },
- Install: &fluxHelmCtrl.Install{
- Remediation: &fluxHelmCtrl.InstallRemediation{
- Retries: -1,
- },
- },
- Upgrade: &fluxHelmCtrl.Upgrade{
- Remediation: &fluxHelmCtrl.UpgradeRemediation{
- Retries: 5,
- },
- CleanupOnFail: true,
- },
- Rollback: &fluxHelmCtrl.Rollback{
- CleanupOnFail: true,
- },
- ValuesFrom: values,
- },
- }
-}
diff --git a/src/extensions/bigbang/test/bigbang_test.go b/src/extensions/bigbang/test/bigbang_test.go
deleted file mode 100644
index 16bf87bdbc..0000000000
--- a/src/extensions/bigbang/test/bigbang_test.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-package main
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- "os"
- "regexp"
- "strings"
- "testing"
-
- "github.com/stretchr/testify/require"
- "github.com/zarf-dev/zarf/src/pkg/cluster"
- "github.com/zarf-dev/zarf/src/pkg/utils/exec"
- test "github.com/zarf-dev/zarf/src/test"
-)
-
-// The Big Bang project ID on Repo1
-const bbProjID = "2872"
-
-var (
- zarf string
- previous string
- latest string
-)
-
-func TestMain(m *testing.M) {
- var err error
-
- // Change to the build dir
- if err := os.Chdir("../../../../build/"); err != nil {
- panic(err)
- }
-
- // Get the latest and previous releases
- latest, previous, err = getReleases()
- if err != nil {
- panic(err)
- }
-
- // Get the Zarf CLI path
- zarf = fmt.Sprintf("./%s", test.GetCLIName())
-
- // Run the tests
- os.Exit(m.Run())
-}
-
-func TestReleases(t *testing.T) {
- CIMount := "/mnt/zarf-tmp"
- tmpdir := fmt.Sprintf("--tmpdir=%s", t.TempDir())
- zarfCache := ""
- // If we are in CI set the temporary directory to /mnt/zarf-tmp to reduce disk pressure
- if os.Getenv("CI") == "true" {
- tmpdir = fmt.Sprintf("--tmpdir=%s", CIMount)
- zarfCache = fmt.Sprintf("--zarf-cache=%s", CIMount)
- }
-
- ctx := context.Background()
-
- // Initialize the cluster with the Git server and AMD64 architecture
- arch := "amd64"
- stdOut, stdErr, err := zarfExec(ctx, "init", "--components", "git-server", "--architecture", arch, tmpdir, "--confirm", zarfCache)
- require.NoError(t, err, stdOut, stdErr)
-
- // Remove the init package to free up disk space on the test runner
- err = os.RemoveAll(fmt.Sprintf("zarf-init-%s-%s.tar.zst", arch, getZarfVersion(ctx, t)))
- require.NoError(t, err)
-
- // Build the previous version
- bbVersion := fmt.Sprintf("--set=BB_VERSION=%s", previous)
- bbMajor := fmt.Sprintf("--set=BB_MAJOR=%s", previous[0:1])
- stdOut, stdErr, err = zarfExec(ctx, "package", "create", "../src/extensions/bigbang/test/package", bbVersion, bbMajor, tmpdir, "--confirm")
- require.NoError(t, err, stdOut, stdErr)
-
- // Clean up zarf cache to reduce disk pressure
- stdOut, stdErr, err = zarfExec(ctx, "tools", "clear-cache")
- require.NoError(t, err, stdOut, stdErr)
-
- // Deploy the previous version
- pkgPath := fmt.Sprintf("zarf-package-big-bang-test-%s-%s.tar.zst", arch, previous)
- stdOut, stdErr, err = zarfExec(ctx, "package", "deploy", pkgPath, tmpdir, "--confirm")
- require.NoError(t, err, stdOut, stdErr)
-
- // HACK: scale down the flux deployments due to very-low CPU in the test runner
- fluxControllers := []string{"helm-controller", "source-controller", "kustomize-controller", "notification-controller"}
- for _, deployment := range fluxControllers {
- stdOut, stdErr, err = zarfExec(ctx, "tools", "kubectl", "-n", "flux-system", "scale", "deployment", deployment, "--replicas=0")
- require.NoError(t, err, stdOut, stdErr)
- }
-
- // Cluster info
- stdOut, stdErr, err = zarfExec(ctx, "tools", "kubectl", "describe", "nodes")
- require.NoError(t, err, stdOut, stdErr)
-
- // Build the latest version
- bbVersion = fmt.Sprintf("--set=BB_VERSION=%s", latest)
- bbMajor = fmt.Sprintf("--set=BB_MAJOR=%s", latest[0:1])
- stdOut, stdErr, err = zarfExec(ctx, "package", "create", "../src/extensions/bigbang/test/package", bbVersion, bbMajor, "--differential", pkgPath, tmpdir, "--confirm")
- require.NoError(t, err, stdOut, stdErr)
-
- // Remove the previous version package
- err = os.RemoveAll(pkgPath)
- require.NoError(t, err)
-
- // Clean up zarf cache to reduce disk pressure
- stdOut, stdErr, err = zarfExec(ctx, "tools", "clear-cache")
- require.NoError(t, err, stdOut, stdErr)
-
- // Deploy the latest version
- pkgPath = fmt.Sprintf("zarf-package-big-bang-test-%s-%s-differential-%s.tar.zst", arch, previous, latest)
- stdOut, stdErr, err = zarfExec(ctx, "package", "deploy", pkgPath, tmpdir, "--confirm")
- require.NoError(t, err, stdOut, stdErr)
-
- // Cluster info
- stdOut, stdErr, err = zarfExec(ctx, "tools", "kubectl", "describe", "nodes")
- require.NoError(t, err, stdOut, stdErr)
-
- // Test connectivity to Twistlock
- testConnection(ctx, t)
-}
-
-func testConnection(ctx context.Context, t *testing.T) {
- // Establish the tunnel config
- c, err := cluster.NewCluster()
- require.NoError(t, err)
- tunnel, err := c.NewTunnel("twistlock", "svc", "twistlock-console", "", 0, 8081)
- require.NoError(t, err)
-
- // Establish the tunnel connection
- _, err = tunnel.Connect(ctx)
- require.NoError(t, err)
- defer tunnel.Close()
-
- // Test the connection
- resp, err := http.Get(tunnel.HTTPEndpoint())
- require.NoError(t, err)
- require.Equal(t, 200, resp.StatusCode)
-}
-
-func zarfExec(ctx context.Context, args ...string) (string, string, error) {
- return exec.CmdWithContext(ctx, exec.PrintCfg(), zarf, args...)
-}
-
-// getZarfVersion returns the current build/zarf version
-func getZarfVersion(ctx context.Context, t *testing.T) string {
- // Get the version of the CLI
- stdOut, stdErr, err := zarfExec(ctx, "version")
- require.NoError(t, err, stdOut, stdErr)
- return strings.Trim(stdOut, "\n")
-}
-
-func getReleases() (latest, previous string, err error) {
- // Create the URL for the API endpoint
- url := fmt.Sprintf("https://repo1.dso.mil/api/v4/projects/%s/repository/tags", bbProjID)
-
- // Send an HTTP GET request to the API endpoint
- resp, err := http.Get(url)
- if err != nil {
- return latest, previous, err
- }
- defer resp.Body.Close()
-
- // Read the response body
- body, err := io.ReadAll(resp.Body)
- if err != nil {
- return latest, previous, err
- }
-
- // Parse the response body as a JSON array of objects
- var data []map[string]interface{}
- err = json.Unmarshal(body, &data)
- if err != nil {
- return latest, previous, err
- }
-
- // Compile the regular expression for filtering tags that don't contain a hyphen
- re := regexp.MustCompile("^[^-]+$")
-
- // Create a slice to store the tag names that match the regular expression
- var releases []string
-
- // Iterate over the tags returned by the API, and filter out tags that don't match the regular expression
- for _, tag := range data {
- name, ok := tag["name"].(string)
- if !ok {
- return "", "", fmt.Errorf("name key is not of type string")
- }
- if re.MatchString(name) {
- releases = append(releases, name)
- }
- }
-
- // Set the latest and previous release variables to the first two releases
- return releases[0], releases[1], nil
-}
diff --git a/src/extensions/bigbang/test/package/disable-all-bb1.yaml b/src/extensions/bigbang/test/package/disable-all-bb1.yaml
deleted file mode 100644
index c51a3d1095..0000000000
--- a/src/extensions/bigbang/test/package/disable-all-bb1.yaml
+++ /dev/null
@@ -1,58 +0,0 @@
-# Disable everything
-istio:
- enabled: false
-
-istiooperator:
- enabled: false
-
-jaeger:
- enabled: false
-
-kiali:
- enabled: false
-
-clusterAuditor:
- enabled: false
-
-gatekeeper:
- enabled: false
-
-kyverno:
- enabled: false
-
-kyvernopolicies:
- enabled: false
-
-kyvernoreporter:
- enabled: false
-
-logging:
- enabled: false
-
-eckoperator:
- enabled: false
-
-fluentbit:
- enabled: false
-
-promtail:
- enabled: false
-
-loki:
- enabled: false
-
-neuvector:
- enabled: false
-
-tempo:
- enabled: false
-
-monitoring:
- enabled: false
-
-twistlock:
- enabled: false
-
-addons:
- metricsServer:
- enabled: false
diff --git a/src/extensions/bigbang/test/package/disable-all-bb2.yaml b/src/extensions/bigbang/test/package/disable-all-bb2.yaml
deleted file mode 100644
index b8776699bc..0000000000
--- a/src/extensions/bigbang/test/package/disable-all-bb2.yaml
+++ /dev/null
@@ -1,61 +0,0 @@
-# Disable everything
-istio:
- enabled: false
-
-istioOperator:
- enabled: false
-
-jaeger:
- enabled: false
-
-kiali:
- enabled: false
-
-clusterAuditor:
- enabled: false
-
-gatekeeper:
- enabled: false
-
-kyverno:
- enabled: false
-
-kyvernoPolicies:
- enabled: false
-
-kyvernoReporter:
- enabled: false
-
-elasticsearchKibana:
- enabled: false
-
-eckOperator:
- enabled: false
-
-fluentbit:
- enabled: false
-
-promtail:
- enabled: false
-
-loki:
- enabled: false
-
-neuvector:
- enabled: false
-
-tempo:
- enabled: false
-
-monitoring:
- enabled: false
-
-twistlock:
- enabled: false
-
-grafana:
- enabled: false
-
-addons:
- metricsServer:
- enabled: false
diff --git a/src/extensions/bigbang/test/package/enable-twistlock.yaml b/src/extensions/bigbang/test/package/enable-twistlock.yaml
deleted file mode 100644
index da002df723..0000000000
--- a/src/extensions/bigbang/test/package/enable-twistlock.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-twistlock:
- enabled: true
- # Disable init so github runners don't suffocate without enough CPU
- values:
- init:
- enabled: false
-
- console:
- volumeUpgrade: false
diff --git a/src/extensions/bigbang/test/package/flux-overrides-helm-controller.yaml b/src/extensions/bigbang/test/package/flux-overrides-helm-controller.yaml
deleted file mode 100644
index d5e68feaee..0000000000
--- a/src/extensions/bigbang/test/package/flux-overrides-helm-controller.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: helm-controller
- namespace: flux-system
-spec:
- template:
- spec:
- containers:
- - name: manager
- resources:
- limits:
- cpu: 200m
- memory: 256Mi
- requests:
- cpu: 100m
- memory: 64Mi
diff --git a/src/extensions/bigbang/test/package/flux-overrides-kustomize-controller.yaml b/src/extensions/bigbang/test/package/flux-overrides-kustomize-controller.yaml
deleted file mode 100644
index 22e1d7d16b..0000000000
--- a/src/extensions/bigbang/test/package/flux-overrides-kustomize-controller.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: kustomize-controller
- namespace: flux-system
-spec:
- template:
- spec:
- containers:
- - name: manager
- resources:
- limits:
- cpu: 200m
- memory: 256Mi
- requests:
- cpu: 100m
- memory: 64Mi
diff --git a/src/extensions/bigbang/test/package/flux-overrides-notification-controller.yaml b/src/extensions/bigbang/test/package/flux-overrides-notification-controller.yaml
deleted file mode 100644
index a2476b01d2..0000000000
--- a/src/extensions/bigbang/test/package/flux-overrides-notification-controller.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: notification-controller
- namespace: flux-system
-spec:
- template:
- spec:
- containers:
- - name: manager
- resources:
- limits:
- cpu: 200m
- memory: 256Mi
- requests:
- cpu: 100m
- memory: 64Mi
diff --git a/src/extensions/bigbang/test/package/flux-overrides-source-controller.yaml b/src/extensions/bigbang/test/package/flux-overrides-source-controller.yaml
deleted file mode 100644
index 292492775a..0000000000
--- a/src/extensions/bigbang/test/package/flux-overrides-source-controller.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: source-controller
- namespace: flux-system
-spec:
- template:
- spec:
- containers:
- - name: manager
- resources:
- limits:
- cpu: 100m
- memory: 256Mi
- requests:
- cpu: 50m
- memory: 64Mi
diff --git a/src/extensions/bigbang/test/package/zarf.yaml b/src/extensions/bigbang/test/package/zarf.yaml
deleted file mode 100644
index 426fed8f54..0000000000
--- a/src/extensions/bigbang/test/package/zarf.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
-kind: ZarfPackageConfig
-metadata:
- name: big-bang-test
- description: Deploy Big Bang Core
- version: "###ZARF_PKG_TMPL_BB_VERSION###"
- url: https://p1.dso.mil/products/big-bang
- # Big Bang / Iron Bank are only amd64
- architecture: amd64
-
-variables:
- - name: DOMAIN
- default: bigbang.dev
- prompt: false
-
-components:
- - name: bigbang
- required: true
- extensions:
- bigbang:
- version: "###ZARF_PKG_TMPL_BB_VERSION###"
- fluxPatchFiles:
- - flux-overrides-helm-controller.yaml
- - flux-overrides-source-controller.yaml
- - flux-overrides-kustomize-controller.yaml
- - flux-overrides-notification-controller.yaml
- valuesFiles:
- - disable-all-bb###ZARF_PKG_TMPL_BB_MAJOR###.yaml
- - enable-twistlock.yaml
- actions:
- onDeploy:
- onFailure:
- - cmd: ./zarf tools kubectl describe nodes
- - cmd: ./zarf tools kubectl describe pods -A
diff --git a/src/injector/src/main.rs b/src/injector/src/main.rs
index e1b9cc3dc5..c1312eb398 100644
--- a/src/injector/src/main.rs
+++ b/src/injector/src/main.rs
@@ -51,7 +51,7 @@ fn collect_binary_data(paths: &Vec) -> io::Result> {
println!("Processing {}", path.display());
let new_content = get_file(path);
buffer
- .write(&new_content.unwrap())
+ .write_all(&new_content.unwrap())
.expect("Could not add the file contents to the merged file buffer");
}
@@ -143,14 +143,14 @@ async fn handler(Path(path): Path) -> Response {
let name = caps.get(1).unwrap().as_str().to_string();
let reference = caps.get(2).unwrap().as_str().to_string();
handle_get_manifest(name, reference).await
- } else if blob.is_match(&path) {
+ } else if blob.is_match(path) {
let caps = blob.captures(path).unwrap();
let tag = caps.get(1).unwrap().as_str().to_string();
handle_get_digest(tag).await
} else {
Response::builder()
.status(StatusCode::NOT_FOUND)
- .body(format!("Not Found"))
+ .body("Not Found".to_string())
.unwrap()
.into_response()
}
@@ -185,7 +185,7 @@ async fn handle_get_manifest(name: String, reference: String) -> Response {
if sha_manifest.is_empty() {
Response::builder()
.status(StatusCode::NOT_FOUND)
- .body(format!("Not Found"))
+ .body("Not Found".to_string())
.unwrap()
.into_response()
} else {
diff --git a/src/internal/git/repository_test.go b/src/internal/git/repository_test.go
index 7e75319eee..e833e6e2f7 100644
--- a/src/internal/git/repository_test.go
+++ b/src/internal/git/repository_test.go
@@ -56,7 +56,8 @@ func TestRepository(t *testing.T) {
require.NoError(t, err)
_, err = newFile.Write([]byte("Hello World"))
require.NoError(t, err)
- newFile.Close()
+ err = newFile.Close()
+ require.NoError(t, err)
_, err = w.Add(filePath)
require.NoError(t, err)
_, err = w.Commit("Initial commit", &git.CommitOptions{
diff --git a/src/internal/gitea/gitea.go b/src/internal/gitea/gitea.go
index 94244d03f1..48bfdfaae1 100644
--- a/src/internal/gitea/gitea.go
+++ b/src/internal/gitea/gitea.go
@@ -8,6 +8,7 @@ import (
"bytes"
"context"
"encoding/json"
+ "errors"
"fmt"
"io"
"net/http"
@@ -47,7 +48,7 @@ func NewClient(endpoint, username, password string) (*Client, error) {
}
// DoRequest performs a request to the Gitea API at the given path.
-func (g *Client) DoRequest(ctx context.Context, method string, path string, body []byte) ([]byte, int, error) {
+func (g *Client) DoRequest(ctx context.Context, method string, path string, body []byte) (_ []byte, _ int, err error) {
u, err := g.endpoint.Parse(path)
if err != nil {
return nil, 0, err
@@ -63,7 +64,11 @@ func (g *Client) DoRequest(ctx context.Context, method string, path string, body
if err != nil {
return nil, 0, err
}
- defer resp.Body.Close()
+ defer func() {
+ errClose := resp.Body.Close()
+ err = errors.Join(err, errClose)
+ }()
+
b, err := io.ReadAll(resp.Body)
if err != nil {
return nil, 0, err
diff --git a/src/internal/healthchecks/healthchecks.go b/src/internal/healthchecks/healthchecks.go
new file mode 100644
index 0000000000..447ddb81cf
--- /dev/null
+++ b/src/internal/healthchecks/healthchecks.go
@@ -0,0 +1,136 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package healthchecks run kstatus style health checks on a list of objects
+package healthchecks
+
+import (
+ "context"
+ "errors"
+ "fmt"
+
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "sigs.k8s.io/cli-utils/pkg/kstatus/polling/aggregator"
+ "sigs.k8s.io/cli-utils/pkg/kstatus/polling/collector"
+ "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
+ "sigs.k8s.io/cli-utils/pkg/kstatus/status"
+ "sigs.k8s.io/cli-utils/pkg/kstatus/watcher"
+ "sigs.k8s.io/cli-utils/pkg/object"
+)
+
+// Run waits for a list of Zarf healthchecks to reach a ready state.
+func Run(ctx context.Context, watcher watcher.StatusWatcher, healthChecks []v1alpha1.NamespacedObjectKindReference) error {
+ objs := []object.ObjMetadata{}
+ for _, hc := range healthChecks {
+ gv, err := schema.ParseGroupVersion(hc.APIVersion)
+ if err != nil {
+ return err
+ }
+ obj := object.ObjMetadata{
+ GroupKind: schema.GroupKind{
+ Group: gv.Group,
+ Kind: hc.Kind,
+ },
+ Namespace: hc.Namespace,
+ Name: hc.Name,
+ }
+ objs = append(objs, obj)
+ }
+ err := WaitForReady(ctx, watcher, objs)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+// WaitForReadyRuntime waits for all of the objects to reach a ready state.
+func WaitForReadyRuntime(ctx context.Context, sw watcher.StatusWatcher, robjs []runtime.Object) error {
+ objs := []object.ObjMetadata{}
+ for _, robj := range robjs {
+ obj, err := object.RuntimeToObjMeta(robj)
+ if err != nil {
+ return err
+ }
+ objs = append(objs, obj)
+ }
+ return WaitForReady(ctx, sw, objs)
+}
+
+// WaitForReady waits for all of the objects to reach a ready state.
+func WaitForReady(ctx context.Context, sw watcher.StatusWatcher, objs []object.ObjMetadata) error {
+ cancelCtx, cancel := context.WithCancel(ctx)
+ defer cancel()
+
+ eventCh := sw.Watch(cancelCtx, objs, watcher.Options{})
+ statusCollector := collector.NewResourceStatusCollector(objs)
+ done := statusCollector.ListenWithObserver(eventCh, collector.ObserverFunc(
+ func(statusCollector *collector.ResourceStatusCollector, _ event.Event) {
+ rss := []*event.ResourceStatus{}
+ for _, rs := range statusCollector.ResourceStatuses {
+ if rs == nil {
+ continue
+ }
+ rss = append(rss, rs)
+ }
+ desired := status.CurrentStatus
+ if aggregator.AggregateStatus(rss, desired) == desired {
+ cancel()
+ return
+ }
+ }),
+ )
+ <-done
+
+ if statusCollector.Error != nil {
+ return statusCollector.Error
+ }
+
+ // Only check parent context error, otherwise we would error when desired status is achieved.
+ if ctx.Err() != nil {
+ errs := []error{}
+ for _, id := range objs {
+ rs := statusCollector.ResourceStatuses[id]
+ switch rs.Status {
+ case status.CurrentStatus:
+ case status.NotFoundStatus:
+ errs = append(errs, fmt.Errorf("%s: %s not found", rs.Identifier.Name, rs.Identifier.GroupKind.Kind))
+ default:
+ errs = append(errs, fmt.Errorf("%s: %s not ready", rs.Identifier.Name, rs.Identifier.GroupKind.Kind))
+ }
+ }
+ errs = append(errs, ctx.Err())
+ return errors.Join(errs...)
+ }
+
+ return nil
+}
+
+// ImmediateWatcher should only be used for testing and returns the set status immediately.
+type ImmediateWatcher struct {
+ status status.Status
+}
+
+// NewImmediateWatcher returns a ImmediateWatcher.
+func NewImmediateWatcher(status status.Status) *ImmediateWatcher {
+ return &ImmediateWatcher{
+ status: status,
+ }
+}
+
+// Watch watches the given objects and immediately returns the configured status.
+func (w *ImmediateWatcher) Watch(_ context.Context, objs object.ObjMetadataSet, _ watcher.Options) <-chan event.Event {
+ eventCh := make(chan event.Event, len(objs))
+ for _, obj := range objs {
+ eventCh <- event.Event{
+ Type: event.ResourceUpdateEvent,
+ Resource: &event.ResourceStatus{
+ Identifier: obj,
+ Status: w.status,
+ },
+ }
+ }
+ close(eventCh)
+ return eventCh
+}
diff --git a/src/internal/healthchecks/healthchecks_test.go b/src/internal/healthchecks/healthchecks_test.go
new file mode 100644
index 0000000000..d52d0d2ff9
--- /dev/null
+++ b/src/internal/healthchecks/healthchecks_test.go
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package healthchecks run kstatus style health checks on a list of objects
+package healthchecks
+
+import (
+ "context"
+ "errors"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+ v1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/apimachinery/pkg/util/yaml"
+ dynamicfake "k8s.io/client-go/dynamic/fake"
+ "k8s.io/kubectl/pkg/scheme"
+ "sigs.k8s.io/cli-utils/pkg/kstatus/watcher"
+ "sigs.k8s.io/cli-utils/pkg/testutil"
+)
+
+var podCurrentYaml = `
+apiVersion: v1
+kind: Pod
+metadata:
+ name: good-pod
+ namespace: ns
+status:
+ conditions:
+ - type: Ready
+ status: "True"
+ phase: Running
+`
+
+var podYaml = `
+apiVersion: v1
+kind: Pod
+metadata:
+ name: in-progress-pod
+ namespace: ns
+`
+
+func TestRunHealthChecks(t *testing.T) {
+ t.Parallel()
+ tests := []struct {
+ name string
+ podYamls []string
+ expectErrs []error
+ }{
+ {
+ name: "Pod is ready",
+ podYamls: []string{podCurrentYaml},
+ expectErrs: nil,
+ },
+ {
+ name: "One pod is never ready",
+ podYamls: []string{podYaml, podCurrentYaml},
+ expectErrs: []error{errors.New("in-progress-pod: Pod not ready"), context.DeadlineExceeded},
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
+ fakeClient := dynamicfake.NewSimpleDynamicClient(scheme.Scheme)
+ fakeMapper := testutil.NewFakeRESTMapper(
+ v1.SchemeGroupVersion.WithKind("Pod"),
+ )
+ ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
+ defer cancel()
+ statusWatcher := watcher.NewDefaultStatusWatcher(fakeClient, fakeMapper)
+ objs := []v1alpha1.NamespacedObjectKindReference{}
+ for _, podYaml := range tt.podYamls {
+ m := make(map[string]interface{})
+ err := yaml.Unmarshal([]byte(podYaml), &m)
+ require.NoError(t, err)
+ pod := &unstructured.Unstructured{Object: m}
+ podGVR := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
+ err = fakeClient.Tracker().Create(podGVR, pod, pod.GetNamespace())
+ require.NoError(t, err)
+ objs = append(objs, v1alpha1.NamespacedObjectKindReference{
+ APIVersion: pod.GetAPIVersion(),
+ Kind: pod.GetKind(),
+ Namespace: pod.GetNamespace(),
+ Name: pod.GetName(),
+ })
+ }
+
+ err := Run(ctx, statusWatcher, objs)
+ if tt.expectErrs != nil {
+ require.EqualError(t, err, errors.Join(tt.expectErrs...).Error())
+ return
+ }
+ require.NoError(t, err)
+ })
+ }
+}
diff --git a/src/internal/packager/helm/chart.go b/src/internal/packager/helm/chart.go
index 656b5560b5..954b1d6144 100644
--- a/src/internal/packager/helm/chart.go
+++ b/src/internal/packager/helm/chart.go
@@ -5,6 +5,7 @@
package helm
import (
+ "bytes"
"context"
"errors"
"fmt"
@@ -22,9 +23,11 @@ import (
"helm.sh/helm/v3/pkg/releaseutil"
"helm.sh/helm/v3/pkg/storage/driver"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
+ "k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/yaml"
"github.com/zarf-dev/zarf/src/config"
+ "github.com/zarf-dev/zarf/src/internal/healthchecks"
"github.com/zarf-dev/zarf/src/pkg/message"
"github.com/zarf-dev/zarf/src/types"
)
@@ -58,6 +61,10 @@ func (h *Helm) InstallOrUpgradeChart(ctx context.Context) (types.ConnectStrings,
}
histClient := action.NewHistory(h.actionConfig)
+ var release *release.Release
+
+ helmCtx, helmCtxCancel := context.WithTimeout(ctx, h.timeout)
+ defer helmCtxCancel()
err = retry.Do(func() error {
var err error
@@ -70,16 +77,15 @@ func (h *Helm) InstallOrUpgradeChart(ctx context.Context) (types.ConnectStrings,
// No prior release, try to install it.
spinner.Updatef("Attempting chart installation")
- _, err = h.installChart(postRender)
+ release, err = h.installChart(helmCtx, postRender)
} else if histErr == nil && len(releases) > 0 {
// Otherwise, there is a prior release so upgrade it.
spinner.Updatef("Attempting chart upgrade")
lastRelease := releases[len(releases)-1]
- _, err = h.upgradeChart(lastRelease, postRender)
+ release, err = h.upgradeChart(helmCtx, lastRelease, postRender)
} else {
- // 😠things aren't working
return fmt.Errorf("unable to verify the chart installation status: %w", histErr)
}
@@ -118,6 +124,24 @@ func (h *Helm) InstallOrUpgradeChart(ctx context.Context) (types.ConnectStrings,
return nil, "", installErr
}
+ resourceList, err := h.actionConfig.KubeClient.Build(bytes.NewBufferString(release.Manifest), true)
+ if err != nil {
+ return nil, "", fmt.Errorf("unable to build the resource list: %w", err)
+ }
+
+ runtimeObjs := []runtime.Object{}
+ for _, resource := range resourceList {
+ runtimeObjs = append(runtimeObjs, resource.Object)
+ }
+ if !h.chart.NoWait {
+ // Ensure we don't go past the timeout by using a context initialized with the helm timeout
+ spinner.Updatef("Running health checks")
+ if err := healthchecks.WaitForReadyRuntime(helmCtx, h.cluster.Watcher, runtimeObjs); err != nil {
+ return nil, "", err
+ }
+ }
+ spinner.Success()
+
// return any collected connect strings for zarf connect.
return postRender.connectStrings, h.chart.ReleaseName, nil
}
@@ -172,7 +196,7 @@ func (h *Helm) TemplateChart(ctx context.Context) (manifest string, chartValues
}
// Perform the loadedChart installation.
- templatedChart, err := client.Run(loadedChart, chartValues)
+ templatedChart, err := client.RunWithContext(ctx, loadedChart, chartValues)
if err != nil {
return "", nil, fmt.Errorf("error generating helm chart template: %w", err)
}
@@ -241,7 +265,7 @@ func (h *Helm) UpdateReleaseValues(ctx context.Context, updatedValues map[string
client.Wait = true
// Perform the loadedChart upgrade.
- _, err = client.Run(h.chart.ReleaseName, lastRelease.Chart, updatedValues)
+ _, err = client.RunWithContext(ctx, h.chart.ReleaseName, lastRelease.Chart, updatedValues)
if err != nil {
return err
}
@@ -254,7 +278,7 @@ func (h *Helm) UpdateReleaseValues(ctx context.Context, updatedValues map[string
return fmt.Errorf("unable to find the %s helm release", h.chart.ReleaseName)
}
-func (h *Helm) installChart(postRender *renderer) (*release.Release, error) {
+func (h *Helm) installChart(ctx context.Context, postRender *renderer) (*release.Release, error) {
// Bind the helm action.
client := action.NewInstall(h.actionConfig)
@@ -282,10 +306,10 @@ func (h *Helm) installChart(postRender *renderer) (*release.Release, error) {
}
// Perform the loadedChart installation.
- return client.Run(loadedChart, chartValues)
+ return client.RunWithContext(ctx, loadedChart, chartValues)
}
-func (h *Helm) upgradeChart(lastRelease *release.Release, postRender *renderer) (*release.Release, error) {
+func (h *Helm) upgradeChart(ctx context.Context, lastRelease *release.Release, postRender *renderer) (*release.Release, error) {
// Migrate any deprecated APIs (if applicable)
err := h.migrateDeprecatedAPIs(lastRelease)
if err != nil {
@@ -315,7 +339,7 @@ func (h *Helm) upgradeChart(lastRelease *release.Release, postRender *renderer)
}
// Perform the loadedChart upgrade.
- return client.Run(h.chart.ReleaseName, loadedChart, chartValues)
+ return client.RunWithContext(ctx, h.chart.ReleaseName, loadedChart, chartValues)
}
func (h *Helm) rollbackChart(name string, version int) error {
diff --git a/src/internal/packager/helm/zarf.go b/src/internal/packager/helm/zarf.go
index 03e4db2ed0..b6945a6e8c 100644
--- a/src/internal/packager/helm/zarf.go
+++ b/src/internal/packager/helm/zarf.go
@@ -13,11 +13,10 @@ import (
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/cli-utils/pkg/object"
- pkgkubernetes "github.com/defenseunicorns/pkg/kubernetes"
-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "github.com/zarf-dev/zarf/src/internal/healthchecks"
"github.com/zarf-dev/zarf/src/internal/packager/template"
"github.com/zarf-dev/zarf/src/pkg/cluster"
"github.com/zarf-dev/zarf/src/pkg/message"
@@ -61,7 +60,7 @@ func (h *Helm) UpdateZarfRegistryValues(ctx context.Context) error {
}
waitCtx, waitCancel := context.WithTimeout(ctx, 60*time.Second)
defer waitCancel()
- err = pkgkubernetes.WaitForReady(waitCtx, h.cluster.Watcher, objs)
+ err = healthchecks.WaitForReady(waitCtx, h.cluster.Watcher, objs)
if err != nil {
return err
}
@@ -157,7 +156,7 @@ func (h *Helm) UpdateZarfAgentValues(ctx context.Context) error {
}
waitCtx, waitCancel := context.WithTimeout(ctx, 60*time.Second)
defer waitCancel()
- err = pkgkubernetes.WaitForReady(waitCtx, h.cluster.Watcher, objs)
+ err = healthchecks.WaitForReady(waitCtx, h.cluster.Watcher, objs)
if err != nil {
return err
}
diff --git a/src/internal/packager/images/common.go b/src/internal/packager/images/common.go
index 285c541edb..3d5137a995 100644
--- a/src/internal/packager/images/common.go
+++ b/src/internal/packager/images/common.go
@@ -13,7 +13,6 @@ import (
"github.com/google/go-containerregistry/pkg/crane"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/zarf-dev/zarf/src/config"
- "github.com/zarf-dev/zarf/src/pkg/message"
"github.com/zarf-dev/zarf/src/pkg/transform"
"github.com/zarf-dev/zarf/src/types"
)
@@ -98,18 +97,18 @@ func WithPushAuth(ri types.RegistryInfo) crane.Option {
return WithBasicAuth(ri.PushUsername, ri.PushPassword)
}
-func createPushOpts(cfg PushConfig, pb *message.ProgressBar) []crane.Option {
+func createPushOpts(cfg PushConfig) []crane.Option {
opts := CommonOpts(cfg.Arch)
opts = append(opts, WithPushAuth(cfg.RegInfo))
- transport := http.DefaultTransport.(*http.Transport).Clone()
- transport.TLSClientConfig.InsecureSkipVerify = config.CommonOptions.InsecureSkipTLSVerify
+ defaultTransport := http.DefaultTransport.(*http.Transport).Clone()
+ defaultTransport.TLSClientConfig.InsecureSkipVerify = config.CommonOptions.InsecureSkipTLSVerify
// TODO (@WSTARR) This is set to match the TLSHandshakeTimeout to potentially mitigate effects of https://github.com/zarf-dev/zarf/issues/1444
- transport.ResponseHeaderTimeout = 10 * time.Second
+ defaultTransport.ResponseHeaderTimeout = 10 * time.Second
- transportWithProgressBar := helpers.NewTransport(transport, pb)
+ transport := helpers.NewTransport(defaultTransport, nil)
- opts = append(opts, crane.WithTransport(transportWithProgressBar))
+ opts = append(opts, crane.WithTransport(transport))
return opts
}
diff --git a/src/internal/packager/images/pull.go b/src/internal/packager/images/pull.go
index 2e206742c6..a11b6097d7 100644
--- a/src/internal/packager/images/pull.go
+++ b/src/internal/packager/images/pull.go
@@ -300,7 +300,11 @@ func CleanupInProgressLayers(ctx context.Context, img v1.Image) error {
if err != nil {
return err
}
- cacheDir := filepath.Join(config.GetAbsCachePath(), layout.ImagesDir)
+ absPath, err := config.GetAbsCachePath()
+ if err != nil {
+ return err
+ }
+ cacheDir := filepath.Join(absPath, layout.ImagesDir)
location := filepath.Join(cacheDir, digest.String())
info, err := os.Stat(location)
if errors.Is(err, fs.ErrNotExist) {
diff --git a/src/internal/packager/images/push.go b/src/internal/packager/images/push.go
index f8cbf90c4e..e04c628023 100644
--- a/src/internal/packager/images/push.go
+++ b/src/internal/packager/images/push.go
@@ -6,11 +6,9 @@ package images
import (
"context"
- "fmt"
"time"
"github.com/avast/retry-go/v4"
- "github.com/defenseunicorns/pkg/helpers/v2"
"github.com/google/go-containerregistry/pkg/crane"
"github.com/google/go-containerregistry/pkg/logs"
v1 "github.com/google/go-containerregistry/pkg/v1"
@@ -27,7 +25,6 @@ func Push(ctx context.Context, cfg PushConfig) error {
logs.Progress.SetOutput(&message.DebugWriter{})
toPush := map[transform.Image]v1.Image{}
- var totalSize int64
// Build an image list from the references
for _, refInfo := range cfg.ImageList {
img, err := utils.LoadOCIImage(cfg.SourceDirectory, refInfo)
@@ -35,16 +32,6 @@ func Push(ctx context.Context, cfg PushConfig) error {
return err
}
toPush[refInfo] = img
- imgSize, err := calcImgSize(img)
- if err != nil {
- return err
- }
- totalSize += imgSize
- }
-
- // If this is not a no checksum image push we will be pushing two images (the second will go faster as it checks the same layers)
- if !cfg.NoChecksum {
- totalSize = totalSize * 2
}
var (
@@ -52,7 +39,6 @@ func Push(ctx context.Context, cfg PushConfig) error {
tunnel *cluster.Tunnel
registryURL = cfg.RegInfo.Address
)
-
err = retry.Do(func() error {
c, _ := cluster.NewCluster()
if c != nil {
@@ -64,16 +50,12 @@ func Push(ctx context.Context, cfg PushConfig) error {
defer tunnel.Close()
}
}
-
- progress := message.NewProgressBar(totalSize, fmt.Sprintf("Pushing %d images", len(toPush)))
- defer progress.Close()
- pushOptions := createPushOpts(cfg, progress)
+ pushOptions := createPushOpts(cfg)
pushImage := func(img v1.Image, name string) error {
if tunnel != nil {
return tunnel.Wrap(func() error { return crane.Push(img, name, pushOptions...) })
}
-
return crane.Push(img, name, pushOptions...)
}
@@ -84,14 +66,7 @@ func Push(ctx context.Context, cfg PushConfig) error {
}
}()
for refInfo, img := range toPush {
- refTruncated := helpers.Truncate(refInfo.Reference, 55, true)
- progress.Updatef(fmt.Sprintf("Pushing %s", refTruncated))
-
- size, err := calcImgSize(img)
- if err != nil {
- return err
- }
-
+ message.Infof("Pushing %s", refInfo.Reference)
// If this is not a no checksum image push it for use with the Zarf agent
if !cfg.NoChecksum {
offlineNameCRC, err := transform.ImageTransformHost(registryURL, refInfo.Reference)
@@ -102,8 +77,6 @@ func Push(ctx context.Context, cfg PushConfig) error {
if err = pushImage(img, offlineNameCRC); err != nil {
return err
}
-
- totalSize -= size
}
// To allow for other non-zarf workloads to easily see the images upload a non-checksum version
@@ -113,16 +86,12 @@ func Push(ctx context.Context, cfg PushConfig) error {
return err
}
- message.Debugf("push %s -> %s)", refInfo.Reference, offlineName)
-
if err = pushImage(img, offlineName); err != nil {
return err
}
pushed = append(pushed, refInfo)
- totalSize -= size
}
- progress.Successf("Pushed %d images", len(cfg.ImageList))
return nil
}, retry.Context(ctx), retry.Attempts(uint(cfg.Retries)), retry.Delay(500*time.Millisecond))
if err != nil {
@@ -131,25 +100,3 @@ func Push(ctx context.Context, cfg PushConfig) error {
return nil
}
-
-func calcImgSize(img v1.Image) (int64, error) {
- size, err := img.Size()
- if err != nil {
- return size, err
- }
-
- layers, err := img.Layers()
- if err != nil {
- return size, err
- }
-
- for _, layer := range layers {
- ls, err := layer.Size()
- if err != nil {
- return size, err
- }
- size += ls
- }
-
- return size, nil
-}
diff --git a/src/internal/packager/sbom/catalog.go b/src/internal/packager/sbom/catalog.go
index 58aa23870a..65c32c039b 100755
--- a/src/internal/packager/sbom/catalog.go
+++ b/src/internal/packager/sbom/catalog.go
@@ -54,9 +54,13 @@ var componentPrefix = "zarf-component-"
func Catalog(ctx context.Context, componentSBOMs map[string]*layout.ComponentSBOM, imageList []transform.Image, paths *layout.PackagePaths) error {
imageCount := len(imageList)
componentCount := len(componentSBOMs)
+ cachePath, err := config.GetAbsCachePath()
+ if err != nil {
+ return err
+ }
builder := Builder{
spinner: message.NewProgressSpinner("Creating SBOMs for %d images and %d components with files.", imageCount, componentCount),
- cachePath: config.GetAbsCachePath(),
+ cachePath: cachePath,
imagesPath: paths.Images.Base,
outputDir: paths.SBOMs.Path,
}
diff --git a/src/internal/packager2/inspect.go b/src/internal/packager2/inspect.go
index bfad933b3a..0e4c1e0321 100644
--- a/src/internal/packager2/inspect.go
+++ b/src/internal/packager2/inspect.go
@@ -7,12 +7,15 @@ package packager2
import (
"context"
"fmt"
+ "os"
"github.com/defenseunicorns/pkg/helpers/v2"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/internal/packager/sbom"
"github.com/zarf-dev/zarf/src/pkg/cluster"
"github.com/zarf-dev/zarf/src/pkg/packager/filters"
+ "github.com/zarf-dev/zarf/src/pkg/utils"
)
// ZarfInspectOptions tracks the user-defined preferences during a package inspection.
@@ -35,7 +38,7 @@ func Inspect(ctx context.Context, opt ZarfInspectOptions) (v1alpha1.ZarfPackage,
}
if getSBOM(opt.ViewSBOM, opt.SBOMOutputDir) {
- err = handleSBOMOptions(ctx, pkg, opt)
+ err = handleSBOMOptions(ctx, opt)
if err != nil {
return pkg, err
}
@@ -75,7 +78,7 @@ func getPackageMetadata(ctx context.Context, opt ZarfInspectOptions) (v1alpha1.Z
return pkg, nil
}
-func handleSBOMOptions(ctx context.Context, pkg v1alpha1.ZarfPackage, opt ZarfInspectOptions) error {
+func handleSBOMOptions(ctx context.Context, opt ZarfInspectOptions) error {
loadOpt := LoadOptions{
Source: opt.Source,
SkipSignatureValidation: opt.SkipSignatureValidation,
@@ -86,23 +89,25 @@ func handleSBOMOptions(ctx context.Context, pkg v1alpha1.ZarfPackage, opt ZarfIn
if err != nil {
return err
}
- if opt.SBOMOutputDir != "" {
- out, err := layout.SBOMs.OutputSBOMFiles(opt.SBOMOutputDir, pkg.Metadata.Name)
+
+ sbomDirPath := opt.SBOMOutputDir
+ if sbomDirPath == "" {
+ tmpDir, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
if err != nil {
return err
}
- if opt.ViewSBOM {
- err := sbom.ViewSBOMFiles(out)
- if err != nil {
- return err
- }
- }
- } else if opt.ViewSBOM {
- err := sbom.ViewSBOMFiles(layout.SBOMs.Path)
+ defer os.RemoveAll(tmpDir)
+ sbomDirPath = tmpDir
+ }
+ sbomPath, err := layout.GetSBOM(sbomDirPath)
+ if err != nil {
+ return err
+ }
+ if opt.ViewSBOM {
+ err := sbom.ViewSBOMFiles(sbomPath)
if err != nil {
return err
}
- return err
}
return nil
}
diff --git a/src/internal/packager2/layout/create.go b/src/internal/packager2/layout/create.go
new file mode 100644
index 0000000000..c9c0a0845c
--- /dev/null
+++ b/src/internal/packager2/layout/create.go
@@ -0,0 +1,475 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+package layout
+
+import (
+ "archive/tar"
+ "context"
+ "crypto/sha256"
+ "encoding/hex"
+ "fmt"
+ "io"
+ "io/fs"
+ "os"
+ "path/filepath"
+ "runtime"
+ "slices"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/defenseunicorns/pkg/helpers/v2"
+ goyaml "github.com/goccy/go-yaml"
+ "github.com/mholt/archiver/v3"
+ "github.com/sigstore/cosign/v2/cmd/cosign/cli/options"
+ "github.com/sigstore/cosign/v2/cmd/cosign/cli/sign"
+
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "github.com/zarf-dev/zarf/src/config"
+ "github.com/zarf-dev/zarf/src/config/lang"
+ "github.com/zarf-dev/zarf/src/internal/packager/helm"
+ "github.com/zarf-dev/zarf/src/internal/packager/kustomize"
+ "github.com/zarf-dev/zarf/src/pkg/lint"
+ "github.com/zarf-dev/zarf/src/pkg/packager/deprecated"
+ "github.com/zarf-dev/zarf/src/pkg/utils"
+ "github.com/zarf-dev/zarf/src/pkg/zoci"
+)
+
+// CreateOptions are the options for creating a skeleton package.
+type CreateOptions struct {
+ Flavor string
+ RegistryOverrides map[string]string
+ SigningKeyPath string
+ SigningKeyPassword string
+ SetVariables map[string]string
+}
+
+// CreateSkeleton creates a skeleton package and returns the path to the created package.
+func CreateSkeleton(ctx context.Context, packagePath string, opt CreateOptions) (string, error) {
+ b, err := os.ReadFile(filepath.Join(packagePath, ZarfYAML))
+ if err != nil {
+ return "", err
+ }
+ var pkg v1alpha1.ZarfPackage
+ err = goyaml.Unmarshal(b, &pkg)
+ if err != nil {
+ return "", err
+ }
+ buildPath, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
+ if err != nil {
+ return "", err
+ }
+
+ pkg.Metadata.Architecture = config.GetArch()
+
+ pkg, err = resolveImports(ctx, pkg, packagePath, pkg.Metadata.Architecture, opt.Flavor)
+ if err != nil {
+ return "", err
+ }
+
+ pkg.Metadata.Architecture = zoci.SkeletonArch
+
+ err = validate(pkg, packagePath, opt.SetVariables)
+ if err != nil {
+ return "", err
+ }
+
+ for _, component := range pkg.Components {
+ err := assembleComponent(component, packagePath, buildPath)
+ if err != nil {
+ return "", err
+ }
+ }
+
+ checksumContent, checksumSha, err := getChecksum(buildPath)
+ if err != nil {
+ return "", err
+ }
+ checksumPath := filepath.Join(buildPath, Checksums)
+ err = os.WriteFile(checksumPath, []byte(checksumContent), helpers.ReadWriteUser)
+ if err != nil {
+ return "", err
+ }
+ pkg.Metadata.AggregateChecksum = checksumSha
+
+ pkg = recordPackageMetadata(pkg, opt.Flavor, opt.RegistryOverrides)
+
+ b, err = goyaml.Marshal(pkg)
+ if err != nil {
+ return "", err
+ }
+ err = os.WriteFile(filepath.Join(buildPath, ZarfYAML), b, helpers.ReadWriteUser)
+ if err != nil {
+ return "", err
+ }
+
+ err = signPackage(buildPath, opt.SigningKeyPath, opt.SigningKeyPassword)
+ if err != nil {
+ return "", err
+ }
+
+ return buildPath, nil
+}
+
+func validate(pkg v1alpha1.ZarfPackage, packagePath string, setVariables map[string]string) error {
+ err := lint.ValidatePackage(pkg)
+ if err != nil {
+ return fmt.Errorf("package validation failed: %w", err)
+ }
+ findings, err := lint.ValidatePackageSchemaAtPath(packagePath, setVariables)
+ if err != nil {
+ return fmt.Errorf("unable to check schema: %w", err)
+ }
+ if len(findings) == 0 {
+ return nil
+ }
+ return &lint.LintError{
+ BaseDir: packagePath,
+ PackageName: pkg.Metadata.Name,
+ Findings: findings,
+ }
+}
+
+func assembleComponent(component v1alpha1.ZarfComponent, packagePath, buildPath string) error {
+ tmpBuildPath, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
+ if err != nil {
+ return err
+ }
+ defer os.RemoveAll(tmpBuildPath)
+ compBuildPath := filepath.Join(tmpBuildPath, component.Name)
+ err = os.MkdirAll(compBuildPath, 0o700)
+ if err != nil {
+ return err
+ }
+
+ for chartIdx, chart := range component.Charts {
+ if chart.LocalPath != "" {
+ rel := filepath.Join(string(ChartsComponentDir), fmt.Sprintf("%s-%d", chart.Name, chartIdx))
+ dst := filepath.Join(compBuildPath, rel)
+
+ err := helpers.CreatePathAndCopy(filepath.Join(packagePath, chart.LocalPath), dst)
+ if err != nil {
+ return err
+ }
+
+ component.Charts[chartIdx].LocalPath = rel
+ }
+
+ for valuesIdx, path := range chart.ValuesFiles {
+ if helpers.IsURL(path) {
+ continue
+ }
+
+ rel := fmt.Sprintf("%s-%d", helm.StandardName(string(ValuesComponentDir), chart), valuesIdx)
+ component.Charts[chartIdx].ValuesFiles[valuesIdx] = rel
+
+ if err := helpers.CreatePathAndCopy(filepath.Join(packagePath, path), filepath.Join(compBuildPath, rel)); err != nil {
+ return fmt.Errorf("unable to copy chart values file %s: %w", path, err)
+ }
+ }
+ }
+
+ for filesIdx, file := range component.Files {
+ if helpers.IsURL(file.Source) {
+ continue
+ }
+
+ rel := filepath.Join(string(FilesComponentDir), strconv.Itoa(filesIdx), filepath.Base(file.Target))
+ dst := filepath.Join(compBuildPath, rel)
+ destinationDir := filepath.Dir(dst)
+
+ if file.ExtractPath != "" {
+ if err := archiver.Extract(filepath.Join(packagePath, file.Source), file.ExtractPath, destinationDir); err != nil {
+ return fmt.Errorf(lang.ErrFileExtract, file.ExtractPath, file.Source, err.Error())
+ }
+
+ // Make sure dst reflects the actual file or directory.
+ updatedExtractedFileOrDir := filepath.Join(destinationDir, file.ExtractPath)
+ if updatedExtractedFileOrDir != dst {
+ if err := os.Rename(updatedExtractedFileOrDir, dst); err != nil {
+ return fmt.Errorf(lang.ErrWritingFile, dst, err)
+ }
+ }
+ } else {
+ if err := helpers.CreatePathAndCopy(filepath.Join(packagePath, file.Source), dst); err != nil {
+ return fmt.Errorf("unable to copy file %s: %w", file.Source, err)
+ }
+ }
+
+ // Change the source to the new relative source directory (any remote files will have been skipped above)
+ component.Files[filesIdx].Source = rel
+
+ // Remove the extractPath from a skeleton since it will already extract it
+ component.Files[filesIdx].ExtractPath = ""
+
+ // Abort packaging on invalid shasum (if one is specified).
+ if file.Shasum != "" {
+ if err := helpers.SHAsMatch(dst, file.Shasum); err != nil {
+ return err
+ }
+ }
+
+ if file.Executable || helpers.IsDir(dst) {
+ err = os.Chmod(dst, helpers.ReadWriteExecuteUser)
+ if err != nil {
+ return err
+ }
+ } else {
+ err = os.Chmod(dst, helpers.ReadWriteUser)
+ if err != nil {
+ return err
+ }
+ }
+ }
+
+ for dataIdx, data := range component.DataInjections {
+ rel := filepath.Join(string(DataComponentDir), strconv.Itoa(dataIdx), filepath.Base(data.Target.Path))
+ dst := filepath.Join(compBuildPath, rel)
+
+ if err := helpers.CreatePathAndCopy(filepath.Join(packagePath, data.Source), dst); err != nil {
+ return fmt.Errorf("unable to copy data injection %s: %s", data.Source, err.Error())
+ }
+
+ component.DataInjections[dataIdx].Source = rel
+ }
+
+ // Iterate over all manifests.
+ for manifestIdx, manifest := range component.Manifests {
+ for fileIdx, path := range manifest.Files {
+ rel := filepath.Join(string(ManifestsComponentDir), fmt.Sprintf("%s-%d.yaml", manifest.Name, fileIdx))
+ dst := filepath.Join(compBuildPath, rel)
+
+ // Copy manifests without any processing.
+ if err := helpers.CreatePathAndCopy(filepath.Join(packagePath, path), dst); err != nil {
+ return fmt.Errorf("unable to copy manifest %s: %w", path, err)
+ }
+
+ component.Manifests[manifestIdx].Files[fileIdx] = rel
+ }
+
+ for kustomizeIdx, path := range manifest.Kustomizations {
+ // Generate manifests from kustomizations and place in the package.
+ kname := fmt.Sprintf("kustomization-%s-%d.yaml", manifest.Name, kustomizeIdx)
+ rel := filepath.Join(string(ManifestsComponentDir), kname)
+ dst := filepath.Join(compBuildPath, rel)
+
+ if err := kustomize.Build(filepath.Join(packagePath, path), dst, manifest.KustomizeAllowAnyDirectory); err != nil {
+ return fmt.Errorf("unable to build kustomization %s: %w", path, err)
+ }
+ }
+
+ // remove kustomizations
+ component.Manifests[manifestIdx].Kustomizations = nil
+ }
+
+ // Write the tar component.
+ entries, err := os.ReadDir(compBuildPath)
+ if err != nil {
+ return err
+ }
+ if len(entries) == 0 {
+ return nil
+ }
+ err = os.MkdirAll(filepath.Join(compBuildPath, "temp"), 0o700)
+ if err != nil {
+ return err
+ }
+ tarPath := filepath.Join(buildPath, "components", fmt.Sprintf("%s.tar", component.Name))
+ err = os.MkdirAll(filepath.Join(buildPath, "components"), 0o700)
+ if err != nil {
+ return err
+ }
+ err = createReproducibleTarballFromDir(compBuildPath, component.Name, tarPath)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func recordPackageMetadata(pkg v1alpha1.ZarfPackage, flavor string, registryOverrides map[string]string) v1alpha1.ZarfPackage {
+ now := time.Now()
+ // Just use $USER env variable to avoid CGO issue.
+ // https://groups.google.com/g/golang-dev/c/ZFDDX3ZiJ84.
+ // Record the name of the user creating the package.
+ if runtime.GOOS == "windows" {
+ pkg.Build.User = os.Getenv("USERNAME")
+ } else {
+ pkg.Build.User = os.Getenv("USER")
+ }
+
+ // Record the hostname of the package creation terminal.
+ // The error here is ignored because the hostname is not critical to the package creation.
+ hostname, _ := os.Hostname()
+ pkg.Build.Terminal = hostname
+
+ if pkg.IsInitConfig() {
+ pkg.Metadata.Version = config.CLIVersion
+ }
+
+ pkg.Build.Architecture = pkg.Metadata.Architecture
+
+ // Record the Zarf Version the CLI was built with.
+ pkg.Build.Version = config.CLIVersion
+
+ // Record the time of package creation.
+ pkg.Build.Timestamp = now.Format(time.RFC1123Z)
+
+ // Record the migrations that will be ran on the package.
+ pkg.Build.Migrations = []string{
+ deprecated.ScriptsToActionsMigrated,
+ deprecated.PluralizeSetVariable,
+ }
+
+ // Record the flavor of Zarf used to build this package (if any).
+ pkg.Build.Flavor = flavor
+
+ pkg.Build.RegistryOverrides = registryOverrides
+
+ // Record the latest version of Zarf without breaking changes to the package structure.
+ pkg.Build.LastNonBreakingVersion = deprecated.LastNonBreakingVersion
+
+ return pkg
+}
+
+func getChecksum(dirPath string) (string, string, error) {
+ checksumData := []string{}
+ err := filepath.Walk(dirPath, func(path string, info fs.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+ if info.IsDir() {
+ return nil
+ }
+ rel, err := filepath.Rel(dirPath, path)
+ if err != nil {
+ return err
+ }
+ if rel == ZarfYAML || rel == Checksums {
+ return nil
+ }
+ sum, err := helpers.GetSHA256OfFile(path)
+ if err != nil {
+ return err
+ }
+ checksumData = append(checksumData, fmt.Sprintf("%s %s", sum, filepath.ToSlash(rel)))
+ return nil
+ })
+ if err != nil {
+ return "", "", err
+ }
+ slices.Sort(checksumData)
+
+ checksumContent := strings.Join(checksumData, "\n") + "\n"
+ sha := sha256.Sum256([]byte(checksumContent))
+ return checksumContent, hex.EncodeToString(sha[:]), nil
+}
+
+func signPackage(dirPath, signingKeyPath, signingKeyPassword string) error {
+ if signingKeyPath == "" {
+ return nil
+ }
+ passFunc := func(_ bool) ([]byte, error) {
+ return []byte(signingKeyPassword), nil
+ }
+ keyOpts := options.KeyOpts{
+ KeyRef: signingKeyPath,
+ PassFunc: passFunc,
+ }
+ rootOpts := &options.RootOptions{
+ Verbose: false,
+ Timeout: options.DefaultTimeout,
+ }
+ _, err := sign.SignBlobCmd(
+ rootOpts,
+ keyOpts,
+ filepath.Join(dirPath, ZarfYAML),
+ true,
+ filepath.Join(dirPath, Signature),
+ "",
+ false)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func createReproducibleTarballFromDir(dirPath, dirPrefix, tarballPath string) error {
+ tb, err := os.Create(tarballPath)
+ if err != nil {
+ return fmt.Errorf("error creating tarball: %w", err)
+ }
+ defer tb.Close()
+
+ tw := tar.NewWriter(tb)
+ defer tw.Close()
+
+ // Walk through the directory and process each file
+ return filepath.Walk(dirPath, func(filePath string, info os.FileInfo, err error) error {
+ if err != nil {
+ return err
+ }
+
+ link := ""
+ if info.Mode().Type() == os.ModeSymlink {
+ link, err = os.Readlink(filePath)
+ if err != nil {
+ return fmt.Errorf("error reading symlink: %w", err)
+ }
+ }
+
+ // Create a new header
+ header, err := tar.FileInfoHeader(info, link)
+ if err != nil {
+ return fmt.Errorf("error creating tar header: %w", err)
+ }
+
+ // Strip non-deterministic header data
+ header.ModTime = time.Time{}
+ header.AccessTime = time.Time{}
+ header.ChangeTime = time.Time{}
+ header.Uid = 0
+ header.Gid = 0
+ header.Uname = ""
+ header.Gname = ""
+
+ // When run on windows the header mode will set all permission octals to the same value as the first octal.
+ // A file created with 0o700 will return 0o777 when read back. This discrepancy causes differences between packages
+ // created on Windows and Linux.
+ // https://medium.com/@MichalPristas/go-and-file-perms-on-windows-3c944d55dd44
+ // To mitigate this difference we zero all but the last permission octal when writing files to the tar. Making sure
+ // that when unpackaged files from packages created on Windows and Linux will have the same permissions.
+ // The &^ operator called AND NOT sets the bits to 0 in the left hand if the right hand bits are 1.
+ // https://medium.com/learning-the-go-programming-language/bit-hacking-with-go-e0acee258827
+ header.Mode = header.Mode &^ 0o077
+
+ // Ensure the header's name is correctly set relative to the base directory
+ name, err := filepath.Rel(dirPath, filePath)
+ if err != nil {
+ return fmt.Errorf("error getting relative path: %w", err)
+ }
+ name = filepath.Join(dirPrefix, name)
+ name = filepath.ToSlash(name)
+ header.Name = name
+
+ // Write the header to the tarball
+ if err := tw.WriteHeader(header); err != nil {
+ return fmt.Errorf("error writing header: %w", err)
+ }
+
+ // If it's a file, write its content
+ if info.Mode().IsRegular() {
+ file, err := os.Open(filePath)
+ if err != nil {
+ return fmt.Errorf("error opening file: %w", err)
+ }
+ defer file.Close()
+
+ if _, err := io.Copy(tw, file); err != nil {
+ return fmt.Errorf("error writing file to tarball: %w", err)
+ }
+ }
+
+ return nil
+ })
+}
diff --git a/src/internal/packager2/layout/create_test.go b/src/internal/packager2/layout/create_test.go
new file mode 100644
index 0000000000..7e29bb875a
--- /dev/null
+++ b/src/internal/packager2/layout/create_test.go
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+package layout
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/defenseunicorns/pkg/helpers/v2"
+ "github.com/stretchr/testify/require"
+
+ "github.com/zarf-dev/zarf/src/pkg/layout"
+ "github.com/zarf-dev/zarf/src/pkg/lint"
+ "github.com/zarf-dev/zarf/src/test/testutil"
+)
+
+func TestCreateSkeleton(t *testing.T) {
+ t.Parallel()
+
+ ctx := testutil.TestContext(t)
+
+ lint.ZarfSchema = testutil.LoadSchema(t, "../../../../zarf.schema.json")
+
+ opt := CreateOptions{}
+ path, err := CreateSkeleton(ctx, "./testdata/zarf-package", opt)
+ require.NoError(t, err)
+
+ pkgPath := layout.New(path)
+ _, warnings, err := pkgPath.ReadZarfYAML()
+ require.NoError(t, err)
+ require.Empty(t, warnings)
+ b, err := os.ReadFile(filepath.Join(pkgPath.Base, "checksums.txt"))
+ require.NoError(t, err)
+ expectedChecksum := `54f657b43323e1ebecb0758835b8d01a0113b61b7bab0f4a8156f031128d00f9 components/data-injections.tar
+879bfe82d20f7bdcd60f9e876043cc4343af4177a6ee8b2660c304a5b6c70be7 components/files.tar
+c497f1a56559ea0a9664160b32e4b377df630454ded6a3787924130c02f341a6 components/manifests.tar
+fb7ebee94a4479bacddd71195030a483b0b0b96d4f73f7fcd2c2c8e0fce0c5c6 components/helm-charts.tar
+`
+ require.Equal(t, expectedChecksum, string(b))
+}
+
+func TestGetChecksum(t *testing.T) {
+ t.Parallel()
+
+ tmpDir := t.TempDir()
+ files := map[string]string{
+ "empty.txt": "",
+ "foo": "bar",
+ "zarf.yaml": "Zarf Yaml Data",
+ "checksums.txt": "Old Checksum Data",
+ "nested/directory/file.md": "nested",
+ }
+ for k, v := range files {
+ err := os.MkdirAll(filepath.Join(tmpDir, filepath.Dir(k)), 0o700)
+ require.NoError(t, err)
+ err = os.WriteFile(filepath.Join(tmpDir, k), []byte(v), 0o600)
+ require.NoError(t, err)
+ }
+
+ checksumContent, checksumHash, err := getChecksum(tmpDir)
+ require.NoError(t, err)
+
+ expectedContent := `233562de1a0288b139c4fa40b7d189f806e906eeb048517aeb67f34ac0e2faf1 nested/directory/file.md
+e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 empty.txt
+fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9 foo
+`
+ require.Equal(t, expectedContent, checksumContent)
+ require.Equal(t, "7c554cf67e1c2b50a1b728299c368cd56d53588300c37479623f29a52812ca3f", checksumHash)
+}
+
+func TestSignPackage(t *testing.T) {
+ t.Parallel()
+
+ tmpDir := t.TempDir()
+ yamlPath := filepath.Join(tmpDir, "zarf.yaml")
+ signedPath := filepath.Join(tmpDir, "zarf.yaml.sig")
+
+ err := os.WriteFile(yamlPath, []byte("foobar"), 0o644)
+ require.NoError(t, err)
+
+ err = signPackage(tmpDir, "", "")
+ require.NoError(t, err)
+ require.NoFileExists(t, signedPath)
+
+ err = signPackage(tmpDir, "./testdata/cosign.key", "wrongpassword")
+ require.EqualError(t, err, "reading key: decrypt: encrypted: decryption failed")
+
+ err = signPackage(tmpDir, "./testdata/cosign.key", "test")
+ require.NoError(t, err)
+ require.FileExists(t, signedPath)
+}
+
+func TestCreateReproducibleTarballFromDir(t *testing.T) {
+ t.Parallel()
+
+ tmpDir := t.TempDir()
+ err := os.WriteFile(filepath.Join(tmpDir, "test.txt"), []byte("hello world"), 0o600)
+ require.NoError(t, err)
+ tarPath := filepath.Join(t.TempDir(), "data.tar")
+
+ err = createReproducibleTarballFromDir(tmpDir, "", tarPath)
+ require.NoError(t, err)
+
+ shaSum, err := helpers.GetSHA256OfFile(tarPath)
+ require.NoError(t, err)
+ require.Equal(t, "c09d17f612f241cdf549e5fb97c9e063a8ad18ae7a9f3af066332ed6b38556ad", shaSum)
+}
diff --git a/src/internal/packager2/layout/import.go b/src/internal/packager2/layout/import.go
new file mode 100644
index 0000000000..a1c917eee0
--- /dev/null
+++ b/src/internal/packager2/layout/import.go
@@ -0,0 +1,414 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+package layout
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "slices"
+
+ "github.com/defenseunicorns/pkg/helpers/v2"
+ "github.com/defenseunicorns/pkg/oci"
+ "github.com/mholt/archiver/v3"
+ ocispec "github.com/opencontainers/image-spec/specs-go/v1"
+ ocistore "oras.land/oras-go/v2/content/oci"
+
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "github.com/zarf-dev/zarf/src/config"
+ "github.com/zarf-dev/zarf/src/pkg/layout"
+ "github.com/zarf-dev/zarf/src/pkg/zoci"
+)
+
+func resolveImports(ctx context.Context, pkg v1alpha1.ZarfPackage, packagePath, arch, flavor string) (v1alpha1.ZarfPackage, error) {
+ variables := pkg.Variables
+ constants := pkg.Constants
+ components := []v1alpha1.ZarfComponent{}
+
+ for _, component := range pkg.Components {
+ if !compatibleComponent(component, pkg.Metadata.Architecture, flavor) {
+ continue
+ }
+
+ // Skip as component does not have any imports.
+ if component.Import.Path == "" && component.Import.URL == "" {
+ components = append(components, component)
+ continue
+ }
+
+ if err := validateComponentCompose(component); err != nil {
+ return v1alpha1.ZarfPackage{}, fmt.Errorf("invalid imported definition for %s: %w", component.Name, err)
+ }
+
+ var importedPkg v1alpha1.ZarfPackage
+ if component.Import.Path != "" {
+ b, err := os.ReadFile(filepath.Join(packagePath, component.Import.Path, layout.ZarfYAML))
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ importedPkg, err = ParseZarfPackage(b)
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ } else if component.Import.URL != "" {
+ remote, err := zoci.NewRemote(component.Import.URL, zoci.PlatformForSkeleton())
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ _, err = remote.ResolveRoot(ctx)
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ importedPkg, err = remote.FetchZarfYAML(ctx)
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ }
+
+ name := component.Name
+ if component.Import.Name != "" {
+ name = component.Import.Name
+ }
+ found := []v1alpha1.ZarfComponent{}
+ for _, component := range importedPkg.Components {
+ if component.Name == name && compatibleComponent(component, arch, flavor) {
+ found = append(found, component)
+ }
+ }
+ if len(found) == 0 {
+ return v1alpha1.ZarfPackage{}, fmt.Errorf("component %s not found", name)
+ } else if len(found) > 1 {
+ return v1alpha1.ZarfPackage{}, fmt.Errorf("multiple components named %s found", name)
+ }
+ importedComponent := found[0]
+ if importedComponent.Import.Path != "" || importedComponent.Import.URL != "" {
+ return v1alpha1.ZarfPackage{}, fmt.Errorf("imported component %s has imports which is not supported", importedComponent.Name)
+ }
+
+ importPath, err := fetchOCISkeleton(ctx, component, packagePath)
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ importedComponent = fixPaths(importedComponent, importPath, packagePath)
+ composed, err := overrideMetadata(importedComponent, component)
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ composed = overrideDeprecated(composed, component)
+ composed = overrideActions(composed, component)
+ composed = overrideResources(composed, component)
+
+ components = append(components, composed)
+ variables = append(variables, importedPkg.Variables...)
+ constants = append(constants, importedPkg.Constants...)
+ }
+
+ pkg.Components = components
+ pkg.Variables = slices.CompactFunc(variables, func(l, r v1alpha1.InteractiveVariable) bool {
+ return l.Name == r.Name
+ })
+ pkg.Constants = slices.CompactFunc(constants, func(l, r v1alpha1.Constant) bool {
+ return l.Name == r.Name
+ })
+
+ return pkg, nil
+}
+
+func validateComponentCompose(c v1alpha1.ZarfComponent) error {
+ errs := []error{}
+ if c.Import.Path == "" && c.Import.URL == "" {
+ errs = append(errs, errors.New("neither a path nor a URL was provided"))
+ }
+ if c.Import.Path != "" && c.Import.URL != "" {
+ errs = append(errs, errors.New("both a path and a URL were provided"))
+ }
+ if c.Import.URL == "" && c.Import.Path != "" {
+ if filepath.IsAbs(c.Import.Path) {
+ errs = append(errs, errors.New("path cannot be an absolute path"))
+ }
+ }
+ if c.Import.URL != "" && c.Import.Path == "" {
+ ok := helpers.IsOCIURL(c.Import.URL)
+ if !ok {
+ errs = append(errs, errors.New("URL is not a valid OCI URL"))
+ }
+ }
+ return errors.Join(errs...)
+}
+
+func compatibleComponent(c v1alpha1.ZarfComponent, arch, flavor string) bool {
+ satisfiesArch := c.Only.Cluster.Architecture == "" || c.Only.Cluster.Architecture == arch
+ satisfiesFlavor := c.Only.Flavor == "" || c.Only.Flavor == flavor
+ return satisfiesArch && satisfiesFlavor
+}
+
+// TODO (phillebaba): Refactor package structure so that pullOCI can be used instead.
+func fetchOCISkeleton(ctx context.Context, component v1alpha1.ZarfComponent, packagePath string) (string, error) {
+ if component.Import.URL == "" {
+ return component.Import.Path, nil
+ }
+
+ name := component.Name
+ if component.Import.Name != "" {
+ name = component.Import.Name
+ }
+
+ absCachePath, err := config.GetAbsCachePath()
+ if err != nil {
+ return "", err
+ }
+ cache := filepath.Join(absCachePath, "oci")
+ if err := helpers.CreateDirectory(cache, helpers.ReadWriteExecuteUser); err != nil {
+ return "", err
+ }
+
+ // Get the descriptor for the component.
+ remote, err := zoci.NewRemote(component.Import.URL, zoci.PlatformForSkeleton())
+ if err != nil {
+ return "", err
+ }
+ _, err = remote.ResolveRoot(ctx)
+ if err != nil {
+ return "", fmt.Errorf("published skeleton package for %s does not exist: %w", component.Import.URL, err)
+ }
+ manifest, err := remote.FetchRoot(ctx)
+ if err != nil {
+ return "", err
+ }
+ componentDesc := manifest.Locate(filepath.Join(layout.ComponentsDir, fmt.Sprintf("%s.tar", name)))
+ if oci.IsEmptyDescriptor(componentDesc) {
+ return "", fmt.Errorf("component %s not found", name)
+ }
+
+ store, err := ocistore.New(cache)
+ if err != nil {
+ return "", err
+ }
+ exists, err := store.Exists(ctx, componentDesc)
+ if err != nil {
+ return "", err
+ }
+ if !exists {
+ err = remote.CopyToTarget(ctx, []ocispec.Descriptor{componentDesc}, store, remote.GetDefaultCopyOpts())
+ if err != nil {
+ return "", err
+ }
+ }
+ dir := filepath.Join(cache, "dirs", componentDesc.Digest.Encoded())
+ if err := helpers.CreateDirectory(dir, helpers.ReadWriteExecuteUser); err != nil {
+ return "", err
+ }
+ tu := archiver.Tar{
+ OverwriteExisting: true,
+ // removes // from the paths
+ StripComponents: 1,
+ }
+ tb := filepath.Join(cache, "blobs", "sha256", componentDesc.Digest.Encoded())
+ err = tu.Unarchive(tb, dir)
+ if err != nil {
+ return "", err
+ }
+ abs, err := filepath.Abs(packagePath)
+ if err != nil {
+ return "", err
+ }
+ rel, err := filepath.Rel(abs, dir)
+ if err != nil {
+ return "", err
+ }
+ return rel, nil
+}
+
+func overrideMetadata(comp v1alpha1.ZarfComponent, override v1alpha1.ZarfComponent) (v1alpha1.ZarfComponent, error) {
+ // Metadata
+ comp.Name = override.Name
+ comp.Default = override.Default
+ comp.Required = override.Required
+
+ // Override description if it was provided.
+ if override.Description != "" {
+ comp.Description = override.Description
+ }
+
+ if override.Only.LocalOS != "" {
+ if comp.Only.LocalOS != "" {
+ return v1alpha1.ZarfComponent{}, fmt.Errorf("component %q: \"only.localOS\" %q cannot be redefined as %q during compose", comp.Name, comp.Only.LocalOS, override.Only.LocalOS)
+ }
+ comp.Only.LocalOS = override.Only.LocalOS
+ }
+ return comp, nil
+}
+
+func overrideDeprecated(comp v1alpha1.ZarfComponent, override v1alpha1.ZarfComponent) v1alpha1.ZarfComponent {
+ // Override cosign key path if it was provided.
+ if override.DeprecatedCosignKeyPath != "" {
+ comp.DeprecatedCosignKeyPath = override.DeprecatedCosignKeyPath
+ }
+
+ comp.DeprecatedGroup = override.DeprecatedGroup
+
+ // Merge deprecated scripts for backwards compatibility with older zarf binaries.
+ comp.DeprecatedScripts.Before = append(comp.DeprecatedScripts.Before, override.DeprecatedScripts.Before...)
+ comp.DeprecatedScripts.After = append(comp.DeprecatedScripts.After, override.DeprecatedScripts.After...)
+
+ if override.DeprecatedScripts.Retry {
+ comp.DeprecatedScripts.Retry = true
+ }
+ if override.DeprecatedScripts.ShowOutput {
+ comp.DeprecatedScripts.ShowOutput = true
+ }
+ if override.DeprecatedScripts.TimeoutSeconds > 0 {
+ comp.DeprecatedScripts.TimeoutSeconds = override.DeprecatedScripts.TimeoutSeconds
+ }
+ return comp
+}
+
+func overrideActions(comp v1alpha1.ZarfComponent, override v1alpha1.ZarfComponent) v1alpha1.ZarfComponent {
+ comp.Actions.OnCreate.Defaults = override.Actions.OnCreate.Defaults
+ comp.Actions.OnCreate.Before = append(comp.Actions.OnCreate.Before, override.Actions.OnCreate.Before...)
+ comp.Actions.OnCreate.After = append(comp.Actions.OnCreate.After, override.Actions.OnCreate.After...)
+ comp.Actions.OnCreate.OnFailure = append(comp.Actions.OnCreate.OnFailure, override.Actions.OnCreate.OnFailure...)
+ comp.Actions.OnCreate.OnSuccess = append(comp.Actions.OnCreate.OnSuccess, override.Actions.OnCreate.OnSuccess...)
+
+ comp.Actions.OnDeploy.Defaults = override.Actions.OnDeploy.Defaults
+ comp.Actions.OnDeploy.Before = append(comp.Actions.OnDeploy.Before, override.Actions.OnDeploy.Before...)
+ comp.Actions.OnDeploy.After = append(comp.Actions.OnDeploy.After, override.Actions.OnDeploy.After...)
+ comp.Actions.OnDeploy.OnFailure = append(comp.Actions.OnDeploy.OnFailure, override.Actions.OnDeploy.OnFailure...)
+ comp.Actions.OnDeploy.OnSuccess = append(comp.Actions.OnDeploy.OnSuccess, override.Actions.OnDeploy.OnSuccess...)
+
+ comp.Actions.OnRemove.Defaults = override.Actions.OnRemove.Defaults
+ comp.Actions.OnRemove.Before = append(comp.Actions.OnRemove.Before, override.Actions.OnRemove.Before...)
+ comp.Actions.OnRemove.After = append(comp.Actions.OnRemove.After, override.Actions.OnRemove.After...)
+ comp.Actions.OnRemove.OnFailure = append(comp.Actions.OnRemove.OnFailure, override.Actions.OnRemove.OnFailure...)
+ comp.Actions.OnRemove.OnSuccess = append(comp.Actions.OnRemove.OnSuccess, override.Actions.OnRemove.OnSuccess...)
+ return comp
+}
+
+func overrideResources(comp v1alpha1.ZarfComponent, override v1alpha1.ZarfComponent) v1alpha1.ZarfComponent {
+ comp.DataInjections = append(comp.DataInjections, override.DataInjections...)
+ comp.Files = append(comp.Files, override.Files...)
+ comp.Images = append(comp.Images, override.Images...)
+ comp.Repos = append(comp.Repos, override.Repos...)
+
+ // Merge charts with the same name to keep them unique
+ for _, overrideChart := range override.Charts {
+ existing := false
+ for idx := range comp.Charts {
+ if comp.Charts[idx].Name == overrideChart.Name {
+ if overrideChart.Namespace != "" {
+ comp.Charts[idx].Namespace = overrideChart.Namespace
+ }
+ if overrideChart.ReleaseName != "" {
+ comp.Charts[idx].ReleaseName = overrideChart.ReleaseName
+ }
+ comp.Charts[idx].ValuesFiles = append(comp.Charts[idx].ValuesFiles, overrideChart.ValuesFiles...)
+ comp.Charts[idx].Variables = append(comp.Charts[idx].Variables, overrideChart.Variables...)
+ existing = true
+ }
+ }
+
+ if !existing {
+ comp.Charts = append(comp.Charts, overrideChart)
+ }
+ }
+
+ // Merge manifests with the same name to keep them unique
+ for _, overrideManifest := range override.Manifests {
+ existing := false
+ for idx := range comp.Manifests {
+ if comp.Manifests[idx].Name == overrideManifest.Name {
+ if overrideManifest.Namespace != "" {
+ comp.Manifests[idx].Namespace = overrideManifest.Namespace
+ }
+ comp.Manifests[idx].Files = append(comp.Manifests[idx].Files, overrideManifest.Files...)
+ comp.Manifests[idx].Kustomizations = append(comp.Manifests[idx].Kustomizations, overrideManifest.Kustomizations...)
+
+ existing = true
+ }
+ }
+
+ if !existing {
+ comp.Manifests = append(comp.Manifests, overrideManifest)
+ }
+ }
+
+ comp.HealthChecks = append(comp.HealthChecks, override.HealthChecks...)
+
+ return comp
+}
+
+func makePathRelativeTo(path, relativeTo string) string {
+ if helpers.IsURL(path) {
+ return path
+ }
+ return filepath.Join(relativeTo, path)
+}
+
+func fixPaths(child v1alpha1.ZarfComponent, relativeToHead, packagePath string) v1alpha1.ZarfComponent {
+ for fileIdx, file := range child.Files {
+ composed := makePathRelativeTo(file.Source, relativeToHead)
+ child.Files[fileIdx].Source = composed
+ }
+
+ for chartIdx, chart := range child.Charts {
+ for valuesIdx, valuesFile := range chart.ValuesFiles {
+ composed := makePathRelativeTo(valuesFile, relativeToHead)
+ child.Charts[chartIdx].ValuesFiles[valuesIdx] = composed
+ }
+ if child.Charts[chartIdx].LocalPath != "" {
+ composed := makePathRelativeTo(chart.LocalPath, relativeToHead)
+ child.Charts[chartIdx].LocalPath = composed
+ }
+ }
+
+ for manifestIdx, manifest := range child.Manifests {
+ for fileIdx, file := range manifest.Files {
+ composed := makePathRelativeTo(file, relativeToHead)
+ child.Manifests[manifestIdx].Files[fileIdx] = composed
+ }
+ for kustomizeIdx, kustomization := range manifest.Kustomizations {
+ composed := makePathRelativeTo(kustomization, relativeToHead)
+ // kustomizations can use non-standard urls, so we need to check if the composed path exists on the local filesystem
+ invalid := helpers.InvalidPath(filepath.Join(packagePath, composed))
+ if !invalid {
+ child.Manifests[manifestIdx].Kustomizations[kustomizeIdx] = composed
+ }
+ }
+ }
+
+ for dataInjectionsIdx, dataInjection := range child.DataInjections {
+ composed := makePathRelativeTo(dataInjection.Source, relativeToHead)
+ child.DataInjections[dataInjectionsIdx].Source = composed
+ }
+
+ defaultDir := child.Actions.OnCreate.Defaults.Dir
+ child.Actions.OnCreate.Before = fixActionPaths(child.Actions.OnCreate.Before, defaultDir, relativeToHead)
+ child.Actions.OnCreate.After = fixActionPaths(child.Actions.OnCreate.After, defaultDir, relativeToHead)
+ child.Actions.OnCreate.OnFailure = fixActionPaths(child.Actions.OnCreate.OnFailure, defaultDir, relativeToHead)
+ child.Actions.OnCreate.OnSuccess = fixActionPaths(child.Actions.OnCreate.OnSuccess, defaultDir, relativeToHead)
+
+ // deprecated
+ if child.DeprecatedCosignKeyPath != "" {
+ composed := makePathRelativeTo(child.DeprecatedCosignKeyPath, relativeToHead)
+ child.DeprecatedCosignKeyPath = composed
+ }
+
+ return child
+}
+
+// fixActionPaths takes a slice of actions and mutates the Dir to be relative to the head node
+func fixActionPaths(actions []v1alpha1.ZarfComponentAction, defaultDir, relativeToHead string) []v1alpha1.ZarfComponentAction {
+ for actionIdx, action := range actions {
+ var composed string
+ if action.Dir != nil {
+ composed = makePathRelativeTo(*action.Dir, relativeToHead)
+ } else {
+ composed = makePathRelativeTo(defaultDir, relativeToHead)
+ }
+ actions[actionIdx].Dir = &composed
+ }
+ return actions
+}
diff --git a/src/internal/packager2/layout/import_test.go b/src/internal/packager2/layout/import_test.go
new file mode 100644
index 0000000000..1508882059
--- /dev/null
+++ b/src/internal/packager2/layout/import_test.go
@@ -0,0 +1,199 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+package layout
+
+import (
+ "path/filepath"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+)
+
+func TestValidateComponentCompose(t *testing.T) {
+ t.Parallel()
+
+ abs, err := filepath.Abs(".")
+ require.NoError(t, err)
+
+ tests := []struct {
+ name string
+ component v1alpha1.ZarfComponent
+ expectedErrs []string
+ }{
+ {
+ name: "valid path",
+ component: v1alpha1.ZarfComponent{
+ Name: "component1",
+ Import: v1alpha1.ZarfComponentImport{
+ Path: "relative/path",
+ },
+ },
+ expectedErrs: nil,
+ },
+ {
+ name: "valid URL",
+ component: v1alpha1.ZarfComponent{
+ Name: "component2",
+ Import: v1alpha1.ZarfComponentImport{
+ URL: "oci://example.com/package:v0.0.1",
+ },
+ },
+ expectedErrs: nil,
+ },
+ {
+ name: "neither path nor URL provided",
+ component: v1alpha1.ZarfComponent{
+ Name: "neither",
+ },
+ expectedErrs: []string{
+ "neither a path nor a URL was provided",
+ },
+ },
+ {
+ name: "both path and URL provided",
+ component: v1alpha1.ZarfComponent{
+ Name: "both",
+ Import: v1alpha1.ZarfComponentImport{
+ Path: "relative/path",
+ URL: "https://example.com",
+ },
+ },
+ expectedErrs: []string{
+ "both a path and a URL were provided",
+ },
+ },
+ {
+ name: "absolute path provided",
+ component: v1alpha1.ZarfComponent{
+ Name: "abs-path",
+ Import: v1alpha1.ZarfComponentImport{
+ Path: abs,
+ },
+ },
+ expectedErrs: []string{
+ "path cannot be an absolute path",
+ },
+ },
+ {
+ name: "invalid URL provided",
+ component: v1alpha1.ZarfComponent{
+ Name: "bad-url",
+ Import: v1alpha1.ZarfComponentImport{
+ URL: "https://example.com",
+ },
+ },
+ expectedErrs: []string{
+ "URL is not a valid OCI URL",
+ },
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
+
+ err := validateComponentCompose(tt.component)
+ if tt.expectedErrs == nil {
+ require.NoError(t, err)
+ return
+ }
+ require.Error(t, err)
+ errs := strings.Split(err.Error(), "\n")
+ require.ElementsMatch(t, tt.expectedErrs, errs)
+ })
+ }
+}
+
+func TestCompatibleComponent(t *testing.T) {
+ t.Parallel()
+
+ tests := []struct {
+ name string
+ component v1alpha1.ZarfComponent
+ arch string
+ flavor string
+ expectedResult bool
+ }{
+ {
+ name: "set architecture and set flavor",
+ component: v1alpha1.ZarfComponent{
+ Only: v1alpha1.ZarfComponentOnlyTarget{
+ Cluster: v1alpha1.ZarfComponentOnlyCluster{
+ Architecture: "amd64",
+ },
+ Flavor: "foo",
+ },
+ },
+ arch: "amd64",
+ flavor: "foo",
+ expectedResult: true,
+ },
+ {
+ name: "set architecture and empty flavor",
+ component: v1alpha1.ZarfComponent{
+ Only: v1alpha1.ZarfComponentOnlyTarget{
+ Cluster: v1alpha1.ZarfComponentOnlyCluster{
+ Architecture: "amd64",
+ },
+ Flavor: "",
+ },
+ },
+ arch: "amd64",
+ flavor: "foo",
+ expectedResult: true,
+ },
+ {
+ name: "empty architecture and set flavor",
+ component: v1alpha1.ZarfComponent{
+ Only: v1alpha1.ZarfComponentOnlyTarget{
+ Cluster: v1alpha1.ZarfComponentOnlyCluster{
+ Architecture: "",
+ },
+ Flavor: "foo",
+ },
+ },
+ arch: "amd64",
+ flavor: "foo",
+ expectedResult: true,
+ },
+ {
+ name: "architecture miss match",
+ component: v1alpha1.ZarfComponent{
+ Only: v1alpha1.ZarfComponentOnlyTarget{
+ Cluster: v1alpha1.ZarfComponentOnlyCluster{
+ Architecture: "arm",
+ },
+ Flavor: "foo",
+ },
+ },
+ arch: "amd64",
+ flavor: "foo",
+ expectedResult: false,
+ },
+ {
+ name: "flavor miss match",
+ component: v1alpha1.ZarfComponent{
+ Only: v1alpha1.ZarfComponentOnlyTarget{
+ Cluster: v1alpha1.ZarfComponentOnlyCluster{
+ Architecture: "arm",
+ },
+ Flavor: "bar",
+ },
+ },
+ arch: "amd64",
+ flavor: "foo",
+ expectedResult: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ t.Parallel()
+
+ result := compatibleComponent(tt.component, tt.arch, tt.flavor)
+ require.Equal(t, tt.expectedResult, result)
+ })
+ }
+}
diff --git a/src/internal/packager2/layout/layout.go b/src/internal/packager2/layout/layout.go
new file mode 100644
index 0000000000..356bb9a77f
--- /dev/null
+++ b/src/internal/packager2/layout/layout.go
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package layout contains functions for inteacting the Zarf packages.
+package layout
+
+import (
+ goyaml "github.com/goccy/go-yaml"
+
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "github.com/zarf-dev/zarf/src/pkg/packager/deprecated"
+)
+
+// Constants used in the default package layout.
+const (
+ ZarfYAML = "zarf.yaml"
+ Signature = "zarf.yaml.sig"
+ Checksums = "checksums.txt"
+
+ ImagesDir = "images"
+ ComponentsDir = "components"
+
+ SBOMDir = "zarf-sbom"
+ SBOMTar = "sboms.tar"
+
+ IndexJSON = "index.json"
+ OCILayout = "oci-layout"
+)
+
+// ComponentDir is the type for the different directories in a component.
+type ComponentDir string
+
+// Different component directory types.
+const (
+ RepoComponentDir ComponentDir = "repos"
+ FilesComponentDir ComponentDir = "files"
+ ChartsComponentDir ComponentDir = "charts"
+ ManifestsComponentDir ComponentDir = "manifests"
+ DataComponentDir ComponentDir = "data"
+ ValuesComponentDir ComponentDir = "values"
+)
+
+// ParseZarfPackage parses the yaml passed as a byte slice and applies potential schema migrations.
+func ParseZarfPackage(b []byte) (v1alpha1.ZarfPackage, error) {
+ var pkg v1alpha1.ZarfPackage
+ err := goyaml.Unmarshal(b, &pkg)
+ if err != nil {
+ return v1alpha1.ZarfPackage{}, err
+ }
+ if len(pkg.Build.Migrations) > 0 {
+ for idx, component := range pkg.Components {
+ pkg.Components[idx], _ = deprecated.MigrateComponent(pkg.Build, component)
+ }
+ }
+ return pkg, nil
+}
diff --git a/src/internal/packager2/layout/package.go b/src/internal/packager2/layout/package.go
new file mode 100644
index 0000000000..966bcc07dd
--- /dev/null
+++ b/src/internal/packager2/layout/package.go
@@ -0,0 +1,304 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+package layout
+
+import (
+ "archive/tar"
+ "context"
+ "errors"
+ "fmt"
+ "io"
+ "io/fs"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/defenseunicorns/pkg/helpers/v2"
+ registryv1 "github.com/google/go-containerregistry/pkg/v1"
+ "github.com/google/go-containerregistry/pkg/v1/layout"
+ "github.com/mholt/archiver/v3"
+ ocispec "github.com/opencontainers/image-spec/specs-go/v1"
+ "github.com/sigstore/cosign/v2/cmd/cosign/cli/options"
+ "github.com/sigstore/cosign/v2/cmd/cosign/cli/verify"
+
+ "github.com/zarf-dev/zarf/src/api/v1alpha1"
+ "github.com/zarf-dev/zarf/src/config"
+ "github.com/zarf-dev/zarf/src/pkg/transform"
+ "github.com/zarf-dev/zarf/src/pkg/utils"
+)
+
+// PackageLayout manages the layout for a package.
+type PackageLayout struct {
+ dirPath string
+ Pkg v1alpha1.ZarfPackage
+}
+
+// PackageLayoutOptions are the options used when loading a package.
+type PackageLayoutOptions struct {
+ PublicKeyPath string
+ SkipSignatureValidation bool
+ IsPartial bool
+}
+
+// LoadFromTar unpacks the give compressed package and loads it.
+func LoadFromTar(ctx context.Context, tarPath string, opt PackageLayoutOptions) (*PackageLayout, error) {
+ dirPath, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
+ if err != nil {
+ return nil, err
+ }
+ err = archiver.Walk(tarPath, func(f archiver.File) error {
+ if f.IsDir() {
+ return nil
+ }
+ header, ok := f.Header.(*tar.Header)
+ if !ok {
+ return fmt.Errorf("expected header to be *tar.Header but was %T", f.Header)
+ }
+ // If path has nested directories we want to create them.
+ dir := filepath.Dir(header.Name)
+ if dir != "." {
+ err := os.MkdirAll(filepath.Join(dirPath, dir), helpers.ReadExecuteAllWriteUser)
+ if err != nil {
+ return err
+ }
+ }
+ dst, err := os.Create(filepath.Join(dirPath, header.Name))
+ if err != nil {
+ return err
+ }
+ defer dst.Close()
+ _, err = io.Copy(dst, f)
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+ if err != nil {
+ return nil, err
+ }
+ p, err := LoadFromDir(ctx, dirPath, opt)
+ if err != nil {
+ return nil, err
+ }
+ return p, nil
+}
+
+// LoadFromDir loads and validates a package from the given directory path.
+func LoadFromDir(ctx context.Context, dirPath string, opt PackageLayoutOptions) (*PackageLayout, error) {
+ b, err := os.ReadFile(filepath.Join(dirPath, ZarfYAML))
+ if err != nil {
+ return nil, err
+ }
+ pkg, err := ParseZarfPackage(b)
+ if err != nil {
+ return nil, err
+ }
+ pkgLayout := &PackageLayout{
+ dirPath: dirPath,
+ Pkg: pkg,
+ }
+ err = validatePackageIntegrity(pkgLayout, opt.IsPartial)
+ if err != nil {
+ return nil, err
+ }
+ err = validatePackageSignature(ctx, pkgLayout, opt.PublicKeyPath, opt.SkipSignatureValidation)
+ if err != nil {
+ return nil, err
+ }
+ return pkgLayout, nil
+}
+
+// Cleanup removes any temporary directories created.
+func (p *PackageLayout) Cleanup() error {
+ err := os.RemoveAll(p.dirPath)
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+// GetSBOM outputs the SBOM data from the package to the give destination path.
+func (p *PackageLayout) GetSBOM(destPath string) (string, error) {
+ path := filepath.Join(destPath, p.Pkg.Metadata.Name)
+ err := archiver.Extract(filepath.Join(p.dirPath, SBOMTar), "", path)
+ if err != nil {
+ return "", err
+ }
+ return path, nil
+}
+
+// GetComponentDir returns a path to the directory in the given component.
+func (p *PackageLayout) GetComponentDir(destPath, componentName string, ct ComponentDir) (string, error) {
+ sourcePath := filepath.Join(p.dirPath, ComponentsDir, fmt.Sprintf("%s.tar", componentName))
+ _, err := os.Stat(sourcePath)
+ if errors.Is(err, os.ErrNotExist) {
+ return "", fmt.Errorf("component %s does not exist in package: %w", componentName, err)
+ }
+ if err != nil {
+ return "", err
+ }
+ tmpDir, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
+ if err != nil {
+ return "", err
+ }
+ defer os.RemoveAll(tmpDir)
+ // TODO (phillebaba): We are not using archiver.Extract here because there is a bug in Windows where the files will not be extracted properly from nested directories.
+ // https://github.com/zarf-dev/zarf/issues/3051
+ err = archiver.Unarchive(sourcePath, tmpDir)
+ if err != nil {
+ return "", err
+ }
+ compPath := filepath.Join(tmpDir, componentName, string(ct))
+ _, err = os.Stat(compPath)
+ if errors.Is(err, os.ErrNotExist) {
+ return "", fmt.Errorf("component %s could not access a %s directory: %w", componentName, ct, err)
+ }
+ if err != nil {
+ return "", err
+ }
+ outPath := filepath.Join(destPath, string(ct))
+ err = os.Rename(compPath, outPath)
+ if err != nil {
+ return "", err
+ }
+ return outPath, nil
+}
+
+// GetImage returns the image with the given reference in the package layout.
+func (p *PackageLayout) GetImage(ref transform.Image) (registryv1.Image, error) {
+ // Use the manifest within the index.json to load the specific image we want
+ layoutPath := layout.Path(filepath.Join(p.dirPath, ImagesDir))
+ imgIdx, err := layoutPath.ImageIndex()
+ if err != nil {
+ return nil, err
+ }
+ idxManifest, err := imgIdx.IndexManifest()
+ if err != nil {
+ return nil, err
+ }
+ // Search through all the manifests within this package until we find the annotation that matches our ref
+ for _, manifest := range idxManifest.Manifests {
+ if manifest.Annotations[ocispec.AnnotationBaseImageName] == ref.Reference ||
+ // A backwards compatibility shim for older Zarf versions that would leave docker.io off of image annotations
+ (manifest.Annotations[ocispec.AnnotationBaseImageName] == ref.Path+ref.TagOrDigest && ref.Host == "docker.io") {
+ // This is the image we are looking for, load it and then return
+ return layoutPath.Image(manifest.Digest)
+ }
+ }
+ return nil, fmt.Errorf("unable to find the image %s", ref.Reference)
+}
+
+func validatePackageIntegrity(pkgLayout *PackageLayout, isPartial bool) error {
+ _, err := os.Stat(filepath.Join(pkgLayout.dirPath, ZarfYAML))
+ if err != nil {
+ return err
+ }
+ _, err = os.Stat(filepath.Join(pkgLayout.dirPath, Checksums))
+ if err != nil {
+ return err
+ }
+ err = helpers.SHAsMatch(filepath.Join(pkgLayout.dirPath, Checksums), pkgLayout.Pkg.Metadata.AggregateChecksum)
+ if err != nil {
+ return err
+ }
+
+ packageFiles := map[string]interface{}{}
+ err = filepath.Walk(pkgLayout.dirPath, func(path string, info fs.FileInfo, err error) error {
+ if info.IsDir() {
+ return nil
+ }
+ packageFiles[path] = nil
+ return err
+ })
+ if err != nil {
+ return err
+ }
+ // Remove files which are not in the checksums.
+ delete(packageFiles, filepath.Join(pkgLayout.dirPath, ZarfYAML))
+ delete(packageFiles, filepath.Join(pkgLayout.dirPath, Checksums))
+ delete(packageFiles, filepath.Join(pkgLayout.dirPath, Signature))
+
+ b, err := os.ReadFile(filepath.Join(pkgLayout.dirPath, Checksums))
+ if err != nil {
+ return err
+ }
+ lines := strings.Split(string(b), "\n")
+ for _, line := range lines {
+ // If the line is empty (i.e. there is no checksum) simply skip it, this can result from a package with no images/components.
+ if line == "" {
+ continue
+ }
+
+ split := strings.Split(line, " ")
+ if len(split) != 2 {
+ return fmt.Errorf("invalid checksum line: %s", line)
+ }
+ sha := split[0]
+ rel := split[1]
+ if sha == "" || rel == "" {
+ return fmt.Errorf("invalid checksum line: %s", line)
+ }
+
+ path := filepath.Join(pkgLayout.dirPath, rel)
+ _, ok := packageFiles[path]
+ if !ok && isPartial {
+ delete(packageFiles, path)
+ continue
+ }
+ if !ok {
+ return fmt.Errorf("file %s from checksum missing in layout", rel)
+ }
+ err = helpers.SHAsMatch(path, sha)
+ if err != nil {
+ return err
+ }
+ delete(packageFiles, path)
+ }
+
+ if len(packageFiles) > 0 {
+ // TODO (phillebaba): Replace with maps.Keys after upgrading to Go 1.23.
+ filePaths := []string{}
+ for k := range packageFiles {
+ filePaths = append(filePaths, k)
+ }
+ return fmt.Errorf("package contains additional files not present in the checksum %s", strings.Join(filePaths, ", "))
+ }
+
+ return nil
+}
+
+func validatePackageSignature(ctx context.Context, pkgLayout *PackageLayout, publicKeyPath string, skipSignatureValidation bool) error {
+ if skipSignatureValidation {
+ return nil
+ }
+
+ signaturePath := filepath.Join(pkgLayout.dirPath, Signature)
+ sigExist := true
+ _, err := os.Stat(signaturePath)
+ if err != nil {
+ sigExist = false
+ }
+ if !sigExist && publicKeyPath == "" {
+ // Nobody was expecting a signature, so we can just return
+ return nil
+ } else if sigExist && publicKeyPath == "" {
+ return errors.New("package is signed but no key was provided")
+ } else if !sigExist && publicKeyPath != "" {
+ return errors.New("a key was provided but the package is not signed")
+ }
+
+ keyOptions := options.KeyOpts{KeyRef: publicKeyPath}
+ cmd := &verify.VerifyBlobCmd{
+ KeyOpts: keyOptions,
+ SigRef: signaturePath,
+ IgnoreSCT: true,
+ Offline: true,
+ IgnoreTlog: true,
+ }
+ err = cmd.Exec(ctx, filepath.Join(pkgLayout.dirPath, ZarfYAML))
+ if err != nil {
+ return fmt.Errorf("package signature did not match the provided key: %w", err)
+ }
+ return nil
+}
diff --git a/src/internal/packager2/layout/package_test.go b/src/internal/packager2/layout/package_test.go
new file mode 100644
index 0000000000..79fd057429
--- /dev/null
+++ b/src/internal/packager2/layout/package_test.go
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+package layout
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/zarf-dev/zarf/src/pkg/transform"
+ "github.com/zarf-dev/zarf/src/test/testutil"
+)
+
+func TestPackageLayout(t *testing.T) {
+ t.Parallel()
+
+ ctx := testutil.TestContext(t)
+
+ pkgLayout, err := LoadFromTar(ctx, "../testdata/zarf-package-test-amd64-0.0.1.tar.zst", PackageLayoutOptions{})
+ require.NoError(t, err)
+
+ require.Equal(t, "test", pkgLayout.Pkg.Metadata.Name)
+ require.Equal(t, "0.0.1", pkgLayout.Pkg.Metadata.Version)
+
+ tmpDir := t.TempDir()
+ manifestDir, err := pkgLayout.GetComponentDir(tmpDir, "test", ManifestsComponentDir)
+ require.NoError(t, err)
+ expected, err := os.ReadFile("../testdata/deployment.yaml")
+ require.NoError(t, err)
+ b, err := os.ReadFile(filepath.Join(manifestDir, "deployment-0.yaml"))
+ require.NoError(t, err)
+ require.Equal(t, expected, b)
+
+ _, err = pkgLayout.GetComponentDir(t.TempDir(), "does-not-exist", ManifestsComponentDir)
+ require.ErrorContains(t, err, "component does-not-exist does not exist in package")
+
+ _, err = pkgLayout.GetComponentDir(t.TempDir(), "test", FilesComponentDir)
+ require.ErrorContains(t, err, "component test could not access a files directory")
+
+ tmpDir = t.TempDir()
+ sbomPath, err := pkgLayout.GetSBOM(tmpDir)
+ require.NoError(t, err)
+ require.FileExists(t, filepath.Join(sbomPath, "compare.html"))
+
+ ref, err := transform.ParseImageRef("docker.io/library/alpine:3.20")
+ require.NoError(t, err)
+ img, err := pkgLayout.GetImage(ref)
+ require.NoError(t, err)
+ dgst, err := img.Digest()
+ require.NoError(t, err)
+ require.Equal(t, "sha256:33735bd63cf84d7e388d9f6d297d348c523c044410f553bd878c6d7829612735", dgst.String())
+}
diff --git a/src/internal/packager2/layout/testdata/cosign.key b/src/internal/packager2/layout/testdata/cosign.key
new file mode 100644
index 0000000000..90fe1f9dfb
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/cosign.key
@@ -0,0 +1,11 @@
+-----BEGIN ENCRYPTED SIGSTORE PRIVATE KEY-----
+eyJrZGYiOnsibmFtZSI6InNjcnlwdCIsInBhcmFtcyI6eyJOIjo2NTUzNiwiciI6
+OCwicCI6MX0sInNhbHQiOiJEM1h4S3huclZqU3JjSkdvYTZIcTVWYkEwYUhwUldW
+akJKR3F2L0pHZDMwPSJ9LCJjaXBoZXIiOnsibmFtZSI6Im5hY2wvc2VjcmV0Ym94
+Iiwibm9uY2UiOiJSOGZWZzlIczVIdFZKWENDVmJnODhwVFFObTRsQnh0RCJ9LCJj
+aXBoZXJ0ZXh0IjoiclNHS3A0RGpMQzdnd0RnU0F6SnIwQXhVbmxxeG1EVVZ2ci9p
+MzRHTk8vaGRCblRTVEpQYU5YRWJiZDd3R1hDMlVUeU9QOS92Q2NBUUI0dVBFNnZD
+V3ZzSFVwOWYyZlJoazY1TXVFQkFLWStVaE1uQ0QzcGlueWhGNktOUmxEaG1tZCtZ
+SnI4ZW4rczBMZnFQREJWRkRFb2lLVlJENEMxYVF5eTdveGJJOEZDWG9FSStTd284
+WnpsK2F1anpxdlYxTlg0NHJaeU9sZVRyV3c9PSJ9
+-----END ENCRYPTED SIGSTORE PRIVATE KEY-----
diff --git a/src/internal/packager2/layout/testdata/cosign.pub b/src/internal/packager2/layout/testdata/cosign.pub
new file mode 100644
index 0000000000..da98deb626
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/cosign.pub
@@ -0,0 +1,4 @@
+-----BEGIN PUBLIC KEY-----
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWa56xczL+HvqDx5tUg9ThYzIAGcc
+Geic52+Ajs65OgUKePRK49fki3cSZpqV1yCfqHUPnU+SaQjAiCPK3SAW9g==
+-----END PUBLIC KEY-----
diff --git a/src/internal/packager2/layout/testdata/zarf-package/archive.tar b/src/internal/packager2/layout/testdata/zarf-package/archive.tar
new file mode 100644
index 0000000000..cbbd80680c
Binary files /dev/null and b/src/internal/packager2/layout/testdata/zarf-package/archive.tar differ
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/.helmignore b/src/internal/packager2/layout/testdata/zarf-package/chart/.helmignore
new file mode 100644
index 0000000000..f0c1319444
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/.helmignore
@@ -0,0 +1,21 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/Chart.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/Chart.yaml
new file mode 100644
index 0000000000..0ae3bfd45f
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/Chart.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+version: 6.4.0
+appVersion: 6.4.0
+name: podinfo
+engine: gotpl
+description: Podinfo Helm chart for Kubernetes
+home: https://github.com/stefanprodan/podinfo
+maintainers:
+- email: stefanprodan@users.noreply.github.com
+ name: stefanprodan
+sources:
+- https://github.com/stefanprodan/podinfo
+kubeVersion: ">=1.23.0-0"
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/LICENSE b/src/internal/packager2/layout/testdata/zarf-package/chart/LICENSE
new file mode 100644
index 0000000000..1b92ec15f9
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2018 Stefan Prodan. All rights reserved.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/NOTICE b/src/internal/packager2/layout/testdata/zarf-package/chart/NOTICE
new file mode 100644
index 0000000000..5b0414f8c2
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/NOTICE
@@ -0,0 +1 @@
+All files from this chart are from https://github.com/stefanprodan/podinfo/tree/6.4.0/charts/podinfo.
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/NOTES.txt b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/NOTES.txt
new file mode 100644
index 0000000000..d8329725ef
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/NOTES.txt
@@ -0,0 +1,20 @@
+1. Get the application URL by running these commands:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+ {{- range .paths }}
+ http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+ {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+ export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "podinfo.fullname" . }})
+ export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
+ echo http://$NODE_IP:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+ NOTE: It may take a few minutes for the LoadBalancer IP to be available.
+ You can watch the status of by running 'kubectl get svc -w {{ template "podinfo.fullname" . }}'
+ export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "podinfo.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
+ echo http://$SERVICE_IP:{{ .Values.service.externalPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+ echo "Visit http://127.0.0.1:8080 to use your application"
+ kubectl -n {{ .Release.Namespace }} port-forward deploy/{{ template "podinfo.fullname" . }} 8080:{{ .Values.service.externalPort }}
+{{- end }}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/_helpers.tpl b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/_helpers.tpl
new file mode 100644
index 0000000000..1f5a052871
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/_helpers.tpl
@@ -0,0 +1,69 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "podinfo.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "podinfo.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "podinfo.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "podinfo.labels" -}}
+helm.sh/chart: {{ include "podinfo.chart" . }}
+{{ include "podinfo.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "podinfo.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "podinfo.fullname" . }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "podinfo.serviceAccountName" -}}
+{{- if .Values.serviceAccount.enabled }}
+{{- default (include "podinfo.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create the name of the tls secret for secure port
+*/}}
+{{- define "podinfo.tlsSecretName" -}}
+{{- $fullname := include "podinfo.fullname" . -}}
+{{- default (printf "%s-tls" $fullname) .Values.tls.secretName }}
+{{- end }}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/deployment.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/deployment.yaml
new file mode 100644
index 0000000000..87ed373534
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/deployment.yaml
@@ -0,0 +1,205 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ template "podinfo.fullname" . }}
+ labels:
+ {{- include "podinfo.labels" . | nindent 4 }}
+spec:
+ {{- if not .Values.hpa.enabled }}
+ replicas: {{ .Values.replicaCount }}
+ {{- end }}
+ strategy:
+ type: RollingUpdate
+ rollingUpdate:
+ maxUnavailable: 1
+ selector:
+ matchLabels:
+ {{- include "podinfo.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ labels:
+ {{- include "podinfo.selectorLabels" . | nindent 8 }}
+ annotations:
+ prometheus.io/scrape: "true"
+ prometheus.io/port: "{{ .Values.service.httpPort }}"
+ {{- range $key, $value := .Values.podAnnotations }}
+ {{ $key }}: {{ $value | quote }}
+ {{- end }}
+ spec:
+ terminationGracePeriodSeconds: 30
+ {{- if .Values.serviceAccount.enabled }}
+ serviceAccountName: {{ template "podinfo.serviceAccountName" . }}
+ {{- end }}
+ containers:
+ - name: {{ .Chart.Name }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ {{- if .Values.securityContext }}
+ securityContext:
+ {{- toYaml .Values.securityContext | nindent 12 }}
+ {{- else if (or .Values.service.hostPort .Values.tls.hostPort) }}
+ securityContext:
+ allowPrivilegeEscalation: true
+ capabilities:
+ drop:
+ - ALL
+ add:
+ - NET_BIND_SERVICE
+ {{- end }}
+ command:
+ - ./podinfo
+ - --port={{ .Values.service.httpPort | default 9898 }}
+ {{- if .Values.host }}
+ - --host={{ .Values.host }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - --secure-port={{ .Values.tls.port }}
+ {{- end }}
+ {{- if .Values.tls.certPath }}
+ - --cert-path={{ .Values.tls.certPath }}
+ {{- end }}
+ {{- if .Values.service.metricsPort }}
+ - --port-metrics={{ .Values.service.metricsPort }}
+ {{- end }}
+ {{- if .Values.service.grpcPort }}
+ - --grpc-port={{ .Values.service.grpcPort }}
+ {{- end }}
+ {{- if .Values.service.grpcService }}
+ - --grpc-service-name={{ .Values.service.grpcService }}
+ {{- end }}
+ {{- range .Values.backends }}
+ - --backend-url={{ . }}
+ {{- end }}
+ {{- if .Values.cache }}
+ - --cache-server={{ .Values.cache }}
+ {{- else if .Values.redis.enabled }}
+ - --cache-server=tcp://{{ template "podinfo.fullname" . }}-redis:6379
+ {{- end }}
+ - --level={{ .Values.logLevel }}
+ - --random-delay={{ .Values.faults.delay }}
+ - --random-error={{ .Values.faults.error }}
+ {{- if .Values.faults.unhealthy }}
+ - --unhealthy
+ {{- end }}
+ {{- if .Values.faults.unready }}
+ - --unready
+ {{- end }}
+ {{- if .Values.h2c.enabled }}
+ - --h2c
+ {{- end }}
+ env:
+ {{- if .Values.ui.message }}
+ - name: PODINFO_UI_MESSAGE
+ value: {{ quote .Values.ui.message }}
+ {{- end }}
+ {{- if .Values.ui.logo }}
+ - name: PODINFO_UI_LOGO
+ value: {{ .Values.ui.logo }}
+ {{- end }}
+ {{- if .Values.ui.color }}
+ - name: PODINFO_UI_COLOR
+ value: {{ quote .Values.ui.color }}
+ {{- end }}
+ {{- if .Values.backend }}
+ - name: PODINFO_BACKEND_URL
+ value: {{ .Values.backend }}
+ {{- end }}
+ ports:
+ - name: http
+ containerPort: {{ .Values.service.httpPort | default 9898 }}
+ protocol: TCP
+ {{- if .Values.service.hostPort }}
+ hostPort: {{ .Values.service.hostPort }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - name: https
+ containerPort: {{ .Values.tls.port | default 9899 }}
+ protocol: TCP
+ {{- if .Values.tls.hostPort }}
+ hostPort: {{ .Values.tls.hostPort }}
+ {{- end }}
+ {{- end }}
+ {{- if .Values.service.metricsPort }}
+ - name: http-metrics
+ containerPort: {{ .Values.service.metricsPort }}
+ protocol: TCP
+ {{- end }}
+ {{- if .Values.service.grpcPort }}
+ - name: grpc
+ containerPort: {{ .Values.service.grpcPort }}
+ protocol: TCP
+ {{- end }}
+ {{- if .Values.probes.startup.enable }}
+ startupProbe:
+ exec:
+ command:
+ - podcli
+ - check
+ - http
+ - localhost:{{ .Values.service.httpPort | default 9898 }}/healthz
+ {{- with .Values.probes.startup }}
+ initialDelaySeconds: {{ .initialDelaySeconds | default 1 }}
+ timeoutSeconds: {{ .timeoutSeconds | default 5 }}
+ failureThreshold: {{ .failureThreshold | default 3 }}
+ successThreshold: {{ .successThreshold | default 1 }}
+ periodSeconds: {{ .periodSeconds | default 10 }}
+ {{- end }}
+ {{- end }}
+ livenessProbe:
+ exec:
+ command:
+ - podcli
+ - check
+ - http
+ - localhost:{{ .Values.service.httpPort | default 9898 }}/healthz
+ {{- with .Values.probes.liveness }}
+ initialDelaySeconds: {{ .initialDelaySeconds | default 1 }}
+ timeoutSeconds: {{ .timeoutSeconds | default 5 }}
+ failureThreshold: {{ .failureThreshold | default 3 }}
+ successThreshold: {{ .successThreshold | default 1 }}
+ periodSeconds: {{ .periodSeconds | default 10 }}
+ {{- end }}
+ readinessProbe:
+ exec:
+ command:
+ - podcli
+ - check
+ - http
+ - localhost:{{ .Values.service.httpPort | default 9898 }}/readyz
+ {{- with .Values.probes.readiness }}
+ initialDelaySeconds: {{ .initialDelaySeconds | default 1 }}
+ timeoutSeconds: {{ .timeoutSeconds | default 5 }}
+ failureThreshold: {{ .failureThreshold | default 3 }}
+ successThreshold: {{ .successThreshold | default 1 }}
+ periodSeconds: {{ .periodSeconds | default 10 }}
+ {{- end }}
+ volumeMounts:
+ - name: data
+ mountPath: /data
+ {{- if .Values.tls.enabled }}
+ - name: tls
+ mountPath: {{ .Values.tls.certPath | default "/data/cert" }}
+ readOnly: true
+ {{- end }}
+ resources:
+{{ toYaml .Values.resources | indent 12 }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+{{ toYaml . | indent 8 }}
+ {{- end }}
+ volumes:
+ - name: data
+ emptyDir: {}
+ {{- if .Values.tls.enabled }}
+ - name: tls
+ secret:
+ secretName: {{ template "podinfo.tlsSecretName" . }}
+ {{- end }}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/hpa.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/hpa.yaml
new file mode 100644
index 0000000000..f2fb8df1b8
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/hpa.yaml
@@ -0,0 +1,41 @@
+{{- if .Values.hpa.enabled -}}
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: {{ template "podinfo.fullname" . }}
+ labels:
+ {{- include "podinfo.labels" . | nindent 4 }}
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: {{ template "podinfo.fullname" . }}
+ minReplicas: {{ .Values.replicaCount }}
+ maxReplicas: {{ .Values.hpa.maxReplicas }}
+ metrics:
+ {{- if .Values.hpa.cpu }}
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.hpa.cpu }}
+ {{- end }}
+ {{- if .Values.hpa.memory }}
+ - type: Resource
+ resource:
+ name: memory
+ target:
+ type: AverageValue
+ averageValue: {{ .Values.hpa.memory }}
+ {{- end }}
+ {{- if .Values.hpa.requests }}
+ - type: Pods
+ pods:
+ metric:
+ name: http_requests
+ target:
+ type: AverageValue
+ averageValue: {{ .Values.hpa.requests }}
+ {{- end }}
+{{- end }}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/ingress.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/ingress.yaml
new file mode 100644
index 0000000000..93f9ae437a
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/ingress.yaml
@@ -0,0 +1,41 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "podinfo.fullname" . -}}
+{{- $svcPort := .Values.service.externalPort -}}
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: {{ $fullName }}
+ labels:
+ {{- include "podinfo.labels" . | nindent 4 }}
+ {{- with .Values.ingress.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ ingressClassName: {{ .Values.ingress.className }}
+ {{- if .Values.ingress.tls }}
+ tls:
+ {{- range .Values.ingress.tls }}
+ - hosts:
+ {{- range .hosts }}
+ - {{ . | quote }}
+ {{- end }}
+ secretName: {{ .secretName }}
+ {{- end }}
+ {{- end }}
+ rules:
+ {{- range .Values.ingress.hosts }}
+ - host: {{ .host | quote }}
+ http:
+ paths:
+ {{- range .paths }}
+ - path: {{ .path }}
+ pathType: {{ .pathType }}
+ backend:
+ service:
+ name: {{ $fullName }}
+ port:
+ number: {{ $svcPort }}
+ {{- end }}
+ {{- end }}
+{{- end }}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/service.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/service.yaml
new file mode 100644
index 0000000000..6014e78853
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/service.yaml
@@ -0,0 +1,36 @@
+{{- if .Values.service.enabled -}}
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ template "podinfo.fullname" . }}
+ labels:
+ {{- include "podinfo.labels" . | nindent 4 }}
+{{- with .Values.service.annotations }}
+ annotations:
+{{ toYaml . | indent 4 }}
+{{- end }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.externalPort }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ {{- if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }}
+ nodePort: {{ .Values.service.nodePort }}
+ {{- end }}
+ {{- if .Values.tls.enabled }}
+ - port: {{ .Values.tls.port | default 9899 }}
+ targetPort: https
+ protocol: TCP
+ name: https
+ {{- end }}
+ {{- if .Values.service.grpcPort }}
+ - port: {{ .Values.service.grpcPort }}
+ targetPort: grpc
+ protocol: TCP
+ name: grpc
+ {{- end }}
+ selector:
+ {{- include "podinfo.selectorLabels" . | nindent 4 }}
+{{- end }}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/templates/serviceaccount.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/serviceaccount.yaml
new file mode 100644
index 0000000000..d39b798967
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.enabled -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ template "podinfo.serviceAccountName" . }}
+ labels:
+ {{- include "podinfo.labels" . | nindent 4 }}
+{{- with .Values.serviceAccount.imagePullSecrets }}
+imagePullSecrets:
+ {{- toYaml . | nindent 2 }}
+{{- end -}}
+{{- end -}}
diff --git a/src/internal/packager2/layout/testdata/zarf-package/chart/values.yaml b/src/internal/packager2/layout/testdata/zarf-package/chart/values.yaml
new file mode 100644
index 0000000000..89b2bd9129
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/chart/values.yaml
@@ -0,0 +1,164 @@
+# Default values for podinfo.
+
+replicaCount: 1
+logLevel: info
+host: #0.0.0.0
+backend: #http://backend-podinfo:9898/echo
+backends: []
+
+image:
+ repository: ghcr.io/stefanprodan/podinfo
+ tag: 6.4.0
+ pullPolicy: IfNotPresent
+
+ui:
+ color: "#34577c"
+ message: ""
+ logo: ""
+
+# failure conditions
+faults:
+ delay: false
+ error: false
+ unhealthy: false
+ unready: false
+ testFail: false
+ testTimeout: false
+
+# Kubernetes Service settings
+service:
+ enabled: true
+ annotations: {}
+ type: ClusterIP
+ metricsPort: 9797
+ httpPort: 9898
+ externalPort: 9898
+ grpcPort: 9999
+ grpcService: podinfo
+ nodePort: 31198
+ # the port used to bind the http port to the host
+ # NOTE: requires privileged container with NET_BIND_SERVICE capability -- this is useful for testing
+ # in local clusters such as kind without port forwarding
+ hostPort:
+
+# enable h2c protocol (non-TLS version of HTTP/2)
+h2c:
+ enabled: false
+
+# enable tls on the podinfo service
+tls:
+ enabled: false
+ # the name of the secret used to mount the certificate key pair
+ secretName:
+ # the path where the certificate key pair will be mounted
+ certPath: /data/cert
+ # the port used to host the tls endpoint on the service
+ port: 9899
+ # the port used to bind the tls port to the host
+ # NOTE: requires privileged container with NET_BIND_SERVICE capability -- this is useful for testing
+ # in local clusters such as kind without port forwarding
+ hostPort:
+
+# create a certificate manager certificate (cert-manager required)
+certificate:
+ create: false
+ # the issuer used to issue the certificate
+ issuerRef:
+ kind: ClusterIssuer
+ name: self-signed
+ # the hostname / subject alternative names for the certificate
+ dnsNames:
+ - podinfo
+
+# metrics-server add-on required
+hpa:
+ enabled: false
+ maxReplicas: 10
+ # average total CPU usage per pod (1-100)
+ cpu:
+ # average memory usage per pod (100Mi-1Gi)
+ memory:
+ # average http requests per second per pod (k8s-prometheus-adapter)
+ requests:
+
+# Redis address in the format tcp://:
+cache: ""
+# Redis deployment
+redis:
+ enabled: false
+ repository: redis
+ tag: 7.0.7
+
+serviceAccount:
+ # Specifies whether a service account should be created
+ enabled: false
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name:
+ # List of image pull secrets if pulling from private registries
+ imagePullSecrets: []
+
+# set container security context
+securityContext: {}
+
+ingress:
+ enabled: false
+ className: ""
+ annotations: {}
+ # kubernetes.io/ingress.class: nginx
+ # kubernetes.io/tls-acme: "true"
+ hosts:
+ - host: podinfo.local
+ paths:
+ - path: /
+ pathType: ImplementationSpecific
+ tls: []
+ # - secretName: chart-example-tls
+ # hosts:
+ # - chart-example.local
+
+linkerd:
+ profile:
+ enabled: false
+
+# create Prometheus Operator monitor
+serviceMonitor:
+ enabled: false
+ interval: 15s
+ additionalLabels: {}
+
+resources:
+ limits:
+ requests:
+ cpu: 1m
+ memory: 16Mi
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
+
+podAnnotations: {}
+
+# https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes
+probes:
+ readiness:
+ initialDelaySeconds: 1
+ timeoutSeconds: 5
+ failureThreshold: 3
+ successThreshold: 1
+ periodSeconds: 10
+ liveness:
+ initialDelaySeconds: 1
+ timeoutSeconds: 5
+ failureThreshold: 3
+ successThreshold: 1
+ periodSeconds: 10
+ startup:
+ enable: false
+ initialDelaySeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 20
+ successThreshold: 1
+ periodSeconds: 10
diff --git a/src/internal/packager2/layout/testdata/zarf-package/data.txt b/src/internal/packager2/layout/testdata/zarf-package/data.txt
new file mode 100644
index 0000000000..557db03de9
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/data.txt
@@ -0,0 +1 @@
+Hello World
diff --git a/src/internal/packager2/layout/testdata/zarf-package/deployment.yaml b/src/internal/packager2/layout/testdata/zarf-package/deployment.yaml
new file mode 100644
index 0000000000..685c17aa68
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/deployment.yaml
@@ -0,0 +1,21 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nginx-deployment
+ labels:
+ app: nginx
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: nginx
+ template:
+ metadata:
+ labels:
+ app: nginx
+ spec:
+ containers:
+ - name: nginx
+ image: nginx:1.14.2
+ ports:
+ - containerPort: 80
diff --git a/src/internal/packager2/layout/testdata/zarf-package/injection/data.txt b/src/internal/packager2/layout/testdata/zarf-package/injection/data.txt
new file mode 100644
index 0000000000..1269488f7f
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/injection/data.txt
@@ -0,0 +1 @@
+data
diff --git a/src/internal/packager2/layout/testdata/zarf-package/kustomize/kustomization.yaml b/src/internal/packager2/layout/testdata/zarf-package/kustomize/kustomization.yaml
new file mode 100644
index 0000000000..736967b1a3
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/kustomize/kustomization.yaml
@@ -0,0 +1,2 @@
+resources:
+ - namespace.yaml
diff --git a/src/internal/packager2/layout/testdata/zarf-package/kustomize/namespace.yaml b/src/internal/packager2/layout/testdata/zarf-package/kustomize/namespace.yaml
new file mode 100644
index 0000000000..7c265c0193
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/kustomize/namespace.yaml
@@ -0,0 +1,4 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: test
diff --git a/src/internal/packager2/layout/testdata/zarf-package/values.yaml b/src/internal/packager2/layout/testdata/zarf-package/values.yaml
new file mode 100644
index 0000000000..f86a45afe7
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/values.yaml
@@ -0,0 +1,5 @@
+ui:
+ color: "#0d133d"
+ message: "greetings from podinfo (as deployed by Zarf)"
+ # Replace the githubusercontent URL for the airgap
+ logo: "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIFZlY3Rvcm5hdG9yIChodHRwOi8vdmVjdG9ybmF0b3IuaW8vKSAtLT4KCjxzdmcKICAgaGVpZ2h0PSI2NCIKICAgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIgogICBzdHlsZT0iY2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgd2lkdGg9IjY0IgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpZD0ic3ZnODY1IgogICBzb2RpcG9kaTpkb2NuYW1lPSJaYXJmLXJlZG8uc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjIuMiAoYjBhODQ4NjU0MSwgMjAyMi0xMi0wMSkiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnZlY3Rvcm5hdG9yPSJodHRwOi8vdmVjdG9ybmF0b3IuaW8iPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgaWQ9Im5hbWVkdmlldzg2NyIKICAgcGFnZWNvbG9yPSIjNTA1MDUwIgogICBib3JkZXJjb2xvcj0iI2VlZWVlZSIKICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjAiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIwIgogICBpbmtzY2FwZTpkZXNrY29sb3I9IiM1MDUwNTAiCiAgIHNob3dncmlkPSJmYWxzZSIKICAgaW5rc2NhcGU6em9vbT0iMTYiCiAgIGlua3NjYXBlOmN4PSIzMi42NTYyNSIKICAgaW5rc2NhcGU6Y3k9IjM2LjUiCiAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMjU2MCIKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTM3MSIKICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgIGlua3NjYXBlOndpbmRvdy15PSIzMiIKICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzQzNjEiIC8+CjxkZWZzCiAgIGlkPSJkZWZzNjE0Ij4KPHBhdGgKICAgZD0ibSA0OC45MTY2LDI1LjYzMDIgYyAwLjc1ODYsMC4zODc5IDQuMzU1MiwxLjk3MjQgOC44NDc4LC0wLjE3OTggLTAuNDAxNSwtMC42MzY2IC0xLjkxMTYsLTIuNjgzNSAtNC45OTI1LC00LjA2NSAtMS4zNTQ1LC0wLjQyMjEgLTIuNTIxOSwtMC40MzI2IC0zLjM4MzYsLTAuMjAwNiAtMS4yMTE4LDEuNDM4MyAtMS40Nzk2LDIuOTc4OSAtMC40NzE3LDQuNDQ1NCB6IgogICBpZD0iRmlsbCIgLz4KPGxpbmVhckdyYWRpZW50CiAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wNjA0OTU1LDAuMDkwNzQzMikiCiAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICBpZD0iTGluZWFyR3JhZGllbnQiCiAgIHgxPSIzMS4xOTYxIgogICB4Mj0iMzEuMTk2MSIKICAgeTE9IjYxLjM3NjQ5OSIKICAgeTI9IjEuODA0OTk5OSI+CjxzdG9wCiAgIG9mZnNldD0iMCIKICAgc3RvcC1jb2xvcj0iIzdiZDVmNSIKICAgaWQ9InN0b3A1NTAiIC8+CjxzdG9wCiAgIG9mZnNldD0iMSIKICAgc3RvcC1jb2xvcj0iI2RjY2ZlNSIKICAgaWQ9InN0b3A1NTIiIC8+CjwvbGluZWFyR3JhZGllbnQ+CjxwYXRoCiAgIGQ9Im0gNDkuMzczNCwyMC42NjA4IGMgMC44NTA3LDAuMjg5NyA2LjAxMzcsMS42NzI1IDExLjE3NTEsLTQuOTYxNSAtMS41OTM0LC0xLjIzNTYgLTkuMDkzOCwtMi4zNzA5IC0xMi4xODAyLDAuNTM4IC0xLjEyMjYsMS41MDczIC0wLjk2MjEsMy4yNTg3IDEuMDAzNiw0LjM5OTMgeiIKICAgaWQ9IkZpbGxfMiIgLz4KPGxpbmVhckdyYWRpZW50CiAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wNjMyNDQ1LC0wLjAwNTQ5OTU5KSIKICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgIGlkPSJMaW5lYXJHcmFkaWVudF8yIgogICB4MT0iMzEuMTk2MSIKICAgeDI9IjMxLjE5NjEiCiAgIHkxPSI2MS4zNzY0OTkiCiAgIHkyPSIxLjgwNDk5OTkiPgo8c3RvcAogICBvZmZzZXQ9IjAiCiAgIHN0b3AtY29sb3I9IiM3YmQ1ZjUiCiAgIGlkPSJzdG9wNTU2IiAvPgo8c3RvcAogICBvZmZzZXQ9IjEiCiAgIHN0b3AtY29sb3I9IiNkY2NmZTUiCiAgIGlkPSJzdG9wNTU4IiAvPgo8L2xpbmVhckdyYWRpZW50Pgo8cGF0aAogICBkPSJNIDQ4LjE3NTYsMTUuODIzMyBDIDU4LjM0ODYsMTMuMzc4NSA1OS4zNzc5LDcuNjE5NzcgNTkuNjEzNyw2LjI3NjQzIDQ5LjczNyw1Ljk1ODEgNDUuNzg2MywxMC4zMjg4IDQ1LjAzNzYsMTEuMzAyOSBjIDAuMjUyNCwyLjE3OTYgMC42MDM1LDMuNDU2MiAzLjEzNSw0LjUxMzggeiIKICAgaWQ9IkZpbGxfMyIgLz4KPGxpbmVhckdyYWRpZW50CiAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzYzOTMxLC0wLjAyMTgzNTgpIgogICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgaWQ9IkxpbmVhckdyYWRpZW50XzMiCiAgIHgxPSIzMS4xOTYxIgogICB4Mj0iMzEuMTk2MSIKICAgeTE9IjYxLjM3NjQ5OSIKICAgeTI9IjEuODA0OTk5OSI+CjxzdG9wCiAgIG9mZnNldD0iMCIKICAgc3RvcC1jb2xvcj0iIzdiZDVmNSIKICAgaWQ9InN0b3A1NjIiIC8+CjxzdG9wCiAgIG9mZnNldD0iMSIKICAgc3RvcC1jb2xvcj0iI2RjY2ZlNSIKICAgaWQ9InN0b3A1NjQiIC8+CjwvbGluZWFyR3JhZGllbnQ+CjxwYXRoCiAgIGQ9Im0gMjUuODQ3NCw1MC43MDM2IGMgLTAuNjE1MywwLjg3NTYgLTIuMzk2LDIuMzk0OCAtMy4zMjY5LDIuOTIzNiAtMS4wNzIsMC42MDY1IC0yLjI3NzMsMC45MzkzIC0zLjUwODksMC45Njg3IC0xLjIzMTYsMC4wMjk1IC0yLjQ1MTUsLTAuMjQ1NCAtMy41NTEzLC0wLjggLTIuMjkwNywtMS4xNjgzIC00LjE0OTksLTMuNjY0NCAtNC44NzE3LC03LjYzMzYgLTAuMDUzMSwtMC4yOTE5IC0wLjUzNTIsLTAuNTA4IC0wLjU0NzksLTAuMDQwMSAwLjA0NzcsNS42Njk0IDIuMzExNiw5LjM3MTEgNS40MjEyLDExLjMxOTIgMC41MDg3LDAuMzcyIDEuMDQzMiwwLjU2NTcgMS42MjY1LDAuODA0NyA3LjY0NjQsMi4zMzk3IDEyLjgwNzgsLTIuNDM1MiAxNC44Nzg3LC00Ljk1MzIgLTAuNjEzNywxLjU0OTYgLTEuNTUxLDIuOTUwNiAtMi43NDk1LDQuMTA5NiAtMC45MjgxLDAuODk3NiAtMS45ODczLDEuNjQ4OSAtMy4xNDE0LDIuMjI4MyAtMS40MjUyLDAuNzEzNiAtMi45NjM1LDEuMTc0NSAtNC41NDY1LDEuMzYyNSAtMS41NzU0LDAuMTkwNiAtMy4xNzIyLDAuMDk4OSAtNC43MTUzLC0wLjI3MDYgQyAxNS4xNTEyLDYwLjMzNDMgMTMuNTk0OSw1OS41ODIxIDEyLjI1NzgsNTguNTIwMyAxMC45MjA2LDU3LjQ1ODQgOS44MzU5NCw1Ni4xMTM0IDkuMDgxODgsNTQuNTgyMiA2LjkwNTgyLDUwLjEyNTYgNy4yNjkwMyw0NS41MDY2IDguMzkwNTEsNDIuOTA5MSA4LjYzOTQ3LDQyLjI0MTggOS4wNDYwNiw0MS42NDQ0IDkuNTc1NzIsNDEuMTY3OCA5LjcxNDQzLDQxLjAzMjkgOS44OTM1OSw0MC45NDcgMTAuMDg1OCw0MC45MjM1IGMgMC4xOTIyLC0wLjAyMzYgMC4zODY4LDAuMDE2NCAwLjU1NCwwLjExMzggMC41Mzg1LDAuMzQzOCAxLjAxNjQsMS4zMjQzIDEuMjk5OSwzLjEyNiAwLjg0NDQsNC43NjUgMi43NDY1LDYuOTk3NCA1LjgwNjQsOC43ODQyIDAuNjk0MiwwLjM1OSAxLjc5MjUsMC42MzIzIDIuNTc0MSwwLjY0MjIgMC43ODE1LDAuMDEgMS41NTQ2LC0wLjE2MjUgMi4yNTc3LC0wLjUwMzcgMC44NDQyLC0wLjQwNDIgMi4yODYxLC0xLjAwMTYgMy4yNjk1LC0yLjM4MjQgeiIKICAgaWQ9IkZpbGxfNCIgLz4KPHBhdGgKICAgZD0ibSAzMS43MTIyLDQyLjcxMTcgYyAtMC4zNDE5LC0xLjQzNDYgLTAuNjgxOCwtMi44NzEzIC0xLjAxOTUsLTQuMzEwMSBoIC0wLjAxOTEgYyAwLjA2MzcsLTAuOTU1IDAuNDIzNywtMi4wNzg3IDAuMTg4LC0yLjg2NSBsIC0wLjYxMTcsMi44MDc3IHYgMC4wOTIzIGwgMS4wNTEzLDQuNDU2NiBjIDAuMDMxOSwwLjA0MTQgMC4wNjM4LDAuMDg1OSAwLjA5MjQsMC4xMzA1IGwgMS41MjkzLDAuOTU1IC0xLjQ5MSwwLjI0ODMgMC4wNjY5LDAuMjI5MiBjIDAsMC4wMDMxIDAuMzMxMywxLjEwNzcgLTAuMDcwMSwxLjg1OSAtMC4yMDM5LC0wLjM5MTYgLTAuNjIxMywtMS4wNiAtMC44NDExLC0xLjQ1MTYgLTAuMDc2NSwwLjAxMjggLTAuNDY4NCwxLjI3NjUgLTEuMzE5LDEuNjkwMyAtMC4wMTI4LC0wLjU3OTMgLTAuMDM1MSwtMS4xNTg3IC0wLjAzNTEsLTEuNzM4IGwgLTAuMzUwNSwwLjM0MzggYyAtMC4zNDQ1LDAuMzEyMSAtMC43NzU0LDAuNTEzIC0xLjIzNjEsMC41NzYxIDAuNDk3LC0wLjUwMjkgMS4zMDk0LC0xLjM4NzkgMS4yNzQ0LC0xLjkwOTkgLTAuMDE1NiwtMC4yMzk5IC0wLjM0NTUsLTAuNzI5OCAtMC44MDE2LC0xLjQwNzEgbCAtMC4wMywtMC4wNDQ1IGMgLTAuOTIzOSwtMS4zMzA2IC0yLjc3NSwtNC4xMjg3IC0zLjE1NDEsLTYuNDIzOCAtMC4xNjU3LDIuMjYzMyAxLjY4ODYsNS4wMTA0IDIuODAzNyw2LjY1OTQgMC4yOTk2LDAuMzg0NSAwLjU1NCwwLjgwMjEgMC43NTgyLDEuMjQ0NiAwLjAzNTEsMC41NDQ0IC0xLjUyOTMsMS45MjU5IC0xLjUyOTMsMS45MjU5IDAsMCAtMC4zNTY4LDAuMzE1MSAwLjExNDcsMC4zNjkzIDAuNjExNiwwLjA2NjkgMS4yMjczLC0wLjA4MyAxLjczOTYsLTAuNDIzNCAwLjAyMjMsMC4zNzg4IDAuMDIyMywwLjc1NDQgMC4wMjIzLDEuMTMzMiAwLDAgLTAuMDM4MiwwLjMxMiAwLjI4MDQsMC4yMDA2IDAuMzI1MiwtMC4xMDc0IDAuNjI1NCwtMC4yNzkyIDAuODgyNywtMC41MDUgMC4yNTczLC0wLjIyNTkgMC40NjYzLC0wLjUwMTMgMC42MTQ3LC0wLjgwOTcgbCAwLjU1NzYsMC45OTMyIGMgMC4wMjU1LDAuMDQ3NyAwLjEyMSwwLjM4NTEgMC4zNzU5LDAuMTA4MiAwLjYzNzIsLTAuNjk0IDAuNDk3LC0xLjgwODEgMC4zOTgzLC0yLjI4NTYgbCAxLjU5MywtMC4yNjQyIGMgMC4wNzY1LC0wLjAwOTYgMC4yMTY2LC0wLjI5MjkgMC4wNzY1LC0wLjM4ODQgeiBNIDE3LjI1NCw1Ny43MjA5IGMgOS42OCwyLjk2NTEgMTUuMTgyMywtNS45ODM0IDE1LjI1MDksLTYuMDk1IGwgN2UtNCwtMC4wMDEgYyAwLjA0LC0wLjA2MyAwLjEwMzIsLTAuMTA3NyAwLjE3NiwtMC4xMjQ0IDAuMDcyOCwtMC4wMTY3IDAuMTQ5MiwtMC4wMDQgMC4yMTI3LDAuMDM1MyAwLjA1MjEsMC4wMzI3IDAuMDkyNCwwLjA4MTMgMC4xMTQ4LDAuMTM4NiAwLjAyMjQsMC4wNTczIDAuMDI1NywwLjEyMDMgMC4wMDk0LDAuMTc5NyAtMC40NDAzLDEuODQwNyAtMS4yOTk0LDMuNTU1MyAtMi41MTA2LDUuMDEwNSAzLjg3MSwtMS44NTkxIDcuMDA5MywtNC45NDA1IDcuODA1OCwtOC42MjM1IC0wLjI2MTMsLTAuMDc5NiAtMC45NTU4LC0wLjg4MTggLTAuOTk3MiwtMC45NTUgMS40MzY5LDAuODM0IDIuMDgzNiwwLjg0MDQgMy43OTQ1LDEuMDc1OSBsIDAuMTcyMSwwLjAyNTUgdiAwLjE3MTkgYyAtMC4wMDE0LDAuNDMxIDAuMTYzMywwLjg0NTkgMC40NTk5LDEuMTU4OSAwLjI5NjYsMC4zMTI5IDAuNzAyMywwLjQ5OTggMS4xMzMxLDAuNTIxOSAxLjI3NTUsLTAuNTE0OCA1LjI1MjEsLTEuMDgyMiA2LjUzODgsLTEuMjY1OCBsIDAuMDUzMSwtMC4wMDc1IGMgLTAuMjIxMiwtMC4yOTUxIC0wLjkyNzIsLTAuNTU0IC0xLjQxNzgsLTAuNzc5OSBsIC0wLjM4ODcsLTAuMTg0NyAwLjM4MjMsLTAuMTk0MiBjIDAuNTk2MiwtMC4yNjA2IDEuNTkxLC0wLjU1MTMgMS44MjU2LC0wLjY4NzUgLTAuODQ0MiwtMC41MTY2IC0yLjYwOTMsLTAuMjM4OCAtMi42MTI1LC0wLjIzODggbCAtMC40MTQyLDAuMDczMiBjIDAuNDc3OSwtMC45NTUgMi4xNzIzLC0xLjkwMTYgMi4zNzY4LC0yLjA5NzcgLTEuMDg4MywtMC40Mjc2IC0zLjU4NzUsMC45NzQgLTQuMDQzMSwxLjIxNiAtMC4wNjY5LDAuMzUwMSAtMC4xNDY2LDAuODM0IC0wLjM3OTEsMS4wNzI3IDAuMDI4NiwtMC43NTEyIDAuMTgzOCwtMi4xODM5IDAuMTU5MywtMi41MTc5IC0wLjE0NTIsMC4xMDA5IC0yLjI3NDksMi40OTg4IC0yLjI4MTIsMi41MDIgMC4wMjE4LC0wLjQzMTkgMC4yMDM1LC0wLjg0MDMgMC41MDk3LC0xLjE0NiAwLjM3OTIsLTIuNzQ3MSAtMS40OTEsLTUuMzA2NSAtMi4wMTA0LC01Ljk1NTkgLTAuMTg0NywwLjM3ODggLTAuMzg4NiwwLjc2NzIgLTAuNTgzLDEuMTM5NiBsIC0wLjAxNjMsMC4wMzE0IGMgLTAuNDQ1OCwwLjg1OTYgLTAuODQ0MiwxLjYyNzUgLTAuODYzLDEuOTE2OCBsIDEuMTQwNiwyLjIyODMgYyAwLjAyNiwwLjA0OSAwLjAzMTUsMC4xMDYzIDAuMDE1NCwwLjE1OTQgLTAuMDE2MSwwLjA1MyAtMC4wNTI2LDAuMDk3NiAtMC4xMDE1LDAuMTIzOSAtMC4wMjkxLDAuMDE0OCAtMC4wNjEzLDAuMDIyNSAtMC4wOTQsMC4wMjI1IC0wLjAzMjYsMCAtMC4wNjQ4LC0wLjAwNzcgLTAuMDkzOSwtMC4wMjI1IGwgLTEuNDA1MSwtMC42MzY3IGMgLTAuMDc5NiwwLjcyNTggLTAuMTYyNSwxLjQ1MTYgLTAuMjQyMSwyLjE3NzQgMCwwLjE5MSAtMC4zMTg2LDAuMTgxNSAtMC4zOTgzLDAuMDczMiBsIC0wLjk1NTgsLTEuOTI5IC0xLjI3NDQsMS44ODEzIGMgLTAuMDkyNCwwLjEzMzcgLTAuMzkxOSwwLjAyMjMgLTAuMzg1NSwtMC4xMjEgMCwtMC43MzUzIDAsLTEuNDY3NSAwLjAyMjMsLTIuMjAyOCBsIC0xLjQ4MTUsMC4xNjU1IGMgLTAuMDI4NSwwLjAwMTMgLTAuMDU2OSwtMC4wMDMgLTAuMDgzNywtMC4wMTI4IC0wLjAyNjcsLTAuMDA5NyAtMC4wNTEzLC0wLjAyNDYgLTAuMDcyNCwtMC4wNDM4IC0wLjAyMSwtMC4wMTkyIC0wLjAzOCwtMC4wNDI0IC0wLjA1LC0wLjA2ODEgLTAuMDEyMSwtMC4wMjU4IC0wLjAxODksLTAuMDUzOCAtMC4wMjAxLC0wLjA4MjIgLTAuMDAxNiwtMC4wMjkzIDAuMDAzLC0wLjA1ODYgMC4wMTM0LC0wLjA4NiAwLjAxMDQsLTAuMDI3NCAwLjAyNjUsLTAuMDUyMyAwLjA0NzEsLTAuMDczMiAwLDAgMS44NjcsLTEuNjk2NiAyLjM5NTksLTMuMjk3OCAwLjUyODksLTEuNjAxMiAwLjMxODYsLTUuNDg0OCAwLjMxODYsLTUuNDk3NSAwLjU2MDgsMC45NTQ5IDAuMzQ0MSw0LjgyOSAwLjA3OTcsNS42MzEyIC0wLjM5NTEsMS4xOTA1IC0xLjQ2NTYsMi40MTI5IC0yLjA3NDEsMy4wNDMyIGwgMS4zNTA4LC0wLjE0OTYgYyAwLDAuNjU4OSAwLDEuMzIxIC0wLjAyMjMsMS45OCBsIDEuMjk5OSwtMS45MSBjIDAuMzE4NiwwLjYzNjYgMC42MzcyLDEuMjczMyAwLjk1NTgsMS45MzIyIGwgMC4yMjk0LC0yLjAzNDEgMS4zOTU1LDAuNjA4IC0wLjg5ODQsLTEuNzUzOSBjIDAuMDAzMiwtMC4wMjk1IC0wLjAwNDgsLTAuMDU5IC0wLjAyMjMsLTAuMDgyOCAtMC4wMjU1LC0wLjM3MjUgMC40MjY5LC0xLjI0MTUgMC45MzAzLC0yLjIwNiAwLjUwMzQsLTAuOTY0NiAxLjEwNTUsLTIuMTIwMSAxLjIyMzQsLTIuNzg1NCAwLjIwMDcsLTEuMTE3MyAtMC43NzQyLC00LjE3MzMgLTEuMDM1NCwtNC45NjI3IC0yLjQ5ODEsMC42Mjc0IC01LjA5MjEsMC43Nzk2IC03LjY0NjUsMC40NDg4IC0yLjU4MTcsLTAuMzA2NSAtNS4wOTYzLC0xLjAzMDEgLTcuNDQ1OCwtMi4xNDIzIC0wLjQzMDEsMC43MzIxIC0yLjExNTUsMy44ODM2IC0xLjU5Myw3LjQ5OTggdiAwLjEwNSBsIC0wLjA3MzMsMC4wNzMyIGMgMCwwIC00LjM0NTcsNC4zOTMgLTIuNTk2Niw3Ljc3NjggLTAuMDIyMiwtMC43NDU0IDAuMDIzNiwtMS40OTEzIDAuMTM3LC0yLjIyODMgMC4wMjkzLC0wLjE5MDYgMC4wODg0LC0wLjM3NTQgMC4xNzUzLC0wLjU0NzUgMC4xMjQyLC0wLjIxNjUgMC4yODk5LC0wLjI5NjEgMC41MDAyLC0wLjE4MTUgMC4xNDM4LDAuMDk5IDAuMjU0OCwwLjIzODcgMC4zMTg2LDAuNDAxMSAwLjcyOTYsMS40Mzg4IDAuODk1Myw0LjUwNDMgMC44OTg0LDQuNTEzOSAwLjAyMjMsMC4yMTAxIC0wLjMxODYsMC41MjUyIC0wLjQyMzcsMC4wMjU1IDAsMCAtMC4xNjI1LC0yLjk4OTEgLTAuODUzOSwtNC4zNDg0IC0wLjAyODcsLTAuMDU3OSAtMC4wNjA2LC0wLjExNDMgLTAuMDk1NSwtMC4xNjg3IC0wLjA1MTYsMC4xMjM4IC0wLjA4OSwwLjI1MyAtMC4xMTE2LDAuMzg1MiAtMC4xMjczLDAuODUxMSAtMC4xNjI2LDEuNzEzNCAtMC4xMDUxLDIuNTcyMSAwLjAyMjMsMC4yMSAtMC4wNDc4LDAuMzE4MyAtMC4yMTAzLDAuMzE4MyAtMC4xNjI1LDAgLTAuMzYsLTAuMjEzMyAtMC42MzcyLC0wLjU1NzEgbCAtMC4wMDE2LC0wLjAwMiBjIC0wLjcwMTUsLTAuODY5OCAtMi4xODUsLTIuNTIxMiAtMy41MzQ5LC0yLjE0MDMgMC4wODQ5LDAuMTMxMSAyLjE0MSwyLjA5MTQgMi4wOTMzLDIuODY0OSB2IDAuMzg1MiBsIC0wLjMxODcsLTAuMTkxIGMgMCwwIC0yLjEzNjIsLTAuOTY5OCAtMy4zMDcsLTAuNzcwNCAwLjA2NjUsMC4xMzA3IDIuMDQ4NiwxLjMyNzUgMi42MTg5LDEuMzM3IDAuMjk5NSwwLjEzMDUgMC4yNDIxLDAuMzg1MiAwLjAyNTUsMC40MjM0IC0wLjY0NTIsMC4wNTA5IC0xLjc1NzIsMC4zMzgzIC0xLjg3NjYsMC40NDg4IDAuMTY0MiwwLjE3MzkgMy41MDQ2LDAuNjAxNyAzLjk1NywxLjE0MjggMCwwIDAuMDMxNiwwLjAzODUgMC4wODksMC4xMDE1IDAuMzQ1NSwwLjM3ODkgMS42MjY2LDEuNjQ0NyAyLjU5MzcsMC43NTQ4IDAuMDcwMSwtMC4wODU5IDAuNjE0OSwtMC43ODYyIDAuNTY3MSwtMS4xNjE5IGwgMC4wMTkxLC0wLjExNzcgYyAwLjc1NTEsLTEuNTcyNiAzLjYwNjYsLTMuNzExNyA0LjM5MzUsLTIuNTQ2NyAtMC40NjA5LC0wLjA0NTUgLTAuOTI2MywwLjAwOTkgLTEuMzYzNiwwLjE2MjQgLTAuMDg2NiwxLjI2OTMgLTAuNDg2NywyLjQ5NzQgLTEuMTY0NCwzLjU3NDUgLTAuNjc3NywxLjA3NzEgLTEuNjEyLDEuOTY5NyAtMi43MTk0LDIuNTk3OCAtMS4xMTY2LDAuNjMwMiAtMi4zNjk0LDAuOTgwOCAtMy42NTExLDEuMDIxOSAtMS4zMTg3LDAuMDQ0NCAtMi42MjcyLC0wLjI0NDcgLTMuODA0MiwtMC44NDA0IC0xLjkxMTYsLTAuOTcwOSAtMy42MzIzLC0yLjg1MjQgLTQuNTg0OSwtNS42NzI4IDAuNTUxMiw0LjExNiAyLjQzOTMsNi45MTA1IDQuOTgsOC40NjQ1IDAuNTAyNywwLjMwNzUgMS40OTgyLDAuNzIxNCAxLjQ5ODIsMC43MjE0IHoiCiAgIGlkPSJGaWxsXzUiIC8+CjxsaW5lYXJHcmFkaWVudAogICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgaWQ9IkxpbmVhckdyYWRpZW50XzQiCiAgIHgxPSIzMS4xOTYxIgogICB4Mj0iMzEuMTk2MSIKICAgeTE9IjYxLjM3NjQ5OSIKICAgeTI9IjEuODA0OTk5OSI+CjxzdG9wCiAgIG9mZnNldD0iMCIKICAgc3RvcC1jb2xvcj0iIzdiZDVmNSIKICAgaWQ9InN0b3A1NjkiIC8+CjxzdG9wCiAgIG9mZnNldD0iMSIKICAgc3RvcC1jb2xvcj0iI2RjY2ZlNSIKICAgaWQ9InN0b3A1NzEiIC8+CjwvbGluZWFyR3JhZGllbnQ+CjxwYXRoCiAgIGQ9Im0gMTguNzYzMiwxNC43OTA0IGMgMC4wMjg2LC0wLjEzMDUgLTAuNjgwOSwyLjE0OTIgLTEuMDMzMiw2LjAzMDYgMC4wODYsMS42MDA3IDAuNzY2OCwzLjUxMDggMS4zMTE0LDQuNjM0MiAwLjk0ODQsMS42NjQxIDIuMjc1NiwzLjA4MTggMy44NzQyLDQuMTM4MyAyLjY5ODYsMS44ODQ1IDYuMjUxLDMuMTY0MSA5Ljg3NjcsMy41ODExIDMuNjI1NywwLjQxNzEgNy4zMTUxLDAuMDE5MSAxMC4yODQ1LC0xLjQ5MjkgMS42MzQxLC0wLjgxMTQgMy4wNDE3LC0yLjAxNDQgNC4wOTcyLC0zLjUwMTYgMS41MTM0LC0yLjE3NDIgMi4wNzQxLC01LjQyNDMgMS41NzM5LC04LjY1ODUgQyA0OC4yODYsMTYuNTYxMSA0Ni45NDE1LDEzLjYwMzkgNDQuNTgwNiwxMS41MTU3IDQzLjY2NjIsMTAuNjc1MyAzOS4xNzA3LDcuODA3MTQgMzMuMzI3Niw3LjUyMzgzIDI5LjQ3MDgsNy4zMjgzMyAyNS42NTA0LDguMzUxOTQgMjIuNDA5LDEwLjQ0OTMgYyAwLDAgLTMuMDM5MiwyLjk5ODcgLTMuNTQ5Niw0LjEzIC0wLjAzMTIsMC4wNjkxIDEuMDE4OCwtMS4zNTc5IC0wLjA5NjIsMC4yMTExIHoiCiAgIGlkPSJGaWxsXzYiIC8+CjxsaW5lYXJHcmFkaWVudAogICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgaWQ9IkxpbmVhckdyYWRpZW50XzUiCiAgIHgxPSIzMS4xOTYxIgogICB4Mj0iMzEuMTk2MSIKICAgeTE9IjYxLjM3NjQ5OSIKICAgeTI9IjEuODA0OTk5OSI+CjxzdG9wCiAgIG9mZnNldD0iMCIKICAgc3RvcC1jb2xvcj0iIzdiZDVmNSIKICAgaWQ9InN0b3A1NzUiIC8+CjxzdG9wCiAgIG9mZnNldD0iMSIKICAgc3RvcC1jb2xvcj0iI2RjY2ZlNSIKICAgaWQ9InN0b3A1NzciIC8+CjwvbGluZWFyR3JhZGllbnQ+CjxwYXRoCiAgIGQ9Im0gMTAuODY5MSwyMS4yOTM4IGMgMi40ODIxLC0xLjU5MSA1Ljk2NTIsLTIuMzUzMiA5Ljk3MDQsLTEuOTgzNyAwLjI0NTMsMC4yOTkzIDAuNTMwOCwwLjYwNTQgMC42ODA1LDAuNzY3NyAtMC40MzAxLDAuMzg4NCAtMS40OTQyLDEuNDUxNiAtMS4xODIsMi4yMjgzIDAuMDA2NCwwLjAzOSAwLjAwNjQsMC4wNzg4IDAsMC4xMTc4IDAsMC40MTA2IC0wLjMxODYsMS4yNzMzIC0xLjEzNzQsMi4yOTgzIC0wLjgxODgsMS4wMjUgLTIuMjMwMiwyLjE2NzggLTQuNDI1NCwzLjA2MjMgLTIuMjcxNiwwLjkyNjQgLTUuMzkwNzYsMS41OTE3IC05LjYzMTM3LDEuNTYzIDAuNTM1MjYsLTEuMjczMyAyLjgyMjgyLC02LjM2NjUgNS43MTI1NywtOC4wNDA5IHoiCiAgIGlkPSJGaWxsXzciIC8+CjxsaW5lYXJHcmFkaWVudAogICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjA3MDIxMjQsMC4xMjY1MzUpIgogICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgaWQ9IkxpbmVhckdyYWRpZW50XzYiCiAgIHgxPSIzMS4xOTYxIgogICB4Mj0iMzEuMTk2MSIKICAgeTE9IjYxLjM3NjQ5OSIKICAgeTI9IjEuODA0OTk5OSI+CjxzdG9wCiAgIG9mZnNldD0iMCIKICAgc3RvcC1jb2xvcj0iIzdiZDVmNSIKICAgaWQ9InN0b3A1ODEiIC8+CjxzdG9wCiAgIG9mZnNldD0iMSIKICAgc3RvcC1jb2xvcj0iI2RjY2ZlNSIKICAgaWQ9InN0b3A1ODMiIC8+CjwvbGluZWFyR3JhZGllbnQ+CjxwYXRoCiAgIGQ9Im0gMTIuNTQ4OSwxMi4yMzMxIGMgNS4xMDgsMy45MDUzIDguMTUwNSwzLjQ1ODEgOC43MjY2LDMuNjU0NiAyLjQzMDUsLTAuMzI5IDAuODg1NywtNS4zNDQ5IDAuODg1NywtNS4zNDQ5IGwgLTAuMTAyLC0wLjIxOTcgQyAyMi4wNTQsMTAuMzE0MyAyMS4xNzk3LDguMzU3OTcgMTguMzgxNyw2LjM4NjMzIDE2LjEwNTcsNC43ODI1MiAxMi41NTY5LDMuMTY4NiA3LjE2NzcyLDIuNTg0NTkgNy4zNzQ4MSwzLjg2NzQ1IDguNTA5MDQsOS40NzMxOSAxMi41NDg5LDEyLjIzMzEgWiIKICAgaWQ9IkZpbGxfOCIgLz4KPGxpbmVhckdyYWRpZW50CiAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTAuMDU5ODg5MSwtMC4wMzY5OTk4KSIKICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgIGlkPSJMaW5lYXJHcmFkaWVudF83IgogICB4MT0iMzEuMTk2MSIKICAgeDI9IjMxLjE5NjEiCiAgIHkxPSI2MS4zNzY0OTkiCiAgIHkyPSIxLjgwNDk5OTkiPgo8c3RvcAogICBvZmZzZXQ9IjAiCiAgIHN0b3AtY29sb3I9IiM3YmQ1ZjUiCiAgIGlkPSJzdG9wNTg3IiAvPgo8c3RvcAogICBvZmZzZXQ9IjEiCiAgIHN0b3AtY29sb3I9IiNkY2NmZTUiCiAgIGlkPSJzdG9wNTg5IiAvPgo8L2xpbmVhckdyYWRpZW50Pgo8cGF0aAogICBkPSJtIDEyLjQ0NDksMTIuNjUxIGMgLTIuOTI3OTUsLTAuMDYwNSAtNi40OTYzLDAuODcyMiAtMTAuNTUyMTEsMy44ODM1IDEuMjc0NDEsMS4xMzk3IDkuMTQwNzEsNy40ODA3IDE4LjczNzExLDIuMzA3OSAyLjM1NzUsLTEuNTUwNiAxLjkwMTgsLTEuMzY2NCAxLjkxMTMsLTEuMzY2OCAwLjA2NzMsMC4wMTAyIC0wLjY4MzQsLTAuNTYzOCAtMS41NjAzLC0xLjMyNTcgLTIuMjc1NSwtMi4xNTY1IC01LjI0ODcsLTMuMzgzNiAtOC4zODMsLTMuNDk1OCB6IgogICBpZD0iRmlsbF85IiAvPgo8bGluZWFyR3JhZGllbnQKICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgtMC4wNDI4MjY4LC0wLjA0NTY4MikiCiAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICBpZD0iTGluZWFyR3JhZGllbnRfOCIKICAgeDE9IjMxLjE5NjEiCiAgIHgyPSIzMS4xOTYxIgogICB5MT0iNjEuMzc2NDk5IgogICB5Mj0iMS44MDQ5OTk5Ij4KPHN0b3AKICAgb2Zmc2V0PSIwIgogICBzdG9wLWNvbG9yPSIjN2JkNWY1IgogICBpZD0ic3RvcDU5MyIgLz4KPHN0b3AKICAgb2Zmc2V0PSIxIgogICBzdG9wLWNvbG9yPSIjZGNjZmU1IgogICBpZD0ic3RvcDU5NSIgLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50CiAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoNC4yMDA2OCwwLjg2ODQ1OSkiCiAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICBpZD0iTGluZWFyR3JhZGllbnRfOSIKICAgeDE9IjMxLjE5NjEiCiAgIHgyPSIzMS4xOTYxIgogICB5MT0iNjEuMzc2NDk5IgogICB5Mj0iMS44MDQ5OTk5Ij4KPHN0b3AKICAgb2Zmc2V0PSIwIgogICBzdG9wLWNvbG9yPSIjN2JkNWY1IgogICBpZD0ic3RvcDU5OCIgLz4KPHN0b3AKICAgb2Zmc2V0PSIxIgogICBzdG9wLWNvbG9yPSIjZGNjZmU1IgogICBpZD0ic3RvcDYwMCIgLz4KPC9saW5lYXJHcmFkaWVudD4KPHBhdGgKICAgZD0ibSAyMy42MTE0LDEyLjg0NjkgYyAtMC4wMDMyLDAgLTEuNzEwOSwwLjU0MTIgLTEuODI1NiwwLjk3NDEgLTAuMTE0NywwLjQzMjkgMC4zODU1LDEuNjU4NSAwLjM4NTUsMS42NTg1IGwgMC4wNTc0LDAuMTQ2NCAtMC4xMjExLDAuMDk4NyBjIC0wLjAwNjQsMC4wMDMyIC0xLjc4MSwxLjQxOTcgLTEuNjUwNCwxLjk5NTkgMC4xNTYxLDAuNjQ2MiAxLjM2NiwxLjkyNTYgMS4zNjYsMS45MjU2IDAsMCAzLjU4MTUsLTAuNjg5MiA0LjI4MzYsLTMuMDA5MSAwLjc2MywtMi41MjA5IC0yLjE4MDQsLTQuNTM0OCAtMi4yNTI5LC00LjU1NzEgLTAuMDcyNSwtMC4wMjIzIC0xLjMzODUsMC4yNjQxIC0wLjI0MjUsMC43NjcgeiIKICAgaWQ9IkZpbGxfMTAiIC8+CjxsaW5lYXJHcmFkaWVudAogICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjA0MDE3NzcsLTAuMDQ3MTE4MikiCiAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICBpZD0iTGluZWFyR3JhZGllbnRfMTAiCiAgIHgxPSIzMS4xOTYxIgogICB4Mj0iMzEuMTk2MSIKICAgeTE9IjYxLjM3NjQ5OSIKICAgeTI9IjEuODA0OTk5OSI+CjxzdG9wCiAgIG9mZnNldD0iMCIKICAgc3RvcC1jb2xvcj0iIzdiZDVmNSIKICAgaWQ9InN0b3A2MDQiIC8+CjxzdG9wCiAgIG9mZnNldD0iMSIKICAgc3RvcC1jb2xvcj0iI2RjY2ZlNSIKICAgaWQ9InN0b3A2MDYiIC8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudAogICBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuMzEyNjQyLC0wLjA3OTc5MzUpIgogICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgaWQ9IkxpbmVhckdyYWRpZW50XzExIgogICB4MT0iMzEuMTk2MSIKICAgeDI9IjMxLjE5NjEiCiAgIHkxPSI2MS4zNzY0OTkiCiAgIHkyPSIxLjgwNDk5OTkiPgo8c3RvcAogICBvZmZzZXQ9IjAiCiAgIHN0b3AtY29sb3I9IiM3YmQ1ZjUiCiAgIGlkPSJzdG9wNjA5IiAvPgo8c3RvcAogICBvZmZzZXQ9IjEiCiAgIHN0b3AtY29sb3I9IiNkY2NmZTUiCiAgIGlkPSJzdG9wNjExIiAvPgo8L2xpbmVhckdyYWRpZW50PgoKCgoKPC9kZWZzPgo8ZwogICBpZD0iVW50aXRsZWQiCiAgIHZlY3Rvcm5hdG9yOmxheWVyTmFtZT0iVW50aXRsZWQiPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzYyOSI+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnNjI1Ij4KPHVzZQogICBmaWxsPSJ1cmwoI0xpbmVhckdyYWRpZW50KSIKICAgZmlsbC1ydWxlPSJub256ZXJvIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsIgogICBpZD0idXNlNjE2IgogICBzdHlsZT0iZmlsbDp1cmwoI0xpbmVhckdyYWRpZW50KSIgLz4KPG1hc2sKICAgaGVpZ2h0PSI2LjQ4MjgzIgogICBpZD0iU3Ryb2tlTWFzayIKICAgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgd2lkdGg9IjEwLjY0MDgiCiAgIHg9IjQ3LjgxNzIiCiAgIHk9IjIwLjU1MzMiPgo8cmVjdAogICBmaWxsPSIjZmZmZmZmIgogICBoZWlnaHQ9IjYuNDgyODMiCiAgIHN0cm9rZT0ibm9uZSIKICAgd2lkdGg9IjEwLjY0MDgiCiAgIHg9IjQ3LjgxNzIiCiAgIHk9IjIwLjU1MzMwMSIKICAgaWQ9InJlY3Q2MTgiIC8+Cjx1c2UKICAgZmlsbD0iIzAwMDAwMCIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsIgogICBpZD0idXNlNjIwIiAvPgo8L21hc2s+Cjx1c2UKICAgZmlsbD0ibm9uZSIKICAgbWFzaz0idXJsKCNTdHJva2VNYXNrKSIKICAgc3Ryb2tlPSIjNTUyZjgyIgogICBzdHJva2UtbGluZWNhcD0iYnV0dCIKICAgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIKICAgc3Ryb2tlLXdpZHRoPSIwLjk2IgogICB4bGluazpocmVmPSIjRmlsbCIKICAgaWQ9InVzZTYyMyIgLz4KPC9nPgo8cGF0aAogICBkPSJtIDU3Ljc0MjMsMjUuNDYxIGMgMCwwIC00LjM1MzMsLTIuODY5NiAtOC43NzU3LC0zLjcxNzYgLTAuNTc1OSwwLjY3NzkgLTEuMTQ3OCwyLjQyNzkgLTAuMDQ2OSwzLjg4MzMgMC43NTIsMC4zODQgNC4yODc2LDIuMDEyNyA4LjgwOTIsLTAuMTUzNyB6IgogICBmaWxsPSIjNzc3YWJhIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg2MjciIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc2NDQiPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzY0MCI+Cjx1c2UKICAgZmlsbD0idXJsKCNMaW5lYXJHcmFkaWVudF8yKSIKICAgZmlsbC1ydWxlPSJub256ZXJvIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzIiCiAgIGlkPSJ1c2U2MzEiCiAgIHN0eWxlPSJmaWxsOnVybCgjTGluZWFyR3JhZGllbnRfMikiIC8+CjxtYXNrCiAgIGhlaWdodD0iNy41MzEyNyIKICAgaWQ9IlN0cm9rZU1hc2tfMiIKICAgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgd2lkdGg9IjE0LjAzMjIiCiAgIHg9IjQ3LjE5MDQiCiAgIHk9IjEzLjkyNjIiPgo8cmVjdAogICBmaWxsPSIjZmZmZmZmIgogICBoZWlnaHQ9IjcuNTMxMjciCiAgIHN0cm9rZT0ibm9uZSIKICAgd2lkdGg9IjE0LjAzMjIiCiAgIHg9IjQ3LjE5MDM5OSIKICAgeT0iMTMuOTI2MiIKICAgaWQ9InJlY3Q2MzMiIC8+Cjx1c2UKICAgZmlsbD0iIzAwMDAwMCIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzIiCiAgIGlkPSJ1c2U2MzUiIC8+CjwvbWFzaz4KPHVzZQogICBmaWxsPSJub25lIgogICBtYXNrPSJ1cmwoI1N0cm9rZU1hc2tfMikiCiAgIHN0cm9rZT0iIzU1MmY4MiIKICAgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiCiAgIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiCiAgIHN0cm9rZS13aWR0aD0iMC45NiIKICAgeGxpbms6aHJlZj0iI0ZpbGxfMiIKICAgaWQ9InVzZTYzOCIgLz4KPC9nPgo8cGF0aAogICBkPSJtIDU5LjY1OTMsMTUuMjM5NiBjIDAsMCAtNi42NjY5LDIuNTY1MyAtMTEuNjMwMSwxLjQ3NzMgLTEuMDc2NCwyLjI2MzUgMC40MjA1LDMuMjkyMSAxLjMzNzUsMy45NDA1IDAuODU3NiwwLjI5MTIgNi4wNzQzLDEuNzE4OCAxMS4yNTgzLC00Ljk1IC0wLjMwODYsLTAuMTY4OSAtMC42MjcsLTAuMzQ5NyAtMC45NTc1LC0wLjQ3MDUgeiIKICAgZmlsbD0iIzc3N2FiYSIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNjQyIiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnNjU5Ij4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc2NTUiPgo8dXNlCiAgIGZpbGw9InVybCgjTGluZWFyR3JhZGllbnRfMykiCiAgIGZpbGwtcnVsZT0ibm9uemVybyIKICAgc3Ryb2tlPSJub25lIgogICB4bGluazpocmVmPSIjRmlsbF8zIgogICBpZD0idXNlNjQ2IgogICBzdHlsZT0iZmlsbDp1cmwoI0xpbmVhckdyYWRpZW50XzMpIiAvPgo8bWFzawogICBoZWlnaHQ9IjEwLjYwMjUiCiAgIGlkPSJTdHJva2VNYXNrXzMiCiAgIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgIHdpZHRoPSIxNS42NDM3IgogICB4PSI0NC41Mzg0IgogICB5PSI1Ljc3OTkiPgo8cmVjdAogICBmaWxsPSIjZmZmZmZmIgogICBoZWlnaHQ9IjEwLjYwMjUiCiAgIHN0cm9rZT0ibm9uZSIKICAgd2lkdGg9IjE1LjY0MzciCiAgIHg9IjQ0LjUzODM5OSIKICAgeT0iNS43Nzk5MDAxIgogICBpZD0icmVjdDY0OCIgLz4KPHVzZQogICBmaWxsPSIjMDAwMDAwIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIHN0cm9rZT0ibm9uZSIKICAgeGxpbms6aHJlZj0iI0ZpbGxfMyIKICAgaWQ9InVzZTY1MCIgLz4KPC9tYXNrPgo8dXNlCiAgIGZpbGw9Im5vbmUiCiAgIG1hc2s9InVybCgjU3Ryb2tlTWFza18zKSIKICAgc3Ryb2tlPSIjNTUyZjgyIgogICBzdHJva2UtbGluZWNhcD0iYnV0dCIKICAgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIKICAgc3Ryb2tlLXdpZHRoPSIwLjk2IgogICB4bGluazpocmVmPSIjRmlsbF8zIgogICBpZD0idXNlNjUzIiAvPgo8L2c+CjxwYXRoCiAgIGQ9Im0gNTkuNTk3LDYuMjk0ODMgYyAwLDAgLTYuOTc0MSwwLjY1MTc2IC0xMy4zNzQxLDguMjkwMTcgMC41NTg4LDAuNjQzNiAwLjk0MiwwLjczMzggMS45NTEsMS4yNDg0IDEwLjIyMDgsLTIuNDU3NiAxMS4yNTk3LC04LjI4NjY0IDExLjQzMzMsLTkuNTI0MDIgeiIKICAgZmlsbD0iIzc3N2FiYSIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNjU3IiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnNjg5Ij4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc2NzAiPgo8dXNlCiAgIGZpbGw9IiM3NzdhYmEiCiAgIGZpbGwtcnVsZT0ibm9uemVybyIKICAgc3Ryb2tlPSJub25lIgogICB4bGluazpocmVmPSIjRmlsbF80IgogICBpZD0idXNlNjYxIiAvPgo8bWFzawogICBoZWlnaHQ9IjIxLjEzMzEiCiAgIGlkPSJTdHJva2VNYXNrXzQiCiAgIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgIHdpZHRoPSIyNi41MjM2IgogICB4PSI3LjAxNjUzIgogICB5PSI0MC40MzY5Ij4KPHJlY3QKICAgZmlsbD0iI2ZmZmZmZiIKICAgaGVpZ2h0PSIyMS4xMzMxMDEiCiAgIHN0cm9rZT0ibm9uZSIKICAgd2lkdGg9IjI2LjUyMzYiCiAgIHg9IjcuMDE2NTMiCiAgIHk9IjQwLjQzNjkwMSIKICAgaWQ9InJlY3Q2NjMiIC8+Cjx1c2UKICAgZmlsbD0iIzAwMDAwMCIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzQiCiAgIGlkPSJ1c2U2NjUiIC8+CjwvbWFzaz4KPHVzZQogICBmaWxsPSJub25lIgogICBtYXNrPSJ1cmwoI1N0cm9rZU1hc2tfNCkiCiAgIHN0cm9rZT0iIzU1MmY4MiIKICAgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiCiAgIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiCiAgIHN0cm9rZS13aWR0aD0iMC45NiIKICAgeGxpbms6aHJlZj0iI0ZpbGxfNCIKICAgaWQ9InVzZTY2OCIgLz4KPC9nPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzY4MSI+Cjx1c2UKICAgZmlsbD0idXJsKCNMaW5lYXJHcmFkaWVudF80KSIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzUiCiAgIGlkPSJ1c2U2NzIiCiAgIHN0eWxlPSJmaWxsOnVybCgjTGluZWFyR3JhZGllbnRfNCkiIC8+CjxtYXNrCiAgIGhlaWdodD0iMjcuOTMzOCIKICAgaWQ9IlN0cm9rZU1hc2tfNSIKICAgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgd2lkdGg9IjQwLjU5OTQiCiAgIHg9IjEwLjIwNzQiCiAgIHk9IjMwLjg2OSI+CjxyZWN0CiAgIGZpbGw9IiNmZmZmZmYiCiAgIGhlaWdodD0iMjcuOTMzOCIKICAgc3Ryb2tlPSJub25lIgogICB3aWR0aD0iNDAuNTk5NCIKICAgeD0iMTAuMjA3NCIKICAgeT0iMzAuODY4OTk5IgogICBpZD0icmVjdDY3NCIgLz4KPHVzZQogICBmaWxsPSIjMDAwMDAwIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIHN0cm9rZT0ibm9uZSIKICAgeGxpbms6aHJlZj0iI0ZpbGxfNSIKICAgaWQ9InVzZTY3NiIgLz4KPC9tYXNrPgo8dXNlCiAgIGZpbGw9Im5vbmUiCiAgIG1hc2s9InVybCgjU3Ryb2tlTWFza181KSIKICAgc3Ryb2tlPSIjNTUyZjgyIgogICBzdHJva2UtbGluZWNhcD0iYnV0dCIKICAgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIKICAgc3Ryb2tlLXdpZHRoPSIwLjk2IgogICB4bGluazpocmVmPSIjRmlsbF81IgogICBpZD0idXNlNjc5IiAvPgo8L2c+CjxwYXRoCiAgIGQ9Im0gMjMuNjk3NSwzNi40MDczIGMgLTAuMDk2MSwwLjg1OSAtMC4wODMyLDEuNzI2NiAwLjAzODQsMi41ODI0IHYgMC4xMDU2IGwgLTAuMDczNiwwLjA3MzYgYyAwLDAgLTMuOTIsMy45NjQ4IC0yLjg0NDgsNy4yNzM2IC0wLjM1NTIsLTIuMzI5NiAxLjkyLC01LjQ3MiAzLjQ2MjQsLTcuMTg3MiAtMC4yNTkyLC0wLjkwMjQgLTAuMzIsLTMuOTcxMiAtMC4yNzg0LC00LjQ1MTIgLTAuMTQ2NCwwLjUyMzYgLTAuMjQ3LDEuMDU5IC0wLjMwMDgsMS42IHoiCiAgIGZpbGw9IiM3NzdhYmEiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDY4MyIgLz4KPHBhdGgKICAgZD0ibSAyNS4yMDExLDM3LjA3MjIgYyAwLjY3NTIsMi4wMTI4IDIuMTAyNCw0LjE2IDIuODgsNS4yNzM2IDAuNDczNiwwLjcwNCAwLjgxNiwxLjIxMjggMC44MzIsMS40NTkyIDAuMDM1MiwwLjUyNDggLTAuNzc3NiwxLjQxNDQgLTEuMjgsMS45MiAwLDAgMS43NTA0LC0wLjg1NzYgMS42LC0yLjI3MiAwLDAgLTMuNTg3MiwtNS44MDggLTMuMzk4NCwtNi44MTI4IDAsMCAwLjU0NzIsLTEuNjk5MiAwLjg4OTYsLTEuOTc0NCAwLDAgLTEuNzEyLDAuOTM0NCAtMS41MDA4LDIuNDEyOCB6IgogICBmaWxsPSIjNzc3YWJhIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg2ODUiIC8+CjxwYXRoCiAgIGQ9Im0gMzYuOTk1OCwzNS44MzA1IGMgMC41NjMyLDAuOTYgMC4zNDU2LDQuODUxMiAwLjA3NjgsNS42NTc2IC0wLjM5NjgsMS4yIC0xLjQ3MiwyLjQyODggLTIuMDgzMiwzLjA2MjQgMS4yMTYsLTAuNTEyIDIuNTEyLC0zLjA5NzYgMi41MTIsLTMuMDk3NiAwLjI1OTIsLTEuNjggMC41MTUyLC00LjE2IC0wLjUwNTYsLTUuNjIyNCB6IgogICBmaWxsPSIjNzc3YWJhIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg2ODciIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc3MDQiPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzcwMCI+Cjx1c2UKICAgZmlsbD0idXJsKCNMaW5lYXJHcmFkaWVudF81KSIKICAgZmlsbC1ydWxlPSJub256ZXJvIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzYiCiAgIGlkPSJ1c2U2OTEiCiAgIHN0eWxlPSJmaWxsOnVybCgjTGluZWFyR3JhZGllbnRfNSkiIC8+CjxtYXNrCiAgIGhlaWdodD0iMjYuNzg5OCIKICAgaWQ9IlN0cm9rZU1hc2tfNiIKICAgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgd2lkdGg9IjMyLjE1NzMiCiAgIHg9IjE3LjI0ODkiCiAgIHk9IjcuMDIwMjQiPgo8cmVjdAogICBmaWxsPSIjZmZmZmZmIgogICBoZWlnaHQ9IjI2Ljc4OTgwMSIKICAgc3Ryb2tlPSJub25lIgogICB3aWR0aD0iMzIuMTU3Mjk5IgogICB4PSIxNy4yNDg4OTkiCiAgIHk9IjcuMDIwMjM5OCIKICAgaWQ9InJlY3Q2OTMiIC8+Cjx1c2UKICAgZmlsbD0iIzAwMDAwMCIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzYiCiAgIGlkPSJ1c2U2OTUiIC8+CjwvbWFzaz4KPHVzZQogICBmaWxsPSJub25lIgogICBtYXNrPSJ1cmwoI1N0cm9rZU1hc2tfNikiCiAgIHN0cm9rZT0iIzU1MmY4MiIKICAgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiCiAgIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiCiAgIHN0cm9rZS13aWR0aD0iMC45NiIKICAgeGxpbms6aHJlZj0iI0ZpbGxfNiIKICAgaWQ9InVzZTY5OCIgLz4KPC9nPgo8cGF0aAogICBkPSJNIDM4LjEzNjUsMzMuMTMzMSBDIDIyLjM5NTcsMzEuODkxNSAyMC44OTQ4LDIyLjY2MjMgMjAuODUsMjIuMzU1MSBjIC0yLjEzNDUsLTEuMzkwNyAtMy4wMTc3LDAuNTYzOCAtMS44MDQ1LDMuMTczNiAwLjk1MTYsMS42NzM2IDIuMzE5LDMuMDY5OCAzLjkyNTQsNC4xMzA5IDIuOTc4MiwxLjk4ODggNi4zNjg2LDMuMTM0NyA5LjkyODYsMy41MjM2IDEuNzQ5MiwwLjIxNDQgMy41MDA3LDAuMTgzOCA1LjI0OTksLTAuMDMwNiB6IgogICBmaWxsPSIjNzc3YWJhIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MDIiIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc3MTAiPgo8cGF0aAogICBkPSJtIDMyLjM5NDUsMjguNzk5OCBjIDEuMTIsMS4xMTY4IDkuNTEwNCwxLjAxNDQgOS45NTg0LDAuMDIyNCAtMiw1LjYxMjggLTkuNDE0NCwzLjI2NCAtOS45NTg0LC0wLjAyMjQgeiIKICAgZmlsbD0iIzU1MmY4MiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzA2IiAvPgo8cGF0aAogICBkPSJtIDQwLjY0MDUsMzAuNzE5NSBjIC0wLjA3NjgsMC40MTI4IC0zLjM2MzIsMi4yMTQ0IC02LjA0NDgsMC4xMTIgMCwwIDEuNzk1MiwtMS4xMiA2LjA0NDgsLTAuMTEyIHoiCiAgIGZpbGw9IiNjM2EzY2QiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDcwOCIgLz4KPC9nPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzcxNiI+CjxwYXRoCiAgIGQ9Im0gNDAuMDczLDI2LjY2MjQgYyAtMC4yMzQyLDAuMjk4NSAtMC40MjU5LDAuNjI4MSAtMC41Njk2LDAuOTc5MiAtMC4wMzIsMC4yNDMyIDAuNDY3MiwtMC41Mzc2IDEuMTM5MiwtMC41ODU2IDAuMTMsLTAuMDE1NSAwLjI1NDcsLTAuMDYwNCAwLjM2NDgsLTAuMTMxMiAwLjA1NDEsLTAuMDQzOCAwLjA5MjQsLTAuMTA0IDAuMTA5MiwtMC4xNzE2IDAuMDE2NywtMC4wNjc2IDAuMDExLC0wLjEzODggLTAuMDE2NCwtMC4yMDI4IC0wLjA0MzcsLTAuMDY3OCAtMC4xMDMyLC0wLjEyMzkgLTAuMTczNSwtMC4xNjM1IC0wLjA3MDIsLTAuMDM5NiAtMC4xNDkxLC0wLjA2MTQgLTAuMjI5NywtMC4wNjM3IC0wLjEyNDMsMC4wMDk1IC0wLjI0NTMsMC4wNDQ1IC0wLjM1NTQsMC4xMDI5IC0wLjExMDEsMC4wNTgzIC0wLjIwNywwLjEzODggLTAuMjg0NiwwLjIzNjMgeiIKICAgZmlsbD0iIzU1MmY4MiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzEyIiAvPgo8cGF0aAogICBkPSJtIDM3LjQzOTksMjcuNjYzNSBjIC0wLjEzNjIsLTAuMzk5NSAtMC4zMzAzLC0wLjc3NjggLTAuNTc2LC0xLjEyIC0wLjA3NDQsLTAuMTA1OCAtMC4xNjk1LC0wLjE5NTYgLTAuMjc5NSwtMC4yNjM3IC0wLjExLC0wLjA2ODIgLTAuMjMyNiwtMC4xMTM1IC0wLjM2MDUsLTAuMTMzMSAtMC4wOTU5LC0wLjAwMjggLTAuMTkwOSwwLjAxOSAtMC4yNzYsMC4wNjMzIC0wLjA4NTIsMC4wNDQyIC0wLjE1NzYsMC4xMDk0IC0wLjIxMDQsMC4xODk1IC0wLjAzODQsMC4wNjcyIC0wLjA1MTIsMC4xNDYxIC0wLjAzNTksMC4yMjIgMC4wMTUzLDAuMDc1OSAwLjA1NzYsMC4xNDM3IDAuMTE5MSwwLjE5MDggMC4xMTg2LDAuMDg0NSAwLjI1NTgsMC4xMzk0IDAuNCwwLjE2IDAuNzQ4OCwwLjA3NjggMS4yNTQ0LDAuOTYgMS4yMzUyLDAuNjkxMiB6IgogICBmaWxsPSIjNTUyZjgyIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MTQiIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc3MjYiPgo8cGF0aAogICBkPSJtIDQzLjEwOCwxOC41Njg2IGMgMC43MzI4LC0xLjk2NjQgMi4yNzMsLTIuMTU1MyAzLjQ3NTMsLTAuNDI2OSAwLjY0NzMsMSAxLjA0OTEsMi4xMzQzIDEuMTczOCwzLjMxMzQgMC4xNzY5LDEuMTczOCAwLjA3MjEsMi4zNzIgLTAuMzA1OSwzLjQ5ODkgLTAuNzExNCwxLjk2MjggLTIuMjczLDIuMTUxOCAtMy40NzUzLDAuNDI2OCAtMC42NDQyLC0xLjAwMTQgLTEuMDQ1OCwtMi4xMzUgLTEuMTczOCwtMy4zMTM0IC0wLjE3MzUsLTEuMTczOSAtMC4wNjg4LC0yLjM3MTMgMC4zMDU5LC0zLjQ5ODggeiBtIDEuOTEzNywwLjY0NzIgYyAtMC4zNTU3LDAuMDUyNSAtMC42NTQ1LDAuMzkxOSAtMC44MzU5LDAuODk1NyAtMC4zNzM1LDEuMDQ5NyAtMC4yMzgzLDIuNjk0MiAwLjQwMiwzLjYyODQgMC42NDAyLDAuOTM0MiAxLjQyMjgsMC42OTk3IDEuNzc4NSwtMC4zNDk5IDAuMzU1NywtMS4wNDk3IDAuMjM4MywtMi42OTA2IC0wLjQwMTksLTMuNjI4MyAtMC4wODY4LC0wLjE3MzMgLTAuMjIyNiwtMC4zMTgzIC0wLjM5MTEsLTAuNDE3NiAtMC4xNjg0LC0wLjA5OTMgLTAuMzYyNCwtMC4xNDg3IC0wLjU1ODcsLTAuMTQyMyB6IgogICBmaWxsPSIjNTUyZjgyIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MTgiIC8+CjxwYXRoCiAgIGQ9Im0gNDMuMzQ2NSwxOC44ODA0IGMgMC42NTkyLC0xLjc5ODQgMi4wNDQ4LC0xLjk3MTIgMy4xMjY0LC0wLjM5MDQgMC41ODIzLDAuOTE0NSAwLjk0MzgsMS45NTIgMS4wNTYsMy4wMzA0IDAuMTU5MSwxLjA3MzUgMC4wNjQ4LDIuMTY5NCAtMC4yNzUyLDMuMiAtMC42NCwxLjc5NTIgLTIuMDQ0OCwxLjk2OCAtMy4xMjY0LDAuMzkwNCAtMC41Nzk2LC0wLjkxNTkgLTAuOTQwOSwtMS45NTI3IC0xLjA1NiwtMy4wMzA0IC0wLjE1NjEsLTEuMDczNyAtMC4wNjE5LC0yLjE2ODggMC4yNzUyLC0zLjIgeiBtIDEuNzIxNiwwLjU5MiBjIC0wLjMyLDAuMDQ4IC0wLjU4ODgsMC4zNTg0IC0wLjc1MiwwLjgxOTIgLTAuMzM2LDAuOTYgLTAuMjE0NCwyLjQ2NCAwLjM2MTYsMy4zMTg0IDAuNTc2LDAuODU0NCAxLjI4LDAuNjQgMS42LC0wLjMyIDAuMzIsLTAuOTYgMC4yMTQ0LC0yLjQ2MDggLTAuMzYxNiwtMy4zMTg0IC0wLjA3ODEsLTAuMTU4NSAtMC4yMDAzLC0wLjI5MTEgLTAuMzUxOCwtMC4zODE5IC0wLjE1MTUsLTAuMDkwOCAtMC4zMjYxLC0wLjEzNiAtMC41MDI2LC0wLjEzMDEgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzIwIiAvPgo8cGF0aAogICBkPSJtIDQ0Ljc2NzgsMjMuNzU0IGMgLTAuNjgxNiwtMS4wMTc2IC0wLjgyNTYsLTIuODM1MiAtMC40Mjg4LC0zLjk1ODQgMC4zNjE2LC0xLjAyNzIgMS4wODQ4LC0xLjI2MDggMS42OTkyLC0wLjM0MjQgMC42ODQ4LDEuMDE3NiAwLjgyODgsMi44MzUyIDAuNDMyLDMuOTU4NCAtMC4zNjQ4LDEuMDI3MiAtMS4wODQ4LDEuMjYwOCAtMS43MDI0LDAuMzQyNCB6IgogICBmaWxsPSIjNTUyZjgyIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MjIiIC8+CjxwYXRoCiAgIGQ9Im0gNDQuOTQ0OSwxOC4wNzYzIGMgLTAuNDY0LDAuMDQxNiAtMC43NzQ0LDAuNzgwOCAtMC42OTEyLDEuNjUxMiAwLjA4MzIsMC44NzA0IDAuNTI0OCwxLjUzMjggMC45ODg4LDEuNDkxMiAwLjQ2NCwtMC4wNDE2IDAuNzcxMiwtMC43ODQgMC42OTEyLC0xLjY1MTIgLTAuMDgsLTAuODY3MiAtMC41MjQ4LC0xLjUzNiAtMC45ODg4LC0xLjQ5MTIgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzI0IiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnNzM2Ij4KPHBhdGgKICAgZD0ibSAzMi4wMzgxLDE4LjA1IGMgLTAuNzA3OSwtMi4zNjI0IC0yLjU2NiwtMi43NDM3IC00LjE3OTksLTAuODI2OCAtMC44NzQzLDEuMTE3MSAtMS40NjIyLDIuNDEzOSAtMS43MTY2LDMuNzg2NSAtMC4zMTQ3LDEuMzY2MyAtMC4yOTQxLDIuNzgzNSAwLjA2MDIsNC4xNDA5IDAuNzA3OCwyLjM2MjQgMi41NjYsMi43NDM3IDQuMTc5OSwwLjgyMzUgMC44NzM4LC0xLjExOTkgMS40NjE2LC0yLjQxODggMS43MTY2LC0zLjc5MzMgMC4zMTQ2LC0xLjM2NTIgMC4yOTQsLTIuNzgxMiAtMC4wNjAyLC00LjEzNzUgeiBtIC0yLjM3ODQsMC41ODA1IGMgMC40MzE4LDAuMDk3OCAwLjc1NzQsMC41MjMxIDAuOTM0NCwxLjEzMzkgMC4zNTM5LDEuMjUyMSAwLjA0NiwzLjE4OTIgLTAuODEwNSw0LjIzMiAtMC44NTY2LDEuMDQyOCAtMS43Njk3LDAuNjc1IC0yLjEyMzYsLTAuNTYzNiAtMC4zNTQsLTEuMjM4NSAtMC4wNjczLC0zLjE4NTggMC43OTYzLC00LjIyODYgMC4zNTM5LC0wLjQ0NTUgMC43NzUxLC0wLjY3NSAxLjIwMzQsLTAuNTczNyB6IgogICBmaWxsPSIjNTUyZjgyIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MjgiIC8+CjxwYXRoCiAgIGQ9Im0gMzEuNzQ2NiwxOC4yNTMyIGMgLTAuNjM3MSwtMi4yMjc0IC0yLjMwOTQsLTIuNTg3IC0zLjc2MTksLTAuNzc5NiAtMC43ODY5LDEuMDUzMyAtMS4zMTYsMi4yNzYgLTEuNTQ1LDMuNTcwMiAtMC4yODMyLDEuMjg4MiAtMC4yNjQ2LDIuNjI0MyAwLjA1NDIsMy45MDQyIDAuNjM3MSwyLjIyNzQgMi4zMDk0LDIuNTg3IDMuNzYxOSwwLjc3NjQgMC43ODY1LC0xLjA1NTkgMS4zMTU1LC0yLjI4MDUgMS41NDUsLTMuNTc2NSAwLjI4MzEsLTEuMjg3MSAwLjI2NDYsLTIuNjIyMyAtMC4wNTQyLC0zLjkwMTEgeiBtIC0yLjE0MDYsMC41NDczIGMgMC4zODg2LDAuMDkyMyAwLjY4MTcsMC40OTMyIDAuODQxLDEuMDY5MSAwLjMxODUsMS4xODA1IDAuMDQxNCwzLjAwNyAtMC43Mjk1LDMuOTkwMiAtMC43NzA5LDAuOTgzMiAtMS41OTI3LDAuNjM2NCAtMS45MTEyLC0wLjUzMTQgLTAuMzE4NiwtMS4xNjc4IC0wLjA2MDUsLTMuMDAzOCAwLjcxNjcsLTMuOTg3IDAuMzE4NSwtMC40MiAwLjY5NzYsLTAuNjM2NCAxLjA4MywtMC41NDA5IHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDczMCIgLz4KPHBhdGgKICAgZD0ibSAyOS43NTk1LDIzLjkxNjkgYyAwLjkwODgsLTEuMTYxNiAxLjI0MTYsLTMuMzM3NiAwLjg2MDgsLTQuNzI5NiAtMC4zNDg4LC0xLjI3OTkgLTEuMiwtMS42Mjg3IC0yLjAyMjQsLTAuNTgyMyAtMC45MTIsMS4xNjE1IC0xLjI0NDgsMy4zMzc1IC0wLjg2MDgsNC43Mjk1IDAuMzQ4OCwxLjI4IDEuMTk2OCwxLjYyNTYgMi4wMjI0LDAuNTgyNCB6IgogICBmaWxsPSIjNTUyZjgyIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MzIiIC8+CjxwYXRoCiAgIGQ9Im0gMjkuOTc4LDE2Ljk3OTMgYyAwLjU2LDAuMDk5MiAwLjg3MzYsMS4wMzA0IDAuNjk3NiwyLjA4IC0wLjE3NiwxLjA0OTYgLTAuNzc0NCwxLjgyMDggLTEuMzM0NCwxLjcyMTYgLTAuNTYsLTAuMDk5MiAtMC44NjA4LC0xLjAzMzYgLTAuNzAwOCwtMi4wODMyIDAuMTYsLTEuMDQ5NiAwLjc3NDQsLTEuODE3NiAxLjMzNzYsLTEuNzE4NCB6IgogICBmaWxsPSIjZmZmZmZmIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3MzQiIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc3NDQiPgo8cGF0aAogICBkPSJtIDUzLjYyNTcsMzYuNjQ5NCBjIDAuNDcwNiwtNmUtNCAwLjkzMDgsMC4xMzgyIDEuMzIyNSwwLjM5OSAwLjM5MTgsMC4yNjA4IDAuNjk3NCwwLjYzMTkgMC44Nzg0LDEuMDY2MyAwLjE4MSwwLjQzNDQgMC4yMjkxLDAuOTEyNyAwLjEzODQsMS4zNzQ1IC0wLjA5MDcsMC40NjE4IC0wLjMxNjMsMC44ODYzIC0wLjY0ODIsMS4yMiAtMC4zMzE4LDAuMzMzNiAtMC43NTUxLDAuNTYxNSAtMS4yMTY0LDAuNjU0NyAtMC40NjEzLDAuMDkzMiAtMC45Mzk5LDAuMDQ3NiAtMS4zNzUzLC0wLjEzMTEgLTAuNDM1MywtMC4xNzg2IC0wLjgwOCwtMC40ODIzIC0xLjA3MDksLTAuODcyNiAtMC4yNjI5LC0wLjM5MDMgLTAuNDA0MiwtMC44NDk4IC0wLjQwNjEsLTEuMzIwNCAtMC4wMDEzLC0wLjMxMzIgMC4wNTkyLC0wLjYyMzUgMC4xNzgxLC0wLjkxMzMgMC4xMTg5LC0wLjI4OTcgMC4yOTM4LC0wLjU1MzIgMC41MTQ3LC0wLjc3NTIgMC4yMjA4LC0wLjIyMjEgMC40ODMzLC0wLjM5ODQgMC43NzI0LC0wLjUxODggMC4yODkxLC0wLjEyMDUgMC41OTkyLC0wLjE4MjcgMC45MTI0LC0wLjE4MzEgeiIKICAgZmlsbD0iIzhiZDRmMyIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzM4IiAvPgo8cGF0aAogICBkPSJtIDUzLjA2OTMsMzcuNDM5NSBjIDAuMDkzNywwIDAuMTg1MiwwLjAyNzcgMC4yNjMxLDAuMDc5OCAwLjA3NzksMC4wNTIgMC4xMzg2LDAuMTI2IDAuMTc0NSwwLjIxMjUgMC4wMzU4LDAuMDg2NiAwLjA0NTIsMC4xODE4IDAuMDI2OSwwLjI3MzYgLTAuMDE4MywwLjA5MTkgLTAuMDYzNCwwLjE3NjMgLTAuMTI5NiwwLjI0MjUgLTAuMDY2MiwwLjA2NjMgLTAuMTUwNiwwLjExMTQgLTAuMjQyNSwwLjEyOTYgLTAuMDkxOSwwLjAxODMgLTAuMTg3MSwwLjAwODkgLTAuMjczNiwtMC4wMjY5IC0wLjA4NjYsLTAuMDM1OCAtMC4xNjA1LC0wLjA5NjYgLTAuMjEyNiwtMC4xNzQ0IC0wLjA1MiwtMC4wNzc5IC0wLjA3OTgsLTAuMTY5NSAtMC4wNzk4LC0wLjI2MzIgLTRlLTQsLTAuMDYyIDAuMDExNCwtMC4xMjM1IDAuMDM0OSwtMC4xODA5IDAuMDIzNCwtMC4wNTc1IDAuMDU4LC0wLjEwOTcgMC4xMDE4LC0wLjE1MzcgMC4wNDM3LC0wLjA0NDEgMC4wOTU3LC0wLjA3OSAwLjE1MywtMC4xMDI4IDAuMDU3MiwtMC4wMjM5IDAuMTE4NywtMC4wMzYxIDAuMTgwNywtMC4wMzYxIHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc0MCIgLz4KPHBhdGgKICAgZD0ibSA1Mi42MTIyLDM4Ljg5MjYgYyAwLjA0NjcsMCAwLjA5MTUsMC4wMTg1IDAuMTI0NSwwLjA1MTUgMC4wMzMsMC4wMzMgMC4wNTE1LDAuMDc3OCAwLjA1MTUsMC4xMjQ1IC0wLjAwMzEsMC4wMjI5IC0wLjAxMDcsMC4wNDQ5IC0wLjAyMjQsMC4wNjQ5IC0wLjAxMTcsMC4wMiAtMC4wMjcyLDAuMDM3NCAtMC4wNDU2LDAuMDUxNCAtMC4wMTg0LDAuMDE0IC0wLjAzOTQsMC4wMjQyIC0wLjA2MTgsMC4wMyAtMC4wMjIzLDAuMDA1OSAtMC4wNDU3LDAuMDA3MiAtMC4wNjg2LDAuMDA0MSAtMC4wMzgyLC0wLjAwNDcgLTAuMDczOCwtMC4wMjIxIC0wLjEwMSwtMC4wNDkzIC0wLjAyNzMsLTAuMDI3MyAtMC4wNDQ2LC0wLjA2MjkgLTAuMDQ5MywtMC4xMDExIC0xZS00LC0wLjA0NjEgMC4wMTgsLTAuMDkwNCAwLjA1MDQsLTAuMTIzNCAwLjAzMjMsLTAuMDMyOSAwLjA3NjIsLTAuMDUxOCAwLjEyMjMsLTAuMDUyNiB6IgogICBmaWxsPSIjZmZmZmZmIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3NDIiIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc3NTIiPgo8cGF0aAogICBkPSJtIDU0LjYwMjIsNDQuMjUyOSBjIDAuMjY5LDAgMC41MzE5LDAuMDc5OCAwLjc1NTYsMC4yMjkyIDAuMjIzNiwwLjE0OTUgMC4zOTc5LDAuMzYxOSAwLjUwMDksMC42MTA0IDAuMTAyOSwwLjI0ODUgMC4xMjk4LDAuNTIxOSAwLjA3NzQsMC43ODU3IC0wLjA1MjUsMC4yNjM5IC0wLjE4MiwwLjUwNjIgLTAuMzcyMiwwLjY5NjQgLTAuMTkwMiwwLjE5MDIgLTAuNDMyNiwwLjMxOTcgLTAuNjk2NCwwLjM3MjIgLTAuMjYzOCwwLjA1MjUgLTAuNTM3MiwwLjAyNTUgLTAuNzg1OCwtMC4wNzc0IC0wLjI0ODUsLTAuMTAyOSAtMC40NjA5LC0wLjI3NzMgLTAuNjEwMywtMC41MDA5IC0wLjE0OTQsLTAuMjIzNyAtMC4yMjkyLC0wLjQ4NjYgLTAuMjI5MiwtMC43NTU2IDAsLTAuMzYwNyAwLjE0MzMsLTAuNzA2NiAwLjM5ODMsLTAuOTYxNiAwLjI1NTEsLTAuMjU1MSAwLjYwMSwtMC4zOTg0IDAuOTYxNywtMC4zOTg0IHoiCiAgIGZpbGw9IiM4YmQ0ZjMiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc0NiIgLz4KPHBhdGgKICAgZD0ibSA1NC40MDAxLDQ0LjU3MzMgYyAwLjA2OTUsNmUtNCAwLjEzNzIsMC4wMjE4IDAuMTk0NywwLjA2MDggMC4wNTc1LDAuMDM5MSAwLjEwMjEsMC4wOTQzIDAuMTI4MiwwLjE1ODcgMC4wMjYyLDAuMDY0MyAwLjAzMjcsMC4xMzUgMC4wMTg4LDAuMjAzMSAtMC4wMTQsMC4wNjggLTAuMDQ3OCwwLjEzMDUgLTAuMDk3MSwwLjE3OTQgLTAuMDQ5NCwwLjA0ODkgLTAuMTEyMSwwLjA4MjEgLTAuMTgwMywwLjA5NTQgLTAuMDY4MiwwLjAxMzMgLTAuMTM4OCwwLjAwNjIgLTAuMjAyOSwtMC4wMjA2IC0wLjA2NDEsLTAuMDI2NyAtMC4xMTg5LC0wLjA3MTggLTAuMTU3NSwtMC4xMjk2IC0wLjAzODUsLTAuMDU3OCAtMC4wNTkxLC0wLjEyNTggLTAuMDU5MSwtMC4xOTUyIDAsLTAuMDQ2NSAwLjAwOTIsLTAuMDkyNiAwLjAyNzEsLTAuMTM1NSAwLjAxNzksLTAuMDQyOSAwLjA0NDEsLTAuMDgxOSAwLjA3NzIsLTAuMTE0NiAwLjAzMywtMC4wMzI3IDAuMDcyMiwtMC4wNTg2IDAuMTE1MiwtMC4wNzYxIDAuMDQzMSwtMC4wMTc1IDAuMDg5MiwtMC4wMjYzIDAuMTM1NywtMC4wMjU4IHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc0OCIgLz4KPHBhdGgKICAgZD0ibSA1NC4wNjA5LDQ1LjY0ODQgYyAwLjAzNDgsMCAwLjA2ODIsMC4wMTM5IDAuMDkyOCwwLjAzODUgMC4wMjQ2LDAuMDI0NiAwLjAzODQsMC4wNTc5IDAuMDM4NCwwLjA5MjcgMCwwLjAzNDggLTAuMDEzOCwwLjA2ODIgLTAuMDM4NCwwLjA5MjggLTAuMDI0NiwwLjAyNDYgLTAuMDU4LDAuMDM4NCAtMC4wOTI4LDAuMDM4NCAtMC4wMzQ4LDAgLTAuMDY4MiwtMC4wMTM4IC0wLjA5MjgsLTAuMDM4NCAtMC4wMjQ2LC0wLjAyNDYgLTAuMDM4NCwtMC4wNTggLTAuMDM4NCwtMC4wOTI4IDAuMDAxNSwtMC4wMzQzIDAuMDE1OSwtMC4wNjY3IDAuMDQwMSwtMC4wOTEgMC4wMjQzLC0wLjAyNDMgMC4wNTY4LC0wLjAzODYgMC4wOTExLC0wLjA0MDIgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzUwIiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnNzYwIj4KPHBhdGgKICAgZD0ibSAxNS4xODE2LDI5Ljc1OTggYyAwLjQ3MDksMCAwLjkzMTIsMC4xMzk2IDEuMzIyNywwLjQwMTIgMC4zOTE1LDAuMjYxNiAwLjY5NjcsMC42MzM0IDAuODc2OSwxLjA2ODUgMC4xODAxLDAuNDM1IDAuMjI3MywwLjkxMzcgMC4xMzU0LDEuMzc1NSAtMC4wOTE4LDAuNDYxOSAtMC4zMTg2LDAuODg2MSAtMC42NTE1LDEuMjE5IC0wLjMzMywwLjMzMyAtMC43NTcyLDAuNTU5OCAtMS4yMTksMC42NTE2IC0wLjQ2MTksMC4wOTE5IC0wLjk0MDYsMC4wNDQ3IC0xLjM3NTYsLTAuMTM1NSAtMC40MzUsLTAuMTgwMiAtMC44MDY5LC0wLjQ4NTMgLTEuMDY4NSwtMC44NzY4IC0wLjI2MTYsLTAuMzkxNiAtMC40MDEyLC0wLjg1MTkgLTAuNDAxMiwtMS4zMjI3IDAsLTAuNjMxNSAwLjI1MDgsLTEuMjM3IDAuNjk3MywtMS42ODM1IDAuNDQ2NSwtMC40NDY1IDEuMDUyMSwtMC42OTczIDEuNjgzNSwtMC42OTczIHoiCiAgIGZpbGw9IiM4YmQ0ZjMiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc1NCIgLz4KPHBhdGgKICAgZD0ibSAxNC42MjIxLDMwLjU1OTYgYyAwLjA5MzQsMCAwLjE4NDcsMC4wMjc2IDAuMjYyNCwwLjA3OTQgMC4wNzc4LDAuMDUxNyAwLjEzODUsMC4xMjUzIDAuMTc0NSwwLjIxMTUgMC4wMzYsMC4wODYyIDAuMDQ1OCwwLjE4MSAwLjAyOCwwLjI3MjcgLTAuMDE3OCwwLjA5MTcgLTAuMDYyMiwwLjE3NjEgLTAuMTI3OCwwLjI0MjYgLTAuMDY1NiwwLjA2NjUgLTAuMTQ5NCwwLjExMjEgLTAuMjQwOSwwLjEzMTEgLTAuMDkxNCwwLjAxOSAtMC4xODY0LDAuMDEwNSAtMC4yNzMxLC0wLjAyNDQgLTAuMDg2NiwtMC4wMzQ4IC0wLjE2MSwtMC4wOTQ1IC0wLjIxMzgsLTAuMTcxNiAtMC4wNTI4LC0wLjA3NyAtMC4wODE3LC0wLjE2NzkgLTAuMDgyOSwtMC4yNjEzIC05ZS00LC0wLjA2MjggMC4wMTA4LC0wLjEyNSAwLjAzNDIsLTAuMTgzMiAwLjAyMzQsLTAuMDU4MiAwLjA1ODEsLTAuMTExMiAwLjEwMjIsLTAuMTU1OSAwLjA0NDEsLTAuMDQ0NiAwLjA5NjYsLTAuMDgwMSAwLjE1NDUsLTAuMTA0MyAwLjA1NzgsLTAuMDI0MiAwLjExOTksLTAuMDM2NiAwLjE4MjcsLTAuMDM2NiB6IgogICBmaWxsPSIjZmZmZmZmIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3NTYiIC8+CjxwYXRoCiAgIGQ9Im0gMTQuMTY2MywzMiBjIDAuMDM0OCwwIDAuMDY4OCwwLjAxMDMgMC4wOTc3LDAuMDI5NyAwLjAyOSwwLjAxOTMgMC4wNTE1LDAuMDQ2OCAwLjA2NDksMC4wNzg5IDAuMDEzMywwLjAzMjIgMC4wMTY4LDAuMDY3NiAwLjAxLDAuMTAxNyAtMC4wMDY4LDAuMDM0MiAtMC4wMjM2LDAuMDY1NSAtMC4wNDgyLDAuMDkwMSAtMC4wMjQ2LDAuMDI0NyAtMC4wNTYsMC4wNDE0IC0wLjA5MDEsMC4wNDgyIC0wLjAzNDEsMC4wMDY4IC0wLjA2OTUsMC4wMDMzIC0wLjEwMTcsLTAuMDEgLTAuMDMyMSwtMC4wMTMzIC0wLjA1OTYsLTAuMDM1OSAtMC4wNzksLTAuMDY0OCAtMC4wMTkzLC0wLjAyOSAtMC4wMjk2LC0wLjA2MyAtMC4wMjk2LC0wLjA5NzggLTVlLTQsLTAuMDIyNyAwLjAwMzYsLTAuMDQ1MyAwLjAxMTksLTAuMDY2NCAwLjAwODMsLTAuMDIxMSAwLjAyMDcsLTAuMDQwNCAwLjAzNjQsLTAuMDU2NyAwLjAxNTgsLTAuMDE2NCAwLjAzNDYsLTAuMDI5NSAwLjA1NTQsLTAuMDM4NSAwLjAyMDgsLTAuMDA5MSAwLjA0MzIsLTAuMDE0IDAuMDY1OSwtMC4wMTQ0IHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc1OCIgLz4KPC9nPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzc2OCI+CjxwYXRoCiAgIGQ9Im0gMTguMzMwOCwzOC4zMjkxIGMgMC4xNzc5LDAgMC4zNTE3LDAuMDUyNyAwLjQ5OTYsMC4xNTE1IDAuMTQ3OSwwLjA5ODggMC4yNjMxLDAuMjM5MyAwLjMzMTIsMC40MDM2IDAuMDY4MSwwLjE2NDMgMC4wODU5LDAuMzQ1MSAwLjA1MTIsMC41MTk1IC0wLjAzNDcsMC4xNzQ1IC0wLjEyMDQsMC4zMzQ3IC0wLjI0NjEsMC40NjA0IC0wLjEyNTgsMC4xMjU4IC0wLjI4NiwwLjIxMTQgLTAuNDYwNCwwLjI0NjEgLTAuMTc0NSwwLjAzNDcgLTAuMzU1MywwLjAxNjkgLTAuNTE5NiwtMC4wNTExIC0wLjE2NDMsLTAuMDY4MSAtMC4zMDQ3LC0wLjE4MzQgLTAuNDAzNSwtMC4zMzEyIC0wLjA5ODgsLTAuMTQ3OSAtMC4xNTE2LC0wLjMyMTggLTAuMTUxNiwtMC40OTk2IDAsLTAuMjM3NiAwLjA5NDQsLTAuNDY1NSAwLjI2MjUsLTAuNjMzNiAwLjE2OCwtMC4xNjggMC4zOTU5LC0wLjI2MjQgMC42MzM1LC0wLjI2MjQgeiIKICAgZmlsbD0iIzhiZDRmMyIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzYyIiAvPgo8cGF0aAogICBkPSJtIDE4LjE3NDcsMzguNjg3NSBjIDAuMDQzLDAgMC4wODUxLDAuMDEyOCAwLjEyMDgsMC4wMzY3IDAuMDM1OCwwLjAyMzkgMC4wNjM3LDAuMDU3OSAwLjA4MDIsMC4wOTc3IDAuMDE2NSwwLjAzOTcgMC4wMjA4LDAuMDgzNSAwLjAxMjQsMC4xMjU3IC0wLjAwODQsMC4wNDIyIC0wLjAyOTEsMC4wODEgLTAuMDU5NiwwLjExMTQgLTAuMDMwNCwwLjAzMDQgLTAuMDY5MiwwLjA1MTIgLTAuMTExNCwwLjA1OTYgLTAuMDQyMiwwLjAwODMgLTAuMDg2LDAuMDA0IC0wLjEyNTcsLTAuMDEyNCAtMC4wMzk4LC0wLjAxNjUgLTAuMDczOCwtMC4wNDQ0IC0wLjA5NzcsLTAuMDgwMiAtMC4wMjM5LC0wLjAzNTggLTAuMDM2NiwtMC4wNzc4IC0wLjAzNjYsLTAuMTIwOSAtNWUtNCwtMC4wMjg3IDAuMDA0OSwtMC4wNTcyIDAuMDE1NiwtMC4wODM4IDAuMDEwOCwtMC4wMjY1IDAuMDI2OCwtMC4wNTA3IDAuMDQ3MSwtMC4wNzEgMC4wMjAzLC0wLjAyMDMgMC4wNDQ1LC0wLjAzNjMgMC4wNzExLC0wLjA0NzEgMC4wMjY2LC0wLjAxMDggMC4wNTUxLC0wLjAxNjEgMC4wODM4LC0wLjAxNTcgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzY0IiAvPgo8cGF0aAogICBkPSJtIDE3Ljk2NjcsMzkuMzU5NCBjIDAuMDE1OCwwIDAuMDMxMywwLjAwNDcgMC4wNDQ1LDAuMDEzNSAwLjAxMzEsMC4wMDg3IDAuMDIzNCwwLjAyMTIgMC4wMjk0LDAuMDM1OSAwLjAwNjEsMC4wMTQ2IDAuMDA3NywwLjAzMDcgMC4wMDQ2LDAuMDQ2MiAtMC4wMDMxLDAuMDE1NSAtMC4wMTA3LDAuMDI5OCAtMC4wMjE5LDAuMDQwOSAtMC4wMTEyLDAuMDExMiAtMC4wMjU1LDAuMDE4OSAtMC4wNDEsMC4wMjE5IC0wLjAxNTUsMC4wMDMxIC0wLjAzMTYsMC4wMDE1IC0wLjA0NjIsLTAuMDA0NSAtMC4wMTQ2LC0wLjAwNjEgLTAuMDI3MSwtMC4wMTYzIC0wLjAzNTksLTAuMDI5NSAtMC4wMDg4LC0wLjAxMzEgLTAuMDEzNSwtMC4wMjg2IC0wLjAxMzUsLTAuMDQ0NCAwLC0wLjAyMTIgMC4wMDg0LC0wLjA0MTYgMC4wMjM1LC0wLjA1NjYgMC4wMTUsLTAuMDE1IDAuMDM1MywtMC4wMjM0IDAuMDU2NSwtMC4wMjM0IHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc2NiIgLz4KPC9nPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzc3NiI+CjxwYXRoCiAgIGQ9Im0gMTUuNzQwOSwzNS44Mzk4IGMgMC4yNjk2LC02ZS00IDAuNTMzMywwLjA3ODcgMC43NTc5LDAuMjI4IDAuMjI0NSwwLjE0OTMgMC4zOTk3LDAuMzYxOCAwLjUwMzUsMC42MTA2IDAuMTAzNywwLjI0ODkgMC4xMzE0LDAuNTIyOSAwLjA3OTQsMC43ODc0IC0wLjA1MiwwLjI2NDYgLTAuMTgxMywwLjUwNzggLTAuMzcxNSwwLjY5ODkgLTAuMTkwMiwwLjE5MTEgLTAuNDMyNywwLjMyMTUgLTAuNjk3MSwwLjM3NDcgLTAuMjY0MywwLjA1MzIgLTAuNTM4NCwwLjAyNjkgLTAuNzg3OCwtMC4wNzU3IC0wLjI0OTMsLTAuMTAyNiAtMC40NjI2LC0wLjI3NjggLTAuNjEyOSwtMC41MDA2IC0wLjE1MDMsLTAuMjIzOSAtMC4yMzA5LC0wLjQ4NzIgLTAuMjMxNSwtMC43NTY5IC01ZS00LC0wLjE3OSAwLjAzNDQsLTAuMzU2MyAwLjEwMjUsLTAuNTIxOSAwLjA2ODEsLTAuMTY1NSAwLjE2ODIsLTAuMzE2IDAuMjk0NSwtMC40NDI5IDAuMTI2MywtMC4xMjY5IDAuMjc2MywtMC4yMjc3IDAuNDQxNSwtMC4yOTY2IDAuMTY1MywtMC4wNjg5IDAuMzQyNCwtMC4xMDQ1IDAuNTIxNSwtMC4xMDUgeiIKICAgZmlsbD0iIzhiZDRmMyIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzcwIiAvPgo8cGF0aAogICBkPSJtIDE1LjU0MjcsMzYuMTYwMiBjIDAuMDcwMywwIDAuMTM4OSwwLjAyMDggMC4xOTczLDAuMDU5OCAwLjA1ODUsMC4wMzkgMC4xMDQsMC4wOTQ1IDAuMTMwOSwwLjE1OTQgMC4wMjY4LDAuMDY0OSAwLjAzMzksMC4xMzYzIDAuMDIwMiwwLjIwNTMgLTAuMDEzNywwLjA2ODkgLTAuMDQ3NiwwLjEzMjEgLTAuMDk3MiwwLjE4MTggLTAuMDQ5NywwLjA0OTcgLTAuMTEzLDAuMDgzNSAtMC4xODE5LDAuMDk3MiAtMC4wNjg5LDAuMDEzNyAtMC4xNDAzLDAuMDA2NyAtMC4yMDUyLC0wLjAyMDIgLTAuMDY0OSwtMC4wMjY5IC0wLjEyMDQsLTAuMDcyNCAtMC4xNTk0LC0wLjEzMDggLTAuMDM5MSwtMC4wNTg0IC0wLjA1OTksLTAuMTI3MSAtMC4wNTk5LC0wLjE5NzMgMCwtMC4wOTQyIDAuMDM3NCwtMC4xODQ2IDAuMTA0LC0wLjI1MTIgMC4wNjY2LC0wLjA2NjYgMC4xNTcsLTAuMTA0IDAuMjUxMiwtMC4xMDQgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzcyIiAvPgo8cGF0aAogICBkPSJtIDE1LjIwMDcsMzcuMjM4MyBjIDAuMDM0OCwwIDAuMDY4MSwwLjAxMzggMC4wOTI3LDAuMDM4NCAwLjAyNDcsMC4wMjQ2IDAuMDM4NSwwLjA1OCAwLjAzODUsMC4wOTI4IDAuMDAyNywwLjAxNyAwLjAwMjEsMC4wMzQ0IC0wLjAwMTksMC4wNTEyIC0wLjAwNCwwLjAxNjcgLTAuMDExMywwLjAzMjYgLTAuMDIxNCwwLjA0NjUgLTAuMDEwMSwwLjAxNCAtMC4wMjI4LDAuMDI1OCAtMC4wMzc1LDAuMDM0OSAtMC4wMTQ3LDAuMDA5IC0wLjAzMSwwLjAxNTEgLTAuMDQ4LDAuMDE3OCAtMC4wMzQzLDAuMDA0NyAtMC4wNjksLTAuMDA0IC0wLjA5NywtMC4wMjQzIC0wLjAyOCwtMC4wMjAyIC0wLjA0NzIsLTAuMDUwNSAtMC4wNTM0LC0wLjA4NDUgLTAuMDAzMiwtMC4wMTM3IC0wLjAwMzIsLTAuMDI3OSAwLC0wLjA0MTYgLTVlLTQsLTAuMDE2OCAwLjAwMjQsLTAuMDMzNiAwLjAwODUsLTAuMDQ5MyAwLjAwNiwtMC4wMTU2IDAuMDE1MSwtMC4wMyAwLjAyNjcsLTAuMDQyMiAwLjAxMTYsLTAuMDEyMiAwLjAyNTUsLTAuMDIxOSAwLjA0MDgsLTAuMDI4OCAwLjAxNTQsLTAuMDA2OCAwLjAzMiwtMC4wMTA1IDAuMDQ4OCwtMC4wMTA5IHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc3NCIgLz4KPC9nPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzc4NCI+CjxwYXRoCiAgIGQ9Im0gNDUuNTk0LDUzLjYwOTQgYyAtMC4yNTg5LDAgLTAuNTExOSwwLjA3NjcgLTAuNzI3MiwwLjIyMDUgLTAuMjE1MiwwLjE0MzkgLTAuMzgzLDAuMzQ4MyAtMC40ODIsMC41ODc0IC0wLjA5OTEsMC4yMzkyIC0wLjEyNSwwLjUwMjMgLTAuMDc0NSwwLjc1NjIgMC4wNTA1LDAuMjUzOSAwLjE3NTIsMC40ODcxIDAuMzU4MiwwLjY3MDEgMC4xODMsMC4xODMxIDAuNDE2MiwwLjMwNzcgMC42NzAxLDAuMzU4MiAwLjI1MzksMC4wNTA1IDAuNTE3MSwwLjAyNDYgMC43NTYyLC0wLjA3NDQgMC4yMzkyLC0wLjA5OTEgMC40NDM2LC0wLjI2NjkgMC41ODc0LC0wLjQ4MjEgMC4xNDM4LC0wLjIxNTIgMC4yMjA1LC0wLjQ2ODMgMC4yMjA1LC0wLjcyNzEgMCwtMC4zNDcxIC0wLjEzNzgsLTAuNjggLTAuMzgzMywtMC45MjU1IC0wLjI0NTQsLTAuMjQ1NCAtMC41NzgzLC0wLjM4MzMgLTAuOTI1NCwtMC4zODMzIHoiCiAgIGZpbGw9IiM4YmQ0ZjMiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc3OCIgLz4KPHBhdGgKICAgZD0ibSA0NS45MDE4LDU0LjA1MDggYyAtMC4wNTEzLDAgLTAuMTAxNCwwLjAxNTIgLTAuMTQ0LDAuMDQzNyAtMC4wNDI3LDAuMDI4NCAtMC4wNzU5LDAuMDY4OSAtMC4wOTU1LDAuMTE2MyAtMC4wMTk2LDAuMDQ3NCAtMC4wMjQ3LDAuMDk5NSAtMC4wMTQ3LDAuMTQ5NyAwLjAxLDAuMDUwMyAwLjAzNDYsMC4wOTY1IDAuMDcwOSwwLjEzMjggMC4wMzYyLDAuMDM2MiAwLjA4MjQsMC4wNjA5IDAuMTMyNywwLjA3MDkgMC4wNTAzLDAuMDEgMC4xMDI0LDAuMDA0OSAwLjE0OTgsLTAuMDE0NyAwLjA0NzMsLTAuMDE5NyAwLjA4NzgsLTAuMDUyOSAwLjExNjMsLTAuMDk1NSAwLjAyODUsLTAuMDQyNiAwLjA0MzcsLTAuMDkyOCAwLjA0MzcsLTAuMTQ0IDAsLTAuMDY4OCAtMC4wMjczLC0wLjEzNDcgLTAuMDc1OSwtMC4xODMzIC0wLjA0ODcsLTAuMDQ4NiAtMC4xMTQ2LC0wLjA3NTkgLTAuMTgzMywtMC4wNzU5IHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc4MCIgLz4KPHBhdGgKICAgZD0ibSA0Ni4xNTA4LDU0Ljg0MTggYyAtMC4wMjUsMC4wMDE1IC0wLjA0ODYsMC4wMTIxIC0wLjA2NjIsMC4wMjk4IC0wLjAxNzcsMC4wMTc3IC0wLjAyODMsMC4wNDEyIC0wLjAyOTksMC4wNjYyIC00ZS00LDAuMDEyNyAwLjAwMTgsMC4wMjU0IDAuMDA2NCwwLjAzNzMgMC4wMDQ3LDAuMDExOCAwLjAxMTgsMC4wMjI2IDAuMDIwOCwwLjAzMTYgMC4wMDksMC4wMDkgMC4wMTk3LDAuMDE2IDAuMDMxNiwwLjAyMDcgMC4wMTE4LDAuMDA0NyAwLjAyNDUsMC4wMDY4IDAuMDM3MywwLjAwNjQgMC4wMTIxLDRlLTQgMC4wMjQzLC0wLjAwMTYgMC4wMzU3LC0wLjAwNTggMC4wMTE0LC0wLjAwNDMgMC4wMjE5LC0wLjAxMDggMC4wMzA4LC0wLjAxOTEgMC4wMDg5LC0wLjAwODMgMC4wMTYxLC0wLjAxODMgMC4wMjEyLC0wLjAyOTQgMC4wMDUsLTAuMDExMSAwLjAwNzgsLTAuMDIzMSAwLjAwODMsLTAuMDM1MyA0ZS00LC0wLjAxMjcgLTAuMDAxOCwtMC4wMjU0IC0wLjAwNjQsLTAuMDM3MyAtMC4wMDQ3LC0wLjAxMTggLTAuMDExOCwtMC4wMjI2IC0wLjAyMDgsLTAuMDMxNiAtMC4wMDksLTAuMDA5IC0wLjAxOTcsLTAuMDE2IC0wLjAzMTYsLTAuMDIwNyAtMC4wMTE4LC0wLjAwNDcgLTAuMDI0NSwtMC4wMDY4IC0wLjAzNzIsLTAuMDA2NCB6IgogICBmaWxsPSIjZmZmZmZmIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg3ODIiIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc3OTIiPgo8cGF0aAogICBkPSJtIDQ0LjExLDU2LjA1NzYgYyAtMC4wOTc1LDAgLTAuMTkyOCwwLjAyODkgLTAuMjczOCwwLjA4MzEgLTAuMDgxLDAuMDU0MSAtMC4xNDQyLDAuMTMxMSAtMC4xODE1LDAuMjIxMSAtMC4wMzczLDAuMDkwMSAtMC4wNDcxLDAuMTg5MiAtMC4wMjgsMC4yODQ4IDAuMDE5LDAuMDk1NSAwLjA2NTksMC4xODM0IDAuMTM0OCwwLjI1MjMgMC4wNjg5LDAuMDY4OSAwLjE1NjgsMC4xMTU4IDAuMjUyMywwLjEzNDggMC4wOTU2LDAuMDE5MSAwLjE5NDcsMC4wMDkzIDAuMjg0OCwtMC4wMjggMC4wOSwtMC4wMzczIDAuMTY3LC0wLjEwMDUgMC4yMjExLC0wLjE4MTUgMC4wNTQyLC0wLjA4MSAwLjA4MzEsLTAuMTc2MyAwLjA4MzEsLTAuMjczOCAwLC0wLjEzMDcgLTAuMDUxOSwtMC4yNTYgLTAuMTQ0NCwtMC4zNDg0IEMgNDQuMzY2LDU2LjEwOTUgNDQuMjQwNyw1Ni4wNTc2IDQ0LjExLDU2LjA1NzYgWiIKICAgZmlsbD0iIzhiZDRmMyIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzg2IiAvPgo8cGF0aAogICBkPSJtIDQ0LjE5NjgsNTYuMjUzMyBjIC0wLjAzMTgsLTAuMDA0NyAtMC4wNjQxLDAuMDAzIC0wLjA5MDMsMC4wMjE0IC0wLjAyNjIsMC4wMTg1IC0wLjA0NDMsMC4wNDY0IC0wLjA1MDUsMC4wNzc4IC0wLjAwNDcsMC4wMzIyIDAuMDAzNCwwLjA2NDkgMC4wMjI2LDAuMDkxMiAwLjAxOTEsMC4wMjYzIDAuMDQ3NywwLjA0NDEgMC4wNzk4LDAuMDQ5NiBoIDAuMDM4NCBjIDAuMDI4NCwtMC4wMDQ3IDAuMDU0MywtMC4wMTkzIDAuMDczLC0wLjA0MTMgMC4wMTg3LC0wLjAyMTkgMC4wMjg5LC0wLjA0OTggMC4wMjg5LC0wLjA3ODcgMCwtMC4wMjg4IC0wLjAxMDIsLTAuMDU2NyAtMC4wMjg5LC0wLjA3ODcgLTAuMDE4NywtMC4wMjIgLTAuMDQ0NiwtMC4wMzY2IC0wLjA3MywtMC4wNDEzIHoiCiAgIGZpbGw9IiNmZmZmZmYiCiAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgb3BhY2l0eT0iMSIKICAgc3Ryb2tlPSJub25lIgogICBpZD0icGF0aDc4OCIgLz4KPHBhdGgKICAgZD0ibSA0NC4zMTI0LDU2LjYxNzIgYyAtMC4wMDg5LDAgLTAuMDE3NSwwLjAwMjYgLTAuMDI0OSwwLjAwNzUgLTAuMDA3NCwwLjAwNSAtMC4wMTMxLDAuMDEyIC0wLjAxNjUsMC4wMjAxIC0wLjAwMzQsMC4wMDgyIC0wLjAwNDMsMC4wMTcyIC0wLjAwMjYsMC4wMjU5IDAuMDAxOCwwLjAwODcgMC4wMDYsMC4wMTY3IDAuMDEyMywwLjAyMyAwLjAwNjMsMC4wMDYyIDAuMDE0MiwwLjAxMDUgMC4wMjI5LDAuMDEyMiAwLjAwODcsMC4wMDE4IDAuMDE3Nyw5ZS00IDAuMDI1OSwtMC4wMDI1IDAuMDA4MiwtMC4wMDM0IDAuMDE1MiwtMC4wMDkyIDAuMDIwMSwtMC4wMTY1IDAuMDA1LC0wLjAwNzQgMC4wMDc2LC0wLjAxNjEgMC4wMDc2LC0wLjAyNDkgMCwtMC4wMTE5IC0wLjAwNDcsLTAuMDIzMyAtMC4wMTMxLC0wLjAzMTcgLTAuMDA4NCwtMC4wMDg0IC0wLjAxOTgsLTAuMDEzMSAtMC4wMzE3LC0wLjAxMzEgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzkwIiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnODAwIj4KPHBhdGgKICAgZD0ibSA0NS4wNTkzLDU3Ljc4NTIgYyAtMC4xNDgxLDAgLTAuMjkyOCwwLjA0MzkgLTAuNDE2LDAuMTI2MiAtMC4xMjMxLDAuMDgyMiAtMC4yMTkxLDAuMTk5MiAtMC4yNzU4LDAuMzM2IC0wLjA1NjYsMC4xMzY4IC0wLjA3MTUsMC4yODc0IC0wLjA0MjYsMC40MzI2IDAuMDI4OSwwLjE0NTMgMC4xMDAyLDAuMjc4NyAwLjIwNSwwLjM4MzQgMC4xMDQ3LDAuMTA0OCAwLjIzODEsMC4xNzYxIDAuMzgzNCwwLjIwNSAwLjE0NTIsMC4wMjg5IDAuMjk1OCwwLjAxNCAwLjQzMjYsLTAuMDQyNiAwLjEzNjgsLTAuMDU2NyAwLjI1MzgsLTAuMTUyNyAwLjMzNiwtMC4yNzU4IDAuMDgyMywtMC4xMjMyIDAuMTI2MiwtMC4yNjc5IDAuMTI2MiwtMC40MTYgMCwtMC4xOTg2IC0wLjA3ODgsLTAuMzg5MSAtMC4yMTkzLC0wLjUyOTUgLTAuMTQwNCwtMC4xNDA1IC0wLjMzMDksLTAuMjE5MyAtMC41Mjk1LC0wLjIxOTMgeiIKICAgZmlsbD0iIzhiZDRmMyIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzk0IiAvPgo8cGF0aAogICBkPSJtIDQ1LjE2ODYsNTcuOTYxMiBjIC0wLjA1MSwwIC0wLjA5OTgsMC4wMjAyIC0wLjEzNTgsMC4wNTYyIC0wLjAzNiwwLjAzNiAtMC4wNTYyLDAuMDg0OSAtMC4wNTYyLDAuMTM1OCAwLDAuMDM4NiAwLjAxMTQsMC4wNzY0IDAuMDMyOSwwLjEwODUgMC4wMjE0LDAuMDMyMSAwLjA1MTksMC4wNTcxIDAuMDg3NiwwLjA3MTggMC4wMzU2LDAuMDE0OCAwLjA3NDksMC4wMTg3IDAuMTEyNywwLjAxMTIgMC4wMzc5LC0wLjAwNzYgMC4wNzI3LC0wLjAyNjIgMC4xLC0wLjA1MzUgMC4wMjczLC0wLjAyNzMgMC4wNDU5LC0wLjA2MiAwLjA1MzQsLTAuMDk5OSAwLjAwNzYsLTAuMDM3OSAwLjAwMzcsLTAuMDc3MSAtMC4wMTExLC0wLjExMjggLTAuMDE0OCwtMC4wMzU3IC0wLjAzOTgsLTAuMDY2MSAtMC4wNzE5LC0wLjA4NzYgLTAuMDMyMSwtMC4wMjE0IC0wLjA2OTgsLTAuMDMyOSAtMC4xMDg0LC0wLjAzMjkgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzk2IiAvPgo8cGF0aAogICBkPSJtIDQ1LjM1NzUsNTguNTU5NyBjIC0wLjAwOTUsLTAuMDAyNCAtMC4wMTk0LC0wLjAwMjcgLTAuMDI5LC0xMGUtNCAtMC4wMDk2LDAuMDAxNyAtMC4wMTg4LDAuMDA1MyAtMC4wMjY5LDAuMDEwNyAtMC4wMDgxLDAuMDA1NSAtMC4wMTUsMC4wMTI1IC0wLjAyMDMsMC4wMjA3IC0wLjAwNTMsMC4wMDgzIC0wLjAwODcsMC4wMTc1IC0wLjAxMDIsMC4wMjcyIC0wLjAwMzksMC4wMTg2IC00ZS00LDAuMDM4IDAuMDA5NywwLjA1NDEgMC4wMTAyLDAuMDE2MSAwLjAyNjIsMC4wMjc3IDAuMDQ0NywwLjAzMjMgaCAwLjAzMiBjIDAuMDE4NiwwIDAuMDM2NSwtMC4wMDc1IDAuMDQ5NywtMC4wMjA3IDAuMDEzMiwtMC4wMTMyIDAuMDIwNywtMC4wMzExIDAuMDIwNywtMC4wNDk3IDRlLTQsLTAuMDA5MyAtMTBlLTQsLTAuMDE4NSAtMC4wMDQyLC0wLjAyNzIgLTAuMDAzMSwtMC4wMDg3IC0wLjAwNzksLTAuMDE2NyAtMC4wMTQyLC0wLjAyMzYgLTAuMDA2MiwtMC4wMDY4IC0wLjAxMzcsLTAuMDEyNCAtMC4wMjIxLC0wLjAxNjMgLTAuMDA4NCwtMC4wMDM5IC0wLjAxNzUsLTAuMDA2MSAtMC4wMjY3LC0wLjAwNjUgeiIKICAgZmlsbD0iI2ZmZmZmZiIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoNzk4IiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnODE1Ij4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc4MTEiPgo8dXNlCiAgIGZpbGw9InVybCgjTGluZWFyR3JhZGllbnRfNikiCiAgIGZpbGwtcnVsZT0ibm9uemVybyIKICAgc3Ryb2tlPSJub25lIgogICB4bGluazpocmVmPSIjRmlsbF83IgogICBpZD0idXNlODAyIgogICBzdHlsZT0iZmlsbDp1cmwoI0xpbmVhckdyYWRpZW50XzYpIiAvPgo8bWFzawogICBoZWlnaHQ9IjExLjA5MDIiCiAgIGlkPSJTdHJva2VNYXNrXzciCiAgIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgIHdpZHRoPSIxNy43NzgzIgogICB4PSI0LjQyMzQxIgogICB5PSIxOC43MzgyIj4KPHJlY3QKICAgZmlsbD0iI2ZmZmZmZiIKICAgaGVpZ2h0PSIxMS4wOTAyIgogICBzdHJva2U9Im5vbmUiCiAgIHdpZHRoPSIxNy43NzgyOTkiCiAgIHg9IjQuNDIzNDA5OSIKICAgeT0iMTguNzM4MTk5IgogICBpZD0icmVjdDgwNCIgLz4KPHVzZQogICBmaWxsPSIjMDAwMDAwIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIHN0cm9rZT0ibm9uZSIKICAgeGxpbms6aHJlZj0iI0ZpbGxfNyIKICAgaWQ9InVzZTgwNiIgLz4KPC9tYXNrPgo8dXNlCiAgIGZpbGw9Im5vbmUiCiAgIG1hc2s9InVybCgjU3Ryb2tlTWFza183KSIKICAgc3Ryb2tlPSIjNTUyZjgyIgogICBzdHJva2UtbGluZWNhcD0iYnV0dCIKICAgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIKICAgc3Ryb2tlLXdpZHRoPSIwLjk2IgogICB4bGluazpocmVmPSIjRmlsbF83IgogICBpZD0idXNlODA5IiAvPgo8L2c+CjxwYXRoCiAgIGQ9Im0gMTYuMDI1OSwyMS4xOTk4IGMgMCwwIC02LjY1MTUzLDcuMjgwNCAtMTAuNTM5NTQsNy40ODUyIC0wLjE0NCwwLjMyIC0wLjI2MDE3LDAuNTc3OCAtMC4zMjQxNywwLjc2MDIgNC4yNTkyMSwwLjAxOTIgNy4zNDY5MSwtMC42NDg2IDkuNjI1MzEsLTEuNTgzIDIuMTk1MiwtMC44OTYgMy41OTM2LC0yLjA0NDggNC40NDgsLTMuMDc4NCAwLjg1NDQsLTEuMDMzNiAxLjA4MjUsLTEuODk5NyAxLjA4NTcsLTIuMzE1NyAwLjAwNjQsLTAuMDM5MiAwLjAyMzksLTAuMTI4MiAwLjAxNzUsLTAuMTY3NCAtMC4zMiwtMC43NjggMC43Nzg0LC0xLjc3OTMgMS4yMDcyLC0yLjE4MjUgLTAuMTUwNCwtMC4xNjMyIC0wLjQzMzUsLTAuNTE1MyAtMC42ODMxLC0wLjgxNjEgLTIuMzc5MiwtMC4wNTg2IC0yLjg2NzcsLTAuNDQ4OCAtNC44MzA1LDEuODg0OSAtMS45NjI4LDIuMzMzNiAtMC4wMDY0LDAuMDEyOCAtMC4wMDY0LDAuMDEyOCB6IgogICBmaWxsPSIjNzc3YWJhIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg4MTMiIC8+CjwvZz4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc4MzAiPgo8ZwogICBvcGFjaXR5PSIxIgogICBpZD0iZzgyNiI+Cjx1c2UKICAgZmlsbD0idXJsKCNMaW5lYXJHcmFkaWVudF83KSIKICAgZmlsbC1ydWxlPSJub256ZXJvIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzgiCiAgIGlkPSJ1c2U4MTciCiAgIHN0eWxlPSJmaWxsOnVybCgjTGluZWFyR3JhZGllbnRfNykiIC8+CjxtYXNrCiAgIGhlaWdodD0iMTQuMzM5IgogICBpZD0iU3Ryb2tlTWFza184IgogICBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICB3aWR0aD0iMTYuNTMxNiIKICAgeD0iNi41OTM1MiIKICAgeT0iMi4wMzk1NiI+CjxyZWN0CiAgIGZpbGw9IiNmZmZmZmYiCiAgIGhlaWdodD0iMTQuMzM5IgogICBzdHJva2U9Im5vbmUiCiAgIHdpZHRoPSIxNi41MzE2MDEiCiAgIHg9IjYuNTkzNTIwMiIKICAgeT0iMi4wMzk1NjAxIgogICBpZD0icmVjdDgxOSIgLz4KPHVzZQogICBmaWxsPSIjMDAwMDAwIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIHN0cm9rZT0ibm9uZSIKICAgeGxpbms6aHJlZj0iI0ZpbGxfOCIKICAgaWQ9InVzZTgyMSIgLz4KPC9tYXNrPgo8dXNlCiAgIGZpbGw9Im5vbmUiCiAgIG1hc2s9InVybCgjU3Ryb2tlTWFza184KSIKICAgc3Ryb2tlPSIjNTUyZjgyIgogICBzdHJva2UtbGluZWNhcD0iYnV0dCIKICAgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIKICAgc3Ryb2tlLXdpZHRoPSIwLjk2IgogICB4bGluazpocmVmPSIjRmlsbF84IgogICBpZD0idXNlODI0IiAvPgo8L2c+CjxwYXRoCiAgIGQ9Im0gMjEuNDg4MywxNC42NCBjIDAsMCAtOS43NDA4LC0xMC4zODA3NSAtMTMuOTE5OTYsLTExLjkwMDc1IDAsMCAzLjYxNTk2LDAuNDk5MiA1LjU4MDc2LDEuMDM2OCAtMS45NDk4LC0wLjYyMzY2IC0zLjk1OTc3LC0xLjA0MDg4IC01Ljk5Njc2LC0xLjI0NDggMC4yMTEyLDEuMjggMS4zNDQsNi45MjQ4IDUuNDA0NzYsOS42OTkyNSAzLjQ2ODIsMi44NTU1IDcuMDk3OSwzLjcxMDIgOC43OTM4LDMuNjg4IDAuNTIzNCwtMC4xMDEgMC44OTY0LC0wLjU1OTkgMC44ODYsLTAuNTQ1OSAtMC4wMTYxLDAuMDA4NCAtMC42MjIsLTAuNTcxMiAtMC43NDg2LC0wLjczMjYgeiIKICAgZmlsbD0iIzc3N2FiYSIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBvcGFjaXR5PSIxIgogICBzdHJva2U9Im5vbmUiCiAgIGlkPSJwYXRoODI4IiAvPgo8L2c+CjxnCiAgIG9wYWNpdHk9IjEiCiAgIGlkPSJnODQ1Ij4KPGcKICAgb3BhY2l0eT0iMSIKICAgaWQ9Imc4NDEiPgo8dXNlCiAgIGZpbGw9InVybCgjTGluZWFyR3JhZGllbnRfOCkiCiAgIGZpbGwtcnVsZT0ibm9uemVybyIKICAgc3Ryb2tlPSJub25lIgogICB4bGluazpocmVmPSIjRmlsbF85IgogICBpZD0idXNlODMyIgogICBzdHlsZT0iZmlsbDp1cmwoI0xpbmVhckdyYWRpZW50XzgpIiAvPgo8bWFzawogICBoZWlnaHQ9IjkuMTU4MzEiCiAgIGlkPSJTdHJva2VNYXNrXzkiCiAgIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgIHdpZHRoPSIyMS45MTY2IgogICB4PSIxLjEzNDExIgogICB5PSIxMi4xNjgzIj4KPHJlY3QKICAgZmlsbD0iI2ZmZmZmZiIKICAgaGVpZ2h0PSI5LjE1ODMwOTkiCiAgIHN0cm9rZT0ibm9uZSIKICAgd2lkdGg9IjIxLjkxNjU5OSIKICAgeD0iMS4xMzQxMSIKICAgeT0iMTIuMTY4MyIKICAgaWQ9InJlY3Q4MzQiIC8+Cjx1c2UKICAgZmlsbD0iIzAwMDAwMCIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzkiCiAgIGlkPSJ1c2U4MzYiIC8+CjwvbWFzaz4KPHVzZQogICBmaWxsPSJub25lIgogICBtYXNrPSJ1cmwoI1N0cm9rZU1hc2tfOSkiCiAgIHN0cm9rZT0iIzU1MmY4MiIKICAgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiCiAgIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiCiAgIHN0cm9rZS13aWR0aD0iMC45NiIKICAgeGxpbms6aHJlZj0iI0ZpbGxfOSIKICAgaWQ9InVzZTgzOSIgLz4KPC9nPgo8cGF0aAogICBkPSJtIDIwLjM2MjYsMTYuODc4NCBjIDAsMCAtMTUuMTE5NDYsLTEuMDU4IC0xOC4yMzYyNiwtMC40MDg0IDAuNjM0NTUsLTAuNTMwMSAxLjI5Nzk2LC0xLjAyNDggMS45ODcyLC0xLjQ4MTYgLTAuNzkzOTQsMC40NjQxIC0xLjU2MTAzLDAuOTcyNiAtMi4yOTc2LDEuNTIzMiAxLjI4LDEuMTQ1NiA5LjE3NzU2LDcuNTIgMTguODE5MTYsMi4zMiAxLjk1NjEsLTEuMjg3MiAxLjk2NDksLTEuMzYwMiAxLjk0NDksLTEuMzQ1NCAtMC4wMiwwLjAxNDcgLTAuNzQ1MSwtMC40NDIxIC0yLjIwMzksLTAuNjAxNiB6IgogICBmaWxsPSIjNzc3YWJhIgogICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgIG9wYWNpdHk9IjEiCiAgIHN0cm9rZT0ibm9uZSIKICAgaWQ9InBhdGg4NDMiIC8+CjwvZz4KPGcKICAgaWQ9Imc0MzYxIgogICBzdHlsZT0iZGlzcGxheTppbmxpbmUiPjxwYXRoCiAgICAgZD0ibSAyMi44NzUyLDE0LjYyMTIgYyAwLjAyNDgsLTEuNDA1NiAyLjYyNCwtNi4zOTgyMSAtMC44ODM3LC0zLjkxNTUgLTIuMDAxLDEuNDE2MyAwLjkwNDUsMy45MTggMC44ODM3LDMuOTE1NSB6IgogICAgIGZpbGw9InVybCgjTGluZWFyR3JhZGllbnRfOSkiCiAgICAgZmlsbC1ydWxlPSJub256ZXJvIgogICAgIG9wYWNpdHk9IjEiCiAgICAgc3Ryb2tlPSJub25lIgogICAgIGlkPSJwYXRoODQ3IgogICAgIGlua3NjYXBlOmxhYmVsPSJwYXRoODQ3IgogICAgIHN0eWxlPSJjbGlwLXJ1bGU6ZXZlbm9kZDtmaWxsOnVybCgjTGluZWFyR3JhZGllbnRfOSk7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kIiAvPjxnCiAgICAgb3BhY2l0eT0iMSIKICAgICBpZD0iZzg1OCI+Cjx1c2UKICAgZmlsbD0idXJsKCNMaW5lYXJHcmFkaWVudF8xMCkiCiAgIGZpbGwtcnVsZT0ibm9uemVybyIKICAgc3Ryb2tlPSJub25lIgogICB4bGluazpocmVmPSIjRmlsbF8xMCIKICAgaWQ9InVzZTg0OSIKICAgc3R5bGU9ImZpbGw6dXJsKCNMaW5lYXJHcmFkaWVudF8xMCkiIC8+CjxtYXNrCiAgIGhlaWdodD0iOC41Njg2IgogICBpZD0iU3Ryb2tlTWFza18xMCIKICAgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgd2lkdGg9IjYuNzQyNjMiCiAgIHg9IjE5Ljk3MDQiCiAgIHk9IjExLjU5ODYiPgo8cmVjdAogICBmaWxsPSIjZmZmZmZmIgogICBoZWlnaHQ9IjguNTY4NTk5NyIKICAgc3Ryb2tlPSJub25lIgogICB3aWR0aD0iNi43NDI2MyIKICAgeD0iMTkuOTcwNCIKICAgeT0iMTEuNTk4NiIKICAgaWQ9InJlY3Q4NTEiIC8+Cjx1c2UKICAgZmlsbD0iIzAwMDAwMCIKICAgZmlsbC1ydWxlPSJldmVub2RkIgogICBzdHJva2U9Im5vbmUiCiAgIHhsaW5rOmhyZWY9IiNGaWxsXzEwIgogICBpZD0idXNlODUzIiAvPgo8L21hc2s+Cjx1c2UKICAgZmlsbD0ibm9uZSIKICAgbWFzaz0idXJsKCNTdHJva2VNYXNrXzEwKSIKICAgc3Ryb2tlPSIjNTUyZjgyIgogICBzdHJva2UtbGluZWNhcD0iYnV0dCIKICAgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIKICAgc3Ryb2tlLXdpZHRoPSIwLjk2IgogICB4bGluazpocmVmPSIjRmlsbF8xMCIKICAgaWQ9InVzZTg1NiIgLz4KPC9nPjxwYXRoCiAgICAgZD0ibSAyMy42MzY3LDEyLjgzNzggYyAtMC4wMDMyLDAgLTEuMzgzNCwwLjUxNzYgLTEuNDk4MSwwLjk1MDUgLTAuMTE0NywwLjQzMjkgMC4zODU1LDEuNjU4NSAwLjM4NTUsMS42NTg1IGwgMC4wNTc0LDAuMTQ2NCAtMC4xMjExLDAuMDk4NyBjIC0wLjAwNjQsMC4wMDMyIC0xLjk1NzcsMS43MjA0IC0xLjgyNzEsMi4yOTY2IDAuMTU2MSwwLjY0NjIgMS44NTI3LDIuNDY4NSAxLjg1MjcsMi40Njg1IDAsMCA0LjQ2NjcsLTEuMzQ5NSA1LjA0OSwtNC4xNzU1IDAuNTMxNiwtMi41Nzk2IC0zLjQ3MDYsLTUuMDczNSAtNC4zMTQyLC00Ljc3NzggLTAuMDQ3LDAuMDE2NSAtMS43ODA0LDAuNzA4MyAtMS43MDIxLDEuNDczIDAuMDQyMSwwLjQxMDkgMC43MzA5LC0wLjM0MTQgMi4xMTgsLTAuMTM4OSB6IgogICAgIGZpbGw9InVybCgjTGluZWFyR3JhZGllbnRfMTEpIgogICAgIGZpbGwtcnVsZT0ibm9uemVybyIKICAgICBvcGFjaXR5PSIxIgogICAgIHN0cm9rZT0ibm9uZSIKICAgICBpZD0icGF0aDg2MCIKICAgICBzdHlsZT0iZmlsbDp1cmwoI0xpbmVhckdyYWRpZW50XzExKSIgLz48L2c+CjwvZz4KPC9zdmc+Cg=="
diff --git a/src/internal/packager2/layout/testdata/zarf-package/zarf.yaml b/src/internal/packager2/layout/testdata/zarf-package/zarf.yaml
new file mode 100644
index 0000000000..695ac11604
--- /dev/null
+++ b/src/internal/packager2/layout/testdata/zarf-package/zarf.yaml
@@ -0,0 +1,41 @@
+kind: ZarfPackageConfig
+metadata:
+ name: test
+ version: v0.0.1
+components:
+ - name: helm-charts
+ required: true
+ charts:
+ - name: podinfo-local
+ version: 6.4.0
+ namespace: podinfo-from-local-chart
+ localPath: chart
+ valuesFiles:
+ - values.yaml
+ - name: files
+ required: true
+ files:
+ - source: data.txt
+ target: data.txt
+ - source: archive.tar
+ extractPath: archive-data.txt
+ target: archive-data.txt
+ - name: data-injections
+ required: true
+ dataInjections:
+ - source: injection
+ target:
+ namespace: test
+ selector: app=test
+ container: test
+ path: /test
+ compress: true
+ - name: manifests
+ required: true
+ manifests:
+ - name: deployment
+ namespace: httpd
+ files:
+ - deployment.yaml
+ kustomizations:
+ - kustomize
diff --git a/src/internal/packager2/load.go b/src/internal/packager2/load.go
index c17fcf24b5..b757315173 100644
--- a/src/internal/packager2/load.go
+++ b/src/internal/packager2/load.go
@@ -4,10 +4,8 @@
package packager2
import (
- "archive/tar"
"context"
"encoding/json"
- "errors"
"fmt"
"io"
"net/url"
@@ -17,14 +15,12 @@ import (
"strings"
"github.com/defenseunicorns/pkg/helpers/v2"
- "github.com/mholt/archiver/v3"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
+ "github.com/zarf-dev/zarf/src/internal/packager2/layout"
"github.com/zarf-dev/zarf/src/pkg/cluster"
- "github.com/zarf-dev/zarf/src/pkg/layout"
"github.com/zarf-dev/zarf/src/pkg/packager/filters"
- "github.com/zarf-dev/zarf/src/pkg/packager/sources"
"github.com/zarf-dev/zarf/src/pkg/utils"
"github.com/zarf-dev/zarf/src/types"
)
@@ -39,7 +35,7 @@ type LoadOptions struct {
}
// LoadPackage optionally fetches and loads the package from the given source.
-func LoadPackage(ctx context.Context, opt LoadOptions) (*layout.PackagePaths, error) {
+func LoadPackage(ctx context.Context, opt LoadOptions) (*layout.PackageLayout, error) {
srcType, err := identifySource(opt.Source)
if err != nil {
return nil, err
@@ -81,87 +77,16 @@ func LoadPackage(ctx context.Context, opt LoadOptions) (*layout.PackagePaths, er
}
}
- // Extract the package
- packageDir, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
- if err != nil {
- return nil, err
+ layoutOpt := layout.PackageLayoutOptions{
+ PublicKeyPath: opt.PublicKeyPath,
+ SkipSignatureValidation: opt.SkipSignatureValidation,
+ IsPartial: isPartial,
}
- pathsExtracted := []string{}
- err = archiver.Walk(tarPath, func(f archiver.File) error {
- if f.IsDir() {
- return nil
- }
- header, ok := f.Header.(*tar.Header)
- if !ok {
- return fmt.Errorf("expected header to be *tar.Header but was %T", f.Header)
- }
- // If path has nested directories we want to create them.
- dir := filepath.Dir(header.Name)
- if dir != "." {
- err := os.MkdirAll(filepath.Join(packageDir, dir), helpers.ReadExecuteAllWriteUser)
- if err != nil {
- return err
- }
- }
- dst, err := os.Create(filepath.Join(packageDir, header.Name))
- if err != nil {
- return err
- }
- defer dst.Close()
- _, err = io.Copy(dst, f)
- if err != nil {
- return err
- }
- pathsExtracted = append(pathsExtracted, header.Name)
- return nil
- })
+ pkgLayout, err := layout.LoadFromTar(ctx, tarPath, layoutOpt)
if err != nil {
return nil, err
}
-
- // Load the package paths
- pkgPaths := layout.New(packageDir)
- pkgPaths.SetFromPaths(pathsExtracted)
- pkg, _, err := pkgPaths.ReadZarfYAML()
- if err != nil {
- return nil, err
- }
- // TODO: Filter is not persistently applied.
- pkg.Components, err = opt.Filter.Apply(pkg)
- if err != nil {
- return nil, err
- }
- if err := pkgPaths.MigrateLegacy(); err != nil {
- return nil, err
- }
- if !pkgPaths.IsLegacyLayout() {
- if err := sources.ValidatePackageIntegrity(pkgPaths, pkg.Metadata.AggregateChecksum, isPartial); err != nil {
- return nil, err
- }
- if !opt.SkipSignatureValidation {
- if err := sources.ValidatePackageSignature(ctx, pkgPaths, opt.PublicKeyPath); err != nil {
- return nil, err
- }
- }
- }
- for _, component := range pkg.Components {
- if err := pkgPaths.Components.Unarchive(component); err != nil {
- if errors.Is(err, layout.ErrNotLoaded) {
- _, err := pkgPaths.Components.Create(component)
- if err != nil {
- return nil, err
- }
- } else {
- return nil, err
- }
- }
- }
- if pkgPaths.SBOMs.Path != "" {
- if err := pkgPaths.SBOMs.Unarchive(); err != nil {
- return nil, err
- }
- }
- return pkgPaths, nil
+ return pkgLayout, nil
}
// identifySource returns the source type for the given source.
@@ -246,14 +171,11 @@ func packageFromSourceOrCluster(ctx context.Context, cluster *cluster.Cluster, s
Filter: filters.Empty(),
PublicKeyPath: publicKeyPath,
}
- pkgPaths, err := LoadPackage(ctx, loadOpt)
- if err != nil {
- return v1alpha1.ZarfPackage{}, err
- }
- defer os.RemoveAll(pkgPaths.Base)
- pkg, _, err := pkgPaths.ReadZarfYAML()
+ p, err := LoadPackage(ctx, loadOpt)
if err != nil {
return v1alpha1.ZarfPackage{}, err
}
- return pkg, nil
+ //nolint: errcheck // ignore
+ defer p.Cleanup()
+ return p.Pkg, nil
}
diff --git a/src/internal/packager2/load_test.go b/src/internal/packager2/load_test.go
index 4c09a12260..e5f815244d 100644
--- a/src/internal/packager2/load_test.go
+++ b/src/internal/packager2/load_test.go
@@ -28,12 +28,12 @@ func TestLoadPackage(t *testing.T) {
{
name: "tarball",
source: "./testdata/zarf-package-test-amd64-0.0.1.tar.zst",
- shasum: "307294e3a066cebea6f04772c2ba31210b2753b40b0d5da86a1983c29c5545dd",
+ shasum: "bef73d652f004d214d5cf9e00195293f7ae8390b8ff6ed45e39c2c9eb622b873",
},
{
name: "split",
source: "./testdata/zarf-package-test-amd64-0.0.1.tar.zst.part000",
- shasum: "6c0de217e3eeff224679ec0a26751655759a30f4aae7fbe793ca1617ddfc4228",
+ shasum: "9c021ef9f62f58cca6dc01641521f372f387cc54c0d959a4f3861c6c636d98f1",
},
}
for _, tt := range tests {
@@ -48,14 +48,12 @@ func TestLoadPackage(t *testing.T) {
SkipSignatureValidation: false,
Filter: filters.Empty(),
}
- pkgPaths, err := LoadPackage(ctx, opt)
+ pkgLayout, err := LoadPackage(ctx, opt)
require.NoError(t, err)
- pkg, _, err := pkgPaths.ReadZarfYAML()
- require.NoError(t, err)
- require.Equal(t, "test", pkg.Metadata.Name)
- require.Equal(t, "0.0.1", pkg.Metadata.Version)
- require.Len(t, pkg.Components, 1)
+ require.Equal(t, "test", pkgLayout.Pkg.Metadata.Name)
+ require.Equal(t, "0.0.1", pkgLayout.Pkg.Metadata.Version)
+ require.Len(t, pkgLayout.Pkg.Components, 1)
}
opt := LoadOptions{
@@ -152,7 +150,7 @@ func TestPackageFromSourceOrCluster(t *testing.T) {
c := &cluster.Cluster{
Clientset: fake.NewSimpleClientset(),
}
- _, err = c.RecordPackageDeployment(ctx, pkg, nil, 1)
+ _, err = c.RecordPackageDeployment(ctx, pkg, nil)
require.NoError(t, err)
pkg, err = packageFromSourceOrCluster(ctx, c, "test", false, "")
require.NoError(t, err)
diff --git a/src/internal/packager2/mirror.go b/src/internal/packager2/mirror.go
index 7649b62757..1b0131dd21 100644
--- a/src/internal/packager2/mirror.go
+++ b/src/internal/packager2/mirror.go
@@ -8,6 +8,7 @@ import (
"errors"
"fmt"
"net/http"
+ "os"
"time"
"github.com/avast/retry-go/v4"
@@ -21,8 +22,8 @@ import (
"github.com/zarf-dev/zarf/src/internal/dns"
"github.com/zarf-dev/zarf/src/internal/git"
"github.com/zarf-dev/zarf/src/internal/gitea"
+ "github.com/zarf-dev/zarf/src/internal/packager2/layout"
"github.com/zarf-dev/zarf/src/pkg/cluster"
- "github.com/zarf-dev/zarf/src/pkg/layout"
"github.com/zarf-dev/zarf/src/pkg/message"
"github.com/zarf-dev/zarf/src/pkg/packager/filters"
"github.com/zarf-dev/zarf/src/pkg/transform"
@@ -33,7 +34,7 @@ import (
// MirrorOptions are the options for Mirror.
type MirrorOptions struct {
Cluster *cluster.Cluster
- PackagePaths layout.PackagePaths
+ PkgLayout *layout.PackageLayout
Filter filters.ComponentFilterStrategy
RegistryInfo types.RegistryInfo
GitInfo types.GitServerInfo
@@ -43,33 +44,28 @@ type MirrorOptions struct {
// Mirror mirrors the package contents to the given registry and git server.
func Mirror(ctx context.Context, opt MirrorOptions) error {
- err := pushImagesToRegistry(ctx, opt.Cluster, opt.PackagePaths, opt.Filter, opt.RegistryInfo, opt.NoImageChecksum, opt.Retries)
+ err := pushImagesToRegistry(ctx, opt.Cluster, opt.PkgLayout, opt.Filter, opt.RegistryInfo, opt.NoImageChecksum, opt.Retries)
if err != nil {
return err
}
- err = pushReposToRepository(ctx, opt.Cluster, opt.PackagePaths, opt.Filter, opt.GitInfo, opt.Retries)
+ err = pushReposToRepository(ctx, opt.Cluster, opt.PkgLayout, opt.Filter, opt.GitInfo, opt.Retries)
if err != nil {
return err
}
return nil
}
-func pushImagesToRegistry(ctx context.Context, c *cluster.Cluster, pkgPaths layout.PackagePaths, filter filters.ComponentFilterStrategy, regInfo types.RegistryInfo, noImgChecksum bool, retries int) error {
+func pushImagesToRegistry(ctx context.Context, c *cluster.Cluster, pkgLayout *layout.PackageLayout, filter filters.ComponentFilterStrategy, regInfo types.RegistryInfo, noImgChecksum bool, retries int) error {
logs.Warn.SetOutput(&message.DebugWriter{})
logs.Progress.SetOutput(&message.DebugWriter{})
- pkg, _, err := pkgPaths.ReadZarfYAML()
+ components, err := filter.Apply(pkgLayout.Pkg)
if err != nil {
return err
}
- components, err := filter.Apply(pkg)
- if err != nil {
- return err
- }
- pkg.Components = components
images := map[transform.Image]v1.Image{}
- for _, component := range pkg.Components {
+ for _, component := range components {
for _, img := range component.Images {
ref, err := transform.ParseImageRef(img)
if err != nil {
@@ -78,26 +74,26 @@ func pushImagesToRegistry(ctx context.Context, c *cluster.Cluster, pkgPaths layo
if _, ok := images[ref]; ok {
continue
}
- ociImage, err := utils.LoadOCIImage(pkgPaths.Images.Base, ref)
+ img, err := pkgLayout.GetImage(ref)
if err != nil {
return err
}
- images[ref] = ociImage
+ images[ref] = img
}
}
if len(images) == 0 {
return nil
}
- transport := http.DefaultTransport.(*http.Transport).Clone()
- transport.TLSClientConfig.InsecureSkipVerify = config.CommonOptions.InsecureSkipTLSVerify
+ defaultTransport := http.DefaultTransport.(*http.Transport).Clone()
+ defaultTransport.TLSClientConfig.InsecureSkipVerify = config.CommonOptions.InsecureSkipTLSVerify
// TODO (@WSTARR) This is set to match the TLSHandshakeTimeout to potentially mitigate effects of https://github.com/zarf-dev/zarf/issues/1444
- transport.ResponseHeaderTimeout = 10 * time.Second
- transportWithProgressBar := helpers.NewTransport(transport, nil)
+ defaultTransport.ResponseHeaderTimeout = 10 * time.Second
+ transport := helpers.NewTransport(defaultTransport, nil)
pushOptions := []crane.Option{
- crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: pkg.Build.Architecture}),
- crane.WithTransport(transportWithProgressBar),
+ crane.WithPlatform(&v1.Platform{OS: "linux", Architecture: pkgLayout.Pkg.Build.Architecture}),
+ crane.WithTransport(transport),
crane.WithAuth(authn.FromConfig(authn.AuthConfig{
Username: regInfo.PushUsername,
Password: regInfo.PushPassword,
@@ -171,20 +167,23 @@ func pushImagesToRegistry(ctx context.Context, c *cluster.Cluster, pkgPaths layo
return nil
}
-func pushReposToRepository(ctx context.Context, c *cluster.Cluster, pkgPaths layout.PackagePaths, filter filters.ComponentFilterStrategy, gitInfo types.GitServerInfo, retries int) error {
- pkg, _, err := pkgPaths.ReadZarfYAML()
+func pushReposToRepository(ctx context.Context, c *cluster.Cluster, pkgLayout *layout.PackageLayout, filter filters.ComponentFilterStrategy, gitInfo types.GitServerInfo, retries int) error {
+ components, err := filter.Apply(pkgLayout.Pkg)
if err != nil {
return err
}
- components, err := filter.Apply(pkg)
- if err != nil {
- return err
- }
- pkg.Components = components
-
- for _, component := range pkg.Components {
+ for _, component := range components {
for _, repoURL := range component.Repos {
- repository, err := git.Open(pkgPaths.Components.Dirs[component.Name].Repos, repoURL)
+ tmpDir, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
+ if err != nil {
+ return err
+ }
+ defer os.RemoveAll(tmpDir)
+ reposPath, err := pkgLayout.GetComponentDir(tmpDir, component.Name, layout.RepoComponentDir)
+ if err != nil {
+ return err
+ }
+ repository, err := git.Open(reposPath, repoURL)
if err != nil {
return err
}
diff --git a/src/internal/packager2/pull_test.go b/src/internal/packager2/pull_test.go
index 72c85ac4d5..3d8d46b2ce 100644
--- a/src/internal/packager2/pull_test.go
+++ b/src/internal/packager2/pull_test.go
@@ -38,7 +38,7 @@ func TestPull(t *testing.T) {
})
dir := t.TempDir()
- shasum := "307294e3a066cebea6f04772c2ba31210b2753b40b0d5da86a1983c29c5545dd"
+ shasum := "bef73d652f004d214d5cf9e00195293f7ae8390b8ff6ed45e39c2c9eb622b873"
err := Pull(ctx, srv.URL, dir, shasum, filters.Empty())
require.NoError(t, err)
diff --git a/src/internal/packager2/testdata/deployment.yaml b/src/internal/packager2/testdata/deployment.yaml
new file mode 100644
index 0000000000..a03ca172d7
--- /dev/null
+++ b/src/internal/packager2/testdata/deployment.yaml
@@ -0,0 +1,21 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: nginx-deployment
+ labels:
+ app: nginx
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: nginx
+ template:
+ metadata:
+ labels:
+ app: nginx
+ spec:
+ containers:
+ - name: nginx
+ image: docker.io/library/nginx:1.14.2
+ ports:
+ - containerPort: 80
diff --git a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst
index 19b43aa279..6262cc3f2b 100644
Binary files a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst and b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst differ
diff --git a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part000 b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part000
index 2bb849cd7e..d9c5f11fce 100644
--- a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part000
+++ b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part000
@@ -1 +1 @@
-{"sha256Sum":"6c0de217e3eeff224679ec0a26751655759a30f4aae7fbe793ca1617ddfc4228","bytes":3683508,"count":4}
\ No newline at end of file
+{"Sha256Sum":"9c021ef9f62f58cca6dc01641521f372f387cc54c0d959a4f3861c6c636d98f1","Bytes":3683281,"Count":4}
\ No newline at end of file
diff --git a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part001 b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part001
index 5ed2b42c1b..da156d41d4 100644
Binary files a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part001 and b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part001 differ
diff --git a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part002 b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part002
index 55b6a5bb67..216593b3fe 100644
Binary files a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part002 and b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part002 differ
diff --git a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part003 b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part003
index 2dac39314d..3bb8756237 100644
Binary files a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part003 and b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part003 differ
diff --git a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part004 b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part004
index d04f2ef445..3a595f2fba 100644
Binary files a/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part004 and b/src/internal/packager2/testdata/zarf-package-test-amd64-0.0.1.tar.zst.part004 differ
diff --git a/src/internal/packager2/testdata/zarf.yaml b/src/internal/packager2/testdata/zarf.yaml
index c388a95be4..648cf6e778 100644
--- a/src/internal/packager2/testdata/zarf.yaml
+++ b/src/internal/packager2/testdata/zarf.yaml
@@ -5,5 +5,10 @@ metadata:
components:
- name: test
required: true
+ manifests:
+ - name: deployment
+ namespace: nginx
+ files:
+ - deployment.yaml
images:
- docker.io/library/alpine:3.20
diff --git a/src/pkg/cluster/cluster.go b/src/pkg/cluster/cluster.go
index 5db77e0c9c..a97b3066bc 100644
--- a/src/pkg/cluster/cluster.go
+++ b/src/pkg/cluster/cluster.go
@@ -17,9 +17,11 @@ import (
"sigs.k8s.io/cli-utils/pkg/kstatus/watcher"
"github.com/avast/retry-go/v4"
- pkgkubernetes "github.com/defenseunicorns/pkg/kubernetes"
"github.com/zarf-dev/zarf/src/pkg/message"
+ "k8s.io/client-go/dynamic"
+ "k8s.io/client-go/tools/clientcmd"
+ "sigs.k8s.io/controller-runtime/pkg/client/apiutil"
)
const (
@@ -76,11 +78,11 @@ func NewClusterWithWait(ctx context.Context) (*Cluster, error) {
// NewCluster creates a new Cluster instance and validates connection to the cluster by fetching the Kubernetes version.
func NewCluster() (*Cluster, error) {
clusterErr := errors.New("unable to connect to the cluster")
- clientset, config, err := pkgkubernetes.ClientAndConfig()
+ clientset, config, err := ClientAndConfig()
if err != nil {
return nil, errors.Join(clusterErr, err)
}
- watcher, err := pkgkubernetes.WatcherForConfig(config)
+ watcher, err := WatcherForConfig(config)
if err != nil {
return nil, errors.Join(clusterErr, err)
}
@@ -96,3 +98,36 @@ func NewCluster() (*Cluster, error) {
}
return c, nil
}
+
+// ClientAndConfig returns a Kubernetes client and the rest config used to configure the client.
+func ClientAndConfig() (kubernetes.Interface, *rest.Config, error) {
+ loader := clientcmd.NewDefaultClientConfigLoadingRules()
+ clientCfg := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(loader, nil)
+ cfg, err := clientCfg.ClientConfig()
+ if err != nil {
+ return nil, nil, err
+ }
+ clientset, err := kubernetes.NewForConfig(cfg)
+ if err != nil {
+ return nil, nil, err
+ }
+ return clientset, cfg, nil
+}
+
+// WatcherForConfig returns a status watcher for the give Kubernetes configuration.
+func WatcherForConfig(cfg *rest.Config) (watcher.StatusWatcher, error) {
+ dynamicClient, err := dynamic.NewForConfig(cfg)
+ if err != nil {
+ return nil, err
+ }
+ httpClient, err := rest.HTTPClientFor(cfg)
+ if err != nil {
+ return nil, err
+ }
+ restMapper, err := apiutil.NewDynamicRESTMapper(cfg, httpClient)
+ if err != nil {
+ return nil, err
+ }
+ sw := watcher.NewDefaultStatusWatcher(dynamicClient, restMapper)
+ return sw, nil
+}
diff --git a/src/pkg/cluster/injector.go b/src/pkg/cluster/injector.go
index 48552ac5e1..8586934710 100644
--- a/src/pkg/cluster/injector.go
+++ b/src/pkg/cluster/injector.go
@@ -24,9 +24,9 @@ import (
"k8s.io/apimachinery/pkg/util/wait"
"github.com/defenseunicorns/pkg/helpers/v2"
- pkgkubernetes "github.com/defenseunicorns/pkg/kubernetes"
"github.com/zarf-dev/zarf/src/config"
+ "github.com/zarf-dev/zarf/src/internal/healthchecks"
"github.com/zarf-dev/zarf/src/pkg/message"
"github.com/zarf-dev/zarf/src/pkg/transform"
"github.com/zarf-dev/zarf/src/pkg/utils"
@@ -117,7 +117,7 @@ func (c *Cluster) StartInjection(ctx context.Context, tmpDir, imagesDir string,
waitCtx, waitCancel := context.WithTimeout(ctx, 60*time.Second)
defer waitCancel()
- err = pkgkubernetes.WaitForReadyRuntime(waitCtx, c.Watcher, []runtime.Object{pod})
+ err = healthchecks.WaitForReadyRuntime(waitCtx, c.Watcher, []runtime.Object{pod})
if err != nil {
return err
}
@@ -319,6 +319,9 @@ func hasBlockingTaints(taints []corev1.Taint) bool {
func buildInjectionPod(nodeName, image string, payloadCmNames []string, shasum string, resReq corev1.ResourceRequirements) *corev1.Pod {
executeMode := int32(0777)
+ userID := int64(1000)
+ groupID := int64(2000)
+ fsGroupID := int64(2000)
pod := &corev1.Pod{
TypeMeta: metav1.TypeMeta{
@@ -337,6 +340,12 @@ func buildInjectionPod(nodeName, image string, payloadCmNames []string, shasum s
NodeName: nodeName,
// Do not try to restart the pod as it will be deleted/re-created instead.
RestartPolicy: corev1.RestartPolicyNever,
+ SecurityContext: &corev1.PodSecurityContext{
+ RunAsUser: &userID,
+ RunAsGroup: &groupID,
+ FSGroup: &fsGroupID,
+ SeccompProfile: &corev1.SeccompProfile{Type: corev1.SeccompProfileTypeRuntimeDefault},
+ },
Containers: []corev1.Container{
{
Name: "injector",
@@ -366,6 +375,14 @@ func buildInjectionPod(nodeName, image string, payloadCmNames []string, shasum s
},
},
},
+ SecurityContext: &corev1.SecurityContext{
+ ReadOnlyRootFilesystem: helpers.BoolPtr(true),
+ AllowPrivilegeEscalation: helpers.BoolPtr(false),
+ RunAsNonRoot: helpers.BoolPtr(true),
+ Capabilities: &corev1.Capabilities{
+ Drop: []corev1.Capability{"ALL"},
+ },
+ },
Resources: resReq,
},
},
diff --git a/src/pkg/cluster/injector_test.go b/src/pkg/cluster/injector_test.go
index 67dff422f2..e5acdf3227 100644
--- a/src/pkg/cluster/injector_test.go
+++ b/src/pkg/cluster/injector_test.go
@@ -15,6 +15,7 @@ import (
"github.com/google/go-containerregistry/pkg/v1/layout"
"github.com/google/go-containerregistry/pkg/v1/random"
"github.com/stretchr/testify/require"
+ "github.com/zarf-dev/zarf/src/internal/healthchecks"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -22,8 +23,6 @@ import (
"k8s.io/client-go/kubernetes/fake"
k8stesting "k8s.io/client-go/testing"
"sigs.k8s.io/cli-utils/pkg/kstatus/status"
-
- pkgkubernetes "github.com/defenseunicorns/pkg/kubernetes"
)
func TestInjector(t *testing.T) {
@@ -31,7 +30,7 @@ func TestInjector(t *testing.T) {
cs := fake.NewSimpleClientset()
c := &Cluster{
Clientset: cs,
- Watcher: pkgkubernetes.NewImmediateWatcher(status.CurrentStatus),
+ Watcher: healthchecks.NewImmediateWatcher(status.CurrentStatus),
}
cs.PrependReactor("delete-collection", "configmaps", func(action k8stesting.Action) (bool, runtime.Object, error) {
delAction, ok := action.(k8stesting.DeleteCollectionActionImpl)
diff --git a/src/pkg/cluster/testdata/expected-injection-pod.json b/src/pkg/cluster/testdata/expected-injection-pod.json
index 30f2e5b1f1..297a5e28bc 100644
--- a/src/pkg/cluster/testdata/expected-injection-pod.json
+++ b/src/pkg/cluster/testdata/expected-injection-pod.json
@@ -1 +1 @@
-{"kind":"Pod","apiVersion":"v1","metadata":{"name":"injector","namespace":"zarf","creationTimestamp":null,"labels":{"app":"zarf-injector","zarf.dev/agent":"ignore"}},"spec":{"volumes":[{"name":"init","configMap":{"name":"rust-binary","defaultMode":511}},{"name":"seed","emptyDir":{}},{"name":"foo","configMap":{"name":"foo"}},{"name":"bar","configMap":{"name":"bar"}}],"containers":[{"name":"injector","image":"docker.io/library/ubuntu:latest","command":["/zarf-init/zarf-injector","shasum"],"workingDir":"/zarf-init","resources":{"limits":{"cpu":"1","memory":"256Mi"},"requests":{"cpu":"500m","memory":"64Mi"}},"volumeMounts":[{"name":"init","mountPath":"/zarf-init/zarf-injector","subPath":"zarf-injector"},{"name":"seed","mountPath":"/zarf-seed"},{"name":"foo","mountPath":"/zarf-init/foo","subPath":"foo"},{"name":"bar","mountPath":"/zarf-init/bar","subPath":"bar"}],"readinessProbe":{"httpGet":{"path":"/v2/","port":5000},"periodSeconds":2,"successThreshold":1,"failureThreshold":10},"imagePullPolicy":"IfNotPresent"}],"restartPolicy":"Never","nodeName":"injection-node"},"status":{}}
+{"kind":"Pod","apiVersion":"v1","metadata":{"name":"injector","namespace":"zarf","creationTimestamp":null,"labels":{"app":"zarf-injector","zarf.dev/agent":"ignore"}},"spec":{"volumes":[{"name":"init","configMap":{"name":"rust-binary","defaultMode":511}},{"name":"seed","emptyDir":{}},{"name":"foo","configMap":{"name":"foo"}},{"name":"bar","configMap":{"name":"bar"}}],"containers":[{"name":"injector","image":"docker.io/library/ubuntu:latest","command":["/zarf-init/zarf-injector","shasum"],"workingDir":"/zarf-init","resources":{"limits":{"cpu":"1","memory":"256Mi"},"requests":{"cpu":"500m","memory":"64Mi"}},"volumeMounts":[{"name":"init","mountPath":"/zarf-init/zarf-injector","subPath":"zarf-injector"},{"name":"seed","mountPath":"/zarf-seed"},{"name":"foo","mountPath":"/zarf-init/foo","subPath":"foo"},{"name":"bar","mountPath":"/zarf-init/bar","subPath":"bar"}],"readinessProbe":{"httpGet":{"path":"/v2/","port":5000},"periodSeconds":2,"successThreshold":1,"failureThreshold":10},"imagePullPolicy":"IfNotPresent","securityContext":{"capabilities":{"drop":["ALL"]},"runAsNonRoot":true,"readOnlyRootFilesystem":true,"allowPrivilegeEscalation":false}}],"restartPolicy":"Never","nodeName":"injection-node","securityContext":{"runAsUser":1000,"runAsGroup":2000,"fsGroup":2000,"seccompProfile":{"type":"RuntimeDefault"}}},"status":{}}
diff --git a/src/pkg/cluster/zarf.go b/src/pkg/cluster/zarf.go
index b990b3de81..3f12381e38 100644
--- a/src/pkg/cluster/zarf.go
+++ b/src/pkg/cluster/zarf.go
@@ -10,14 +10,12 @@ import (
"errors"
"fmt"
"strings"
- "time"
autoscalingV2 "k8s.io/api/autoscaling/v2"
corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "github.com/avast/retry-go/v4"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/internal/gitea"
@@ -172,84 +170,10 @@ func (c *Cluster) StripZarfLabelsAndSecretsFromNamespaces(ctx context.Context) {
spinner.Success()
}
-// PackageSecretNeedsWait checks if a package component has a running webhook that needs to be waited on.
-func (c *Cluster) PackageSecretNeedsWait(deployedPackage *types.DeployedPackage, component v1alpha1.ZarfComponent, skipWebhooks bool) (needsWait bool, waitSeconds int, hookName string) {
- // Skip checking webhook status when '--skip-webhooks' flag is provided and for YOLO packages
- if skipWebhooks || deployedPackage == nil || deployedPackage.Data.Metadata.YOLO {
- return false, 0, ""
- }
-
- // Look for the specified component
- hookMap, componentExists := deployedPackage.ComponentWebhooks[component.Name]
- if !componentExists {
- return false, 0, "" // Component not found, no need to wait
- }
-
- // Check if there are any "Running" webhooks for the component that we need to wait for
- for hookName, webhook := range hookMap {
- if webhook.Status == types.WebhookStatusRunning {
- return true, webhook.WaitDurationSeconds, hookName
- }
- }
-
- // If we get here, the component doesn't need to wait for a webhook to run
- return false, 0, ""
-}
-
-// RecordPackageDeploymentAndWait records the deployment of a package to the cluster and waits for any webhooks to complete.
-func (c *Cluster) RecordPackageDeploymentAndWait(ctx context.Context, pkg v1alpha1.ZarfPackage, components []types.DeployedComponent, generation int, component v1alpha1.ZarfComponent, skipWebhooks bool) (*types.DeployedPackage, error) {
- deployedPackage, err := c.RecordPackageDeployment(ctx, pkg, components, generation)
- if err != nil {
- return nil, err
- }
-
- packageNeedsWait, waitSeconds, hookName := c.PackageSecretNeedsWait(deployedPackage, component, skipWebhooks)
- // If no webhooks need to complete, we can return immediately.
- if !packageNeedsWait {
- return deployedPackage, nil
- }
-
- spinner := message.NewProgressSpinner("Waiting for webhook %q to complete for component %q", hookName, component.Name)
- defer spinner.Stop()
-
- waitDuration := types.DefaultWebhookWaitDuration
- if waitSeconds > 0 {
- waitDuration = time.Duration(waitSeconds) * time.Second
- }
- waitCtx, cancel := context.WithTimeout(ctx, waitDuration)
- defer cancel()
- deployedPackage, err = retry.DoWithData(func() (*types.DeployedPackage, error) {
- deployedPackage, err = c.GetDeployedPackage(waitCtx, deployedPackage.Name)
- if err != nil {
- return nil, err
- }
- packageNeedsWait, _, _ = c.PackageSecretNeedsWait(deployedPackage, component, skipWebhooks)
- if packageNeedsWait {
- return nil, errors.New("wait on running webhook")
- }
- return deployedPackage, nil
- }, retry.Context(waitCtx), retry.Attempts(0), retry.DelayType(retry.FixedDelay), retry.Delay(time.Second))
- if err != nil {
- return nil, err
- }
- spinner.Success()
- return deployedPackage, nil
-}
-
// RecordPackageDeployment saves metadata about a package that has been deployed to the cluster.
-func (c *Cluster) RecordPackageDeployment(ctx context.Context, pkg v1alpha1.ZarfPackage, components []types.DeployedComponent, generation int) (*types.DeployedPackage, error) {
+func (c *Cluster) RecordPackageDeployment(ctx context.Context, pkg v1alpha1.ZarfPackage, components []types.DeployedComponent) (*types.DeployedPackage, error) {
packageName := pkg.Metadata.Name
- // Attempt to load information about webhooks for the package
- var componentWebhooks map[string]map[string]types.Webhook
- existingPackageSecret, err := c.GetDeployedPackage(ctx, packageName)
- if err != nil {
- message.Debugf("Unable to fetch existing secret for package '%s': %s", packageName, err.Error())
- }
- if existingPackageSecret != nil {
- componentWebhooks = existingPackageSecret.ComponentWebhooks
- }
-
// TODO: This is done for backwards compatibility and could be removed in the future.
connectStrings := types.ConnectStrings{}
for _, comp := range components {
@@ -266,8 +190,6 @@ func (c *Cluster) RecordPackageDeployment(ctx context.Context, pkg v1alpha1.Zarf
Data: pkg,
DeployedComponents: components,
ConnectStrings: connectStrings,
- Generation: generation,
- ComponentWebhooks: componentWebhooks,
}
packageData, err := json.Marshal(deployedPackage)
@@ -309,7 +231,7 @@ func (c *Cluster) RecordPackageDeployment(ctx context.Context, pkg v1alpha1.Zarf
return secret, nil
}()
if err != nil {
- return nil, fmt.Errorf("failed to record package deployment in secret '%s'", deployedPackageSecret.Name)
+ return nil, fmt.Errorf("failed to record package deployment in secret '%s': %w", deployedPackageSecret.Name, err)
}
if err := json.Unmarshal(updatedSecret.Data["data"], &deployedPackage); err != nil {
return nil, err
diff --git a/src/pkg/cluster/zarf_test.go b/src/pkg/cluster/zarf_test.go
index d2f3aefcde..a9895bc953 100644
--- a/src/pkg/cluster/zarf_test.go
+++ b/src/pkg/cluster/zarf_test.go
@@ -16,192 +16,10 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/fake"
- "github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/types"
)
-// TestPackageSecretNeedsWait verifies that Zarf waits for webhooks to complete correctly.
-func TestPackageSecretNeedsWait(t *testing.T) {
- t.Parallel()
-
- type testCase struct {
- name string
- deployedPackage *types.DeployedPackage
- component v1alpha1.ZarfComponent
- skipWebhooks bool
- needsWait bool
- waitSeconds int
- hookName string
- }
-
- var (
- componentName = "test-component"
- packageName = "test-package"
- webhookName = "test-webhook"
- )
-
- testCases := []testCase{
- {
- name: "NoWebhooks",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{},
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- {
- name: "WebhookRunning",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{
- componentName: {
- webhookName: types.Webhook{
- Status: types.WebhookStatusRunning,
- WaitDurationSeconds: 10,
- },
- },
- },
- },
- needsWait: true,
- waitSeconds: 10,
- hookName: webhookName,
- },
- // Ensure we only wait on running webhooks for the provided component
- {
- name: "WebhookRunningOnDifferentComponent",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{
- "different-component": {
- webhookName: types.Webhook{
- Status: types.WebhookStatusRunning,
- WaitDurationSeconds: 10,
- },
- },
- },
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- {
- name: "WebhookSucceeded",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{
- componentName: {
- webhookName: types.Webhook{
- Status: types.WebhookStatusSucceeded,
- },
- },
- },
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- {
- name: "WebhookFailed",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{
- componentName: {
- webhookName: types.Webhook{
- Status: types.WebhookStatusFailed,
- },
- },
- },
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- {
- name: "WebhookRemoving",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{
- componentName: {
- webhookName: types.Webhook{
- Status: types.WebhookStatusRemoving,
- },
- },
- },
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- {
- name: "SkipWaitForYOLO",
- component: v1alpha1.ZarfComponent{Name: componentName},
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- Data: v1alpha1.ZarfPackage{
- Metadata: v1alpha1.ZarfMetadata{
- YOLO: true,
- },
- },
- ComponentWebhooks: map[string]map[string]types.Webhook{
- componentName: {
- webhookName: types.Webhook{
- Status: types.WebhookStatusRunning,
- WaitDurationSeconds: 10,
- },
- },
- },
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- {
- name: "SkipWebhooksFlagUsed",
- component: v1alpha1.ZarfComponent{Name: componentName},
- skipWebhooks: true,
- deployedPackage: &types.DeployedPackage{
- Name: packageName,
- ComponentWebhooks: map[string]map[string]types.Webhook{
- componentName: {
- webhookName: types.Webhook{
- Status: types.WebhookStatusRunning,
- WaitDurationSeconds: 10,
- },
- },
- },
- },
- needsWait: false,
- waitSeconds: 0,
- hookName: "",
- },
- }
-
- for _, testCase := range testCases {
- testCase := testCase
-
- t.Run(testCase.name, func(t *testing.T) {
- t.Parallel()
-
- c := &Cluster{}
-
- needsWait, waitSeconds, hookName := c.PackageSecretNeedsWait(testCase.deployedPackage, testCase.component, testCase.skipWebhooks)
-
- require.Equal(t, testCase.needsWait, needsWait)
- require.Equal(t, testCase.waitSeconds, waitSeconds)
- require.Equal(t, testCase.hookName, hookName)
- })
- }
-}
-
func TestGetDeployedPackage(t *testing.T) {
t.Parallel()
ctx := context.Background()
diff --git a/src/pkg/interactive/components.go b/src/pkg/interactive/components.go
index b742aeed4c..9b5cee436c 100644
--- a/src/pkg/interactive/components.go
+++ b/src/pkg/interactive/components.go
@@ -20,7 +20,10 @@ func SelectOptionalComponent(component v1alpha1.ZarfComponent) (bool, error) {
displayComponent := component
displayComponent.Description = ""
- utils.ColorPrintYAML(displayComponent, nil, false)
+ err := utils.ColorPrintYAML(displayComponent, nil, false)
+ if err != nil {
+ return false, err
+ }
if component.Description != "" {
message.Question(component.Description)
}
@@ -31,7 +34,7 @@ func SelectOptionalComponent(component v1alpha1.ZarfComponent) (bool, error) {
}
var confirm bool
- err := survey.AskOne(prompt, &confirm)
+ err = survey.AskOne(prompt, &confirm)
if err != nil {
return false, err
}
diff --git a/src/pkg/layout/component.go b/src/pkg/layout/component.go
index c3ce6ae930..9a3735b54b 100644
--- a/src/pkg/layout/component.go
+++ b/src/pkg/layout/component.go
@@ -50,7 +50,10 @@ func (c *Components) Archive(component v1alpha1.ZarfComponent, cleanupTemp bool)
}
base := c.Dirs[name].Base
if cleanupTemp {
- _ = os.RemoveAll(c.Dirs[name].Temp)
+ err := os.RemoveAll(c.Dirs[name].Temp)
+ if err != nil {
+ return err
+ }
}
size, err := helpers.GetDirSize(base)
if err != nil {
diff --git a/src/pkg/layout/package.go b/src/pkg/layout/package.go
index 532f46653d..7824d34ba9 100644
--- a/src/pkg/layout/package.go
+++ b/src/pkg/layout/package.go
@@ -5,6 +5,7 @@
package layout
import (
+ "errors"
"fmt"
"os"
"path/filepath"
@@ -77,11 +78,12 @@ func (pp *PackagePaths) ReadZarfYAML() (v1alpha1.ZarfPackage, []string, error) {
}
// MigrateLegacy migrates a legacy package layout to the new layout.
-func (pp *PackagePaths) MigrateLegacy() error {
+func (pp *PackagePaths) MigrateLegacy() (err error) {
var pkg v1alpha1.ZarfPackage
base := pp.Base
// legacy layout does not contain a checksums file, nor a signature
+ // TODO(mkcp): This can be un-nested as an early return
if helpers.InvalidPath(pp.Checksums) && pp.Signature == "" {
if err := utils.ReadYaml(pp.ZarfYAML, &pkg); err != nil {
return err
@@ -113,7 +115,10 @@ func (pp *PackagePaths) MigrateLegacy() error {
if !helpers.InvalidPath(legacyImagesTar) {
pp = pp.AddImages()
message.Debugf("Migrating %q to %q", legacyImagesTar, pp.Images.Base)
- defer os.Remove(legacyImagesTar)
+ defer func(name string) {
+ err2 := os.Remove(name)
+ err = errors.Join(err, err2)
+ }(legacyImagesTar)
imgTags := []string{}
for _, component := range pkg.Components {
imgTags = append(imgTags, component.Images...)
@@ -323,7 +328,10 @@ func (pp *PackagePaths) Files() map[string]string {
pathMap := make(map[string]string)
stripBase := func(path string) string {
- rel, _ := filepath.Rel(pp.Base, path)
+ rel, err := filepath.Rel(pp.Base, path)
+ if err != nil {
+ message.Debug("unable to strip base from path", "error", err)
+ }
// Convert from the OS path separator to the standard '/' for Windows support
return filepath.ToSlash(rel)
}
diff --git a/src/pkg/layout/split.go b/src/pkg/layout/split.go
index 4668107405..3354a66038 100644
--- a/src/pkg/layout/split.go
+++ b/src/pkg/layout/split.go
@@ -18,12 +18,20 @@ import (
)
// splitFile will split the file into chunks and remove the original file.
-func splitFile(srcPath string, chunkSize int) error {
+func splitFile(srcPath string, chunkSize int) (err error) {
srcFile, err := os.Open(srcPath)
if err != nil {
return err
}
- defer srcFile.Close()
+ // Ensure we close our sourcefile, even if we error out.
+ defer func() {
+ err2 := srcFile.Close()
+ // Ignore if file is already closed
+ if !errors.Is(err2, os.ErrClosed) {
+ err = errors.Join(err, err2)
+ }
+ }()
+
fi, err := srcFile.Stat()
if err != nil {
return err
@@ -31,17 +39,28 @@ func splitFile(srcPath string, chunkSize int) error {
title := fmt.Sprintf("[0/%d] MB bytes written", fi.Size()/1000/1000)
progressBar := message.NewProgressBar(fi.Size(), title)
- defer progressBar.Close()
+ defer func(progressBar *message.ProgressBar) {
+ err2 := progressBar.Close()
+ err = errors.Join(err, err2)
+ }(progressBar)
hash := sha256.New()
fileCount := 0
+ // TODO(mkcp): The inside of this loop should be wrapped in a closure so we can close the destination file each
+ // iteration as soon as we're done writing.
for {
path := fmt.Sprintf("%s.part%03d", srcPath, fileCount+1)
dstFile, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, helpers.ReadAllWriteUser)
if err != nil {
return err
}
- defer dstFile.Close()
+ defer func(dstFile *os.File) {
+ err2 := dstFile.Close()
+ // Ignore if file is already closed
+ if !errors.Is(err2, os.ErrClosed) {
+ err = errors.Join(err, err2)
+ }
+ }(dstFile)
written, copyErr := io.CopyN(dstFile, srcFile, int64(chunkSize))
if copyErr != nil && !errors.Is(copyErr, io.EOF) {
@@ -59,13 +78,14 @@ func splitFile(srcPath string, chunkSize int) error {
if err != nil {
return err
}
- err = dstFile.Close()
- if err != nil {
- return err
- }
// EOF error could be returned on 0 bytes written.
if written == 0 {
+ // NOTE(mkcp): We have to close the file before removing it or windows will break with a file-in-use err.
+ err = dstFile.Close()
+ if err != nil {
+ return err
+ }
err = os.Remove(path)
if err != nil {
return err
@@ -80,6 +100,7 @@ func splitFile(srcPath string, chunkSize int) error {
}
// Remove original file
+ // NOTE(mkcp): We have to close the file before removing or windows can break with a file-in-use err.
err = srcFile.Close()
if err != nil {
return err
diff --git a/src/pkg/layout/split_test.go b/src/pkg/layout/split_test.go
index 718dc7bfee..51866374ec 100644
--- a/src/pkg/layout/split_test.go
+++ b/src/pkg/layout/split_test.go
@@ -61,7 +61,8 @@ func TestSplitFile(t *testing.T) {
require.NoError(t, err)
_, err = f.Write(b)
require.NoError(t, err)
- f.Close()
+ err = f.Close()
+ require.NoError(t, err)
err = splitFile(p, tt.chunkSize)
require.NoError(t, err)
diff --git a/src/pkg/lint/schema.go b/src/pkg/lint/schema.go
index b6cb5f6e3e..a5f9009dc9 100644
--- a/src/pkg/lint/schema.go
+++ b/src/pkg/lint/schema.go
@@ -7,6 +7,7 @@ package lint
import (
"fmt"
"io/fs"
+ "path/filepath"
"regexp"
"github.com/xeipuuv/gojsonschema"
@@ -17,6 +18,23 @@ import (
// ZarfSchema is exported so main.go can embed the schema file
var ZarfSchema fs.ReadFileFS
+// ValidatePackageSchemaAtPath checks the Zarf package in the current directory against the Zarf schema
+func ValidatePackageSchemaAtPath(path string, setVariables map[string]string) ([]PackageFinding, error) {
+ var untypedZarfPackage interface{}
+ if err := utils.ReadYaml(filepath.Join(path, layout.ZarfYAML), &untypedZarfPackage); err != nil {
+ return nil, err
+ }
+ jsonSchema, err := ZarfSchema.ReadFile("zarf.schema.json")
+ if err != nil {
+ return nil, err
+ }
+ _, err = templateZarfObj(&untypedZarfPackage, setVariables)
+ if err != nil {
+ return nil, err
+ }
+ return getSchemaFindings(jsonSchema, untypedZarfPackage)
+}
+
// ValidatePackageSchema checks the Zarf package in the current directory against the Zarf schema
func ValidatePackageSchema(setVariables map[string]string) ([]PackageFinding, error) {
var untypedZarfPackage interface{}
diff --git a/src/pkg/logger/logger.go b/src/pkg/logger/logger.go
new file mode 100644
index 0000000000..aa0d4b7f07
--- /dev/null
+++ b/src/pkg/logger/logger.go
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package logger implements a log/slog based logger in Zarf.
+package logger
+
+import (
+ "context"
+ "fmt"
+ "io"
+ "log/slog"
+ "os"
+ "strings"
+ "sync/atomic"
+)
+
+var defaultLogger atomic.Pointer[slog.Logger]
+
+// init sets a logger with default config when the package is initialized.
+func init() {
+ l, _ := New(ConfigDefault()) //nolint:errcheck
+ SetDefault(l)
+}
+
+// Level declares each supported log level. These are 1:1 what log/slog supports by default. Info is the default level.
+type Level int
+
+// Store names for Levels
+var (
+ Debug = Level(slog.LevelDebug) // -4
+ Info = Level(slog.LevelInfo) // 0
+ Warn = Level(slog.LevelWarn) // 4
+ Error = Level(slog.LevelError) // 8
+)
+
+// validLevels is a set that provides an ergonomic way to check if a level is a member of the set.
+var validLevels = map[Level]bool{
+ Debug: true,
+ Info: true,
+ Warn: true,
+ Error: true,
+}
+
+// strLevels maps a string to its Level.
+var strLevels = map[string]Level{
+ // NOTE(mkcp): Map trace to debug for backwards compatibility.
+ "trace": Debug,
+ "debug": Debug,
+ "info": Info,
+ "warn": Warn,
+ "error": Error,
+}
+
+// ParseLevel takes a string representation of a Level, ensure it exists, and then converts it into a Level.
+func ParseLevel(s string) (Level, error) {
+ k := strings.ToLower(s)
+ l, ok := strLevels[k]
+ if !ok {
+ return 0, fmt.Errorf("invalid log level: %s", k)
+ }
+ return l, nil
+}
+
+// Format declares the kind of logging handler to use. An empty Format defaults to text.
+type Format string
+
+// ToLower takes a Format string and converts it to lowercase for case-agnostic validation. Users shouldn't have to care
+// about "json" vs. "JSON" for example - they should both work.
+func (f Format) ToLower() Format {
+ return Format(strings.ToLower(string(f)))
+}
+
+// TODO(mkcp): Add dev format
+var (
+ // FormatText uses the standard slog TextHandler
+ FormatText Format = "text"
+ // FormatJSON uses the standard slog JSONHandler
+ FormatJSON Format = "json"
+ // FormatNone sends log writes to DestinationNone / io.Discard
+ FormatNone Format = "none"
+)
+
+// More printers would be great, like dev format https://github.com/golang-cz/devslog
+// and a pretty console slog https://github.com/phsym/console-slog
+
+// Destination declares an io.Writer to send logs to.
+type Destination io.Writer
+
+var (
+ // DestinationDefault points to Stderr
+ DestinationDefault Destination = os.Stderr
+ // DestinationNone discards logs as they are received
+ DestinationNone Destination = io.Discard
+)
+
+// Config is configuration for a logger.
+type Config struct {
+ // Level sets the log level. An empty value corresponds to Info aka 0.
+ Level
+ Format
+ Destination
+}
+
+// ConfigDefault returns a Config with defaults like Text formatting at Info level writing to Stderr.
+func ConfigDefault() Config {
+ return Config{
+ Level: Info,
+ Format: FormatText,
+ Destination: DestinationDefault, // Stderr
+ }
+}
+
+// New takes a Config and returns a validated logger.
+func New(cfg Config) (*slog.Logger, error) {
+ var handler slog.Handler
+ opts := slog.HandlerOptions{}
+
+ // Use default destination if none
+ if cfg.Destination == nil {
+ cfg.Destination = DestinationDefault
+ }
+
+ // Check that we have a valid log level.
+ if !validLevels[cfg.Level] {
+ return nil, fmt.Errorf("unsupported log level: %d", cfg.Level)
+ }
+ opts.Level = slog.Level(cfg.Level)
+
+ switch cfg.Format.ToLower() {
+ // Use Text handler if no format provided
+ case "", FormatText:
+ handler = slog.NewTextHandler(cfg.Destination, &opts)
+ case FormatJSON:
+ handler = slog.NewJSONHandler(cfg.Destination, &opts)
+ // TODO(mkcp): Add dev format
+ // case FormatDev:
+ // handler = slog.NewTextHandler(DestinationNone, &slog.HandlerOptions{
+ // AddSource: true,
+ // })
+ case FormatNone:
+ handler = slog.NewTextHandler(DestinationNone, &slog.HandlerOptions{})
+ // Format not found, let's error out
+ default:
+ return nil, fmt.Errorf("unsupported log format: %s", cfg.Format)
+ }
+
+ log := slog.New(handler)
+ return log, nil
+}
+
+// ctxKey provides a location to store a logger in a context.
+type ctxKey struct{}
+
+// defaultCtxKey provides a default key if one is not passed into From.
+var defaultCtxKey = ctxKey{}
+
+// WithContext takes a context.Context and a *slog.Logger, storing it on the key
+func WithContext(ctx context.Context, logger *slog.Logger) context.Context {
+ return context.WithValue(ctx, defaultCtxKey, logger)
+}
+
+// From takes a context and reads out a *slog.Logger. If From does not find a value it will return a discarding logger
+// similar to log-format "none".
+func From(ctx context.Context) *slog.Logger {
+ // Grab value from key
+ log := ctx.Value(defaultCtxKey)
+
+ // Ensure our value is a *slog.Logger before we cast.
+ switch l := log.(type) {
+ case *slog.Logger:
+ return l
+ default:
+ // Value is empty or not a *slog.Logger, pass back a Discard logger.
+ h := slog.NewTextHandler(DestinationNone, &slog.HandlerOptions{})
+ return slog.New(h)
+ }
+}
+
+// Default retrieves a logger from the package default. This is intended as a fallback when a logger cannot easily be
+// passed in as a dependency, like when developing a new function. Use it like you would use context.TODO().
+func Default() *slog.Logger {
+ return defaultLogger.Load()
+}
+
+// SetDefault takes a logger and atomically stores it as the package default. This is intended to be called when the
+// application starts to override the default config with application-specific config. See Default() for more usage
+// details.
+func SetDefault(l *slog.Logger) {
+ defaultLogger.Store(l)
+}
diff --git a/src/pkg/logger/logger_test.go b/src/pkg/logger/logger_test.go
new file mode 100644
index 0000000000..409922c7b2
--- /dev/null
+++ b/src/pkg/logger/logger_test.go
@@ -0,0 +1,227 @@
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
+
+// Package logger implements a log/slog based logger in Zarf.
+package logger
+
+import (
+ "context"
+ "os"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func Test_New(t *testing.T) {
+ t.Parallel()
+
+ tt := []struct {
+ name string
+ cfg Config
+ }{
+ {
+ name: "Empty level, format, and destination are ok",
+ cfg: Config{},
+ },
+ {
+ name: "Default config is ok",
+ cfg: ConfigDefault(),
+ },
+ {
+ name: "Debug logs are ok",
+ cfg: Config{
+ Level: Debug,
+ },
+ },
+ {
+ name: "Info logs are ok",
+ cfg: Config{
+ Level: Info,
+ },
+ },
+ {
+ name: "Warn logs are ok",
+ cfg: Config{
+ Level: Warn,
+ },
+ },
+ {
+ name: "Error logs are ok",
+ cfg: Config{
+ Level: Error,
+ },
+ },
+ {
+ name: "Text format is supported",
+ cfg: Config{
+ Format: FormatText,
+ },
+ },
+ {
+ name: "JSON format is supported",
+ cfg: Config{
+ Format: FormatJSON,
+ },
+ },
+ {
+ name: "FormatNone is supported to disable logs",
+ cfg: Config{
+ Format: FormatNone,
+ },
+ },
+ {
+ name: "DestinationNone is supported to disable logs",
+ cfg: Config{
+ Destination: DestinationNone,
+ },
+ },
+ {
+ name: "users can send logs to any io.Writer",
+ cfg: Config{
+ Destination: os.Stdout,
+ },
+ },
+ }
+ for _, tc := range tt {
+ t.Run(tc.name, func(t *testing.T) {
+ res, err := New(tc.cfg)
+ require.NoError(t, err)
+ require.NotNil(t, res)
+ })
+ }
+}
+
+func Test_NewErrors(t *testing.T) {
+ t.Parallel()
+
+ tt := []struct {
+ name string
+ cfg Config
+ }{
+ {
+ name: "unsupported log level errors",
+ cfg: Config{
+ Level: 3,
+ },
+ },
+ {
+ name: "wildly unsupported log level errors",
+ cfg: Config{
+ Level: 42389412389213489,
+ },
+ },
+ {
+ name: "unsupported format errors",
+ cfg: Config{
+ Format: "foobar",
+ },
+ },
+ {
+ name: "wildly unsupported format errors",
+ cfg: Config{
+ Format: "^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$ lorem ipsum dolor sit amet 243897 )*&($#",
+ },
+ },
+ }
+ for _, tc := range tt {
+ t.Run(tc.name, func(t *testing.T) {
+ res, err := New(tc.cfg)
+ require.Error(t, err)
+ require.Nil(t, res)
+ })
+ }
+}
+
+func Test_ParseLevel(t *testing.T) {
+ t.Parallel()
+
+ tt := []struct {
+ name string
+ s string
+ expect Level
+ }{
+ {
+ name: "can parse debug",
+ s: "debug",
+ expect: Debug,
+ },
+ {
+ name: "can parse info",
+ s: "Info",
+ expect: Info,
+ },
+ {
+ name: "can parse warn",
+ s: "warn",
+ expect: Warn,
+ },
+ {
+ name: "can parse error",
+ s: "error",
+ expect: Error,
+ },
+ {
+ name: "can handle uppercase",
+ s: "ERROR",
+ expect: Error,
+ },
+ {
+ name: "can handle inconsistent uppercase",
+ s: "errOR",
+ expect: Error,
+ },
+ }
+ for _, tc := range tt {
+ t.Run(tc.name, func(t *testing.T) {
+ res, err := ParseLevel(tc.s)
+ require.NoError(t, err)
+ require.Equal(t, tc.expect, res)
+ })
+ }
+}
+
+func Test_ParseLevelErrors(t *testing.T) {
+ t.Parallel()
+
+ tt := []struct {
+ name string
+ s string
+ }{
+ {
+ name: "errors out on unknown level",
+ s: "SUPER-DEBUG-10x-supremE",
+ },
+ {
+ name: "is precise about character variations",
+ s: "érrør",
+ },
+ {
+ name: "does not partial match level",
+ s: "error-info",
+ },
+ {
+ name: "does not partial match level 2",
+ s: "info-error",
+ },
+ {
+ name: "does not partial match level 3",
+ s: "info2",
+ },
+ }
+ for _, tc := range tt {
+ t.Run(tc.name, func(t *testing.T) {
+ _, err := ParseLevel(tc.s)
+ require.Error(t, err)
+ })
+ }
+}
+
+func TestContext(t *testing.T) {
+ t.Parallel()
+
+ t.Run("can load a logger from the default key", func(t *testing.T) {
+ ctx := WithContext(context.Background(), Default())
+ res := From(ctx)
+ require.NotNil(t, res)
+ })
+}
diff --git a/src/pkg/message/progress.go b/src/pkg/message/progress.go
index 7c050b0ba2..e756ae0715 100644
--- a/src/pkg/message/progress.go
+++ b/src/pkg/message/progress.go
@@ -22,10 +22,11 @@ type ProgressBar struct {
// NewProgressBar creates a new ProgressBar instance from a total value and a format.
func NewProgressBar(total int64, text string) *ProgressBar {
var progress *pterm.ProgressbarPrinter
+ var err error
if NoProgress {
Info(text)
} else {
- progress, _ = pterm.DefaultProgressbar.
+ progress, err = pterm.DefaultProgressbar.
WithTotal(int(total)).
WithShowCount(false).
WithTitle(padding + text).
@@ -33,6 +34,9 @@ func NewProgressBar(total int64, text string) *ProgressBar {
WithMaxWidth(TermWidth).
WithWriter(os.Stderr).
Start()
+ if err != nil {
+ WarnErr(err, "Unable to create default progressbar")
+ }
}
return &ProgressBar{
@@ -53,7 +57,10 @@ func (p *ProgressBar) Updatef(format string, a ...any) {
// Failf marks the ProgressBar as failed in the CLI.
func (p *ProgressBar) Failf(format string, a ...any) {
- p.Close()
+ err := p.Close()
+ if err != nil {
+ Debug("unable to close failed progressbar", "error", err)
+ }
Warnf(format, a...)
}
@@ -103,7 +110,10 @@ func (p *ProgressBar) Write(data []byte) (int, error) {
// Successf marks the ProgressBar as successful in the CLI.
func (p *ProgressBar) Successf(format string, a ...any) {
- p.Close()
+ err := p.Close()
+ if err != nil {
+ Debug("unable to close successful progressbar", "error", err)
+ }
pterm.Success.Printfln(format, a...)
}
diff --git a/src/pkg/message/spinner.go b/src/pkg/message/spinner.go
index 93511a705c..76d2d81bb5 100644
--- a/src/pkg/message/spinner.go
+++ b/src/pkg/message/spinner.go
@@ -8,6 +8,7 @@ import (
"bufio"
"bytes"
"fmt"
+ "log/slog"
"strings"
"github.com/pterm/pterm"
@@ -34,15 +35,19 @@ func NewProgressSpinner(format string, a ...any) *Spinner {
}
var spinner *pterm.SpinnerPrinter
+ var err error
text := pterm.Sprintf(format, a...)
if NoProgress {
Info(text)
} else {
- spinner, _ = pterm.DefaultSpinner.
+ spinner, err = pterm.DefaultSpinner.
WithRemoveWhenDone(false).
// Src: https://github.com/gernest/wow/blob/master/spin/spinners.go#L335
WithSequence(sequence...).
Start(text)
+ if err != nil {
+ slog.Debug("unable to create default spinner", "error", err)
+ }
}
activeSpinner = &Spinner{
@@ -108,7 +113,10 @@ func (p *Spinner) Updatef(format string, a ...any) {
// Stop the spinner.
func (p *Spinner) Stop() {
if p.spinner != nil && p.spinner.IsActive {
- _ = p.spinner.Stop()
+ err := p.spinner.Stop()
+ if err != nil {
+ slog.Debug("unable to stop spinner", "error", err)
+ }
}
activeSpinner = nil
}
diff --git a/src/pkg/packager/composer/list.go b/src/pkg/packager/composer/list.go
index b021355739..65d9a3209b 100644
--- a/src/pkg/packager/composer/list.go
+++ b/src/pkg/packager/composer/list.go
@@ -13,7 +13,6 @@ import (
"github.com/defenseunicorns/pkg/helpers/v2"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
- "github.com/zarf-dev/zarf/src/extensions/bigbang"
"github.com/zarf-dev/zarf/src/pkg/layout"
"github.com/zarf-dev/zarf/src/pkg/packager/deprecated"
"github.com/zarf-dev/zarf/src/pkg/utils"
@@ -339,8 +338,6 @@ func (ic *ImportChain) Compose(ctx context.Context) (composed *v1alpha1.ZarfComp
overrideActions(composed, node.ZarfComponent)
composed.HealthChecks = append(composed.HealthChecks, node.ZarfComponent.HealthChecks...)
- bigbang.Compose(composed, node.ZarfComponent, node.relativeToHead)
-
node = node.prev
}
diff --git a/src/pkg/packager/composer/list_test.go b/src/pkg/packager/composer/list_test.go
index a64de955e0..238aa77cec 100644
--- a/src/pkg/packager/composer/list_test.go
+++ b/src/pkg/packager/composer/list_test.go
@@ -14,7 +14,6 @@ import (
"github.com/stretchr/testify/require"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
- "github.com/zarf-dev/zarf/src/api/v1alpha1/extensions"
)
func TestNewImportChain(t *testing.T) {
@@ -280,21 +279,6 @@ func TestCompose(t *testing.T) {
},
},
},
- // Extensions should be appended with corrected directories
- Extensions: extensions.ZarfComponentExtensions{
- BigBang: &extensions.BigBang{
- ValuesFiles: []string{
- fmt.Sprintf("%s%svalues.yaml", finalDirectory, string(os.PathSeparator)),
- fmt.Sprintf("%s%svalues.yaml", firstDirectory, string(os.PathSeparator)),
- "values.yaml",
- },
- FluxPatchFiles: []string{
- fmt.Sprintf("%s%spatch.yaml", finalDirectory, string(os.PathSeparator)),
- fmt.Sprintf("%s%spatch.yaml", firstDirectory, string(os.PathSeparator)),
- "patch.yaml",
- },
- },
- },
},
},
}
@@ -599,16 +583,6 @@ func createDummyComponent(t *testing.T, name, importDir, subName string) v1alpha
},
},
},
- Extensions: extensions.ZarfComponentExtensions{
- BigBang: &extensions.BigBang{
- ValuesFiles: []string{
- "values.yaml",
- },
- FluxPatchFiles: []string{
- "patch.yaml",
- },
- },
- },
}
}
diff --git a/src/pkg/packager/composer/oci.go b/src/pkg/packager/composer/oci.go
index 2541e45f32..4d2589f717 100644
--- a/src/pkg/packager/composer/oci.go
+++ b/src/pkg/packager/composer/oci.go
@@ -64,7 +64,11 @@ func (ic *ImportChain) fetchOCISkeleton(ctx context.Context) error {
componentDesc := manifest.Locate(filepath.Join(layout.ComponentsDir, fmt.Sprintf("%s.tar", name)))
- cache := filepath.Join(config.GetAbsCachePath(), "oci")
+ absCachePath, err := config.GetAbsCachePath()
+ if err != nil {
+ return err
+ }
+ cache := filepath.Join(absCachePath, "oci")
if err := helpers.CreateDirectory(cache, helpers.ReadWriteExecuteUser); err != nil {
return err
}
diff --git a/src/pkg/packager/creator/normal.go b/src/pkg/packager/creator/normal.go
index 4c71ec9ac7..3b7d4a7698 100644
--- a/src/pkg/packager/creator/normal.go
+++ b/src/pkg/packager/creator/normal.go
@@ -21,7 +21,6 @@ import (
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/config/lang"
- "github.com/zarf-dev/zarf/src/extensions/bigbang"
"github.com/zarf-dev/zarf/src/internal/git"
"github.com/zarf-dev/zarf/src/internal/packager/helm"
"github.com/zarf-dev/zarf/src/internal/packager/images"
@@ -85,12 +84,6 @@ func (pc *PackageCreator) LoadPackageDefinition(ctx context.Context, src *layout
warnings = append(warnings, templateWarnings...)
- // After templates are filled process any create extensions
- pkg.Components, err = pc.processExtensions(ctx, pkg.Components, src, pkg.Metadata.YOLO)
- if err != nil {
- return v1alpha1.ZarfPackage{}, nil, err
- }
-
// If we are creating a differential package, remove duplicate images and repos.
if pc.createOpts.DifferentialPackagePath != "" {
pkg.Build.Differential = true
@@ -184,12 +177,16 @@ func (pc *PackageCreator) Assemble(ctx context.Context, dst *layout.PackagePaths
dst.AddImages()
+ cachePath, err := config.GetAbsCachePath()
+ if err != nil {
+ return err
+ }
pullCfg := images.PullConfig{
DestinationDirectory: dst.Images.Base,
ImageList: imageList,
Arch: arch,
RegistryOverrides: pc.createOpts.RegistryOverrides,
- CacheDirectory: filepath.Join(config.GetAbsCachePath(), layout.ImagesDir),
+ CacheDirectory: filepath.Join(cachePath, layout.ImagesDir),
}
pulled, err := images.Pull(ctx, pullCfg)
@@ -209,6 +206,12 @@ func (pc *PackageCreator) Assemble(ctx context.Context, dst *layout.PackagePaths
sbomImageList = append(sbomImageList, info)
}
}
+
+ // Sort images index to make build reproducible.
+ err = utils.SortImagesIndex(dst.Images.Base)
+ if err != nil {
+ return err
+ }
}
// Ignore SBOM creation if the flag is set.
@@ -333,27 +336,6 @@ func (pc *PackageCreator) Output(ctx context.Context, dst *layout.PackagePaths,
return nil
}
-func (pc *PackageCreator) processExtensions(ctx context.Context, components []v1alpha1.ZarfComponent, layout *layout.PackagePaths, isYOLO bool) (processedComponents []v1alpha1.ZarfComponent, err error) {
- // Create component paths and process extensions for each component.
- for _, c := range components {
- componentPaths, err := layout.Components.Create(c)
- if err != nil {
- return nil, err
- }
-
- // Big Bang
- if c.Extensions.BigBang != nil {
- if c, err = bigbang.Run(ctx, isYOLO, componentPaths, c); err != nil {
- return nil, fmt.Errorf("unable to process bigbang extension: %w", err)
- }
- }
-
- processedComponents = append(processedComponents, c)
- }
-
- return processedComponents, nil
-}
-
func (pc *PackageCreator) addComponent(ctx context.Context, component v1alpha1.ZarfComponent, dst *layout.PackagePaths) error {
message.HeaderInfof("📦 %s COMPONENT", strings.ToUpper(component.Name))
diff --git a/src/pkg/packager/creator/skeleton.go b/src/pkg/packager/creator/skeleton.go
index 648fb562b3..8d1acbdf34 100644
--- a/src/pkg/packager/creator/skeleton.go
+++ b/src/pkg/packager/creator/skeleton.go
@@ -17,7 +17,6 @@ import (
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/config/lang"
- "github.com/zarf-dev/zarf/src/extensions/bigbang"
"github.com/zarf-dev/zarf/src/internal/packager/helm"
"github.com/zarf-dev/zarf/src/internal/packager/kustomize"
"github.com/zarf-dev/zarf/src/pkg/layout"
@@ -62,11 +61,6 @@ func (sc *SkeletonCreator) LoadPackageDefinition(ctx context.Context, src *layou
warnings = append(warnings, composeWarnings...)
- pkg.Components, err = sc.processExtensions(pkg.Components, src)
- if err != nil {
- return v1alpha1.ZarfPackage{}, nil, err
- }
-
for _, warning := range warnings {
message.Warn(warning)
}
@@ -126,27 +120,6 @@ func (sc *SkeletonCreator) Output(_ context.Context, dst *layout.PackagePaths, p
return dst.SignPackage(sc.publishOpts.SigningKeyPath, sc.publishOpts.SigningKeyPassword, !config.CommonOptions.Confirm)
}
-func (sc *SkeletonCreator) processExtensions(components []v1alpha1.ZarfComponent, layout *layout.PackagePaths) (processedComponents []v1alpha1.ZarfComponent, err error) {
- // Create component paths and process extensions for each component.
- for _, c := range components {
- componentPaths, err := layout.Components.Create(c)
- if err != nil {
- return nil, err
- }
-
- // Big Bang
- if c.Extensions.BigBang != nil {
- if c, err = bigbang.Skeletonize(componentPaths, c); err != nil {
- return nil, fmt.Errorf("unable to process bigbang extension: %w", err)
- }
- }
-
- processedComponents = append(processedComponents, c)
- }
-
- return processedComponents, nil
-}
-
func (sc *SkeletonCreator) addComponent(component v1alpha1.ZarfComponent, dst *layout.PackagePaths) (updatedComponent *v1alpha1.ZarfComponent, err error) {
message.HeaderInfof("📦 %s COMPONENT", strings.ToUpper(component.Name))
diff --git a/src/pkg/packager/deploy.go b/src/pkg/packager/deploy.go
index ee3796ac6c..26079df5d4 100644
--- a/src/pkg/packager/deploy.go
+++ b/src/pkg/packager/deploy.go
@@ -19,19 +19,16 @@ import (
"golang.org/x/sync/errgroup"
"github.com/avast/retry-go/v4"
- pkgkubernetes "github.com/defenseunicorns/pkg/kubernetes"
corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime/schema"
- "sigs.k8s.io/cli-utils/pkg/kstatus/watcher"
- "sigs.k8s.io/cli-utils/pkg/object"
"github.com/defenseunicorns/pkg/helpers/v2"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/internal/git"
"github.com/zarf-dev/zarf/src/internal/gitea"
+ "github.com/zarf-dev/zarf/src/internal/healthchecks"
"github.com/zarf-dev/zarf/src/internal/packager/helm"
"github.com/zarf-dev/zarf/src/internal/packager/images"
"github.com/zarf-dev/zarf/src/internal/packager/template"
@@ -147,7 +144,6 @@ func (p *Packager) deployComponents(ctx context.Context) ([]types.DeployedCompon
// Process all the components we are deploying
for _, component := range p.cfg.Pkg.Components {
// Connect to cluster if a component requires it.
- packageGeneration := 1
if component.RequiresCluster() {
timeout := cluster.DefaultTimeout
if p.cfg.Pkg.IsInitConfig() {
@@ -158,17 +154,10 @@ func (p *Packager) deployComponents(ctx context.Context) ([]types.DeployedCompon
if err := p.connectToCluster(connectCtx); err != nil {
return nil, fmt.Errorf("unable to connect to the Kubernetes cluster: %w", err)
}
-
- // If this package has been deployed before, increment the package generation within the secret
- if existingDeployedPackage, _ := p.cluster.GetDeployedPackage(ctx, p.cfg.Pkg.Metadata.Name); existingDeployedPackage != nil {
- packageGeneration = existingDeployedPackage.Generation + 1
- }
}
deployedComponent := types.DeployedComponent{
- Name: component.Name,
- Status: types.ComponentStatusDeploying,
- ObservedGeneration: packageGeneration,
+ Name: component.Name,
}
// Ensure we don't overwrite any installedCharts data when updating the package secret
@@ -183,13 +172,6 @@ func (p *Packager) deployComponents(ctx context.Context) ([]types.DeployedCompon
deployedComponents = append(deployedComponents, deployedComponent)
idx := len(deployedComponents) - 1
- // Update the package secret to indicate that we are attempting to deploy this component
- if p.isConnectedToCluster() {
- if _, err := p.cluster.RecordPackageDeploymentAndWait(ctx, p.cfg.Pkg, deployedComponents, packageGeneration, component, p.cfg.DeployOpts.SkipWebhooks); err != nil {
- message.Debugf("Unable to record package deployment for component %s: this will affect features like `zarf package remove`: %s", component.Name, err.Error())
- }
- }
-
// Deploy the component
var charts []types.InstalledChart
var deployErr error
@@ -210,10 +192,8 @@ func (p *Packager) deployComponents(ctx context.Context) ([]types.DeployedCompon
if deployErr != nil {
onFailure()
- // Update the package secret to indicate that we failed to deploy this component
- deployedComponents[idx].Status = types.ComponentStatusFailed
if p.isConnectedToCluster() {
- if _, err := p.cluster.RecordPackageDeploymentAndWait(ctx, p.cfg.Pkg, deployedComponents, packageGeneration, component, p.cfg.DeployOpts.SkipWebhooks); err != nil {
+ if _, err := p.cluster.RecordPackageDeployment(ctx, p.cfg.Pkg, deployedComponents); err != nil {
message.Debugf("Unable to record package deployment for component %q: this will affect features like `zarf package remove`: %s", component.Name, err.Error())
}
}
@@ -222,9 +202,8 @@ func (p *Packager) deployComponents(ctx context.Context) ([]types.DeployedCompon
// Update the package secret to indicate that we successfully deployed this component
deployedComponents[idx].InstalledCharts = charts
- deployedComponents[idx].Status = types.ComponentStatusSucceeded
if p.isConnectedToCluster() {
- if _, err := p.cluster.RecordPackageDeploymentAndWait(ctx, p.cfg.Pkg, deployedComponents, packageGeneration, component, p.cfg.DeployOpts.SkipWebhooks); err != nil {
+ if _, err := p.cluster.RecordPackageDeployment(ctx, p.cfg.Pkg, deployedComponents); err != nil {
message.Debugf("Unable to record package deployment for component %q: this will affect features like `zarf package remove`: %s", component.Name, err.Error())
}
}
@@ -238,30 +217,6 @@ func (p *Packager) deployComponents(ctx context.Context) ([]types.DeployedCompon
return deployedComponents, nil
}
-func runHealthChecks(ctx context.Context, watcher watcher.StatusWatcher, healthChecks []v1alpha1.NamespacedObjectKindReference) error {
- objs := []object.ObjMetadata{}
- for _, hc := range healthChecks {
- gv, err := schema.ParseGroupVersion(hc.APIVersion)
- if err != nil {
- return err
- }
- obj := object.ObjMetadata{
- GroupKind: schema.GroupKind{
- Group: gv.Group,
- Kind: hc.Kind,
- },
- Namespace: hc.Namespace,
- Name: hc.Name,
- }
- objs = append(objs, obj)
- }
- err := pkgkubernetes.WaitForReady(ctx, watcher, objs)
- if err != nil {
- return err
- }
- return nil
-}
-
func (p *Packager) deployInitComponent(ctx context.Context, component v1alpha1.ZarfComponent) ([]types.InstalledChart, error) {
hasExternalRegistry := p.cfg.InitOpts.RegistryInfo.Address != ""
isSeedRegistry := component.Name == "zarf-seed-registry"
@@ -403,7 +358,7 @@ func (p *Packager) deployComponent(ctx context.Context, component v1alpha1.ZarfC
defer cancel()
spinner := message.NewProgressSpinner("Running health checks")
defer spinner.Stop()
- if err = runHealthChecks(healthCheckContext, p.cluster.Watcher, component.HealthChecks); err != nil {
+ if err = healthchecks.Run(healthCheckContext, p.cluster.Watcher, component.HealthChecks); err != nil {
return nil, fmt.Errorf("health checks failed: %w", err)
}
spinner.Success()
@@ -438,8 +393,11 @@ func (p *Packager) processComponentFiles(component v1alpha1.ZarfComponent, pkgLo
}
// Replace temp target directory and home directory
- file.Target = strings.Replace(file.Target, "###ZARF_TEMP###", p.layout.Base, 1)
- file.Target = config.GetAbsHomePath(file.Target)
+ target, err := config.GetAbsHomePath(strings.Replace(file.Target, "###ZARF_TEMP###", p.layout.Base, 1))
+ if err != nil {
+ return err
+ }
+ file.Target = target
fileList := []string{}
if helpers.IsDir(fileLocation) {
@@ -467,7 +425,7 @@ func (p *Packager) processComponentFiles(component v1alpha1.ZarfComponent, pkgLo
// Copy the file to the destination
spinner.Updatef("Saving %s", file.Target)
- err := helpers.CreatePathAndCopy(fileLocation, file.Target)
+ err = helpers.CreatePathAndCopy(fileLocation, file.Target)
if err != nil {
return fmt.Errorf("unable to copy file %s to %s: %w", fileLocation, file.Target, err)
}
diff --git a/src/pkg/packager/deploy_test.go b/src/pkg/packager/deploy_test.go
index f5dba049e1..a1f32aa346 100644
--- a/src/pkg/packager/deploy_test.go
+++ b/src/pkg/packager/deploy_test.go
@@ -4,22 +4,12 @@
package packager
import (
- "context"
"testing"
- "time"
"github.com/stretchr/testify/require"
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/pkg/packager/sources"
"github.com/zarf-dev/zarf/src/types"
- v1 "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
- "k8s.io/apimachinery/pkg/runtime/schema"
- "k8s.io/apimachinery/pkg/util/yaml"
- dynamicfake "k8s.io/client-go/dynamic/fake"
- "k8s.io/kubectl/pkg/scheme"
- "sigs.k8s.io/cli-utils/pkg/kstatus/watcher"
- "sigs.k8s.io/cli-utils/pkg/testutil"
)
func TestGenerateValuesOverrides(t *testing.T) {
@@ -282,82 +272,3 @@ func TestServiceInfoFromServiceURL(t *testing.T) {
})
}
}
-
-var podCurrentYaml = `
-apiVersion: v1
-kind: Pod
-metadata:
- name: good-pod
- namespace: ns
-status:
- conditions:
- - type: Ready
- status: "True"
- phase: Running
-`
-
-var podYaml = `
-apiVersion: v1
-kind: Pod
-metadata:
- name: in-progress-pod
- namespace: ns
-`
-
-func yamlToUnstructured(t *testing.T, yml string) *unstructured.Unstructured {
- t.Helper()
- m := make(map[string]interface{})
- err := yaml.Unmarshal([]byte(yml), &m)
- require.NoError(t, err)
- return &unstructured.Unstructured{Object: m}
-}
-
-func TestRunHealthChecks(t *testing.T) {
- t.Parallel()
- tests := []struct {
- name string
- podYaml string
- expectErr error
- }{
- {
- name: "Pod is running",
- podYaml: podCurrentYaml,
- expectErr: nil,
- },
- {
- name: "Pod is never ready",
- podYaml: podYaml,
- expectErr: context.DeadlineExceeded,
- },
- }
-
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- t.Parallel()
- fakeClient := dynamicfake.NewSimpleDynamicClient(scheme.Scheme)
- fakeMapper := testutil.NewFakeRESTMapper(
- v1.SchemeGroupVersion.WithKind("Pod"),
- )
- ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
- defer cancel()
- pod := yamlToUnstructured(t, tt.podYaml)
- statusWatcher := watcher.NewDefaultStatusWatcher(fakeClient, fakeMapper)
- podGVR := schema.GroupVersionResource{Group: "", Version: "v1", Resource: "pods"}
- require.NoError(t, fakeClient.Tracker().Create(podGVR, pod, pod.GetNamespace()))
- objs := []v1alpha1.NamespacedObjectKindReference{
- {
- APIVersion: pod.GetAPIVersion(),
- Kind: pod.GetKind(),
- Namespace: pod.GetNamespace(),
- Name: pod.GetName(),
- },
- }
- err := runHealthChecks(ctx, statusWatcher, objs)
- if tt.expectErr != nil {
- require.ErrorIs(t, err, tt.expectErr)
- return
- }
- require.NoError(t, err)
- })
- }
-}
diff --git a/src/pkg/packager/dev.go b/src/pkg/packager/dev.go
index de7af6f4af..1985edb655 100644
--- a/src/pkg/packager/dev.go
+++ b/src/pkg/packager/dev.go
@@ -16,6 +16,7 @@ import (
"github.com/zarf-dev/zarf/src/pkg/message"
"github.com/zarf-dev/zarf/src/pkg/packager/creator"
"github.com/zarf-dev/zarf/src/pkg/packager/filters"
+ "github.com/zarf-dev/zarf/src/types"
)
// DevDeploy creates + deploys a package in one shot
@@ -76,6 +77,24 @@ func (p *Packager) DevDeploy(ctx context.Context) error {
if !p.cfg.CreateOpts.NoYOLO {
p.cfg.Pkg.Metadata.YOLO = true
+
+ // Set default builtin values so they exist in case any helm charts rely on them
+ registryInfo := types.RegistryInfo{Address: p.cfg.DeployOpts.RegistryURL}
+ if err := registryInfo.FillInEmptyValues(); err != nil {
+ return err
+ }
+ gitServer := types.GitServerInfo{}
+ if err = gitServer.FillInEmptyValues(); err != nil {
+ return err
+ }
+ artifactServer := types.ArtifactServerInfo{}
+ artifactServer.FillInEmptyValues()
+
+ p.state = &types.ZarfState{
+ RegistryInfo: registryInfo,
+ GitServer: gitServer,
+ ArtifactServer: artifactServer,
+ }
} else {
p.hpaModified = false
// Reset registry HPA scale down whether an error occurs or not
diff --git a/src/pkg/packager/inspect.go b/src/pkg/packager/inspect.go
index ae850498b8..03dee54883 100644
--- a/src/pkg/packager/inspect.go
+++ b/src/pkg/packager/inspect.go
@@ -34,7 +34,10 @@ func (p *Packager) Inspect(ctx context.Context) error {
fmt.Fprintln(os.Stdout, "-", image)
}
} else {
- utils.ColorPrintYAML(p.cfg.Pkg, nil, false)
+ err := utils.ColorPrintYAML(p.cfg.Pkg, nil, false)
+ if err != nil {
+ return err
+ }
}
sbomDir := p.layout.SBOMs.Path
diff --git a/src/pkg/packager/interactive.go b/src/pkg/packager/interactive.go
index bd44342e7f..bc29c8e0f8 100644
--- a/src/pkg/packager/interactive.go
+++ b/src/pkg/packager/interactive.go
@@ -21,7 +21,10 @@ import (
func (p *Packager) confirmAction(stage string, warnings []string, sbomViewFiles []string) bool {
pterm.Println()
message.HeaderInfof("📦 PACKAGE DEFINITION")
- utils.ColorPrintYAML(p.cfg.Pkg, p.getPackageYAMLHints(stage), true)
+ err := utils.ColorPrintYAML(p.cfg.Pkg, p.getPackageYAMLHints(stage), true)
+ if err != nil {
+ message.WarnErr(err, "unable to print yaml")
+ }
// Print any potential breaking changes (if this is a Deploy confirm) between this CLI version and the deployed init package
if stage == config.ZarfDeployStage {
diff --git a/src/pkg/packager/publish.go b/src/pkg/packager/publish.go
index 94fdee63c2..95d4c66a36 100644
--- a/src/pkg/packager/publish.go
+++ b/src/pkg/packager/publish.go
@@ -13,6 +13,7 @@ import (
"github.com/defenseunicorns/pkg/helpers/v2"
"github.com/defenseunicorns/pkg/oci"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
+
"github.com/zarf-dev/zarf/src/api/v1alpha1"
"github.com/zarf-dev/zarf/src/config"
"github.com/zarf-dev/zarf/src/pkg/layout"
@@ -117,7 +118,10 @@ func (p *Packager) Publish(ctx context.Context) (err error) {
},
})
}
- utils.ColorPrintYAML(ex, nil, true)
+ err := utils.ColorPrintYAML(ex, nil, true)
+ if err != nil {
+ return err
+ }
}
return nil
}
diff --git a/src/pkg/utils/auth.go b/src/pkg/utils/auth.go
index 0bc5cf501a..a6285ec35a 100644
--- a/src/pkg/utils/auth.go
+++ b/src/pkg/utils/auth.go
@@ -23,7 +23,10 @@ type Credential struct {
// FindAuthForHost finds the authentication scheme for a given host using .git-credentials then .netrc.
func FindAuthForHost(baseURL string) (*Credential, error) {
- homePath, _ := os.UserHomeDir()
+ homePath, err := os.UserHomeDir()
+ if err != nil {
+ return nil, err
+ }
// Read the ~/.git-credentials file
credentialsPath := filepath.Join(homePath, ".git-credentials")
@@ -52,7 +55,7 @@ func FindAuthForHost(baseURL string) (*Credential, error) {
}
// credentialParser parses a user's .git-credentials file to find git creds for hosts.
-func credentialParser(path string) ([]Credential, error) {
+func credentialParser(path string) (_ []Credential, err error) {
file, err := os.Open(path)
if errors.Is(err, os.ErrNotExist) {
return nil, nil
@@ -60,7 +63,10 @@ func credentialParser(path string) ([]Credential, error) {
if err != nil {
return nil, err
}
- defer file.Close()
+ defer func() {
+ err2 := file.Close()
+ err = errors.Join(err, err2)
+ }()
var credentials []Credential
scanner := bufio.NewScanner(file)
@@ -83,7 +89,7 @@ func credentialParser(path string) ([]Credential, error) {
}
// netrcParser parses a user's .netrc file using the method curl did pre 7.84.0: https://daniel.haxx.se/blog/2022/05/31/netrc-pains/.
-func netrcParser(path string) ([]Credential, error) {
+func netrcParser(path string) (_ []Credential, _ error) {
file, err := os.Open(path)
if errors.Is(err, os.ErrNotExist) {
return nil, nil
@@ -91,7 +97,10 @@ func netrcParser(path string) ([]Credential, error) {
if err != nil {
return nil, err
}
- defer file.Close()
+ defer func() {
+ err2 := file.Close()
+ err = errors.Join(err, err2)
+ }()
var credentials []Credential
scanner := bufio.NewScanner(file)
@@ -151,6 +160,7 @@ func netrcParser(path string) ([]Credential, error) {
}
}
}
+
// Append the last machine (if exists) at the end of the file
if activeMachine != nil {
credentials = appendNetrcMachine(activeMachine, credentials)
diff --git a/src/pkg/utils/cosign.go b/src/pkg/utils/cosign.go
index f81183741a..a06beae49f 100644
--- a/src/pkg/utils/cosign.go
+++ b/src/pkg/utils/cosign.go
@@ -228,26 +228,27 @@ func GetCosignArtifacts(image string) ([]string, error) {
ref, err := name.ParseReference(image, nameOpts...)
if err != nil {
- return []string{}, err
+ return nil, err
}
+ // Return empty if we don't have a signature on the image
var remoteOpts []ociremote.Option
- simg, _ := ociremote.SignedEntity(ref, remoteOpts...)
+ simg, _ := ociremote.SignedEntity(ref, remoteOpts...) //nolint:errcheck
if simg == nil {
- return []string{}, nil
+ return nil, nil
}
// Errors are dogsled because these functions always return a name.Tag which we can check for layers
- sigRef, _ := ociremote.SignatureTag(ref, remoteOpts...)
- attRef, _ := ociremote.AttestationTag(ref, remoteOpts...)
+ sigRef, _ := ociremote.SignatureTag(ref, remoteOpts...) //nolint:errcheck
+ attRef, _ := ociremote.AttestationTag(ref, remoteOpts...) //nolint:errcheck
ss, err := simg.Signatures()
if err != nil {
- return []string{}, err
+ return nil, err
}
ssLayers, err := ss.Layers()
if err != nil {
- return []string{}, err
+ return nil, err
}
var cosignArtifactList = make([]string, 0)
@@ -257,11 +258,11 @@ func GetCosignArtifacts(image string) ([]string, error) {
atts, err := simg.Attestations()
if err != nil {
- return []string{}, err
+ return nil, err
}
aLayers, err := atts.Layers()
if err != nil {
- return []string{}, err
+ return nil, err
}
if 0 < len(aLayers) {
cosignArtifactList = append(cosignArtifactList, attRef.String())
diff --git a/src/pkg/utils/exec/exec.go b/src/pkg/utils/exec/exec.go
index 3f76e3f23c..f9ac5bbed4 100644
--- a/src/pkg/utils/exec/exec.go
+++ b/src/pkg/utils/exec/exec.go
@@ -65,8 +65,14 @@ func CmdWithContext(ctx context.Context, config Config, command string, args ...
cmd.Env = append(os.Environ(), config.Env...)
// Capture the command outputs.
- cmdStdout, _ := cmd.StdoutPipe()
- cmdStderr, _ := cmd.StderrPipe()
+ cmdStdout, err := cmd.StdoutPipe()
+ if err != nil {
+ return "", "", fmt.Errorf("failed to capture stdout, error=%w", err)
+ }
+ cmdStderr, err := cmd.StderrPipe()
+ if err != nil {
+ return "", "", fmt.Errorf("failed to capture stderr, error=%w", err)
+ }
var (
stdoutBuf, stderrBuf bytes.Buffer
diff --git a/src/pkg/utils/image.go b/src/pkg/utils/image.go
index 3756a759e1..cd62128159 100644
--- a/src/pkg/utils/image.go
+++ b/src/pkg/utils/image.go
@@ -9,6 +9,8 @@ import (
"fmt"
"os"
"path/filepath"
+ "slices"
+ "strings"
"github.com/defenseunicorns/pkg/helpers/v2"
v1 "github.com/google/go-containerregistry/pkg/v1"
@@ -102,3 +104,25 @@ func OnlyHasImageLayers(img v1.Image) (bool, error) {
}
return true, nil
}
+
+// SortImagesIndex sorts the index.json by digest.
+func SortImagesIndex(ociPath string) error {
+ indexPath := filepath.Join(ociPath, "index.json")
+ b, err := os.ReadFile(indexPath)
+ if err != nil {
+ return err
+ }
+ var index ocispec.Index
+ err = json.Unmarshal(b, &index)
+ if err != nil {
+ return err
+ }
+ slices.SortFunc(index.Manifests, func(a, b ocispec.Descriptor) int {
+ return strings.Compare(string(a.Digest), string(b.Digest))
+ })
+ b, err = json.Marshal(index)
+ if err != nil {
+ return err
+ }
+ return os.WriteFile(indexPath, b, helpers.ReadWriteUser)
+}
diff --git a/src/pkg/utils/network.go b/src/pkg/utils/network.go
index ffe5490600..17aa9a6ac3 100644
--- a/src/pkg/utils/network.go
+++ b/src/pkg/utils/network.go
@@ -6,6 +6,7 @@ package utils
import (
"context"
+ "errors"
"fmt"
"io"
"net/http"
@@ -39,7 +40,7 @@ func parseChecksum(src string) (string, string, error) {
}
// DownloadToFile downloads a given URL to the target filepath (including the cosign key if necessary).
-func DownloadToFile(ctx context.Context, src, dst, cosignKeyPath string) error {
+func DownloadToFile(ctx context.Context, src, dst, cosignKeyPath string) (err error) {
// check if the parsed URL has a checksum
// if so, remove it and use the checksum to validate the file
src, checksum, err := parseChecksum(src)
@@ -57,7 +58,11 @@ func DownloadToFile(ctx context.Context, src, dst, cosignKeyPath string) error {
if err != nil {
return fmt.Errorf(lang.ErrWritingFile, dst, err.Error())
}
- defer file.Close()
+ // Ensure our file closes and any error propagate out on error branches
+ defer func(file *os.File) {
+ err2 := file.Close()
+ err = errors.Join(err, err2)
+ }(file)
parsed, err := url.Parse(src)
if err != nil {
@@ -90,13 +95,16 @@ func DownloadToFile(ctx context.Context, src, dst, cosignKeyPath string) error {
return nil
}
-func httpGetFile(url string, destinationFile *os.File) error {
+func httpGetFile(url string, destinationFile *os.File) (err error) {
// Get the data
resp, err := http.Get(url)
if err != nil {
return fmt.Errorf("unable to download the file %s", url)
}
- defer resp.Body.Close()
+ defer func() {
+ err2 := resp.Body.Close()
+ err = errors.Join(err, err2)
+ }()
// Check server response
if resp.StatusCode != http.StatusOK {
diff --git a/src/pkg/utils/sort.go b/src/pkg/utils/sort.go
deleted file mode 100644
index 6fd625c96d..0000000000
--- a/src/pkg/utils/sort.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package utils provides generic utility functions.
-package utils
-
-import "fmt"
-
-// Dependency is an interface that represents a node in a list of dependencies.
-type Dependency interface {
- Name() string
- Dependencies() []string
-}
-
-// SortDependencies performs a topological sort on a dependency graph and
-// returns a slice of the nodes in order of their precedence.
-// The input data is a map of nodes to a slice of its dependencies.
-//
-// E.g:
-// A depends on B & C, B depends on C and C has no dependencies:
-// {"A": ["B", "C"], "B": ["C"], "C": []string{}}
-//
-// Note sort order is dependent on the slice order of the input data for
-// nodes with the same in-degree (i.e. the same number of dependencies).
-func SortDependencies(data []Dependency) ([]string, error) {
- // Initialize the in-degree and out-degree maps.
- inDegree := make(map[string]int)
- outDegree := make(map[string][]string)
-
- // Populate the in-degree and out-degree maps.
- for _, d := range data {
- outDegree[d.Name()] = d.Dependencies()
- inDegree[d.Name()] = 0
- }
- for _, deps := range data {
- for _, d := range deps.Dependencies() {
- inDegree[d]++
- }
- }
-
- // Initialize the queue and the result list.
- queue := make([]string, 0)
- result := make([]string, 0)
-
- // Enqueue all nodes with zero in-degree.
- for _, d := range data {
- if inDegree[d.Name()] == 0 {
- queue = append(queue, d.Name())
- }
- }
-
- // Process the queue.
- for len(queue) > 0 {
- // Dequeue a node from the queue.
- node := queue[0]
- queue = queue[1:]
-
- // Add the node to the result list.
- result = append([]string{node}, result...)
-
- // Decrement the in-degree of all outgoing neighbors.
- for _, neighbor := range outDegree[node] {
- inDegree[neighbor]--
- // If the neighbor has zero in-degree, enqueue it.
- if inDegree[neighbor] == 0 {
- queue = append(queue, neighbor)
- }
- }
- }
-
- // If there are still nodes with non-zero in-degree, there is a cycle in the graph.
- // Return an empty result list to indicate this.
- for _, degree := range inDegree {
- if degree > 0 {
- return result, fmt.Errorf("dependency cycle detected")
- }
- }
-
- // Return the result list.
- return result, nil
-}
diff --git a/src/pkg/utils/sort_test.go b/src/pkg/utils/sort_test.go
deleted file mode 100644
index beee3e160b..0000000000
--- a/src/pkg/utils/sort_test.go
+++ /dev/null
@@ -1,174 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// SPDX-FileCopyrightText: 2021-Present The Zarf Authors
-
-// Package utils provides generic utility functions.
-package utils
-
-import (
- "testing"
-
- "github.com/stretchr/testify/require"
-)
-
-type TestDependency struct {
- name string
- dependencies []string
-}
-
-func (t TestDependency) Name() string {
- return t.name
-}
-
-func (t TestDependency) Dependencies() []string {
- return t.dependencies
-}
-
-func TestSortDependencies(t *testing.T) {
- tests := []struct {
- name string
- data []TestDependency // input data: a map of nodes to their dependencies
- expected []string // expected output: a slice of nodes in order of their precedence
- success bool // whether the test should succeed or fail
- }{
- {
- name: "simple graph",
- data: []TestDependency{
- {
- name: "A",
- dependencies: []string{"B", "C"},
- },
- {
- name: "B",
- dependencies: []string{"C"},
- },
- {
- name: "C",
- },
- },
- // C has no dependencies, B depends on C, and A depends on both B and C
- expected: []string{"C", "B", "A"},
- success: true,
- },
- {
- name: "complex graph",
- data: []TestDependency{
- {
- name: "A",
- dependencies: []string{"B", "C", "D"},
- },
- {
- name: "B",
- dependencies: []string{"C", "D", "E"},
- },
- {
- name: "C",
- dependencies: []string{"E"},
- },
- {
- name: "D",
- dependencies: []string{"E"},
- },
- {
- name: "E",
- },
- },
- expected: []string{"E", "D", "C", "B", "A"},
- success: true,
- },
- {
- name: "graph with multiple roots",
- data: []TestDependency{
- {
- name: "A",
- },
- {
- name: "B",
- },
- {
- name: "C",
- dependencies: []string{"A", "B"},
- },
- {
- name: "D",
- dependencies: []string{"C", "E"},
- },
- {
- name: "E",
- dependencies: []string{"F"},
- },
- {
- name: "F",
- },
- },
- expected: []string{"F", "B", "A", "E", "C", "D"},
- success: true,
- },
- {
- name: "graph with multiple sinks",
- data: []TestDependency{
- {
- name: "A",
- dependencies: []string{"B"},
- },
- {
- name: "B",
- dependencies: []string{"C"},
- },
- {
- name: "C",
- },
- {
- name: "D",
- dependencies: []string{"E"},
- },
- {
- name: "E",
- dependencies: []string{"F"},
- },
- {
- name: "F",
- },
- {
- name: "G",
- },
- },
- expected: []string{"F", "C", "E", "B", "G", "D", "A"},
- success: true,
- },
- {
- name: "graph with circular dependencies",
- data: []TestDependency{
- {
- name: "A",
- dependencies: []string{"B"},
- },
- {
- name: "B",
- dependencies: []string{"C"},
- },
- {
- name: "C",
- dependencies: []string{"A"},
- },
- },
- expected: []string{},
- success: false,
- },
- }
-
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- deps := make([]Dependency, len(tt.data))
- for i := range tt.data {
- deps[i] = tt.data[i]
- }
- result, err := SortDependencies(deps)
- if tt.success {
- require.NoError(t, err)
- } else {
- require.Error(t, err)
- }
- require.Equal(t, tt.expected, result)
- })
- }
-}
diff --git a/src/pkg/utils/wait.go b/src/pkg/utils/wait.go
index dbcbbf0267..8fecaf8e10 100644
--- a/src/pkg/utils/wait.go
+++ b/src/pkg/utils/wait.go
@@ -197,7 +197,11 @@ func waitForNetworkEndpoint(resource, name, condition string, timeout time.Durat
message.Debug(err)
continue
}
- defer conn.Close()
+ err = conn.Close()
+ if err != nil {
+ message.Debug(err)
+ continue
+ }
}
// Yay, we made it!
diff --git a/src/pkg/utils/yaml.go b/src/pkg/utils/yaml.go
index 641c219977..e0b8a3e953 100644
--- a/src/pkg/utils/yaml.go
+++ b/src/pkg/utils/yaml.go
@@ -36,8 +36,11 @@ func yamlFormat(attr color.Attribute) string {
}
// ColorPrintYAML pretty prints a yaml file to the console.
-func ColorPrintYAML(data any, hints map[string]string, spaceRootLists bool) {
- text, _ := goyaml.Marshal(data)
+func ColorPrintYAML(data any, hints map[string]string, spaceRootLists bool) error {
+ text, err := goyaml.Marshal(data)
+ if err != nil {
+ return err
+ }
tokens := lexer.Tokenize(string(text))
if spaceRootLists {
@@ -102,6 +105,7 @@ func ColorPrintYAML(data any, hints map[string]string, spaceRootLists bool) {
pterm.Println()
pterm.Println(outputYAML)
+ return nil
}
// AddRootListHint adds a hint string for a given root list key and value.
diff --git a/src/pkg/variables/templates.go b/src/pkg/variables/templates.go
index f0153d0baa..5f8c9b940c 100644
--- a/src/pkg/variables/templates.go
+++ b/src/pkg/variables/templates.go
@@ -6,6 +6,7 @@ package variables
import (
"bufio"
+ "errors"
"fmt"
"os"
"regexp"
@@ -49,7 +50,7 @@ func (vc *VariableConfig) GetAllTemplates() map[string]*TextTemplate {
}
// ReplaceTextTemplate loads a file from a given path, replaces text in it and writes it back in place.
-func (vc *VariableConfig) ReplaceTextTemplate(path string) error {
+func (vc *VariableConfig) ReplaceTextTemplate(path string) (err error) {
templateRegex := fmt.Sprintf("###%s_[A-Z0-9_]+###", strings.ToUpper(vc.templatePrefix))
templateMap := vc.GetAllTemplates()
@@ -57,7 +58,10 @@ func (vc *VariableConfig) ReplaceTextTemplate(path string) error {
if err != nil {
return err
}
- defer textFile.Close()
+ defer func() {
+ err2 := textFile.Close()
+ err = errors.Join(err, err2)
+ }()
// This regex takes a line and parses the text before and after a discovered template: https://regex101.com/r/ilUxAz/1
regexTemplateLine := regexp.MustCompile(fmt.Sprintf("(?P.*?)(?P%s)(?P.*)", templateRegex))
@@ -130,5 +134,10 @@ func (vc *VariableConfig) ReplaceTextTemplate(path string) error {
}
}
- return os.WriteFile(path, []byte(text), helpers.ReadWriteUser)
+ // NOTE(mkcp): The extra if err != nil is not necessary, but is here to be explicit
+ err = os.WriteFile(path, []byte(text), helpers.ReadWriteUser)
+ if err != nil {
+ return err
+ }
+ return nil
}
diff --git a/src/pkg/variables/templates_test.go b/src/pkg/variables/templates_test.go
index 73c2ddd7e4..bb6c95a820 100644
--- a/src/pkg/variables/templates_test.go
+++ b/src/pkg/variables/templates_test.go
@@ -130,14 +130,20 @@ func TestReplaceTextTemplate(t *testing.T) {
for _, tc := range tests {
if tc.path == "" {
- tmpDir := t.TempDir()
- tc.path = filepath.Join(tmpDir, "templates.test")
+ func() {
+ tmpDir := t.TempDir()
+ tc.path = filepath.Join(tmpDir, "templates.test")
- f, _ := os.Create(tc.path)
- defer f.Close()
+ f, err := os.Create(tc.path)
+ require.NoError(t, err)
- _, err := f.WriteString(start)
- require.NoError(t, err)
+ defer func() {
+ require.NoError(t, f.Close())
+ }()
+
+ _, err = f.WriteString(start)
+ require.NoError(t, err)
+ }()
}
gotErr := tc.vc.ReplaceTextTemplate(tc.path)
@@ -145,7 +151,8 @@ func TestReplaceTextTemplate(t *testing.T) {
require.Error(t, gotErr)
} else {
require.NoError(t, gotErr)
- gotContents, _ := os.ReadFile(tc.path)
+ gotContents, err := os.ReadFile(tc.path)
+ require.NoError(t, err)
require.Equal(t, tc.wantContents, string(gotContents))
}
}
diff --git a/src/pkg/zoci/copier.go b/src/pkg/zoci/copier.go
index f1564bfaed..597da7776e 100644
--- a/src/pkg/zoci/copier.go
+++ b/src/pkg/zoci/copier.go
@@ -7,6 +7,7 @@ package zoci
import (
"bytes"
"context"
+ "errors"
"fmt"
"github.com/defenseunicorns/pkg/oci"
@@ -16,7 +17,7 @@ import (
)
// CopyPackage copies a zarf package from one OCI registry to another
-func CopyPackage(ctx context.Context, src *Remote, dst *Remote, concurrency int) error {
+func CopyPackage(ctx context.Context, src *Remote, dst *Remote, concurrency int) (err error) {
srcManifest, err := src.FetchRoot(ctx)
if err != nil {
return err
@@ -26,7 +27,10 @@ func CopyPackage(ctx context.Context, src *Remote, dst *Remote, concurrency int)
title := fmt.Sprintf("[0/%d] layers copied", len(layers))
progressBar := message.NewProgressBar(size, title)
- defer progressBar.Close()
+ defer func(progressBar *message.ProgressBar) {
+ err2 := progressBar.Close()
+ err = errors.Join(err, err2)
+ }(progressBar)
if err := oci.Copy(ctx, src.OrasRemote, dst.OrasRemote, nil, concurrency, progressBar); err != nil {
return err
diff --git a/src/pkg/zoci/pull.go b/src/pkg/zoci/pull.go
index d8ba73775e..1984f87ffd 100644
--- a/src/pkg/zoci/pull.go
+++ b/src/pkg/zoci/pull.go
@@ -6,6 +6,7 @@ package zoci
import (
"context"
+ "errors"
"fmt"
"path/filepath"
@@ -32,7 +33,7 @@ var (
// - zarf.yaml
// - checksums.txt
// - zarf.yaml.sig
-func (r *Remote) PullPackage(ctx context.Context, destinationDir string, concurrency int, layersToPull ...ocispec.Descriptor) ([]ocispec.Descriptor, error) {
+func (r *Remote) PullPackage(ctx context.Context, destinationDir string, concurrency int, layersToPull ...ocispec.Descriptor) (_ []ocispec.Descriptor, err error) {
isPartialPull := len(layersToPull) > 0
r.Log().Debug(fmt.Sprintf("Pulling %s", r.Repo().Reference))
@@ -62,7 +63,10 @@ func (r *Remote) PullPackage(ctx context.Context, destinationDir string, concurr
if err != nil {
return nil, err
}
- defer dst.Close()
+ defer func(dst *file.Store) {
+ err2 := dst.Close()
+ err = errors.Join(err, err2)
+ }(dst)
copyOpts := r.GetDefaultCopyOpts()
copyOpts.Concurrency = concurrency
diff --git a/src/pkg/zoci/push.go b/src/pkg/zoci/push.go
index e080e80f99..5727849ae2 100644
--- a/src/pkg/zoci/push.go
+++ b/src/pkg/zoci/push.go
@@ -6,6 +6,7 @@ package zoci
import (
"context"
+ "errors"
"fmt"
"github.com/defenseunicorns/pkg/helpers/v2"
@@ -19,12 +20,15 @@ import (
)
// PublishPackage publishes the zarf package to the remote repository.
-func (r *Remote) PublishPackage(ctx context.Context, pkg *v1alpha1.ZarfPackage, paths *layout.PackagePaths, concurrency int) error {
+func (r *Remote) PublishPackage(ctx context.Context, pkg *v1alpha1.ZarfPackage, paths *layout.PackagePaths, concurrency int) (err error) {
src, err := file.New(paths.Base)
if err != nil {
return err
}
- defer src.Close()
+ defer func(src *file.Store) {
+ err2 := src.Close()
+ err = errors.Join(err, err2)
+ }(src)
r.Log().Info(fmt.Sprintf("Publishing package to %s", r.Repo().Reference))
spinner := message.NewProgressSpinner("")
@@ -71,7 +75,10 @@ func (r *Remote) PublishPackage(ctx context.Context, pkg *v1alpha1.ZarfPackage,
total += manifestConfigDesc.Size
progressBar := message.NewProgressBar(total, fmt.Sprintf("Publishing %s:%s", r.Repo().Reference.Repository, r.Repo().Reference.Reference))
- defer progressBar.Close()
+ defer func(progressBar *message.ProgressBar) {
+ err2 := progressBar.Close()
+ err = errors.Join(err, err2)
+ }(progressBar)
r.SetProgressWriter(progressBar)
defer r.ClearProgressWriter()
diff --git a/src/test/common.go b/src/test/common.go
index 746600feb1..b103c4da03 100644
--- a/src/test/common.go
+++ b/src/test/common.go
@@ -6,6 +6,7 @@ package test
import (
"bufio"
+ "errors"
"fmt"
"os"
"regexp"
@@ -53,13 +54,21 @@ func GetCLIName() string {
}
// Zarf executes a Zarf command.
-func (e2e *ZarfE2ETest) Zarf(t *testing.T, args ...string) (string, string, error) {
+func (e2e *ZarfE2ETest) Zarf(t *testing.T, args ...string) (_ string, _ string, err error) {
+ return e2e.ZarfInDir(t, "", args...)
+}
+
+// ZarfInDir executes a Zarf command in specific directory.
+func (e2e *ZarfE2ETest) ZarfInDir(t *testing.T, dir string, args ...string) (_ string, _ string, err error) {
if !slices.Contains(args, "--tmpdir") && !slices.Contains(args, "tools") {
tmpdir, err := os.MkdirTemp("", "zarf-")
if err != nil {
return "", "", err
}
- defer os.RemoveAll(tmpdir)
+ defer func(path string) {
+ errRemove := os.RemoveAll(path)
+ err = errors.Join(err, errRemove)
+ }(tmpdir)
args = append(args, "--tmpdir", tmpdir)
}
if !slices.Contains(args, "--zarf-cache") && !slices.Contains(args, "tools") && os.Getenv("CI") == "true" {
@@ -74,9 +83,14 @@ func (e2e *ZarfE2ETest) Zarf(t *testing.T, args ...string) (string, string, erro
return "", "", err
}
args = append(args, "--zarf-cache", cacheDir)
- defer os.RemoveAll(cacheDir)
+ defer func(path string) {
+ errRemove := os.RemoveAll(path)
+ err = errors.Join(err, errRemove)
+ }(cacheDir)
}
- return exec.CmdWithTesting(t, exec.PrintCfg(), e2e.ZarfBinPath, args...)
+ cfg := exec.PrintCfg()
+ cfg.Dir = dir
+ return exec.CmdWithTesting(t, cfg, e2e.ZarfBinPath, args...)
}
// Kubectl executes `zarf tools kubectl ...`
@@ -87,9 +101,10 @@ func (e2e *ZarfE2ETest) Kubectl(t *testing.T, args ...string) (string, string, e
}
// CleanFiles removes files and directories that have been created during the test.
-func (e2e *ZarfE2ETest) CleanFiles(files ...string) {
+func (e2e *ZarfE2ETest) CleanFiles(t *testing.T, files ...string) {
for _, file := range files {
- _ = os.RemoveAll(file)
+ err := os.RemoveAll(file)
+ require.NoError(t, err)
}
}
diff --git a/src/test/e2e/00_use_cli_test.go b/src/test/e2e/00_use_cli_test.go
index 366bacb7f9..e5bc25cb4d 100644
--- a/src/test/e2e/00_use_cli_test.go
+++ b/src/test/e2e/00_use_cli_test.go
@@ -27,9 +27,9 @@ func TestUseCLI(t *testing.T) {
expectedShasum := "61b50898f982d015ed87093ba822de0fe011cec6dd67db39f99d8c56391a6109\n"
shasumTestFilePath := "shasum-test-file"
- e2e.CleanFiles(shasumTestFilePath)
+ e2e.CleanFiles(t, shasumTestFilePath)
t.Cleanup(func() {
- e2e.CleanFiles(shasumTestFilePath)
+ e2e.CleanFiles(t, shasumTestFilePath)
})
err := os.WriteFile(shasumTestFilePath, []byte("random test data 🦄\n"), helpers.ReadWriteUser)
@@ -110,7 +110,8 @@ func TestUseCLI(t *testing.T) {
t.Run("changing log level", func(t *testing.T) {
t.Parallel()
// Test that changing the log level actually applies the requested level
- _, stdErr, _ := e2e.Zarf(t, "internal", "crc32", "zarf", "--log-level=debug")
+ _, stdErr, err := e2e.Zarf(t, "internal", "crc32", "zarf", "--log-level=debug")
+ require.NoError(t, err)
expectedOutString := "Log level set to debug"
require.Contains(t, stdErr, expectedOutString, "The log level should be changed to 'debug'")
})
@@ -138,7 +139,7 @@ func TestUseCLI(t *testing.T) {
require.FileExists(t, "binaries/eksctl_Darwin_arm64")
require.FileExists(t, "binaries/eksctl_Linux_x86_64")
- e2e.CleanFiles("binaries/eksctl_Darwin_x86_64", "binaries/eksctl_Darwin_arm64", "binaries/eksctl_Linux_x86_64", path, "eks.yaml")
+ e2e.CleanFiles(t, "binaries/eksctl_Darwin_x86_64", "binaries/eksctl_Darwin_arm64", "binaries/eksctl_Linux_x86_64", path, "eks.yaml")
})
t.Run("zarf package create with tmpdir and cache", func(t *testing.T) {
@@ -164,7 +165,7 @@ func TestUseCLI(t *testing.T) {
secondFile = "second-choice-file.txt"
)
t.Cleanup(func() {
- e2e.CleanFiles(firstFile, secondFile)
+ e2e.CleanFiles(t, firstFile, secondFile)
})
path := fmt.Sprintf("build/zarf-package-component-choice-%s.tar.zst", e2e.Arch)
stdOut, stdErr, err := e2e.Zarf(t, "package", "deploy", path, "--tmpdir", tmpdir, "--log-level=debug", "--confirm")
@@ -197,7 +198,7 @@ func TestUseCLI(t *testing.T) {
tlsCert := "tls.crt"
tlsKey := "tls.key"
t.Cleanup(func() {
- e2e.CleanFiles(tlsCA, tlsCert, tlsKey)
+ e2e.CleanFiles(t, tlsCA, tlsCert, tlsKey)
})
stdOut, stdErr, err := e2e.Zarf(t, "tools", "gen-pki", "github.com", "--sub-alt-name", "google.com")
require.NoError(t, err, stdOut, stdErr)
diff --git a/src/test/e2e/01_component_choice_test.go b/src/test/e2e/01_component_choice_test.go
index 8668586956..b16efcb3e8 100644
--- a/src/test/e2e/01_component_choice_test.go
+++ b/src/test/e2e/01_component_choice_test.go
@@ -19,7 +19,7 @@ func TestComponentChoice(t *testing.T) {
secondFile = "second-choice-file.txt"
)
t.Cleanup(func() {
- e2e.CleanFiles(firstFile, secondFile)
+ e2e.CleanFiles(t, firstFile, secondFile)
})
path := fmt.Sprintf("build/zarf-package-component-choice-%s.tar.zst", e2e.Arch)
diff --git a/src/test/e2e/02_component_actions_test.go b/src/test/e2e/02_component_actions_test.go
index 8ef710ee90..47804677f2 100644
--- a/src/test/e2e/02_component_actions_test.go
+++ b/src/test/e2e/02_component_actions_test.go
@@ -26,8 +26,8 @@ func TestComponentActions(t *testing.T) {
}
allArtifacts := append(deployArtifacts, createArtifacts...)
- e2e.CleanFiles(allArtifacts...)
- defer e2e.CleanFiles(allArtifacts...)
+ e2e.CleanFiles(t, allArtifacts...)
+ defer e2e.CleanFiles(t, allArtifacts...)
/* Create */
// Try creating the package to test the onCreate actions.
@@ -111,7 +111,7 @@ func TestComponentActions(t *testing.T) {
require.FileExists(t, deployWithEnvVarArtifact)
// Remove the env var file at the end of the test
- e2e.CleanFiles(deployWithEnvVarArtifact)
+ e2e.CleanFiles(t, deployWithEnvVarArtifact)
})
t.Run("action on-deploy-with-template", func(t *testing.T) {
@@ -128,7 +128,7 @@ func TestComponentActions(t *testing.T) {
require.Contains(t, string(outTemplated), "The snake says ###ZARF_VAR_SNAKE_SOUND###")
// Remove the templated file so we can test with dynamic variables
- e2e.CleanFiles(deployTemplatedArtifact)
+ e2e.CleanFiles(t, deployTemplatedArtifact)
// Test using a templated file with dynamic variables
stdOut, stdErr, err = e2e.Zarf(t, "package", "deploy", path, "--components=on-deploy-with-template-use-of-variable,on-deploy-with-dynamic-variable,on-deploy-with-multiple-variables", "--confirm")
@@ -140,7 +140,7 @@ func TestComponentActions(t *testing.T) {
require.Contains(t, string(outTemplated), "The snake says hiss")
// Remove the templated file at the end of the test
- e2e.CleanFiles(deployTemplatedArtifact)
+ e2e.CleanFiles(t, deployTemplatedArtifact)
})
t.Run("action on-deploy-immediate-failure", func(t *testing.T) {
diff --git a/src/test/e2e/03_deprecations_test.go b/src/test/e2e/03_deprecations_test.go
index 0414a3915e..a20684c2ad 100644
--- a/src/test/e2e/03_deprecations_test.go
+++ b/src/test/e2e/03_deprecations_test.go
@@ -5,98 +5,91 @@
package test
import (
+ "context"
"fmt"
+ "path/filepath"
"testing"
+ goyaml "github.com/goccy/go-yaml"
+ "github.com/otiai10/copy"
"github.com/stretchr/testify/require"
+
+ layout2 "github.com/zarf-dev/zarf/src/internal/packager2/layout"
)
-// TestDeprecatedComponentScripts verifies that deprecated component scripts are still able to be executed (after being internally
-// migrated into zarf actions).
+// TestDeprecatedComponentScripts verifies that deprecated component scripts are still able to be executed after being internally migrated into zarf actions.
func TestDeprecatedComponentScripts(t *testing.T) {
- t.Log("E2E: Testing deprecated component scripts")
+ t.Parallel()
- // Note these files will be created in the package directory, not CWD
- testPackageDirPath := "src/test/packages/03-deprecated-component-scripts"
- prepareArtifact := fmt.Sprintf("%s/test-deprecated-prepare-hook.txt", testPackageDirPath)
deployArtifacts := []string{
"test-deprecated-deploy-before-hook.txt",
"test-deprecated-deploy-after-hook.txt",
}
- allArtifacts := append(deployArtifacts, prepareArtifact)
- e2e.CleanFiles(allArtifacts...)
- defer e2e.CleanFiles(allArtifacts...)
-
- // 1. Try creating the package to test the create scripts
- testPackagePath := fmt.Sprintf("%s/zarf-package-deprecated-component-scripts-%s.tar.zst", testPackageDirPath, e2e.Arch)
- outputFlag := fmt.Sprintf("-o=%s", testPackageDirPath)
- stdOut, stdErr, err := e2e.Zarf(t, "package", "create", testPackageDirPath, outputFlag, "--confirm")
- defer e2e.CleanFiles(testPackagePath)
- require.NoError(t, err, stdOut, stdErr)
- require.Contains(t, stdErr, "Component '1-test-deprecated-prepare-scripts' is using scripts")
- require.Contains(t, stdErr, "Component '2-test-deprecated-deploy-scripts' is using scripts")
- require.Contains(t, stdErr, "Component '3-test-deprecated-timeout-scripts' is using scripts")
-
- // Test for package create prepare artifact
- require.FileExists(t, prepareArtifact)
-
- // Test to ensure the deploy scripts are not executed
+
+ packagePath := t.TempDir()
+ err := copy.Copy("src/test/packages/03-deprecated-component-scripts", packagePath)
+ require.NoError(t, err)
+
+ workingDirPath := t.TempDir()
+ tarName := fmt.Sprintf("zarf-package-deprecated-component-scripts-%s.tar.zst", e2e.Arch)
+
+ // Try creating the package to test the create scripts
+ _, _, err = e2e.ZarfInDir(t, workingDirPath, "package", "create", packagePath, "--confirm")
+ require.NoError(t, err)
+
+ require.FileExists(t, filepath.Join(packagePath, "test-deprecated-prepare-hook.txt"))
for _, artifact := range deployArtifacts {
- require.NoFileExists(t, artifact)
+ require.NoFileExists(t, filepath.Join(workingDirPath, artifact))
}
- // 2. Deploy the simple script that should pass
- stdOut, stdErr, err = e2e.Zarf(t, "package", "deploy", testPackagePath, "--confirm", "--components=2-test-deprecated-deploy-scripts")
- require.NoError(t, err, stdOut, stdErr)
+ // Deploy the simple script that should pass
+ _, _, err = e2e.ZarfInDir(t, workingDirPath, "package", "deploy", tarName, "--confirm", "--components=2-test-deprecated-deploy-scripts")
+ require.NoError(t, err)
- // Check that the deploy artifacts were created
for _, artifact := range deployArtifacts {
- require.FileExists(t, artifact)
+ require.FileExists(t, filepath.Join(workingDirPath, artifact))
}
- // 3. Deploy the simple script that should fail the timeout
- stdOut, stdErr, err = e2e.Zarf(t, "package", "deploy", testPackagePath, "--confirm", "--components=3-test-deprecated-timeout-scripts")
- require.Error(t, err, stdOut, stdErr)
+ // Deploy the simple script that should fail the timeout
+ _, _, err = e2e.ZarfInDir(t, workingDirPath, "package", "deploy", tarName, "--confirm", "--components=3-test-deprecated-timeout-scripts")
+ require.Error(t, err)
}
// TestDeprecatedSetAndPackageVariables verifies that deprecated setVariables and PKG_VARs still able to be set.
func TestDeprecatedSetAndPackageVariables(t *testing.T) {
- t.Log("E2E: Testing deprecated set variables")
+ t.Parallel()
// Note prepare script files will be created in the package directory, not CWD
testPackageDirPath := "src/test/packages/03-deprecated-set-variable"
- prepareArtifact := fmt.Sprintf("%s/test-deprecated-prepare-hook.txt", testPackageDirPath)
- deployArtifacts := []string{
- "test-deprecated-deploy-before-hook.txt",
- "test-deprecated-deploy-after-hook.txt",
- }
- allArtifacts := append(deployArtifacts, prepareArtifact)
- e2e.CleanFiles(allArtifacts...)
- defer e2e.CleanFiles(allArtifacts...)
- // 2. Try creating the package to test the create scripts
- testPackagePath := fmt.Sprintf("%s/zarf-package-deprecated-set-variable-%s.tar.zst", testPackageDirPath, e2e.Arch)
- outputFlag := fmt.Sprintf("-o=%s", testPackageDirPath)
+ outPath := t.TempDir()
+ tarPath := filepath.Join(outPath, fmt.Sprintf("zarf-package-deprecated-set-variable-%s.tar.zst", e2e.Arch))
// Check that the command still errors out
- stdOut, stdErr, err := e2e.Zarf(t, "package", "create", testPackageDirPath, outputFlag, "--confirm")
- require.Error(t, err, stdOut, stdErr)
- require.Contains(t, stdErr, "template \"ECHO\" must be '--set'")
-
- // Check that the command displays a warning on create
- stdOut, stdErr, err = e2e.Zarf(t, "package", "create", testPackageDirPath, outputFlag, "--confirm", "--set", "ECHO=Zarf-The-Axolotl")
- defer e2e.CleanFiles(testPackagePath)
- require.NoError(t, err, stdOut, stdErr)
- require.Contains(t, stdErr, "Component '1-test-deprecated-set-variable' is using setVariable")
- require.Contains(t, stdErr, "deprecated syntax ###ZARF_PKG_VAR_ECHO###")
-
- // 1. Deploy the setVariable action that should pass and output the variable
- stdOut, stdErr, err = e2e.Zarf(t, "package", "deploy", testPackagePath, "--confirm", "--components=1-test-deprecated-set-variable")
- require.NoError(t, err, stdOut, stdErr)
- require.Contains(t, stdErr, "Hello from Hello Kitteh")
-
- // 2. Deploy the setVariable action that should pass and output the variable
- stdOut, stdErr, err = e2e.Zarf(t, "package", "deploy", testPackagePath, "--confirm", "--components=2-test-deprecated-pkg-var")
- require.NoError(t, err, stdOut, stdErr)
- require.Contains(t, stdErr, "Zarf-The-Axolotl")
+ _, _, err := e2e.Zarf(t, "package", "create", testPackageDirPath, "-o", outPath, "--confirm")
+ require.Error(t, err)
+
+ // // Check that the command displays a warning on create
+ _, _, err = e2e.Zarf(t, "package", "create", testPackageDirPath, "-o", outPath, "--confirm", "--set", "ECHO=Zarf-The-Axolotl")
+ require.NoError(t, err)
+
+ pkgLayout, err := layout2.LoadFromTar(context.Background(), tarPath, layout2.PackageLayoutOptions{})
+ require.NoError(t, err)
+ b, err := goyaml.Marshal(pkgLayout.Pkg.Components)
+ require.NoError(t, err)
+ expectedYaml := `- name: 1-test-deprecated-set-variable
+ actions:
+ onDeploy:
+ before:
+ - cmd: echo "Hello Kitteh"
+ setVariables:
+ - name: HELLO_KITTEH
+ - cmd: echo "Hello from ${ZARF_VAR_HELLO_KITTEH}"
+- name: 2-test-deprecated-pkg-var
+ actions:
+ onDeploy:
+ before:
+ - cmd: echo "Zarf-The-Axolotl"
+`
+ require.Equal(t, expectedYaml, string(b))
}
diff --git a/src/test/e2e/04_create_templating_test.go b/src/test/e2e/04_create_templating_test.go
index a93f23027d..fb03553553 100644
--- a/src/test/e2e/04_create_templating_test.go
+++ b/src/test/e2e/04_create_templating_test.go
@@ -65,5 +65,5 @@ func TestCreateTemplating(t *testing.T) {
require.NoError(t, err)
require.Contains(t, string(filesJSON), "pandas")
- e2e.CleanFiles(pkgName, fileFoldersPkgName)
+ e2e.CleanFiles(t, pkgName, fileFoldersPkgName)
}
diff --git a/src/test/e2e/05_tarball_test.go b/src/test/e2e/05_tarball_test.go
index d1646899cf..5ab956c5a0 100644
--- a/src/test/e2e/05_tarball_test.go
+++ b/src/test/e2e/05_tarball_test.go
@@ -28,7 +28,7 @@ func TestMultiPartPackage(t *testing.T) {
outputFile = "multi-part-demo.dat"
)
- e2e.CleanFiles(deployPath, outputFile)
+ e2e.CleanFiles(t, deployPath, outputFile)
// Create the package with a max size of 20MB
stdOut, stdErr, err := e2e.Zarf(t, "package", "create", createPath, "--max-package-size=20", "--confirm")
@@ -73,8 +73,8 @@ func TestMultiPartPackage(t *testing.T) {
err = helpers.SHAsMatch(parts[0], pkgData.Sha256Sum)
require.NoError(t, err)
- e2e.CleanFiles(parts...)
- e2e.CleanFiles(outputFile)
+ e2e.CleanFiles(t, parts...)
+ e2e.CleanFiles(t, outputFile)
}
func TestReproducibleTarballs(t *testing.T) {
@@ -98,7 +98,7 @@ func TestReproducibleTarballs(t *testing.T) {
err = utils.ReadYaml(filepath.Join(unpack1, layout.ZarfYAML), &pkg1)
require.NoError(t, err)
- e2e.CleanFiles(unpack1, tb)
+ e2e.CleanFiles(t, unpack1, tb)
stdOut, stdErr, err = e2e.Zarf(t, "package", "create", createPath, "--confirm", "--output", tmp)
require.NoError(t, err, stdOut, stdErr)
diff --git a/src/test/e2e/06_create_sbom_test.go b/src/test/e2e/06_create_sbom_test.go
index a3ee3b4118..9426a21d4c 100644
--- a/src/test/e2e/06_create_sbom_test.go
+++ b/src/test/e2e/06_create_sbom_test.go
@@ -5,6 +5,7 @@
package test
import (
+ "context"
"fmt"
"os"
"path/filepath"
@@ -12,61 +13,63 @@ import (
"testing"
"github.com/stretchr/testify/require"
+
+ layout2 "github.com/zarf-dev/zarf/src/internal/packager2/layout"
)
func TestCreateSBOM(t *testing.T) {
- tmpdir := t.TempDir()
- sbomPath := filepath.Join(tmpdir, ".sbom-location")
+ t.Parallel()
- pkgName := fmt.Sprintf("zarf-package-dos-games-%s-1.1.0.tar.zst", e2e.Arch)
+ outSbomPath := filepath.Join(t.TempDir(), ".sbom-location")
+ buildPath := t.TempDir()
+ tarPath := filepath.Join(buildPath, fmt.Sprintf("zarf-package-dos-games-%s-1.1.0.tar.zst", e2e.Arch))
- stdOut, stdErr, err := e2e.Zarf(t, "package", "create", "examples/dos-games", "--sbom-out", sbomPath, "--confirm")
- require.NoError(t, err, stdOut, stdErr)
- require.Contains(t, stdErr, "Creating SBOMs for 1 images and 0 components with files.")
- // Test that the game package generates the SBOMs we expect (images only)
- require.FileExists(t, filepath.Join(sbomPath, "dos-games", "sbom-viewer-ghcr.io_zarf-dev_doom-game_0.0.1.html"))
- require.FileExists(t, filepath.Join(sbomPath, "dos-games", "compare.html"))
- require.FileExists(t, filepath.Join(sbomPath, "dos-games", "ghcr.io_zarf-dev_doom-game_0.0.1.json"))
+ expectedFiles := []string{
+ "sbom-viewer-ghcr.io_zarf-dev_doom-game_0.0.1.html",
+ "compare.html",
+ "ghcr.io_zarf-dev_doom-game_0.0.1.json",
+ }
- // Clean the SBOM path so it is force to be recreated
- e2e.CleanFiles(sbomPath)
+ _, _, err := e2e.Zarf(t, "package", "create", "examples/dos-games", "-o", buildPath, "--sbom-out", outSbomPath, "--confirm")
+ require.NoError(t, err)
- stdOut, stdErr, err = e2e.Zarf(t, "package", "inspect", pkgName, "--sbom-out", sbomPath)
- require.NoError(t, err, stdOut, stdErr)
- // Test that the game package generates the SBOMs we expect (images only)
- _, err = os.ReadFile(filepath.Join(sbomPath, "dos-games", "sbom-viewer-ghcr.io_zarf-dev_doom-game_0.0.1.html"))
+ pkgLayout, err := layout2.LoadFromTar(context.Background(), tarPath, layout2.PackageLayoutOptions{})
require.NoError(t, err)
- _, err = os.ReadFile(filepath.Join(sbomPath, "dos-games", "compare.html"))
+ getSbomPath, err := pkgLayout.GetSBOM(t.TempDir())
require.NoError(t, err)
- _, err = os.ReadFile(filepath.Join(sbomPath, "dos-games", "ghcr.io_zarf-dev_doom-game_0.0.1.json"))
+ for _, expectedFile := range expectedFiles {
+ require.FileExists(t, filepath.Join(getSbomPath, expectedFile))
+ require.FileExists(t, filepath.Join(outSbomPath, "dos-games", expectedFile))
+ }
+
+ // Clean the SBOM path so it is force to be recreated
+ err = os.RemoveAll(outSbomPath)
require.NoError(t, err)
- stdOut, _, err = e2e.Zarf(t, "package", "inspect", pkgName, "--list-images")
+ _, _, err = e2e.Zarf(t, "package", "inspect", tarPath, "--sbom-out", outSbomPath)
+ require.NoError(t, err)
+
+ for _, expectedFile := range expectedFiles {
+ require.FileExists(t, filepath.Join(outSbomPath, "dos-games", expectedFile))
+ }
+
+ stdOut, _, err := e2e.Zarf(t, "package", "inspect", tarPath, "--list-images")
require.NoError(t, err)
require.Equal(t, "- ghcr.io/zarf-dev/doom-game:0.0.1\n", stdOut)
// Pull the current zarf binary version to find the corresponding init package
- version, stdErr, err := e2e.Zarf(t, "version")
- require.NoError(t, err, version, stdErr)
+ version, _, err := e2e.Zarf(t, "version")
+ require.NoError(t, err)
initName := fmt.Sprintf("build/zarf-init-%s-%s.tar.zst", e2e.Arch, strings.TrimSpace(version))
-
- stdOut, stdErr, err = e2e.Zarf(t, "package", "inspect", initName, "--sbom-out", sbomPath)
- require.NoError(t, err, stdOut, stdErr)
- // Test that we preserve the filepath
- _, err = os.ReadFile(filepath.Join(sbomPath, "dos-games", "sbom-viewer-ghcr.io_zarf-dev_doom-game_0.0.1.html"))
- require.NoError(t, err)
- // Test that the init package generates the SBOMs we expect (images + component files)
- _, err = os.ReadFile(filepath.Join(sbomPath, "init", "sbom-viewer-docker.io_gitea_gitea_1.21.5-rootless.html"))
- require.NoError(t, err)
- _, err = os.ReadFile(filepath.Join(sbomPath, "init", "docker.io_gitea_gitea_1.21.5-rootless.json"))
- require.NoError(t, err)
- _, err = os.ReadFile(filepath.Join(sbomPath, "init", "sbom-viewer-zarf-component-k3s.html"))
- require.NoError(t, err)
- _, err = os.ReadFile(filepath.Join(sbomPath, "init", "zarf-component-k3s.json"))
- require.NoError(t, err)
- _, err = os.ReadFile(filepath.Join(sbomPath, "init", "compare.html"))
+ _, _, err = e2e.Zarf(t, "package", "inspect", initName, "--sbom-out", outSbomPath)
require.NoError(t, err)
- e2e.CleanFiles(pkgName)
+ // Test that we preserve the filepath
+ require.FileExists(t, filepath.Join(outSbomPath, "dos-games", "sbom-viewer-ghcr.io_zarf-dev_doom-game_0.0.1.html"))
+ require.FileExists(t, filepath.Join(outSbomPath, "init", "sbom-viewer-docker.io_gitea_gitea_1.21.5-rootless.html"))
+ require.FileExists(t, filepath.Join(outSbomPath, "init", "docker.io_gitea_gitea_1.21.5-rootless.json"))
+ require.FileExists(t, filepath.Join(outSbomPath, "init", "sbom-viewer-zarf-component-k3s.html"))
+ require.FileExists(t, filepath.Join(outSbomPath, "init", "zarf-component-k3s.json"))
+ require.FileExists(t, filepath.Join(outSbomPath, "init", "compare.html"))
}
diff --git a/src/test/e2e/07_create_git_test.go b/src/test/e2e/07_create_git_test.go
index 7a08043c1f..7ec0302e20 100644
--- a/src/test/e2e/07_create_git_test.go
+++ b/src/test/e2e/07_create_git_test.go
@@ -23,7 +23,7 @@ func TestCreateGit(t *testing.T) {
path := fmt.Sprintf("build/zarf-package-git-data-%s-0.0.1.tar.zst", e2e.Arch)
stdOut, stdErr, err := e2e.Zarf(t, "tools", "archiver", "decompress", path, extractDir, "--unarchive-all")
require.NoError(t, err, stdOut, stdErr)
- defer e2e.CleanFiles(extractDir)
+ defer e2e.CleanFiles(t, extractDir)
// Verify the full-repo component
gitDir := fmt.Sprintf("%s/components/full-repo/repos/zarf-public-test-2395699829/.git", extractDir)
diff --git a/src/test/e2e/08_create_differential_test.go b/src/test/e2e/08_create_differential_test.go
index 59e298c22d..35be26761f 100644
--- a/src/test/e2e/08_create_differential_test.go
+++ b/src/test/e2e/08_create_differential_test.go
@@ -30,7 +30,7 @@ func TestCreateDifferential(t *testing.T) {
// Build the package a first time
stdOut, stdErr, err := e2e.Zarf(t, "package", "create", packagePath, "--set=PACKAGE_VERSION=v0.25.0", "--confirm")
require.NoError(t, err, stdOut, stdErr)
- defer e2e.CleanFiles(packageName)
+ defer e2e.CleanFiles(t, packageName)
// Build the differential package without changing the version
_, stdErr, err = e2e.Zarf(t, "package", "create", packagePath, "--set=PACKAGE_VERSION=v0.25.0", differentialFlag, "--confirm")
@@ -40,7 +40,7 @@ func TestCreateDifferential(t *testing.T) {
// Build the differential package
stdOut, stdErr, err = e2e.Zarf(t, "package", "create", packagePath, "--set=PACKAGE_VERSION=v0.26.0", differentialFlag, "--confirm")
require.NoError(t, err, stdOut, stdErr)
- defer e2e.CleanFiles(differentialPackageName)
+ defer e2e.CleanFiles(t, differentialPackageName)
// Extract the yaml of the differential package
err = archiver.Extract(differentialPackageName, layout.ZarfYAML, tmpdir)
diff --git a/src/test/e2e/10_component_flavor_test.go b/src/test/e2e/10_component_flavor_test.go
index a1f748bd22..5bf12ed335 100644
--- a/src/test/e2e/10_component_flavor_test.go
+++ b/src/test/e2e/10_component_flavor_test.go
@@ -5,120 +5,76 @@
package test
import (
+ "context"
"fmt"
- "os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
- "github.com/stretchr/testify/suite"
-)
-
-type FlavorSuite struct {
- suite.Suite
- *require.Assertions
-}
-var (
- flavorExample = filepath.Join("examples", "package-flavors")
- flavorTest = filepath.Join("src", "test", "packages", "10-package-flavors")
- flavorExamplePath string
- flavorTestAMDPath = filepath.Join("build", "zarf-package-test-package-flavors-amd64.tar.zst")
- flavorTestARMPath = filepath.Join("build", "zarf-package-test-package-flavors-arm64.tar.zst")
+ layout2 "github.com/zarf-dev/zarf/src/internal/packager2/layout"
)
-func (suite *FlavorSuite) SetupSuite() {
- suite.Assertions = require.New(suite.T())
-
- // Setup the example package path after e2e has been initialized
- flavorExamplePath = filepath.Join("build", fmt.Sprintf("zarf-package-package-flavors-%s-1.0.0.tar.zst", e2e.Arch))
-}
-
-func (suite *FlavorSuite) TearDownSuite() {
- err := os.RemoveAll(flavorExamplePath)
- suite.NoError(err)
- err = os.RemoveAll(flavorTestAMDPath)
- suite.NoError(err)
- err = os.RemoveAll(flavorTestARMPath)
- suite.NoError(err)
-}
-
-func (suite *FlavorSuite) Test_0_FlavorExample() {
- suite.T().Log("E2E: Package Flavor Example")
-
- _, stdErr, err := e2e.Zarf(suite.T(), "package", "create", flavorExample, "-o", "build", "--flavor", "oracle-cookie-crunch", "--no-color", "--confirm")
- suite.NoError(err)
-
- // Ensure that the oracle image is included
- suite.Contains(stdErr, `oraclelinux:9-slim`)
-
- // Ensure that the common pod was included
- suite.Contains(stdErr, `description: The pod that runs the specified flavor of Enterprise Linux`)
-
- // Ensure that the other flavors are not included
- suite.NotContains(stdErr, `rockylinux:9-minimal`)
- suite.NotContains(stdErr, `almalinux:9-minimal`)
- suite.NotContains(stdErr, `opensuse/leap:15`)
-}
-
-func (suite *FlavorSuite) Test_1_FlavorArchFiltering() {
- suite.T().Log("E2E: Package Flavor + Arch Filtering")
-
- _, stdErr, err := e2e.Zarf(suite.T(), "package", "create", flavorTest, "-o", "build", "--flavor", "vanilla", "-a", "amd64", "--no-color", "--confirm")
- suite.NoError(err)
-
- // Ensure that the initial filter was applied
- suite.Contains(stdErr, `
-- name: combined
- description: vanilla-amd`)
-
- // Ensure that the import filter was applied
- suite.Contains(stdErr, `
-- name: via-import
- description: vanilla-amd`)
-
- // Ensure that the other flavors / architectures are not included
- suite.NotContains(stdErr, `vanilla-arm`)
- suite.NotContains(stdErr, `chocolate-amd`)
- suite.NotContains(stdErr, `chocolate-arm`)
-
- _, stdErr, err = e2e.Zarf(suite.T(), "package", "create", flavorTest, "-o", "build", "--flavor", "chocolate", "-a", "amd64", "--no-color", "--confirm")
- suite.NoError(err)
-
- // Ensure that the initial filter was applied
- suite.Contains(stdErr, `
-- name: combined
- description: chocolate-amd`)
-
- // Ensure that the import filter was applied
- suite.Contains(stdErr, `
-- name: via-import
- description: chocolate-amd`)
-
- // Ensure that the other flavors / architectures are not included
- suite.NotContains(stdErr, `vanilla-arm`)
- suite.NotContains(stdErr, `vanilla-amd`)
- suite.NotContains(stdErr, `chocolate-arm`)
-
- _, stdErr, err = e2e.Zarf(suite.T(), "package", "create", flavorTest, "-o", "build", "--flavor", "chocolate", "-a", "arm64", "--no-color", "--confirm")
- suite.NoError(err)
-
- // Ensure that the initial filter was applied
- suite.Contains(stdErr, `
-- name: combined
- description: chocolate-arm`)
-
- // Ensure that the import filter was applied
- suite.Contains(stdErr, `
-- name: via-import
- description: chocolate-arm`)
-
- // Ensure that the other flavors / architectures are not included
- suite.NotContains(stdErr, `vanilla-arm`)
- suite.NotContains(stdErr, `vanilla-amd`)
- suite.NotContains(stdErr, `chocolate-amd`)
+func TestFlavorExample(t *testing.T) {
+ t.Parallel()
+
+ tmpDir := t.TempDir()
+ flavorExample := filepath.Join("examples", "package-flavors")
+ _, _, err := e2e.Zarf(t, "package", "create", flavorExample, "-o", tmpDir, "--flavor", "oracle-cookie-crunch", "--no-color", "--confirm")
+ require.NoError(t, err)
+
+ tarPath := filepath.Join(tmpDir, fmt.Sprintf("zarf-package-package-flavors-%s-1.0.0.tar.zst", e2e.Arch))
+ pkgLayout, err := layout2.LoadFromTar(context.Background(), tarPath, layout2.PackageLayoutOptions{})
+ require.NoError(t, err)
+ pkgLayout.Pkg.Metadata.Description = "The pod that runs the specified flavor of Enterprise Linux"
+ imgs := []string{}
+ for _, comp := range pkgLayout.Pkg.Components {
+ imgs = append(imgs, comp.Images...)
+ }
+ require.ElementsMatch(t, imgs, []string{"oraclelinux:9-slim"})
}
-func TestFlavorSuite(t *testing.T) {
- suite.Run(t, new(FlavorSuite))
+func TestFlavorArchFiltering(t *testing.T) {
+ t.Parallel()
+
+ tests := []struct {
+ arch string
+ flavor string
+ expectedIDs []string
+ }{
+ {
+ arch: "amd64",
+ flavor: "vanilla",
+ expectedIDs: []string{"combined-vanilla-amd", "via-import-vanilla-amd"},
+ },
+ {
+ arch: "amd64",
+ flavor: "chocolate",
+ expectedIDs: []string{"combined-chocolate-amd", "via-import-chocolate-amd"},
+ },
+ {
+ arch: "arm64",
+ flavor: "chocolate",
+ expectedIDs: []string{"combined-chocolate-arm", "via-import-chocolate-arm"},
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.arch+"-"+tt.flavor, func(t *testing.T) {
+ t.Parallel()
+
+ tmpDir := t.TempDir()
+ flavorTest := filepath.Join("src", "test", "packages", "10-package-flavors")
+ _, _, err := e2e.Zarf(t, "package", "create", flavorTest, "-o", tmpDir, "--flavor", tt.flavor, "-a", tt.arch, "--no-color", "--confirm")
+ require.NoError(t, err)
+
+ tarPath := filepath.Join(tmpDir, fmt.Sprintf("zarf-package-test-package-flavors-%s.tar.zst", tt.arch))
+ pkgLayout, err := layout2.LoadFromTar(context.Background(), tarPath, layout2.PackageLayoutOptions{})
+ require.NoError(t, err)
+ compIDs := []string{}
+ for _, comp := range pkgLayout.Pkg.Components {
+ compIDs = append(compIDs, comp.Name+"-"+comp.Description)
+ }
+ require.ElementsMatch(t, compIDs, tt.expectedIDs)
+ })
+ }
}
diff --git a/src/test/e2e/11_oci_pull_inspect_test.go b/src/test/e2e/11_oci_pull_inspect_test.go
index b7d52fecec..356c5be99a 100644
--- a/src/test/e2e/11_oci_pull_inspect_test.go
+++ b/src/test/e2e/11_oci_pull_inspect_test.go
@@ -33,7 +33,7 @@ func (suite *PullInspectTestSuite) SetupSuite() {
func (suite *PullInspectTestSuite) TearDownSuite() {
local := fmt.Sprintf("zarf-package-dos-games-%s-1.0.0.tar.zst", e2e.Arch)
- e2e.CleanFiles(local)
+ e2e.CleanFiles(suite.T(), local)
}
func (suite *PullInspectTestSuite) Test_0_Pull() {
diff --git a/src/test/e2e/12_lint_test.go b/src/test/e2e/12_lint_test.go
index dea06dd678..2c77b14056 100644
--- a/src/test/e2e/12_lint_test.go
+++ b/src/test/e2e/12_lint_test.go
@@ -29,9 +29,11 @@ func TestLint(t *testing.T) {
testPackagePath := filepath.Join("src", "test", "packages", "12-lint")
configPath := filepath.Join(testPackagePath, "zarf-config.toml")
- os.Setenv("ZARF_CONFIG", configPath)
+ osSetErr := os.Setenv("ZARF_CONFIG", configPath)
+ require.NoError(t, osSetErr, "Unable to set ZARF_CONFIG")
_, stderr, err := e2e.Zarf(t, "dev", "lint", testPackagePath, "-f", "good-flavor")
- os.Unsetenv("ZARF_CONFIG")
+ osUnsetErr := os.Unsetenv("ZARF_CONFIG")
+ require.NoError(t, osUnsetErr, "Unable to cleanup ZARF_CONFIG")
require.Error(t, err, "Require an exit code since there was warnings / errors")
strippedStderr := e2e.StripMessageFormatting(stderr)
diff --git a/src/test/e2e/14_oci_compose_test.go b/src/test/e2e/14_oci_compose_test.go
index 7159394107..6a983c7fc3 100644
--- a/src/test/e2e/14_oci_compose_test.go
+++ b/src/test/e2e/14_oci_compose_test.go
@@ -69,11 +69,6 @@ func (suite *PublishCopySkeletonSuite) Test_0_Publish_Skeletons() {
suite.NoError(err)
suite.Contains(stdErr, "Published "+ref)
- bigBang := filepath.Join("src", "test", "packages", "14-import-everything", "big-bang-min")
- _, stdErr, err = e2e.Zarf(suite.T(), "package", "publish", bigBang, "oci://"+ref, "--plain-http")
- suite.NoError(err)
- suite.Contains(stdErr, "Published "+ref)
-
composable := filepath.Join("src", "test", "packages", "09-composable-packages")
_, stdErr, err = e2e.Zarf(suite.T(), "package", "publish", composable, "oci://"+ref, "--plain-http")
suite.NoError(err)
@@ -92,9 +87,6 @@ func (suite *PublishCopySkeletonSuite) Test_0_Publish_Skeletons() {
_, _, err = e2e.Zarf(suite.T(), "package", "pull", "oci://"+ref+"/helm-charts:0.0.1", "-o", "build", "--plain-http", "-a", "skeleton")
suite.NoError(err)
- _, _, err = e2e.Zarf(suite.T(), "package", "pull", "oci://"+ref+"/big-bang-min:2.10.0", "-o", "build", "--plain-http", "-a", "skeleton")
- suite.NoError(err)
-
_, _, err = e2e.Zarf(suite.T(), "package", "pull", "oci://"+ref+"/test-compose-package:0.0.1", "-o", "build", "--plain-http", "-a", "skeleton")
suite.NoError(err)
}
@@ -112,9 +104,6 @@ func (suite *PublishCopySkeletonSuite) Test_1_Compose_Everything_Inception() {
suite.NoError(err)
targets := []string{
- "import-component-local == import-component-local",
- "import-component-oci == import-component-oci",
- "import-big-bang == import-big-bang",
"file-imports == file-imports",
"local-chart-import == local-chart-import",
}
@@ -132,50 +121,58 @@ func (suite *PublishCopySkeletonSuite) Test_2_FilePaths() {
filepath.Join("build", "zarf-package-import-everything-skeleton-0.0.1.tar.zst"),
filepath.Join("build", fmt.Sprintf("zarf-package-importception-%s-0.0.1.tar.zst", e2e.Arch)),
filepath.Join("build", "zarf-package-helm-charts-skeleton-0.0.1.tar.zst"),
- filepath.Join("build", "zarf-package-big-bang-min-skeleton-2.10.0.tar.zst"),
filepath.Join("build", "zarf-package-test-compose-package-skeleton-0.0.1.tar.zst"),
}
for _, pkgTar := range pkgTars {
- var pkg v1alpha1.ZarfPackage
-
- unpacked := strings.TrimSuffix(pkgTar, ".tar.zst")
- defer os.RemoveAll(unpacked)
- defer os.RemoveAll(pkgTar)
- _, _, err := e2e.Zarf(suite.T(), "tools", "archiver", "decompress", pkgTar, unpacked, "--unarchive-all")
- suite.NoError(err)
- suite.DirExists(unpacked)
-
- // Verify skeleton contains kustomize-generated manifests.
- if strings.HasSuffix(pkgTar, "zarf-package-test-compose-package-skeleton-0.0.1.tar.zst") {
- kustomizeGeneratedManifests := []string{
- "kustomization-connect-service-0.yaml",
- "kustomization-connect-service-1.yaml",
- "kustomization-connect-service-two-0.yaml",
- }
- manifestDir := filepath.Join(unpacked, "components", "test-compose-package", "manifests")
- for _, manifest := range kustomizeGeneratedManifests {
- manifestPath := filepath.Join(manifestDir, manifest)
- suite.FileExists(manifestPath, "expected to find kustomize-generated manifest: %q", manifestPath)
- var configMap corev1.ConfigMap
- err := utils.ReadYaml(manifestPath, &configMap)
- suite.NoError(err)
- suite.Equal("ConfigMap", configMap.Kind, "expected manifest %q to be of kind ConfigMap", manifestPath)
+ // Wrap in a fn to ensure our defers cleanup resources on each iteration
+ func() {
+ var pkg v1alpha1.ZarfPackage
+
+ unpacked := strings.TrimSuffix(pkgTar, ".tar.zst")
+ _, _, err := e2e.Zarf(suite.T(), "tools", "archiver", "decompress", pkgTar, unpacked, "--unarchive-all")
+ suite.NoError(err)
+ suite.DirExists(unpacked)
+
+ // Cleanup resources
+ defer func() {
+ suite.NoError(os.RemoveAll(unpacked))
+ }()
+ defer func() {
+ suite.NoError(os.RemoveAll(pkgTar))
+ }()
+
+ // Verify skeleton contains kustomize-generated manifests.
+ if strings.HasSuffix(pkgTar, "zarf-package-test-compose-package-skeleton-0.0.1.tar.zst") {
+ kustomizeGeneratedManifests := []string{
+ "kustomization-connect-service-0.yaml",
+ "kustomization-connect-service-1.yaml",
+ "kustomization-connect-service-two-0.yaml",
+ }
+ manifestDir := filepath.Join(unpacked, "components", "test-compose-package", "manifests")
+ for _, manifest := range kustomizeGeneratedManifests {
+ manifestPath := filepath.Join(manifestDir, manifest)
+ suite.FileExists(manifestPath, "expected to find kustomize-generated manifest: %q", manifestPath)
+ var configMap corev1.ConfigMap
+ err := utils.ReadYaml(manifestPath, &configMap)
+ suite.NoError(err)
+ suite.Equal("ConfigMap", configMap.Kind, "expected manifest %q to be of kind ConfigMap", manifestPath)
+ }
}
- }
- err = utils.ReadYaml(filepath.Join(unpacked, layout.ZarfYAML), &pkg)
- suite.NoError(err)
- suite.NotNil(pkg)
+ err = utils.ReadYaml(filepath.Join(unpacked, layout.ZarfYAML), &pkg)
+ suite.NoError(err)
+ suite.NotNil(pkg)
- components := pkg.Components
- suite.NotNil(components)
+ components := pkg.Components
+ suite.NotNil(components)
- isSkeleton := false
- if strings.Contains(pkgTar, "-skeleton-") {
- isSkeleton = true
- }
- suite.verifyComponentPaths(unpacked, components, isSkeleton)
+ isSkeleton := false
+ if strings.Contains(pkgTar, "-skeleton-") {
+ isSkeleton = true
+ }
+ suite.verifyComponentPaths(unpacked, components, isSkeleton)
+ }()
}
}
@@ -259,12 +256,6 @@ func (suite *PublishCopySkeletonSuite) verifyComponentPaths(unpackedPath string,
suite.FileExists(filepath.Join(base, component.DeprecatedCosignKeyPath))
}
- if isSkeleton && component.Extensions.BigBang != nil {
- for _, valuesFile := range component.Extensions.BigBang.ValuesFiles {
- suite.FileExists(filepath.Join(base, valuesFile))
- }
- }
-
for chartIdx, chart := range component.Charts {
if isSkeleton && chart.URL != "" {
continue
diff --git a/src/test/e2e/20_zarf_init_test.go b/src/test/e2e/20_zarf_init_test.go
index c94bfa4226..5f7fd569ec 100644
--- a/src/test/e2e/20_zarf_init_test.go
+++ b/src/test/e2e/20_zarf_init_test.go
@@ -32,7 +32,7 @@ func TestZarfInit(t *testing.T) {
expectedErrorMessage = "unable to run component before action: command \"Check that the host architecture matches the package architecture\""
)
t.Cleanup(func() {
- e2e.CleanFiles(mismatchedInitPackage)
+ e2e.CleanFiles(t, mismatchedInitPackage)
})
if runtime.GOOS == "linux" {
@@ -104,8 +104,8 @@ func TestZarfInit(t *testing.T) {
verifyZarfServiceLabels(t)
// Special sizing-hacking for reducing resources where Kind + CI eats a lot of free cycles (ignore errors)
- _, _, _ = e2e.Kubectl(t, "scale", "deploy", "-n", "kube-system", "coredns", "--replicas=1")
- _, _, _ = e2e.Kubectl(t, "scale", "deploy", "-n", "zarf", "agent-hook", "--replicas=1")
+ _, _, _ = e2e.Kubectl(t, "scale", "deploy", "-n", "kube-system", "coredns", "--replicas=1") //nolint:errcheck
+ _, _, _ = e2e.Kubectl(t, "scale", "deploy", "-n", "zarf", "agent-hook", "--replicas=1") //nolint:errcheck
}
func checkLogForSensitiveState(t *testing.T, logText string, zarfState types.ZarfState) {
diff --git a/src/test/e2e/21_connect_creds_test.go b/src/test/e2e/21_connect_creds_test.go
index c58244a736..c3d174ae65 100644
--- a/src/test/e2e/21_connect_creds_test.go
+++ b/src/test/e2e/21_connect_creds_test.go
@@ -74,7 +74,9 @@ func TestMetrics(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- defer resp.Body.Close()
+ defer func() {
+ require.NoError(t, resp.Body.Close())
+ }()
// Read the response body
body, err := io.ReadAll(resp.Body)
diff --git a/src/test/e2e/22_git_and_gitops_test.go b/src/test/e2e/22_git_and_gitops_test.go
index 901137125b..90eb715259 100644
--- a/src/test/e2e/22_git_and_gitops_test.go
+++ b/src/test/e2e/22_git_and_gitops_test.go
@@ -27,7 +27,7 @@ func TestGit(t *testing.T) {
require.NoError(t, err, stdOut, stdErr)
path := fmt.Sprintf("build/zarf-package-git-data-test-%s-1.0.0.tar.zst", e2e.Arch)
- defer e2e.CleanFiles(path)
+ defer e2e.CleanFiles(t, path)
// Deploy the git data example (with component globbing to test that as well)
stdOut, stdErr, err = e2e.Zarf(t, "package", "deploy", path, "--components=full-repo,specific-*", "--confirm")
diff --git a/src/test/e2e/24_variables_test.go b/src/test/e2e/24_variables_test.go
index f5b06116d0..b583a314d4 100644
--- a/src/test/e2e/24_variables_test.go
+++ b/src/test/e2e/24_variables_test.go
@@ -24,7 +24,7 @@ func TestVariables(t *testing.T) {
tfPath := "modified-terraform.tf"
- e2e.CleanFiles(tfPath, evilPath)
+ e2e.CleanFiles(t, tfPath, evilPath)
// Test that specifying an invalid setVariable value results in an error
stdOut, stdErr, err := e2e.Zarf(t, "package", "create", evilSrc, "--set", "NUMB3R5=K1TT3H", "--confirm")
@@ -43,8 +43,9 @@ func TestVariables(t *testing.T) {
require.Contains(t, stdErr, "", expectedOutString)
// Test that not specifying a prompted variable results in an error
- _, stdErr, _ = e2e.Zarf(t, "package", "deploy", path, "--confirm")
+ _, stdErr, err = e2e.Zarf(t, "package", "deploy", path, "--confirm")
expectedOutString = "variable 'SITE_NAME' must be '--set' when using the '--confirm' flag"
+ require.Error(t, err)
require.Contains(t, stdErr, "", expectedOutString)
// Test that specifying an invalid variable value results in an error
@@ -73,7 +74,8 @@ func TestVariables(t *testing.T) {
require.Contains(t, string(outputTF), "unicorn-land")
// Verify the configmap was properly templated
- kubectlOut, _, _ := e2e.Kubectl(t, "-n", "nginx", "get", "configmap", "nginx-configmap", "-o", "jsonpath='{.data.index\\.html}' ")
+ kubectlOut, _, err := e2e.Kubectl(t, "-n", "nginx", "get", "configmap", "nginx-configmap", "-o", "jsonpath='{.data.index\\.html}' ")
+ require.NoError(t, err, "unable to get nginx configmap")
// OPTIONAL_FOOTER should remain unset because it was not set during deploy
require.Contains(t, string(kubectlOut), "\n \n