diff --git a/.github/workflows/ci_master.yml b/.github/workflows/ci_master.yml index 0c736c3..9e20ee2 100644 --- a/.github/workflows/ci_master.yml +++ b/.github/workflows/ci_master.yml @@ -2,30 +2,19 @@ name: CI (master) on: push: - branches: ["master"] - -permissions: - contents: read + branches: + - master + paths: + - .github/workflows/ci_master.yml + - FastMoq/ + - FastMoq.Core/ + - FastMoq.Web/ + - FastMoq.Tests/ + - FastMoq.Tests.Web/ jobs: - build-test: - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 8.0.x - 9.0.x - - - name: Restore - run: dotnet restore - - - name: Build - run: dotnet build --no-restore --configuration Release - - - name: Test - run: dotnet test --no-build --configuration Release --verbosity normal + call-template: + uses: ./.github/workflows/template_ci.yml + with: + projects: "FastMoq.Tests/FastMoq.Tests.csproj FastMoq.Tests.Web/FastMoq.Tests.Web.csproj" + frameworks: '["8.0.x","9.0.x"]' diff --git a/.github/workflows/ci_pr.yml b/.github/workflows/ci_pr.yml index 34bbf8c..9d4171a 100644 --- a/.github/workflows/ci_pr.yml +++ b/.github/workflows/ci_pr.yml @@ -2,30 +2,19 @@ name: CI (PR) on: pull_request: - branches: ["master"] - -permissions: - contents: read + branches: + - master + paths: + - .github/workflows/ci_pr.yml + - FastMoq/ + - FastMoq.Core/ + - FastMoq.Web/ + - FastMoq.Tests/ + - FastMoq.Tests.Web/ jobs: - build-test: - runs-on: ubuntu-22.04 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup .NET - uses: actions/setup-dotnet@v4 - with: - dotnet-version: | - 8.0.x - 9.0.x - - - name: Restore - run: dotnet restore - - - name: Build - run: dotnet build --no-restore --configuration Release - - - name: Test - run: dotnet test --no-build --configuration Release --verbosity normal + call-template: + uses: ./.github/workflows/template_ci.yml + with: + projects: "FastMoq.Tests/FastMoq.Tests.csproj FastMoq.Tests.Web/FastMoq.Tests.Web.csproj" + frameworks: '["8.0.x","9.0.x"]' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 702b801..e65839b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,7 @@ jobs: matrix: include: - language: csharp - build-mode: none + build-mode: manual # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both @@ -54,6 +54,31 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Setup .NET SDKs + if: matrix.language == 'csharp' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 9.0.x + 8.0.x + + - name: Restore .NET (Release solution only) + if: matrix.language == 'csharp' + run: | + set -euo pipefail + # Use the release solution (excludes test projects) to avoid building test SDK under net6.0 + if [ -f FastMoq-Release.sln ]; then + echo "Restoring FastMoq-Release.sln" + dotnet restore FastMoq-Release.sln + else + echo "FastMoq-Release.sln not found; falling back to all solution files" + for sln in *.sln; do + echo "Restoring solution: $sln" + dotnet restore "$sln" + done + fi + echo "Restore complete (release scope)" + # Configure environment before firewall restrictions - name: Configure GitHub Actions environment run: | @@ -75,21 +100,17 @@ jobs: # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - if: matrix.build-mode == 'manual' - shell: bash + - name: Build (manual single TFM for CodeQL - release scope) + if: matrix.language == 'csharp' && matrix.build-mode == 'manual' run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 + set -euo pipefail + echo "Manual build for CodeQL semantic extraction (net9.0) using release solution" + SLN=FastMoq-Release.sln + if [ ! -f "$SLN" ]; then + echo "Release solution not found; falling back to FastMoq.sln" + SLN=FastMoq.sln + fi + dotnet build "$SLN" -c Release -f net9.0 /p:UseSharedCompilation=false --no-restore - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/pr_FastMoq.yml b/.github/workflows/pr_FastMoq.yml deleted file mode 100644 index 622b2c7..0000000 --- a/.github/workflows/pr_FastMoq.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: pr_FastMoq -on: - workflow_call: - pull_request: - branches: - - master - push: - branches: - - master # Release branch - paths: - - .github/workflows/pr_FastMoq.yml - - FastMoq/ - - FastMoq.Core/ - - FastMoq.Web/ - - FastMoq.Tests/ - - FastMoq.Tests.Web/ - -jobs: - codeql: - uses: ./.github/workflows/codeql.yml - - test: - needs: codeql - name: test - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - # Configure environment before firewall restrictions - - name: Configure GitHub Actions environment - run: | - echo "Setting up environment before firewall restrictions..." - # Configure git for potential package restoration - git config --global user.email "actions@github.com" - git config --global user.name "GitHub Actions" - - - name: Setup .NET 8.0 - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 8.0.x - - - name: Setup .NET 9.0 - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.0.x - - # Configure NuGet sources with authentication before package restore - - name: Configure NuGet sources - run: | - dotnet nuget add source https://api.nuget.org/v3/index.json --name nuget.org --configfile $(dotnet nuget locals global-packages --list | cut -d' ' -f2)/NuGet.Config || true - - name: Install dependencies - run: dotnet restore FastMoq.Tests/FastMoq.Tests.csproj && dotnet restore FastMoq.Tests.Web/FastMoq.Tests.Web.csproj - - name: Build .NET 8.0 - run: dotnet build FastMoq.Tests/FastMoq.Tests.csproj --framework net8.0 -p:SuppressTfmSupportBuildErrors=true && dotnet build FastMoq.Tests.Web/FastMoq.Tests.Web.csproj --framework net8.0 -p:SuppressTfmSupportBuildErrors=true - - name: Build .NET 9.0 - run: dotnet build FastMoq.Tests/FastMoq.Tests.csproj --framework net9.0 -p:SuppressTfmSupportBuildErrors=true && dotnet build FastMoq.Tests.Web/FastMoq.Tests.Web.csproj --framework net9.0 -p:SuppressTfmSupportBuildErrors=true - - name: Test FastMoq.Tests .NET 8.0 - run: dotnet test FastMoq.Tests/FastMoq.Tests.csproj --framework net8.0 --no-build - - name: Test FastMoq.Tests .NET 9.0 - run: dotnet test FastMoq.Tests/FastMoq.Tests.csproj --framework net9.0 --no-build - - name: Test FastMoq.Tests.Web .NET 8.0 - run: dotnet test FastMoq.Tests.Web/FastMoq.Tests.Web.csproj --framework net8.0 --no-build - - name: Test FastMoq.Tests.Web .NET 9.0 - run: dotnet test FastMoq.Tests.Web/FastMoq.Tests.Web.csproj --framework net9.0 --no-build diff --git a/.github/workflows/publish_FastMoq.yml b/.github/workflows/publish_FastMoq.yml index f5bc416..b0757ba 100644 --- a/.github/workflows/publish_FastMoq.yml +++ b/.github/workflows/publish_FastMoq.yml @@ -1,74 +1,150 @@ name: publish_FastMoq + on: release: types: [published] - push: - branches: - - master # Release branch - paths: - - .github/workflows/publish_FastMoq.yml -jobs: - test: - uses: ./.github/workflows/pr_FastMoq.yml +concurrency: + group: publish-${{ github.ref_name }} + cancel-in-progress: false - publish: - needs: test - name: build, pack & publish +permissions: + contents: read + packages: write + id-token: write + +jobs: + verify: + name: Verify release context runs-on: ubuntu-latest + outputs: + version: ${{ steps.verify_tag.outputs.version }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - # Configure environment before firewall restrictions - - name: Configure GitHub Actions environment + - name: Ensure tag references master & extract version + id: verify_tag run: | - echo "Setting up environment before firewall restrictions..." - # Configure git for potential package operations - git config --global user.email "actions@github.com" - git config --global user.name "GitHub Actions" + set -euo pipefail + echo "Ref: $GITHUB_REF" + if [[ "$GITHUB_REF" != refs/tags/* ]]; then + echo "Not a tag ref (got $GITHUB_REF)" >&2; exit 1; + fi + TAG_NAME="${GITHUB_REF#refs/tags/}" + git fetch origin master --depth 1 + TAG_COMMIT=$(git rev-list -n 1 "$TAG_NAME") + MASTER_COMMIT=$(git rev-list -n 1 origin/master) + if ! git merge-base --is-ancestor "$TAG_COMMIT" "$MASTER_COMMIT"; then + echo "Tag commit is not contained in master. Abort." >&2; exit 1; + fi + VERSION="$TAG_NAME" + if [[ $VERSION == v* ]]; then VERSION=${VERSION#v}; fi + if [[ ! $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$ ]]; then + echo "Tag $TAG_NAME is not valid SemVer" >&2; exit 1; + fi + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "Validated tag $TAG_NAME (version $VERSION) is based on master." + + tests: + name: Reusable test matrix (net8/net9) + needs: verify + uses: ./.github/workflows/template_ci.yml + with: + projects: "FastMoq.Tests/FastMoq.Tests.csproj FastMoq.Tests.Web/FastMoq.Tests.Web.csproj" + frameworks: '["8.0.x","9.0.x"]' - - name: Setup .NET - uses: actions/setup-dotnet@v4 + package: + name: Build & Pack (multi-TFM) + runs-on: ubuntu-latest + needs: [tests, verify] + env: + VERSION: ${{ needs.verify.outputs.version }} + steps: + - uses: actions/checkout@v4 with: - dotnet-version: 9.0.x - - # Configure NuGet sources with authentication before operations - - name: Configure NuGet sources + fetch-depth: 0 + - name: Validate changelog entry run: | - dotnet nuget add source https://api.nuget.org/v3/index.json --name nuget.org --configfile $(dotnet nuget locals global-packages --list | cut -d' ' -f2)/NuGet.Config || true - - # Publish - - name: Build FastMoq - run: dotnet build FastMoq-Release.sln -c Release - - - name: Fetch all tags - run: git fetch --tags - - - name: Validate and set version - id: validate + if ! grep -Eq "^##?\s+v?${VERSION}\b" CHANGELOG.md 2>/dev/null; then + echo "CHANGELOG.md missing heading for version ${VERSION}" >&2; exit 1; fi + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: | + 6.0.x + 8.0.x + 9.0.x + cache: true + - name: Restore + run: dotnet restore FastMoq-Release.sln + - name: Build (Release) + run: dotnet build FastMoq-Release.sln -c Release --no-restore + - name: Pack run: | - TAG=$(git describe --tags $(git rev-list --tags --max-count=1)) - VERSION=${TAG#v} # Remove 'v' from the beginning of the tag - if [[ $VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$ ]]; then - echo "VERSION=$VERSION" >> $GITHUB_ENV - else - echo "Error: Latest tag ($TAG) is not a valid SemVer version" - exit 1 - fi - - - name: Creating a package - run: dotnet pack FastMoq-Release.sln --no-build -c Release -o . /p:PackageVersion=${{ env.VERSION }} + if [[ -z "${VERSION:-}" ]]; then echo "VERSION not set" >&2; exit 1; fi + dotnet pack FastMoq-Release.sln -c Release -o ./artifacts --no-build /p:PackageVersion=$VERSION + - name: Verify embedded package version + run: | + PKG=$(ls artifacts/FastMoq.*.nupkg | head -n1) + unzip -p "$PKG" FastMoq.nuspec | grep -Eq "${VERSION}" || { echo "Package nuspec version mismatch" >&2; exit 1; } + - name: List packages + run: ls -1 artifacts + - uses: actions/upload-artifact@v4 + with: + name: FastMoq-nuget + path: ./artifacts/*.nupkg - - name: Push to NuGet + publish: + name: Publish to NuGet + runs-on: ubuntu-latest + needs: [package, verify] + env: + VERSION: ${{ needs.verify.outputs.version }} + steps: + - uses: actions/download-artifact@v4 + with: + name: FastMoq-nuget + path: artifacts + - name: Confirm version + run: | + if [[ -z "${VERSION:-}" ]]; then echo "VERSION not propagated" >&2; exit 1; fi + echo "Publishing version $VERSION" + - name: Check if version already published + run: | + set -euo pipefail + FOUND=$(curl -s https://api.nuget.org/v3-flatcontainer/fastmoq/index.json | jq -r '.versions[]' | grep -Fx "$VERSION" || true) + if [[ -n "$FOUND" ]]; then + echo "Version $VERSION already on NuGet – skipping push."; exit 0; fi + - name: Push packages id: push run: | - OUTPUT=$(dotnet nuget push *.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}} --skip-duplicate) + set -euo pipefail + OUTPUT=$(dotnet nuget push artifacts/*.nupkg -s https://api.nuget.org/v3/index.json -k ${{ secrets.NUGET_API_KEY }} --skip-duplicate 2>&1 || true) echo "$OUTPUT" - if [[ $OUTPUT == *"Your package was pushed"* ]]; then - echo "Push successful" - else - echo "Push failed" - exit 1 - fi + STATUS=failed + if echo "$OUTPUT" | grep -q "Your package was pushed"; then STATUS=success; fi + if echo "$OUTPUT" | grep -qi "Skipping duplicate"; then STATUS=skipped; fi + echo "push-status=$STATUS" >> "$GITHUB_OUTPUT" + if [[ "$STATUS" == failed ]]; then + echo "Package push failed" >&2; exit 1; fi + - name: Generate SBOM (placeholder) + if: steps.push.outputs.push-status == 'success' + run: | + echo "(Optional) Generate SBOM here using syft or dotnet tool if desired." > sbom.txt + echo "SBOM generation placeholder for FastMoq $VERSION" >> sbom.txt + - name: Attest provenance (placeholder) + if: steps.push.outputs.push-status == 'success' + run: | + echo "(Optional) Supply chain attestation placeholder - integrate GitHub attest later." >> provenance.txt + - uses: actions/upload-artifact@v4 + if: steps.push.outputs.push-status == 'success' + with: + name: provenance + path: | + sbom.txt + provenance.txt + - name: Summary + run: | + echo "### Publish Result" >> $GITHUB_STEP_SUMMARY + echo "Version: $VERSION" >> $GITHUB_STEP_SUMMARY + echo "Push Status: ${{ steps.push.outputs.push-status }}" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/publish_pages.yml b/.github/workflows/publish_pages.yml index 59fadba..6d3732d 100644 --- a/.github/workflows/publish_pages.yml +++ b/.github/workflows/publish_pages.yml @@ -2,55 +2,27 @@ name: Publish Pages on: workflow_run: - workflows: ["CI (master)"] # Must match the name: in ci_master.yml + workflows: ["CI (master)"] types: - completed - workflow_dispatch: - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: "pages" - cancel-in-progress: true jobs: - build: + deploy: if: ${{ github.event.workflow_run.conclusion == 'success' }} - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Pages - uses: actions/configure-pages@v4 - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.3' - bundler-cache: true - - - name: Build with Jekyll - uses: actions/jekyll-build-pages@v1 - with: - source: ./Help # Adjust if your Jekyll root is elsewhere - destination: ./_site + uses: actions/configure-pages@v5 - name: Upload artifact uses: actions/upload-pages-artifact@v3 + with: + path: ./Help # adjust if your site source is elsewhere - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-22.04 - needs: build - steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 diff --git a/.github/workflows/template_ci.yml b/.github/workflows/template_ci.yml new file mode 100644 index 0000000..276fefa --- /dev/null +++ b/.github/workflows/template_ci.yml @@ -0,0 +1,155 @@ +name: CI Template + +on: + workflow_call: + inputs: + projects: + required: true + type: string + frameworks: + required: true + type: string + +permissions: + contents: read + security-events: write + packages: read + actions: read + +jobs: + codeql: + uses: ./.github/workflows/codeql.yml + + build-test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + framework: ${{ fromJSON(inputs.frameworks) }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ matrix.framework }} + cache: true + cache-dependency-path: | + **/*.csproj + **/*.sln + + - name: Set environment + run: | + echo "DOTNET_CLI_TELEMETRY_OPTOUT=1" >> $GITHUB_ENV + echo "DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1" >> $GITHUB_ENV + echo "NUGET_PACKAGES=$HOME/.nuget/packages" >> $GITHUB_ENV + + - run: dotnet --info + + - name: Restore (TFM-scoped, no lock mode) + env: + FW: ${{ matrix.framework }} + run: | + set -euo pipefail + FW_NOX="${FW%%.x}" + IFS='.' read -r major minor rest <<< "$FW_NOX" + minor="${minor:-0}" + tfm="net${major}.${minor}" + echo "Derived TFM: $tfm from framework input '$FW'" + : > skipped.txt + for proj in ${{ inputs.projects }}; do + if ! grep -Eiq "net${major}\\.${minor}" "$proj"; then + echo "Skipping $proj (does not target $tfm)" + echo "[RESTORE] $proj ($tfm)" >> skipped.txt + continue + fi + # dotnet restore does not support --framework; use MSBuild property instead + dotnet restore "$proj" -p:TargetFramework="$tfm" + done + + - name: Build (TFM-scoped) + env: + FW: ${{ matrix.framework }} + run: | + set -euo pipefail + FW_NOX="${FW%%.x}" + IFS='.' read -r major minor rest <<< "$FW_NOX" + minor="${minor:-0}" + tfm="net${major}.${minor}" + echo "Building for $tfm" + for proj in ${{ inputs.projects }}; do + if ! grep -Eiq "net${major}\\.${minor}" "$proj"; then + echo "Skipping build $proj (missing $tfm)" + echo "[BUILD] $proj ($tfm)" >> skipped.txt + continue + fi + dotnet build "$proj" --framework "$tfm" --no-restore -c Release + done + + - name: Test (TFM-scoped) + env: + FW: ${{ matrix.framework }} + run: | + set -euo pipefail + FW_NOX="${FW%%.x}" + IFS='.' read -r major minor rest <<< "$FW_NOX" + minor="${minor:-0}" + tfm="net${major}.${minor}" + echo "Testing for $tfm" + for proj in ${{ inputs.projects }}; do + if ! grep -Eiq "net${major}\\.${minor}" "$proj"; then + echo "Skipping test $proj (missing $tfm)" + echo "[TEST] $proj ($tfm)" >> skipped.txt + continue + fi + resultsDir="TestResults/${tfm}" + mkdir -p "$resultsDir" + dotnet test "$proj" --framework "$tfm" --no-build --no-restore --configuration Release \ + --logger "trx;LogFileName=${tfm}-results.trx" \ + --collect "XPlat Code Coverage" \ + --results-directory "$resultsDir" || echo "Test failures captured for $proj ($tfm)" + done + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: test-results-${{ matrix.framework }} + path: | + TestResults/** + **/coverage.cobertura.xml + if-no-files-found: ignore + + - name: Summary of skipped projects + if: always() + run: | + { + echo "### Skipped Projects Summary" + if [[ -s skipped.txt ]]; then + cat skipped.txt + else + echo "No projects were skipped." + fi + } >> "$GITHUB_STEP_SUMMARY" + + tests-aggregate: + runs-on: ubuntu-latest + needs: build-test + if: always() + steps: + - name: Aggregate matrix result + run: | + echo "Aggregating test matrix results..." + result='${{ needs.build-test.result }}' + echo "Matrix overall result: $result" + if [ "$result" != "success" ]; then + echo "One or more test legs failed. See individual build-test jobs." + exit 1 + fi + echo "All test legs passed." >> $GITHUB_STEP_SUMMARY + echo "### Test Matrix Summary" >> $GITHUB_STEP_SUMMARY + echo "All frameworks succeeded." >> $GITHUB_STEP_SUMMARY + diff --git a/FastMoq/packages.lock.json b/FastMoq/packages.lock.json new file mode 100644 index 0000000..1cb1d87 --- /dev/null +++ b/FastMoq/packages.lock.json @@ -0,0 +1,1473 @@ +{ + "removed": true + "AngleSharp.Diffing": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "6OeF2VvqyVaxMOP+wE0fjeaP+0ox2Og26tKDmY3Zf/qugRbd86OjmqoF6ZGyQonyP/zPjJ/TAB9VUR4HG3Dq5A==", + "dependencies": { + "AngleSharp": "1.1.2", + "AngleSharp.Css": "1.0.0-beta.144" + } + }, + "bunit": { + "type": "Transitive", + "resolved": "1.35.3", + "contentHash": "m14GBjUOnQ6ou6fAA03T+oJjqxFDku+Pr84cldugT9ZlKfSDg4h0+RQX9xrC0O6/lY12rE0tWe3DgQABWV1O9w==", + "dependencies": { + "bunit.core": "1.35.3", + "bunit.web": "1.35.3" + } + }, + "bunit.core": { + "type": "Transitive", + "resolved": "1.35.3", + "contentHash": "9P3tG/vIUoL+e2ZS05F4kBOGnDG2CuQoqoTH7snwFqOlz0cGu89GTA4yIgp+t84z0g+l2R0GeeGxUnljhF/gug==", + "dependencies": { + "Microsoft.AspNetCore.Components": "6.0.33", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4" + } + }, + "bunit.web": { + "type": "Transitive", + "resolved": "1.35.3", + "contentHash": "96jlPeVDzBs9OX1Jes3awA+r1xVC2bawDHGxLNtIFzb0wWpbirjCtJeQ2r3DPV1M1BuvhcC2U+8y1b0eFQ8AKQ==", + "dependencies": { + "AngleSharp": "1.1.2", + "AngleSharp.Css": "1.0.0-beta.144", + "AngleSharp.Diffing": "1.0.0", + "Microsoft.AspNetCore.Components": "6.0.33", + "Microsoft.AspNetCore.Components.Authorization": "6.0.33", + "Microsoft.AspNetCore.Components.Web": "6.0.33", + "Microsoft.AspNetCore.Components.WebAssembly": "6.0.33", + "Microsoft.AspNetCore.Components.WebAssembly.Authentication": "6.0.33", + "Microsoft.Extensions.Caching.Memory": "6.0.2", + "Microsoft.Extensions.Localization.Abstractions": "6.0.33", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4", + "System.Text.Json": "8.0.5", + "bunit.core": "1.35.3" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "3/73x14WtMqCcBvE27b3EevlDXeMpcUeRwEqhqsWnR5dg8A2pMDPh42AM2blx5JA7gV1I2be5I199a0UzR6N7w==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "6.0.33", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "Nxdcp9gUfn00BAMz5fV+phLMl8Md/guwCwlAooyAN0WPSbzHYOkcdU+flRCvLzr79XU8Kxy6vdJ7w6M+j+HHRw==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "6.0.33", + "Microsoft.AspNetCore.Components.Analyzers": "6.0.33" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "mhstKorVy+KgweVw/hZyP5I5PiM/sII4Aa2fWNhAUu9ke0Kdmr4rJ5Lh3R1oUP2GpRacj081obexdMuI8/M6ZA==" + }, + "Microsoft.AspNetCore.Components.Authorization": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "wRKiXyNsYNEIJCB4hHFB4Yk5xaqhcUq8TtRQpfx/P9PhjMTZ5fopK0we9OkLcdKXUkYKZ36cx/GnonE7Ld4Xnw==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "6.0.33", + "Microsoft.AspNetCore.Components": "6.0.33" + } + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "e2iIKofX4rBP47/XQpggMi8t2WnnvkZLm9Mujn2bfp/MFtRRyEHAuW1tDmvngK4vGtsHDQEpoFMqHUCQI5L+rA==", + "dependencies": { + "Microsoft.AspNetCore.Components": "6.0.33" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "vKk18Hyxt4lFR/A0WDv3SPKYWL4sPp3jxl/ZFL3JUSLQHdXiN2xEUQSyBDpOSfEJO3B1LHWb4ZA/Rd6SKf+R3g==", + "dependencies": { + "Microsoft.AspNetCore.Components": "6.0.33", + "Microsoft.AspNetCore.Components.Forms": "6.0.33", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.JSInterop": "6.0.33", + "System.IO.Pipelines": "6.0.3" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "llLo36CZShfJTfNCc084AFYPxtQINfU1hpZP79Ls/lHjeSB7nAIss8cIHwsIikbwXEfZeWc8uF3mJG4Xxt59fw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "6.0.33", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.JSInterop.WebAssembly": "6.0.33" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly.Authentication": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "sKC6nbrCMgif2/makDQeBs+1ju/0jWvEFEHr44laGtTzakXO9vhIW6WJf30n1+zUyvasMlMi65y5KnBrufCIHw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Authorization": "6.0.33", + "Microsoft.AspNetCore.Components.Web": "6.0.33" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "KTjopnVL5zwvWQF0hazAiPKIXFFKnvugDtjUz3qtSWk2Hv+ArHoxg7YWhPMgov/6SMaYjL5g6sjYf6TqipDmGw==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "Vh74dyfNQJBc58lcOuhSKH39AuQlgGatAY4bOCZx7F+8/GO3Ba2G9G1swCVhBQkeTG2Ftew8R6iga02ATZiE6w==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.2" + } + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "0i1BBvJBrqdmIdTqCmL+/J74HucYqc5eck3J5trKe6AN2fvdE1lICto6HBwNhbtPniZO7bhW36FnIjTK0FamXg==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.36", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.36", + "Microsoft.Extensions.Caching.Memory": "6.0.3", + "Microsoft.Extensions.DependencyInjection": "6.0.2", + "Microsoft.Extensions.Logging": "6.0.1", + "System.Collections.Immutable": "6.0.1", + "System.Diagnostics.DiagnosticSource": "6.0.2" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "nrR4lfe9izQK1eerKW/ECHuJV8xXtuvoj/APrwwOjX4+Ne2SMXBpetctPcYNVc3KyiKuUHJSLywWtsqoXE5ElA==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "Se0wloBaAJcLwgSW4hvGdAWjKnuIwgQ2PKTNkvG80PW/WFgedwKomY9wuO5BPewIHlX6huGyP//StQQRQOWr+Q==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "Vq9UQEFNU1t42AOSgz6bUe0fpMa1g4wO8Y7EfhYPX6VSriRSRB4ImTC2TEZjOUeyGcZyUI2Kyd6//RfUPUR+Pw==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.36", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.1" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "NWlTJgKQRrZcdN+vph/PSZ1e3a9LDvBgiO/WQLfMWwWEv0XdixMRh6hWaKI+QpqdVCtwzZPQovEBzhJBdgIasA==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.36", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.2" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.36", + "contentHash": "LQjAvbbFD673QABvnJXmGERqEg8NCEimSTPm17jaUVwG38V+rppXZqPnXoKhfV8XrOD7yneJ3+/1vA+cqtk7PQ==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "6.0.36", + "Microsoft.EntityFrameworkCore.Relational": "6.0.36", + "Microsoft.Extensions.DependencyModel": "6.0.2" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "zEtKmOJ3sZ9YxRgvgLtoQsqO069Kqp0aC6Ai+DkyE5uahtu1ynvuoDVFQgyyhVcJWnxCzZHax/3AodvAx2mhjA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.1" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "GVNNcHoPDEUn4OQiBBGs5mE6nX7BA+LeQId9NeA+gB8xcbDUmFPAl8Er2ixNLbn4ffFr8t5jfMwdxgFG66k7BA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "6.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4", + "Microsoft.Extensions.Options": "6.0.1", + "Microsoft.Extensions.Primitives": "6.0.1" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "+FhuIM7bE3CyzhhIju6K1pmcDAp4ez2PKwx8jnV4dEI/LXXBGdQbDijlaQWqMa1oC38DX390bSshQVaKXioiXA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.1" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "gWUfUZ2ZDvwiVCxsOMComAhG43xstNWWVjV2takUZYRuDSJjO9Q5/b3tfOSkl5mcVwZAL3RZviRj5ZilxHghlw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "HS5YsudCGSVoCVdsYJ5FAO9vx0z04qSAXgVzpDJSQ1/w/X9q8hrQVGU2p+Yfui+2KcXLL+Zjc0SX3yJWtBmYiw==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.1", + "System.Text.Json": "6.0.11" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Localization.Abstractions": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "Hbq0a3DswFjen1K6hDljNENpy6bDbA/s2qsQ5M9kqa6fB3JVKWggAdqwx2GJG4+SGkZKOWkOZxQ1QVqavWaF5g==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "k6tbYaHrqY9kq7p5FfpPbddY1OImPCpXQ/PGcED6N9s5ULRp8n1PdmMzsIwIzCnhIS5bs06G/lO9LfNVpUj8jg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.4", + "Microsoft.Extensions.Options": "6.0.1", + "System.Diagnostics.DiagnosticSource": "6.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.4", + "contentHash": "K14wYgwOfKVELrUh5eBqlC8Wvo9vvhS3ZhIvcswV2uS/ubkTRPSQsN557EZiYUSSoZNxizG+alN4wjtdyLdcyw==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "v5rh5jRcLBOKOaLVyYCm4TY/RoJlxWsW7N2TAPkmlHe55/0cB0Syp979x4He1+MIXsaTvJl1WOc7b1D1PSsO3A==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.1" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "zyJfttJduuQbGEsd/TgerUEdgzHgUn/6oFgeaE04DKUMs7bbzckV7Ci1QZxf/VyQAlG41gR/GjecEScuYoHCUg==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "ZFr+bVjSvKUPrQOUBO3rMhU/IPGziexaGH9jW2nv2kIDgJwgOOGkL+59T/98vuWW8M+TFqeuTkVdTPdVC0L0MA==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "6.0.33", + "contentHash": "lwkENolVndLuFUV+7/j+WwQntA0UYB01jObai/3uixgaT4uc7exarLqz2pxYs0AZ0zF1I+QNEb28HYVAFtsLRQ==", + "dependencies": { + "Microsoft.JSInterop": "6.0.33" + } + }, + "Moq": { + "type": "Transitive", + "resolved": "4.18.4", + "contentHash": "IOo+W51+7Afnb0noltJrKxPBSfsgMzTKCw+Re5AMx8l/vBbAbMDOynLik4+lBYIWDJSO0uV7Zdqt7cNb6RZZ+A==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.2", + "contentHash": "ilkvNhrTersLmIVAcDwwPqfhUFCg19Z1GVMvCSi3xk6Akq94f4qadLORQCq/T8+9JgMiPs+F/NECw5uauviaNw==", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.2", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.2" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.1.2", + "contentHash": "A8EBepVqY2lnAp3a8jnhbgzF2tlj2S3HcJQGANTYg/TbYbKa8Z5cM1h74An/vy0svhfzT7tVY0sFmUglLgv+2g==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.2", + "contentHash": "zibGtku8M4Eea1R3ZCAxc86QbNvyEN17mAcQkvWKBuHvRpMiK2g5anG4R5Be7cWKSd1i6baYz8y4dMMAKcXKPg==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.2", + "contentHash": "lxCZarZdvAsMl2zw9bXHrXK6RxVhB4b23iTFhCOdHFhxfbsxLxWf+ocvswJwR/9Wh/E//ddMi+wJGqUKV7VwoA==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.2" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Cc+SfP+jyCmA1TnRnDA7cRZy5jbLyWodfuUJKDJ+PJZBwWkv8szz+ztSCHAonqnL01DRaHaS2ptc4bYIEdgvWw==" + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "gPYFPDyohW2gXNhdQRSjtmeS6FymL2crg4Sral1wtvEJ7DUqFCDWDVbbLobASbzxfic8U1hQEdC7hmg9LHncMw==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "8.0.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "6tQaIexFycaotdGn23lf3XJ/eI1GOjQKIvQDRFN9N4pwoNsKnHuXccQ3lnQO6GX8KAb1ic+6ZofJmPdbUVwZag==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "dependencies": { + "System.IO.Abstractions": "17.2.3" + } + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "6.0.3", + "contentHash": "ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "8.0.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "fastmoq.core": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite": "[6.*, )", + "Moq": "[4.18.4, 4.18.4]", + "System.IO.Abstractions.TestingHelpers": "[17.2.3, 17.2.3]", + "xunit.abstractions": "[2.0.3, )" + } + }, + "fastmoq.web": { + "type": "Project", + "dependencies": { + "FastMoq.Core": "[1.0.0, )", + "System.Configuration.ConfigurationManager": "[8.0.1, )", + "bunit": "[1.35.3, )" + } + } + }, + "net8.0": { + "AngleSharp": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "uF/PzSCVcb+b2nqVvHZbOqexoJ9R6QLjonugPf0PQl+0h7YKaFZeXyspctbHe5HGlx7/Iuk5BErtk+t63ac/ZA==" + }, + "AngleSharp.Css": { + "type": "Transitive", + "resolved": "1.0.0-beta.144", + "contentHash": "WfyZ1zi5o7fNPgTv0O74nmzyxt9w4tjypwpOCSoeoZDOHtgghc/JqyGHRbQh7Y9sZlJiivQhrQNtm4XAy9LHYA==", + "dependencies": { + "AngleSharp": "[1.0.0, 2.0.0)" + } + }, + "AngleSharp.Diffing": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "6OeF2VvqyVaxMOP+wE0fjeaP+0ox2Og26tKDmY3Zf/qugRbd86OjmqoF6ZGyQonyP/zPjJ/TAB9VUR4HG3Dq5A==", + "dependencies": { + "AngleSharp": "1.1.2", + "AngleSharp.Css": "1.0.0-beta.144" + } + }, + "bunit": { + "type": "Transitive", + "resolved": "1.38.5", + "contentHash": "QzUM6j3vX1cxGB79SaWOWVhP+fr0vrU/UYjjZdeuEIi59DMwAY35fz+ZPwW+z1AEoBaiMCje3BrBsjuS44y8cQ==", + "dependencies": { + "bunit.core": "1.38.5", + "bunit.web": "1.38.5" + } + }, + "bunit.core": { + "type": "Transitive", + "resolved": "1.38.5", + "contentHash": "1tTNaTk2PIibXW/FohOESnIX7qt9HIYqdhJfzHiTGZcX9DQyoEkgqsstHKq/S3clZJdRU5wHDZA3nfhP7uSkpw==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.11", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2" + } + }, + "bunit.web": { + "type": "Transitive", + "resolved": "1.38.5", + "contentHash": "uruHfxJrP5WTttKDv7V2+T9XaPgZExHLLIzqgl3n/Z45lfbFStfbmpIL+mNBwwItQKhpjHWDWjhlU0Vy9t6jvw==", + "dependencies": { + "AngleSharp": "1.2.0", + "AngleSharp.Css": "1.0.0-beta.144", + "AngleSharp.Diffing": "1.0.0", + "Microsoft.AspNetCore.Components": "8.0.11", + "Microsoft.AspNetCore.Components.Authorization": "8.0.11", + "Microsoft.AspNetCore.Components.Web": "8.0.11", + "Microsoft.AspNetCore.Components.WebAssembly": "8.0.11", + "Microsoft.AspNetCore.Components.WebAssembly.Authentication": "8.0.11", + "Microsoft.Extensions.Caching.Memory": "8.0.1", + "Microsoft.Extensions.Localization.Abstractions": "8.0.11", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "System.Text.Json": "9.0.0", + "bunit.core": "1.38.5" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "ACaLyjBSz9WUzbaJe0Sv09/FihRNHYlRUIj3uQ8CZFFByf6Qwv3+PXnbltidFKz2iOyqdvppQias3emdQUY2nA==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "8.0.11", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "kyhSQcVEQvMnv2BNRn7JRgYCr+PIO5Uh1mhIFdCNycxE/k8NsI72sV693s1KVmVebMA8g3hTBmfBEheWb3hhww==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.11", + "Microsoft.AspNetCore.Components.Analyzers": "8.0.11" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "4JtFt5IR0ixuFpwY6D2Xi5R+vZQ6iykd2EuG3puHETCOZOgYG8M538LCY1lbgQTkHOL04YKDjQTQu8PU/BaXRQ==" + }, + "Microsoft.AspNetCore.Components.Authorization": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "K1OES99Yj+nMg6ulpXOY+iAK/0RUXEMtdjVzM26IixYKaXFwcKHzMljgv/sZoU3TgQNgp4FD4f38JrUZXUvEgA==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "8.0.11", + "Microsoft.AspNetCore.Components": "8.0.11" + } + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "60g+idqaiVhPVNOqauy/vH5lREpjcuKl3/w6zJhdU1PFWg4jtdoyIPQH+qxBKsUohkELhH3cRfzGRKElVuZuwg==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.11" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "IDmjQ/K7hv6zUEz2LsCkQBngZx6PMnty8OdSPf0hYGMpC+4Yi37pgCc/25fFu3CSBe8nDirqTrqKtfToHWCpbw==", + "dependencies": { + "Microsoft.AspNetCore.Components": "8.0.11", + "Microsoft.AspNetCore.Components.Forms": "8.0.11", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Primitives": "8.0.0", + "Microsoft.JSInterop": "8.0.11", + "System.IO.Pipelines": "8.0.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "rrvIBSuEmxSo9qn18QHarVE1azbTk6+HU8CgYCUiNmh+NcK7dz6FmkiX3TH+buE+X1I/735LacefMabr4spLRg==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "8.0.11", + "Microsoft.Extensions.Configuration.Binder": "8.0.2", + "Microsoft.Extensions.Configuration.Json": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1", + "Microsoft.JSInterop.WebAssembly": "8.0.11" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly.Authentication": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "O1RDRDhU2B0PWkkAFgpp1gD9ni/o+s6owCZDS57wv4b+HueggaPyDH6+uImpF553eEl3KOHRM3O68KIM5sU8PA==", + "dependencies": { + "Microsoft.AspNetCore.Components.Authorization": "8.0.11", + "Microsoft.AspNetCore.Components.Web": "8.0.11" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "cy04xnMSTXTkRPjEwseRz57R5zjR/CWsdEOHH6NhWbNl97k+U1w6dSjqIOC7kv08tyzmM30FzIilSDtE5HdL/A==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "rsceqxvqaCKbASZahYa8chNdEtCghU2JErugi+Ngs/ds2QJrQixsSomGSFCR7219xQXMiz2pSrWshwm/DHqqNw==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + } + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "htQ4w2VmHGiDk8nbdpkeithh7/wBbByu0HvKx32uyCneK1WPPbc/fDhqXcIIj2NK4J6dRFTCE4Y1NrlUIl/uBw==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.20", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.20", + "Microsoft.Extensions.Caching.Memory": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "XPyMIlGNj1RJatIuNPs5sT7MVLOd5SURPQ4os1TH72Mi6rJDMQrT0WHWGpAZOcNapwW4gpmco6adGX3iNqv6mQ==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "U8C8YToCXkaDczeohD7xJKhqKZ9cg0pRsL+cz6zhQr7Y0UQ7eRXhTBy5zIi9YSo82dzN1vawkn6iN9/4k0Zduw==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "ailC6nZmDiSJm0LVFDmacibPccm1Pvaznk4Sk9Kl/XXzCglDu6dlilbmN4gO5I2Vr6Mm1GXu03UJ6XOGyXIgEA==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "8.0.20", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "mfN7QNt7vJAsPSfSTK+U9NDYaqKwl43MSKRZeSaNLAEEn5vCSyu3A58/wdTxE0K61IkiASZBtPmXRXFgZtzqbA==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite.Core": "8.0.20", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.6" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite.Core": { + "type": "Transitive", + "resolved": "8.0.20", + "contentHash": "8M2SSavQ5q4c1Lk/wUGB9WRvfUdYuRHNa2dYUmQUxAL2rKSBdJSX6DBWTVaNW11MNxr0yqSNSHuscEkRajBS3g==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "8.0.20", + "Microsoft.EntityFrameworkCore.Relational": "8.0.20", + "Microsoft.Extensions.DependencyModel": "8.0.2" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "HFDnhYLccngrzyGgHkjEDU5FMLn4MpOsr5ElgsBMC4yx6lJh4jeWO7fHS8+TXPq+dgxCmUa/Trl8svObmwW4QA==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "EJzSNO9oaAXnTdtdNO6npPRsIIeZCBSNmdQ091VDO7fBiOtJAAeEq6dtrVXIi3ZyjC5XRSAtVvF8SzcneRHqKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileProviders.Physical": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "L89DLNuimOghjV3tLx0ArFDwVEJD6+uGB3BMCMX01kaLzXkaXHb2021xOMl2QOxUxbdePKUZsUY7n2UUkycjRg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "8.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "8.0.1", + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "UboiXxpPUpwulHvIAVE36Knq0VSHaAmfrFkegLyBZeaADuKezJ/AIXYAW8F5GBlGk/VaibN2k/Zn1ca8YAfVdA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" + }, + "Microsoft.Extensions.Localization.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "qyfVEOJ8PsYrwC6kTQFSTm4+FrpOAz3OfPXvRPfs7j34V+yHMuVUgIiP5yjrYHcpNbXTtCzoQc/ZdcbpdeX/Xg==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Primitives": "8.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "UYSbAkNGTWVUne3I04/9IRQel3Bt1Ww6Y5cjvZEZ89rWhBD1yWu7YDotvQS62V6mgSfFaXXPGrCUm1VG824QXw==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "eB6YYFdA2DnmR8W1WO9of4hBSaRTsmxke7FVbHjzjhYu/1XgMZ9FZq6sY5OjE7rnkGN3XYHXXWB4T49Y8DAthA==", + "dependencies": { + "Microsoft.JSInterop": "8.0.11" + } + }, + "Moq": { + "type": "Transitive", + "resolved": "4.18.4", + "contentHash": "IOo+W51+7Afnb0noltJrKxPBSfsgMzTKCw+Re5AMx8l/vBbAbMDOynLik4+lBYIWDJSO0uV7Zdqt7cNb6RZZ+A==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.6", + "contentHash": "BmAf6XWt4TqtowmiWe4/5rRot6GerAeklmOPfviOvwLoF5WwgxcJHAxZtySuyW9r9w+HLILnm8VfJFLCUJYW8A==", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.1.6", + "contentHash": "wO6v9GeMx9CUngAet8hbO7xdm+M42p1XeJq47ogyRoYSvNSp0NGLI+MgC0bhrMk9C17MTVFlLiN6ylyExLCc5w==" + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.6", + "contentHash": "2ObJJLkIUIxRpOUlZNGuD4rICpBnrBR5anjyfUFQep4hMOIeqW+XGQYzrNmHSVz5xSWZ3klSbh7sFR6UyDj68Q==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.6", + "contentHash": "PQ2Oq3yepLY4P7ll145P3xtx2bX8xF4PzaKPRpw9jZlKvfe4LE/saAV82inND9usn1XRpmxXk7Lal3MTI+6CNg==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.6" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "pX5GhR4/mfYUbebRdINO6P4B8stIbVWaAWGgWzYO1eC30nUVpCQdzQjKwCPhtLdzjR3d/q+MQ0sRG3B1GLSyqw==", + "dependencies": { + "System.Diagnostics.EventLog": "9.0.2", + "System.Security.Cryptography.ProtectedData": "9.0.2" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "i+Fe6Fpst/onydFLBGilCr/Eh9OFdlaTU/c3alPp6IbLZXQJOgpIu3l4MOnmsN8fDYq5nAyHSqNIJesc74Yw3Q==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "+z9JWtU9di45tW/w6zpuJms4SnAAqKY2Usmmxs7MpOhxWoIeR2pKl1vEkaFbEx52ZfrMFcZXsFe+8WERMozzGg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "e2hMgAErLbKyUUwt18qSBf9T5Y+SFAL3ZedM8fLupkVj8Rj2PZ9oxQ37XX2LF8fTO1wNIxvKpihD7Of7D/NxZw==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "js7+qAu/9mQvnhA4EfGMZNEzXtJCDxgkgj8ohuxq/Qxv+R56G+ljefhiJHOxTNiw54q8vmABCWUwkMulNdlZ4A==", + "dependencies": { + "System.IO.Pipelines": "9.0.0", + "System.Text.Encodings.Web": "9.0.0" + } + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "21.3.1", + "contentHash": "B9USlBOZAiqXss7AI4BH6HVWs+HoHx38OadJjBO0VCzEWgP/u0u52bogmrzDHsyqRv8Yo/xtIMQXgpjLoaAUXw==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "21.3.1", + "contentHash": "XP7tiKVtnOP+jXWsRqgc7WCV2tsoolVnxSNUJXwdWmHCpLMsVlZXRag7dMynnNEQQB9XEJx25RteqN5APCnjag==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "21.3.1", + "TestableIO.System.IO.Abstractions.Wrappers": "21.3.1" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "21.3.1", + "contentHash": "l/xu8G96pntsofFG8vh6BKbVbYWtqYZTpNCcj4jGNwxwSbwY2gvDmkiFmIbWf7lgzPZbopW2FAfaY6m4K/3QJw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "21.3.1" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "fastmoq.core": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite": "[8.*, )", + "Moq": "[4.18.4, 4.18.4]", + "TestableIO.System.IO.Abstractions.TestingHelpers": "[21.3.1, 21.3.1]", + "xunit.abstractions": "[2.0.3, )" + } + }, + "fastmoq.web": { + "type": "Project", + "dependencies": { + "FastMoq.Core": "[1.0.0, )", + "System.Configuration.ConfigurationManager": "[9.0.2, )", + "bunit": "[1.38.5, )" + } + } + }, + "net9.0": { + "AngleSharp": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "uF/PzSCVcb+b2nqVvHZbOqexoJ9R6QLjonugPf0PQl+0h7YKaFZeXyspctbHe5HGlx7/Iuk5BErtk+t63ac/ZA==" + }, + "AngleSharp.Css": { + "type": "Transitive", + "resolved": "1.0.0-beta.144", + "contentHash": "WfyZ1zi5o7fNPgTv0O74nmzyxt9w4tjypwpOCSoeoZDOHtgghc/JqyGHRbQh7Y9sZlJiivQhrQNtm4XAy9LHYA==", + "dependencies": { + "AngleSharp": "[1.0.0, 2.0.0)" + } + }, + "AngleSharp.Diffing": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "6OeF2VvqyVaxMOP+wE0fjeaP+0ox2Og26tKDmY3Zf/qugRbd86OjmqoF6ZGyQonyP/zPjJ/TAB9VUR4HG3Dq5A==", + "dependencies": { + "AngleSharp": "1.1.2", + "AngleSharp.Css": "1.0.0-beta.144" + } + }, + "bunit": { + "type": "Transitive", + "resolved": "1.38.5", + "contentHash": "QzUM6j3vX1cxGB79SaWOWVhP+fr0vrU/UYjjZdeuEIi59DMwAY35fz+ZPwW+z1AEoBaiMCje3BrBsjuS44y8cQ==", + "dependencies": { + "bunit.core": "1.38.5", + "bunit.web": "1.38.5" + } + }, + "bunit.core": { + "type": "Transitive", + "resolved": "1.38.5", + "contentHash": "1tTNaTk2PIibXW/FohOESnIX7qt9HIYqdhJfzHiTGZcX9DQyoEkgqsstHKq/S3clZJdRU5wHDZA3nfhP7uSkpw==", + "dependencies": { + "Microsoft.AspNetCore.Components": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0" + } + }, + "bunit.web": { + "type": "Transitive", + "resolved": "1.38.5", + "contentHash": "uruHfxJrP5WTttKDv7V2+T9XaPgZExHLLIzqgl3n/Z45lfbFStfbmpIL+mNBwwItQKhpjHWDWjhlU0Vy9t6jvw==", + "dependencies": { + "AngleSharp": "1.2.0", + "AngleSharp.Css": "1.0.0-beta.144", + "AngleSharp.Diffing": "1.0.0", + "Microsoft.AspNetCore.Components": "9.0.0", + "Microsoft.AspNetCore.Components.Authorization": "9.0.0", + "Microsoft.AspNetCore.Components.Web": "9.0.0", + "Microsoft.AspNetCore.Components.WebAssembly": "9.0.0", + "Microsoft.AspNetCore.Components.WebAssembly.Authentication": "9.0.0", + "Microsoft.Extensions.Caching.Memory": "9.0.0", + "Microsoft.Extensions.Localization.Abstractions": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "bunit.core": "1.38.5" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.AspNetCore.Authorization": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "qDJlBC5pUQ/3o6/C6Vuo9CGKtV5TAe5AdKeHvDR2bgmw8vwPxsAy3KG5eU0i1C+iAUNbmq+iDTbiKt16f9pRiA==", + "dependencies": { + "Microsoft.AspNetCore.Metadata": "9.0.0", + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.Extensions.Options": "9.0.0" + } + }, + "Microsoft.AspNetCore.Components": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "xKzY0LRqWrwuPVzKIF9k1kC21NrLmIE2qPhhKlInEAdYqNe8qcMoPWZy7fo1uScHkz5g73nTqDDra3+aAV7mTQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "9.0.0", + "Microsoft.AspNetCore.Components.Analyzers": "9.0.0" + } + }, + "Microsoft.AspNetCore.Components.Analyzers": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "maOE1qlJ9hf1Fb7PhFLw9bgP9mWckuDOcn1uKNt9/msdJG2YHl3cPRHojYa6CxliGHIXL8Da4qPgeUc4CaOoeg==" + }, + "Microsoft.AspNetCore.Components.Authorization": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "LD5ApnnUgMAyFDMKXqhyKFksnnxicGxE15dvC6rnOynFzj11Rvf7bENjTP9HUIbD64MYug+wlhl06A4nicw+RQ==", + "dependencies": { + "Microsoft.AspNetCore.Authorization": "9.0.0", + "Microsoft.AspNetCore.Components": "9.0.0" + } + }, + "Microsoft.AspNetCore.Components.Forms": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "orHGxDkbAa9syuaLVtZWOhNC8IddnCsDqpFaKjBj4zxe+B8cd6kcNf/t4Lv5hWBQ7mODiRCzEfKBnpU+GCHvbw==", + "dependencies": { + "Microsoft.AspNetCore.Components": "9.0.0" + } + }, + "Microsoft.AspNetCore.Components.Web": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "ZfJwwV05T+268cnJsO6yfi9oXYLe3ATRAEk0VZgBMptA5HVsduIsnFLjhNOYT7+I8NolxDEx1CEW8yKe5xTb6Q==", + "dependencies": { + "Microsoft.AspNetCore.Components": "9.0.0", + "Microsoft.AspNetCore.Components.Forms": "9.0.0", + "Microsoft.Extensions.DependencyInjection": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0", + "Microsoft.JSInterop": "9.0.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "RwDygFGa1NdKh7N4S6P2xgxB0LeluLss/iZRdNnmOwN1zgpdLH9AnCnTIgDBAW7rhDjcPGrcjsDLNivwDRYwEQ==", + "dependencies": { + "Microsoft.AspNetCore.Components.Web": "9.0.0", + "Microsoft.Extensions.Configuration.Binder": "9.0.0", + "Microsoft.Extensions.Configuration.Json": "9.0.0", + "Microsoft.Extensions.Logging": "9.0.0", + "Microsoft.JSInterop.WebAssembly": "9.0.0" + } + }, + "Microsoft.AspNetCore.Components.WebAssembly.Authentication": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "dWGMHCh3/MchcPTvwz8FBd5O1FBE3Dxq6wWayi2xypgADJDTmpQnmMedN90sNVfekXQheAofYh0aPv6+Rt8Zlw==", + "dependencies": { + "Microsoft.AspNetCore.Components.Authorization": "9.0.0", + "Microsoft.AspNetCore.Components.Web": "9.0.0" + } + }, + "Microsoft.AspNetCore.Metadata": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "X81C891nMuWgzNHyZ0C3s+blSDxRHzQHDFYQoOKtFvFuxGq3BbkLbc5CfiCqIzA/sWIfz6u8sGBgwntQwBJWBw==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "DjxZRueHp0qvZxhvW+H1IWYkSofZI8Chg710KYJjNP/6S4q3rt97pvR8AHOompkSwaN92VLKz5uw01iUt85cMg==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.10" + } + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zkt5yQgnpWKX3rOxn+ZcV23Aj0296XCTqg4lx1hKY+wMXBgkn377UhBrY/A4H6kLpNT7wqZN98xCV0YHXu9VRA==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "9.0.9", + "Microsoft.EntityFrameworkCore.Analyzers": "9.0.9", + "Microsoft.Extensions.Caching.Memory": "9.0.9", + "Microsoft.Extensions.Logging": "9.0.9" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "QdM2k3Mnip2QsaxJbCI95dc2SajRMENdmaMhVKj4jPC5dmkoRcu3eEdvZAgDbd4bFVV1jtPGdHtXewtoBMlZqA==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "uiKeU/qR0YpaDUa4+g0rAjKCuwfq8YWZGcpPptnFWIr1K7dXQTm/15D2HDwwU4ln3Uf66krYybymuY58ua4hhw==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "SonFU9a8x4jZIhIBtCw1hIE3QKjd4c7Y3mjptoh682dfQe7K9pUPGcEV/sk4n8AJdq4fkyJPCaOdYaObhae/Iw==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "9.0.9", + "Microsoft.Extensions.Caching.Memory": "9.0.9", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.9", + "Microsoft.Extensions.Logging": "9.0.9" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "SiAd32IMTAQDo+jQt5GAzCq+5qI/OEdsrbW0qEDr0hUEAh3jnRlt0gbZgDGDUtWk5SWITufB6AOZi0qet9dJIw==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite.Core": "9.0.9", + "Microsoft.Extensions.Caching.Memory": "9.0.9", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.9", + "Microsoft.Extensions.DependencyModel": "9.0.9", + "Microsoft.Extensions.Logging": "9.0.9", + "SQLitePCLRaw.bundle_e_sqlite3": "2.1.10", + "SQLitePCLRaw.core": "2.1.10" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite.Core": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "eQVF8fBgDxjnjan3EB1ysdfDO7lKKfWKTT4VR0BInU4Mi6ADdgiOdm6qvZ/ufh04f3hhPL5lyknx5XotGzBh8A==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "9.0.9", + "Microsoft.EntityFrameworkCore.Relational": "9.0.9", + "Microsoft.Extensions.Caching.Memory": "9.0.9", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.9", + "Microsoft.Extensions.DependencyModel": "9.0.9", + "Microsoft.Extensions.Logging": "9.0.9", + "SQLitePCLRaw.core": "2.1.10" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "NgtRHOdPrAEacfjXLSrH/SRrSqGf6Vaa6d16mW2yoyJdg7AJr0BnBvxkv7PkCm/CHVyzojTK7Y+oUDEulqY1Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.9" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "ln31BtsDsBQxykJgxuCtiUXWRET9FmqeEq0BpPIghkYtGpDDVs8ZcLHAjCCzbw6aGoLek4Z7JaDjSO/CjOD0iw==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.9", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.9", + "Microsoft.Extensions.Logging.Abstractions": "9.0.9", + "Microsoft.Extensions.Options": "9.0.9", + "Microsoft.Extensions.Primitives": "9.0.9" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "YIMO9T3JL8MeEXgVozKt2v79hquo/EFtnY0vgxmLnUvk1Rei/halI7kOWZL2RBeV9FMGzgM9LZA8CVaNwFMaNA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "p5RKAY9POvs3axwA/AQRuJeM8AHuE8h4qbP1NxQeGm0ep46aXz1oCLAp/oOYxX1GsjStgdhHrN3XXLLXr0+b3w==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.9" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "RiScL99DcyngY9zJA2ROrri7Br8tn5N4hP4YNvGdTN/bvg1A3dwvDOxHnNZ3Im7x2SJ5i4LkX1uPiR/MfSFBLQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "4EK93Jcd2lQG4GY6PAw8jGss0ZzFP0vPc1J85mES5fKNuDTqgFXHba9onBw2s18fs3I4vdo2AWyfD1mPAxWSQQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "9.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.0", + "Microsoft.Extensions.FileProviders.Physical": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "WiTK0LrnsqmedrbzwL7f4ZUo+/wByqy2eKab39I380i2rd8ImfCRMrtkqJVGDmfqlkP/YzhckVOwPc5MPrSNpg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "9.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "9.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "9.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "zQV2WOSP+3z1EuK91ULxfGgo2Y75bTRnmJHp08+w/YXAyekZutX/qCd88/HOMNh35MDW9mJJJxPpMPS+1Rww8A==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.9" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "/hymojfWbE9AlDOa0mczR44m00Jj+T3+HZO0ZnVTI032fVycI0ZbNOVFP6kqZMcXiLSYXzR2ilcwaRi6dzeGyA==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "fNGvKct2De8ghm0Bpfq0iWthtzIWabgOTi+gJhNOPhNJIowXNEUE2eZNW/zNCzrHVA3PXg2yZ+3cWZndC2IqYA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "uK439QzYR0q2emLVtYzwyK3x+T5bTY4yWsd/k/ZUS9LR6Sflp8MIdhGXW8kQCd86dQD4tLqvcbLkku8qHY263Q==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "3+ZUSpOSmie+o8NnLIRqCxSh65XL/ExU7JYnFOg58awDRlY3lVpZ9A369jkoZL1rpsq7LDhEfkn2ghhGaY1y5Q==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "9.0.0", + "Microsoft.Extensions.Primitives": "9.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "jGFKZiXs2HNseK3NK/rfwHNNovER71jSj4BD1a/649ml9+h6oEtYd0GSALZDNW8jZ2Rh+oAeadOa6sagYW1F2A==" + }, + "Microsoft.Extensions.Localization.Abstractions": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "wc7PaRhPOnio5Csj80b3UgBWA5l6bp28EhGem7gtfpVopcwbkfPb2Sk8Cu6eBnIW3ZNf1YUgYJzwtjzZEM8+iw==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "MaCB0Y9hNDs4YLu3HCJbo199WnJT8xSgajG1JYGANz9FkseQ5f3v/llu3HxLI6mjDlu7pa7ps9BLPWjKzsAAzQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "9.0.9", + "Microsoft.Extensions.Logging.Abstractions": "9.0.9", + "Microsoft.Extensions.Options": "9.0.9" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "FEgpSF+Z9StMvrsSViaybOBwR0f0ZZxDm8xV5cSOFiXN/t+ys+rwAlTd/6yG7Ld1gfppgvLcMasZry3GsI9lGA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.9" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "loxGGHE1FC2AefwPHzrjPq7X92LQm64qnU/whKfo6oWaceewPUVYQJBJs3S3E2qlWwnCpeZ+dGCPTX+5dgVAuQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.9", + "Microsoft.Extensions.Primitives": "9.0.9" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.9", + "contentHash": "z4pyMePOrl733ltTowbN565PxBw1oAr8IHmIXNDiDqd22nFpYltX9KhrNC/qBWAG1/Zx5MHX+cOYhWJQYCO/iw==" + }, + "Microsoft.JSInterop": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "efQKxKUPe8OuH0hRiYsvBJkhhPzIYFNcr9+3wanQ7Bch/wr1JWNd90GYiPLtkSHepE1zMEoaLkAxi5N5/eyC4Q==" + }, + "Microsoft.JSInterop.WebAssembly": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "5TjNuiavEVk+4UFTZVOKMlpq1qgYW/Vd6N7lNsHJR9kOlhP6S2GtiKdbLn//Aw/22lx3jDJTkekc54F5S8JC4g==", + "dependencies": { + "Microsoft.JSInterop": "9.0.0" + } + }, + "Moq": { + "type": "Transitive", + "resolved": "4.18.4", + "contentHash": "IOo+W51+7Afnb0noltJrKxPBSfsgMzTKCw+Re5AMx8l/vBbAbMDOynLik4+lBYIWDJSO0uV7Zdqt7cNb6RZZ+A==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.10", + "contentHash": "UxWuisvZ3uVcVOLJQv7urM/JiQH+v3TmaJc1BLKl5Dxfm/nTzTUrqswCqg/INiYLi61AXnHo1M1JPmPqqLnAdg==", + "dependencies": { + "SQLitePCLRaw.lib.e_sqlite3": "2.1.10", + "SQLitePCLRaw.provider.e_sqlite3": "2.1.10" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.1.10", + "contentHash": "Ii8JCbC7oiVclaE/mbDEK000EFIJ+ShRPwAvvV89GOZhQ+ZLtlnSWl6ksCNMKu/VGXA4Nfi2B7LhN/QFN9oBcw==" + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.10", + "contentHash": "mAr69tDbnf3QJpRy2nJz8Qdpebdil00fvycyByR58Cn9eARvR+UiG2Vzsp+4q1tV3ikwiYIjlXCQFc12GfebbA==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.1.10", + "contentHash": "uZVTi02C1SxqzgT0HqTWatIbWGb40iIkfc3FpFCpE/r7g6K0PqzDUeefL6P6HPhDtc6BacN3yQysfzP7ks+wSQ==", + "dependencies": { + "SQLitePCLRaw.core": "2.1.10" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "pX5GhR4/mfYUbebRdINO6P4B8stIbVWaAWGgWzYO1eC30nUVpCQdzQjKwCPhtLdzjR3d/q+MQ0sRG3B1GLSyqw==", + "dependencies": { + "System.Diagnostics.EventLog": "9.0.2", + "System.Security.Cryptography.ProtectedData": "9.0.2" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "i+Fe6Fpst/onydFLBGilCr/Eh9OFdlaTU/c3alPp6IbLZXQJOgpIu3l4MOnmsN8fDYq5nAyHSqNIJesc74Yw3Q==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "9.0.2", + "contentHash": "+z9JWtU9di45tW/w6zpuJms4SnAAqKY2Usmmxs7MpOhxWoIeR2pKl1vEkaFbEx52ZfrMFcZXsFe+8WERMozzGg==" + }, + "TestableIO.System.IO.Abstractions": { + "type": "Transitive", + "resolved": "21.3.1", + "contentHash": "B9USlBOZAiqXss7AI4BH6HVWs+HoHx38OadJjBO0VCzEWgP/u0u52bogmrzDHsyqRv8Yo/xtIMQXgpjLoaAUXw==" + }, + "TestableIO.System.IO.Abstractions.TestingHelpers": { + "type": "Transitive", + "resolved": "21.3.1", + "contentHash": "XP7tiKVtnOP+jXWsRqgc7WCV2tsoolVnxSNUJXwdWmHCpLMsVlZXRag7dMynnNEQQB9XEJx25RteqN5APCnjag==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "21.3.1", + "TestableIO.System.IO.Abstractions.Wrappers": "21.3.1" + } + }, + "TestableIO.System.IO.Abstractions.Wrappers": { + "type": "Transitive", + "resolved": "21.3.1", + "contentHash": "l/xu8G96pntsofFG8vh6BKbVbYWtqYZTpNCcj4jGNwxwSbwY2gvDmkiFmIbWf7lgzPZbopW2FAfaY6m4K/3QJw==", + "dependencies": { + "TestableIO.System.IO.Abstractions": "21.3.1" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "fastmoq.core": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite": "[9.*, )", + "Moq": "[4.18.4, 4.18.4]", + "TestableIO.System.IO.Abstractions.TestingHelpers": "[21.3.1, 21.3.1]", + "xunit.abstractions": "[2.0.3, )" + } + }, + "fastmoq.web": { + "type": "Project", + "dependencies": { + "FastMoq.Core": "[1.0.0, )", + "System.Configuration.ConfigurationManager": "[9.0.2, )", + "bunit": "[1.38.5, )" + } + } + } + } +} \ No newline at end of file diff --git a/README.md b/README.md index d4c61ed..b402e87 100644 --- a/README.md +++ b/README.md @@ -498,3 +498,4 @@ Add the following ```InternalsVisibleTo``` line to the AssemblyInfo file. ## [License - MIT](./License) [http://help.fastmoq.com](http://help.fastmoq.com/) +