diff --git a/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml b/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml
index 93803cb8befd..7d54550e8a26 100644
--- a/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml
+++ b/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml
@@ -4,7 +4,7 @@ trigger:
branches:
include:
- internal/release/6.0
-
+
parameters:
# Run the pipeline manually (usually disallowed)
- name: manualRun
@@ -26,8 +26,8 @@ jobs:
- job: Merge_Azure_DevOps_Branches
enableSBOM: false
pool:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals 1es-windows-2019
variables:
- name: WorkingDirectoryName
value: repo-dir
@@ -67,4 +67,4 @@ jobs:
$target = "$branch".Replace('/', ' ')
Write-Host "##vso[build.updatebuildnumber]$target $commit"
- Write-Host "##vso[build.addbuildtag]$target"
\ No newline at end of file
+ Write-Host "##vso[build.addbuildtag]$target"
diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index 277fc34c626f..2c28c29324c2 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -18,6 +18,27 @@ pr:
include:
- '*'
+schedules:
+- cron: 0 9 * * 1
+ displayName: "Run CodeQL3000 weekly, Monday at 2:00 AM PDT"
+ branches:
+ include:
+ - release/2.1
+ - release/6.0
+ - release/7.0
+ - main
+ always: true
+
+parameters:
+# Parameter below is ignored in public builds.
+#
+# Choose whether to run the CodeQL3000 tasks.
+# Manual builds align w/ official builds unless this parameter is true.
+- name: runCodeQL3000
+ default: false
+ displayName: Run CodeQL3000 tasks
+ type: boolean
+
variables:
- name: DOTNET_SKIP_FIRST_TIME_EXPERIENCE
value: true
@@ -113,676 +134,732 @@ variables:
- ${{ if in(variables['Build.Reason'], 'PullRequest') }}:
- name: _SignType
value: test
+- name: runCodeQL3000
+ value: ${{ or(eq(variables['Build.Reason'], 'Schedule'), and(eq(variables['Build.Reason'], 'Manual'), eq(parameters.runCodeQL3000, 'true'))) }}
stages:
- stage: build
displayName: Build
jobs:
- # Code check
- - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'), in(variables['Build.Reason'], 'Manual')) }}:
+ - ${{ if and(ne(variables['System.TeamProject'], 'public'), eq(variables.runCodeQL3000, 'true')) }}:
- template: jobs/default-build.yml
parameters:
- jobName: Code_check
- jobDisplayName: Code check
+ jobName: build
+ jobDisplayName: Build and run CodeQL3000
agentOs: Windows
+ codeSign: false
+ # Component governance and SBOM creation are not needed here. Disable what Arcade would inject.
+ disableComponentGovernance: true
+ enableSbom: false
+ variables:
+ # Security analysis is included in normal runs. Disable its auto-injection.
+ - skipNugetSecurityAnalysis: true
+ # Do not let CodeQL3000 Extension gate scan frequency.
+ - Codeql.Cadence: 0
+ # Enable CodeQL3000 unconditionally so it may be run on any branch.
+ - Codeql.Enabled: true
+ # Ignore the small amount of infrastructure Python code in this repo.
+ - Codeql.Language: cpp,csharp,java,javascript
+ - Codeql.ExcludePathPatterns: submodules
+ # Ignore test and infrastructure code.
+ - Codeql.SourceRoot: src
+ # CodeQL3000 needs this plumbed along as a variable to enable TSA.
+ - Codeql.TSAEnabled: ${{ eq(variables['Build.Reason'], 'Schedule') }}
+ # Default expects tsaoptions.json under SourceRoot.
+ - Codeql.TSAOptionsPath: '$(Build.SourcesDirectory)/.config/tsaoptions.json'
+ beforeBuild:
+ - task: CodeQL3000Init@0
+ displayName: CodeQL Initialize
+ - script: "echo ##vso[build.addbuildtag]CodeQL3000"
+ displayName: 'Set CI CodeQL3000 tag'
+ condition: ne(variables.CODEQL_DIST,'')
steps:
- - powershell: ./eng/scripts/CodeCheck.ps1 -ci $(_InternalRuntimeDownloadArgs)
- displayName: Run eng/scripts/CodeCheck.ps1
+ - script: ./eng/build.cmd
+ -ci
+ -arch x64
+ -all
+ $(_BuildArgs)
+ $(_InternalRuntimeDownloadArgs)
+ /p:UseSharedCompilation=false
+ displayName: Build x64
+ afterBuild:
+ - task: CodeQL3000Finalize@0
+ displayName: CodeQL Finalize
artifacts:
- - name: Code_Check_Logs
+ - name: Build_Logs
path: artifacts/log/
publishOnError: true
includeForks: true
- # Build Windows (x64/x86)
- - template: jobs/default-build.yml
- parameters:
- codeSign: true
- jobName: Windows_build
- jobDisplayName: "Build: Windows x64/x86"
- agentOs: Windows
- steps:
- - script: "echo ##vso[build.addbuildtag]daily-build"
- condition: and(notin(variables['Build.Reason'], 'PullRequest'), notin(variables['DotNetFinalVersionKind'], 'release', 'prerelease'))
- displayName: 'Set CI tags'
- - script: "echo ##vso[build.addbuildtag]release-candidate"
- condition: and(notin(variables['Build.Reason'], 'PullRequest'), in(variables['DotNetFinalVersionKind'], 'release', 'prerelease'))
- displayName: 'Set CI tags'
-
- # !!! NOTE !!! Some of these steps have disabled code signing.
- # This is intentional to workaround https://github.com/dotnet/arcade/issues/1957 which always re-submits for code-signing, even
- # if they have already been signed. This results in slower builds due to re-submitting the same .nupkg many times for signing.
- # The sign settings have been configured to
- - script: ./eng/build.cmd
- -ci
- -arch x64
- -pack
- -all
- $(_BuildArgs)
- $(_InternalRuntimeDownloadArgs)
- $(Windows64LogArgs)
- displayName: Build x64
-
- # Build the x86 shared framework
- # This is going to actually build x86 native assets.
- - script: ./eng/build.cmd
- -ci
- -noBuildRepoTasks
- -arch x86
- -pack
- -all
- -noBuildJava
- -noBuildNative
- /p:OnlyPackPlatformSpecificPackages=true
- $(_BuildArgs)
- $(_InternalRuntimeDownloadArgs)
- $(Windows86LogArgs)
- displayName: Build x86
+ - ${{ else }}: # regular build
+ # Code check
+ - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'), in(variables['Build.Reason'], 'Manual')) }}:
+ - template: jobs/default-build.yml
+ parameters:
+ jobName: Code_check
+ jobDisplayName: Code check
+ agentOs: Windows
+ steps:
+ - powershell: ./eng/scripts/CodeCheck.ps1 -ci $(_InternalRuntimeDownloadArgs)
+ displayName: Run eng/scripts/CodeCheck.ps1
+ artifacts:
+ - name: Code_Check_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+
+ # Build Windows (x64/x86)
+ - template: jobs/default-build.yml
+ parameters:
+ codeSign: true
+ jobName: Windows_build
+ jobDisplayName: "Build: Windows x64/x86"
+ agentOs: Windows
+ steps:
+ - script: "echo ##vso[build.addbuildtag]daily-build"
+ condition: and(notin(variables['Build.Reason'], 'PullRequest'), notin(variables['DotNetFinalVersionKind'], 'release', 'prerelease'))
+ displayName: 'Set CI tags'
+ - script: "echo ##vso[build.addbuildtag]release-candidate"
+ condition: and(notin(variables['Build.Reason'], 'PullRequest'), in(variables['DotNetFinalVersionKind'], 'release', 'prerelease'))
+ displayName: 'Set CI tags'
+
+ # !!! NOTE !!! Some of these steps have disabled code signing.
+ # This is intentional to workaround https://github.com/dotnet/arcade/issues/1957 which always re-submits for code-signing, even
+ # if they have already been signed. This results in slower builds due to re-submitting the same .nupkg many times for signing.
+ # The sign settings have been configured to
+ - script: ./eng/build.cmd
+ -ci
+ -arch x64
+ -pack
+ -all
+ $(_BuildArgs)
+ $(_InternalRuntimeDownloadArgs)
+ $(Windows64LogArgs)
+ displayName: Build x64
+
+ # Build the x86 shared framework
+ # This is going to actually build x86 native assets.
+ - script: ./eng/build.cmd
+ -ci
+ -noBuildRepoTasks
+ -arch x86
+ -pack
+ -all
+ -noBuildJava
+ -noBuildNative
+ /p:OnlyPackPlatformSpecificPackages=true
+ $(_BuildArgs)
+ $(_InternalRuntimeDownloadArgs)
+ $(Windows86LogArgs)
+ displayName: Build x86
+
+ - script: .\src\SiteExtensions\build.cmd
+ -ci
+ -noBuildRepoTasks
+ -pack
+ -noBuildDeps
+ -noBuildNative
+ $(_BuildArgs)
+ $(_InternalRuntimeDownloadArgs)
+ condition: ne(variables['Build.Reason'], 'PullRequest')
+ displayName: Build SiteExtension
+
+ # This runs code-signing on all packages, zips, and jar files as defined in build/CodeSign.targets. If
+ # https://github.com/dotnet/arcade/issues/1957 is resolved, consider running code-signing inline with the other
+ # previous steps. Sign check is disabled because it is run in a separate step below, after installers are built.
+ - script: ./eng/build.cmd
+ -ci
+ -noBuildRepoTasks
+ -noBuildNative
+ -noBuild
+ -noRestore
+ -sign
+ /p:DotNetSignType=$(_SignType)
+ $(_BuildArgs)
+ $(WindowsSignLogArgs)
+ displayName: Code sign packages
+
+ # Windows installers bundle both x86 and x64 assets
+ - script: ./eng/build.cmd
+ -ci
+ -noBuildRepoTasks
+ -sign
+ -buildInstallers
+ -noBuildNative
+ /p:DotNetSignType=$(_SignType)
+ /p:AssetManifestFileName=aspnetcore-win-x64-x86.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ /p:PublishInstallerBaseVersion=true
+ $(WindowsInstallersLogArgs)
+ displayName: Build Installers
+
+ # A few files must also go to the VS package feed.
+ - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(variables['PostBuildSign'], 'true')) }}:
+ - task: NuGetCommand@2
+ displayName: Push Visual Studio packages
+ inputs:
+ command: push
+ packagesToPush: 'artifacts/packages/**/VS.Redist.Common.AspNetCore.*.nupkg'
+ nuGetFeedType: external
+ publishFeedCredentials: 'DevDiv - VS package feed'
- - script: .\src\SiteExtensions\build.cmd
- -ci
- -noBuildRepoTasks
- -pack
- -noBuildDeps
- -noBuildNative
- $(_BuildArgs)
- $(_InternalRuntimeDownloadArgs)
- condition: ne(variables['Build.Reason'], 'PullRequest')
- displayName: Build SiteExtension
+ artifacts:
+ - name: Windows_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: Windows_Packages
+ path: artifacts/packages/
- # This runs code-signing on all packages, zips, and jar files as defined in build/CodeSign.targets. If
- # https://github.com/dotnet/arcade/issues/1957 is resolved, consider running code-signing inline with the other
- # previous steps. Sign check is disabled because it is run in a separate step below, after installers are built.
- - script: ./eng/build.cmd
- -ci
- -noBuildRepoTasks
- -noBuildNative
- -noBuild
- -noRestore
- -sign
- /p:DotNetSignType=$(_SignType)
- $(_BuildArgs)
- $(WindowsSignLogArgs)
- displayName: Code sign packages
+ # Build Windows ARM
+ - template: jobs/default-build.yml
+ parameters:
+ codeSign: true
+ jobName: Windows_arm_build
+ jobDisplayName: "Build: Windows ARM"
+ agentOs: Windows
+ buildArgs:
+ -arch arm
+ -sign
+ -pack
+ -noBuildNodeJS
+ -noBuildJava
+ /p:DotNetSignType=$(_SignType)
+ /p:OnlyPackPlatformSpecificPackages=true
+ /p:AssetManifestFileName=aspnetcore-win-arm.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ installNodeJs: false
+ installJdk: false
+ artifacts:
+ - name: Windows_arm_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: Windows_arm_Packages
+ path: artifacts/packages/
- # Windows installers bundle both x86 and x64 assets
- - script: ./eng/build.cmd
- -ci
- -noBuildRepoTasks
- -sign
- -buildInstallers
- -noBuildNative
- /p:DotNetSignType=$(_SignType)
- /p:AssetManifestFileName=aspnetcore-win-x64-x86.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- /p:PublishInstallerBaseVersion=true
- $(WindowsInstallersLogArgs)
- displayName: Build Installers
-
- # A few files must also go to the VS package feed.
- - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(variables['PostBuildSign'], 'true')) }}:
- - task: NuGetCommand@2
- displayName: Push Visual Studio packages
- inputs:
- command: push
- packagesToPush: 'artifacts/packages/**/VS.Redist.Common.AspNetCore.*.nupkg'
- nuGetFeedType: external
- publishFeedCredentials: 'DevDiv - VS package feed'
-
- artifacts:
- - name: Windows_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Windows_Packages
- path: artifacts/packages/
-
- # Build Windows ARM
- - template: jobs/default-build.yml
- parameters:
- codeSign: true
- jobName: Windows_arm_build
- jobDisplayName: "Build: Windows ARM"
- agentOs: Windows
- buildArgs:
- -arch arm
- -sign
- -pack
- -noBuildNodeJS
- -noBuildJava
- /p:DotNetSignType=$(_SignType)
- /p:OnlyPackPlatformSpecificPackages=true
- /p:AssetManifestFileName=aspnetcore-win-arm.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Windows_arm_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Windows_arm_Packages
- path: artifacts/packages/
-
- # Build Windows ARM64
- - template: jobs/default-build.yml
- parameters:
- codeSign: true
- jobName: Windows_arm64_build
- jobDisplayName: "Build: Windows ARM64"
- agentOs: Windows
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Windows_arm64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Windows_arm64_Packages
- path: artifacts/packages/
- - name: Windows_arm64_Installers
- path: artifacts/installers/
- steps:
- - script: ./eng/build.cmd
+ # Build Windows ARM64
+ - template: jobs/default-build.yml
+ parameters:
+ codeSign: true
+ jobName: Windows_arm64_build
+ jobDisplayName: "Build: Windows ARM64"
+ agentOs: Windows
+ installNodeJs: false
+ installJdk: false
+ artifacts:
+ - name: Windows_arm64_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: Windows_arm64_Packages
+ path: artifacts/packages/
+ - name: Windows_arm64_Installers
+ path: artifacts/installers/
+ steps:
+ - script: ./eng/build.cmd
-ci
-arch arm64
-sign
-pack
-noBuildJava
-noBuildNative
+ -noBuildNodeJS
/p:DotNetSignType=$(_SignType)
/p:OnlyPackPlatformSpecificPackages=true
$(_BuildArgs)
$(_InternalRuntimeDownloadArgs)
$(WindowsArm64LogArgs)
- displayName: Build ARM64
+ displayName: Build ARM64
- # Windows installers bundle for arm64
- - script: ./eng/build.cmd
+ # Windows installers bundle for arm64
+ - script: ./eng/build.cmd
-ci
-noBuildRepoTasks
-arch arm64
-sign
-buildInstallers
-noBuildNative
+ -noBuildNodeJS
/p:DotNetSignType=$(_SignType)
/p:AssetManifestFileName=aspnetcore-win-arm64.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
$(WindowsArm64InstallersLogArgs)
- displayName: Build Arm64 Installers
+ displayName: Build Arm64 Installers
- # A few files must also go to the VS package feed.
- - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(variables['PostBuildSign'], 'true')) }}:
- - task: NuGetCommand@2
- displayName: Push Visual Studio packages
- inputs:
- command: push
- packagesToPush: 'artifacts/packages/**/VS.Redist.Common.AspNetCore.*.nupkg'
- nuGetFeedType: external
- publishFeedCredentials: 'DevDiv - VS package feed'
+ # A few files must also go to the VS package feed.
+ - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(variables['PostBuildSign'], 'true')) }}:
+ - task: NuGetCommand@2
+ displayName: Push Visual Studio packages
+ inputs:
+ command: push
+ packagesToPush: 'artifacts/packages/**/VS.Redist.Common.AspNetCore.*.nupkg'
+ nuGetFeedType: external
+ publishFeedCredentials: 'DevDiv - VS package feed'
- # Build MacOS arm64
- - template: jobs/default-build.yml
- parameters:
- jobName: MacOs_arm64_build
- jobDisplayName: "Build: macOS arm64"
- agentOs: macOs
- buildArgs:
- --arch arm64
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- -p:AssetManifestFileName=aspnetcore-MacOS_arm64.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: MacOS_arm64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: MacOS_arm64_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
- parameters:
- inputName: MacOS_arm64
-
- # Build MacOS x64
- - template: jobs/default-build.yml
- parameters:
- jobName: MacOs_x64_build
- jobDisplayName: "Build: macOS x64"
- agentOs: macOs
- buildArgs:
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- -p:AssetManifestFileName=aspnetcore-MacOS_x64.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: MacOS_x64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: MacOS_x64_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
+ # Build MacOS arm64
+ - template: jobs/default-build.yml
parameters:
- inputName: MacOS_x64
+ jobName: MacOs_arm64_build
+ jobDisplayName: "Build: macOS arm64"
+ agentOs: macOs
+ buildArgs:
+ --arch arm64
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ -p:AssetManifestFileName=aspnetcore-MacOS_arm64.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ installNodeJs: false
+ installJdk: false
+ artifacts:
+ - name: MacOS_arm64_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: MacOS_arm64_Packages
+ path: artifacts/packages/
- # Build Linux x64
- - template: jobs/default-build.yml
- parameters:
- jobName: Linux_x64_build
- jobDisplayName: "Build: Linux x64"
- agentOs: Linux
- useHostedUbuntu: false
- steps:
- - script: ./eng/build.sh
- --ci
- --arch x64
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- $(_BuildArgs)
- $(_InternalRuntimeDownloadArgs)
- displayName: Run build.sh
- - script: |
- git clean -xfd src/**/obj/
- ./dockerbuild.sh bionic \
- --ci \
- --nobl \
- --arch x64 \
- --build-installers \
- --no-build-deps \
- --no-build-nodejs \
- -p:OnlyPackPlatformSpecificPackages=true \
- -p:BuildRuntimeArchive=false \
- -p:LinuxInstallerType=deb \
- $(_BuildArgs) \
- $(_InternalRuntimeDownloadArgs)
- displayName: Build Debian installers
- - script: |
- git clean -xfd src/**/obj/
- ./dockerbuild.sh rhel \
- --ci \
- --nobl \
- --arch x64 \
- --build-installers \
- --no-build-deps \
- --no-build-nodejs \
- -p:OnlyPackPlatformSpecificPackages=true \
- -p:BuildRuntimeArchive=false \
- -p:LinuxInstallerType=rpm \
- -p:AssetManifestFileName=aspnetcore-Linux_x64.xml \
- $(_BuildArgs) \
- $(_PublishArgs) \
- $(_InternalRuntimeDownloadArgs)
- displayName: Build RPM installers
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Linux_x64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Linux_x64_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
- parameters:
- inputName: Linux_x64
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: MacOS_arm64
- # Build Linux ARM
- - template: jobs/default-build.yml
- parameters:
- jobName: Linux_arm_build
- jobDisplayName: "Build: Linux ARM"
- agentOs: Linux
- buildArgs:
- --arch arm
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- -p:AssetManifestFileName=aspnetcore-Linux_arm.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Linux_arm_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Linux_arm_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
+ # Build MacOS x64
+ - template: jobs/default-build.yml
parameters:
- inputName: Linux_arm
-
- # Build Linux ARM64
- - template: jobs/default-build.yml
- parameters:
- jobName: Linux_arm64_build
- jobDisplayName: "Build: Linux ARM64"
- agentOs: Linux
- steps:
- - script: ./eng/build.sh
- --ci
- --arch arm64
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- $(_BuildArgs)
- $(_InternalRuntimeDownloadArgs)
- displayName: Run build.sh
- - script: git clean -xfd src/**/obj/;
- ./dockerbuild.sh rhel --ci --nobl --arch arm64 --build-installers --no-build-deps --no-build-nodejs
- -p:OnlyPackPlatformSpecificPackages=true -p:BuildRuntimeArchive=false -p:LinuxInstallerType=rpm
- -p:AssetManifestFileName=aspnetcore-Linux_arm64.xml
+ jobName: MacOs_x64_build
+ jobDisplayName: "Build: macOS x64"
+ agentOs: macOs
+ buildArgs:
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ -p:AssetManifestFileName=aspnetcore-MacOS_x64.xml
$(_BuildArgs)
$(_PublishArgs)
$(_InternalRuntimeDownloadArgs)
- displayName: Build RPM installers
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Linux_arm64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Linux_arm64_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
- parameters:
- inputName: Linux_arm64
+ installNodeJs: false
+ installJdk: false
+ artifacts:
+ - name: MacOS_x64_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: MacOS_x64_Packages
+ path: artifacts/packages/
- # Build Linux Musl x64
- - template: jobs/default-build.yml
- parameters:
- jobName: Linux_musl_x64_build
- jobDisplayName: "Build: Linux Musl x64"
- agentOs: Linux
- container: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.14-WithNode-20210910135833-c401c85
- buildArgs:
- --arch x64
- --os-name linux-musl
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- -p:AssetManifestFileName=aspnetcore-Linux_musl_x64.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- disableComponentGovernance: true
- skipComponentGovernanceDetection: true
- artifacts:
- - name: Linux_musl_x64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Linux_musl_x64_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
- parameters:
- inputName: Linux_musl_x64
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: MacOS_x64
- # Build Linux Musl ARM
- - template: jobs/default-build.yml
- parameters:
- jobName: Linux_musl_arm_build
- jobDisplayName: "Build: Linux Musl ARM"
- agentOs: Linux
- useHostedUbuntu: false
- container: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-arm-alpine-20211022152824-78f7860
- buildArgs:
- --arch arm
- --os-name linux-musl
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- -p:AssetManifestFileName=aspnetcore-Linux_musl_arm.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Linux_musl_arm_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Linux_musl_arm_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
+ # Build Linux x64
+ - template: jobs/default-build.yml
parameters:
- inputName: Linux_musl_arm
+ jobName: Linux_x64_build
+ jobDisplayName: "Build: Linux x64"
+ agentOs: Linux
+ useHostedUbuntu: false
+ steps:
+ - script: ./eng/build.sh
+ --ci
+ --arch x64
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ $(_BuildArgs)
+ $(_InternalRuntimeDownloadArgs)
+ displayName: Run build.sh
+ - script: |
+ git clean -xfd src/**/obj/
+ ./dockerbuild.sh bionic \
+ --ci \
+ --nobl \
+ --arch x64 \
+ --build-installers \
+ --no-build-deps \
+ --no-build-nodejs \
+ -p:OnlyPackPlatformSpecificPackages=true \
+ -p:BuildRuntimeArchive=false \
+ -p:LinuxInstallerType=deb \
+ $(_BuildArgs) \
+ $(_InternalRuntimeDownloadArgs)
+ displayName: Build Debian installers
+ - script: |
+ git clean -xfd src/**/obj/
+ ./dockerbuild.sh rhel \
+ --ci \
+ --nobl \
+ --arch x64 \
+ --build-installers \
+ --no-build-deps \
+ --no-build-nodejs \
+ -p:OnlyPackPlatformSpecificPackages=true \
+ -p:BuildRuntimeArchive=false \
+ -p:LinuxInstallerType=rpm \
+ -p:AssetManifestFileName=aspnetcore-Linux_x64.xml \
+ $(_BuildArgs) \
+ $(_PublishArgs) \
+ $(_InternalRuntimeDownloadArgs)
+ displayName: Build RPM installers
+ installNodeJs: false
+ installJdk: false
+ artifacts:
+ - name: Linux_x64_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: Linux_x64_Packages
+ path: artifacts/packages/
- # Build Linux Musl ARM64
- - template: jobs/default-build.yml
- parameters:
- jobName: Linux_musl_arm64_build
- jobDisplayName: "Build: Linux Musl ARM64"
- agentOs: Linux
- useHostedUbuntu: false
- container: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-arm64-alpine-20211022152824-538077f
- buildArgs:
- --arch arm64
- --os-name linux-musl
- --pack
- --all
- --no-build-nodejs
- --no-build-java
- -p:OnlyPackPlatformSpecificPackages=true
- -p:AssetManifestFileName=aspnetcore-Linux_musl_arm64.xml
- $(_BuildArgs)
- $(_PublishArgs)
- $(_InternalRuntimeDownloadArgs)
- installNodeJs: false
- installJdk: false
- artifacts:
- - name: Linux_musl_arm64_Logs
- path: artifacts/log/
- publishOnError: true
- includeForks: true
- - name: Linux_musl_arm64_Packages
- path: artifacts/packages/
-
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - template: jobs/codesign-xplat.yml
- parameters:
- inputName: Linux_musl_arm64
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_x64
- - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'), in(variables['Build.Reason'], 'Manual')) }}:
- # Test jobs
+ # Build Linux ARM
- template: jobs/default-build.yml
parameters:
- condition: ne(variables['SkipTests'], 'true')
- jobName: Windows_Test
- jobDisplayName: "Test: Windows Server x64"
- agentOs: Windows
- isTestingJob: true
- # Just uploading artifacts/logs/ files can take 15 minutes. Doubling the cancel timeout for this job.
- cancelTimeoutInMinutes: 30
- buildArgs: -all -pack -test /p:SkipHelixReadyTests=true /p:SkipIISNewHandlerTests=true /p:SkipIISTests=true
- /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false
- /p:SkipComponentsE2ETests=true
- $(_InternalRuntimeDownloadArgs)
- beforeBuild:
- - powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
- displayName: Setup IISExpress test certificates and schema
+ jobName: Linux_arm_build
+ jobDisplayName: "Build: Linux ARM"
+ agentOs: Linux
+ buildArgs:
+ --arch arm
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ -p:AssetManifestFileName=aspnetcore-Linux_arm.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ installNodeJs: false
+ installJdk: false
artifacts:
- - name: Windows_Test_Logs
+ - name: Linux_arm_Logs
path: artifacts/log/
publishOnError: true
includeForks: true
- - name: Windows_Test_Results
- path: artifacts/TestResults/
- publishOnError: true
- includeForks: true
+ - name: Linux_arm_Packages
+ path: artifacts/packages/
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_arm
+
+ # Build Linux ARM64
- template: jobs/default-build.yml
parameters:
- condition: ne(variables['SkipTests'], 'true')
- jobName: MacOS_Test
- jobDisplayName: "Test: macOS"
- agentOs: macOS
- timeoutInMinutes: 240
- isTestingJob: true
- buildArgs: --all --test "/p:RunTemplateTests=false /p:SkipComponentsE2ETests=true /p:SkipHelixReadyTests=true" $(_InternalRuntimeDownloadArgs)
- beforeBuild:
- - bash: "./eng/scripts/install-nginx-mac.sh"
- displayName: Installing Nginx
+ jobName: Linux_arm64_build
+ jobDisplayName: "Build: Linux ARM64"
+ agentOs: Linux
+ steps:
+ - script: ./eng/build.sh
+ --ci
+ --arch arm64
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ $(_BuildArgs)
+ $(_InternalRuntimeDownloadArgs)
+ displayName: Run build.sh
+ - script: git clean -xfd src/**/obj/;
+ ./dockerbuild.sh rhel --ci --nobl --arch arm64 --build-installers --no-build-deps --no-build-nodejs
+ -p:OnlyPackPlatformSpecificPackages=true -p:BuildRuntimeArchive=false -p:LinuxInstallerType=rpm
+ -p:AssetManifestFileName=aspnetcore-Linux_arm64.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ displayName: Build RPM installers
+ installNodeJs: false
+ installJdk: false
artifacts:
- - name: MacOS_Test_Logs
+ - name: Linux_arm64_Logs
path: artifacts/log/
publishOnError: true
includeForks: true
- - name: MacOS_Test_Results
- path: artifacts/TestResults/
+ - name: Linux_arm64_Packages
+ path: artifacts/packages/
+
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_arm64
+
+ # Build Linux Musl x64
+ - template: jobs/default-build.yml
+ parameters:
+ jobName: Linux_musl_x64_build
+ jobDisplayName: "Build: Linux Musl x64"
+ agentOs: Linux
+ container: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.14-WithNode
+ buildArgs:
+ --arch x64
+ --os-name linux-musl
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ -p:AssetManifestFileName=aspnetcore-Linux_musl_x64.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ installNodeJs: false
+ installJdk: false
+ disableComponentGovernance: true
+ artifacts:
+ - name: Linux_musl_x64_Logs
+ path: artifacts/log/
publishOnError: true
includeForks: true
+ - name: Linux_musl_x64_Packages
+ path: artifacts/packages/
+
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_musl_x64
+ # Build Linux Musl ARM
- template: jobs/default-build.yml
parameters:
- condition: ne(variables['SkipTests'], 'true')
- jobName: Linux_Test
- jobDisplayName: "Test: Ubuntu x64"
+ jobName: Linux_musl_arm_build
+ jobDisplayName: "Build: Linux Musl ARM"
agentOs: Linux
- isTestingJob: true
useHostedUbuntu: false
- buildArgs: --all --test "/p:RunTemplateTests=false /p:SkipComponentsE2ETests=true /p:SkipHelixReadyTests=true" $(_InternalRuntimeDownloadArgs)
- beforeBuild:
- - bash: "./eng/scripts/install-nginx-linux.sh"
- displayName: Installing Nginx
- - bash: "echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p"
- displayName: Increase inotify limit
+ container: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-arm-alpine
+ buildArgs:
+ --arch arm
+ --os-name linux-musl
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ -p:AssetManifestFileName=aspnetcore-Linux_musl_arm.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ installNodeJs: false
+ installJdk: false
artifacts:
- - name: Linux_Test_Logs
+ - name: Linux_musl_arm_Logs
path: artifacts/log/
publishOnError: true
includeForks: true
- - name: Linux_Test_Results
- path: artifacts/TestResults/
- publishOnError: true
- includeForks: true
+ - name: Linux_musl_arm_Packages
+ path: artifacts/packages/
+
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_musl_arm
- # Helix x64
+ # Build Linux Musl ARM64
- template: jobs/default-build.yml
parameters:
- jobName: Helix_x64
- jobDisplayName: 'Tests: Helix x64'
- agentOs: Windows
- timeoutInMinutes: 240
- steps:
- # Build the shared framework
- - script: ./eng/build.cmd -ci -nobl -all -pack -arch x64
- /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log $(_InternalRuntimeDownloadArgs)
- displayName: Build shared fx
- - script: ./eng/build.cmd -ci -nobl -noBuildRepoTasks -restore -noBuild -noBuildNative -projects src/Grpc/**/*.csproj
- /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log $(_InternalRuntimeDownloadArgs)
- displayName: Restore interop projects
- - script: ./eng/build.cmd -ci -nobl -noBuildRepoTasks -noRestore -test -all -noBuildNative -projects eng\helix\helix.proj
- /p:IsRequiredCheck=true /p:IsHelixJob=true /p:BuildInteropProjects=true /p:RunTemplateTests=true /p:SkipComponentsE2ETests=true
- /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log $(_InternalRuntimeDownloadArgs)
- displayName: Run build.cmd helix target
- env:
- HelixApiAccessToken: $(HelixApiAccessToken) # Needed for internal queues
- SYSTEM_ACCESSTOKEN: $(System.AccessToken) # We need to set this env var to publish helix results to Azure Dev Ops
-
+ jobName: Linux_musl_arm64_build
+ jobDisplayName: "Build: Linux Musl ARM64"
+ agentOs: Linux
+ useHostedUbuntu: false
+ container: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-arm64-alpine
+ buildArgs:
+ --arch arm64
+ --os-name linux-musl
+ --pack
+ --all
+ --no-build-nodejs
+ --no-build-java
+ -p:OnlyPackPlatformSpecificPackages=true
+ -p:AssetManifestFileName=aspnetcore-Linux_musl_arm64.xml
+ $(_BuildArgs)
+ $(_PublishArgs)
+ $(_InternalRuntimeDownloadArgs)
+ installNodeJs: false
+ installJdk: false
artifacts:
- - name: Helix_logs
+ - name: Linux_musl_arm64_Logs
path: artifacts/log/
publishOnError: true
includeForks: true
-
- # Source build
- - template: /eng/common/templates/job/source-build.yml
- parameters:
- platform:
- name: 'Managed'
- container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-20210714125435-9b5bbc2'
- buildScript: './eng/build.sh $(_PublishArgs) --no-build-repo-tasks $(_InternalRuntimeDownloadArgs)'
- skipPublishValidation: true
-
- # Publish to the BAR
- - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - template: /eng/common/templates/job/publish-build-assets.yml
+ - name: Linux_musl_arm64_Packages
+ path: artifacts/packages/
+
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - template: jobs/codesign-xplat.yml
+ parameters:
+ inputName: Linux_musl_arm64
+
+ - ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'), in(variables['Build.Reason'], 'Manual')) }}:
+ # Test jobs
+ - template: jobs/default-build.yml
+ parameters:
+ condition: ne(variables['SkipTests'], 'true')
+ jobName: Windows_Test
+ jobDisplayName: "Test: Windows Server x64"
+ agentOs: Windows
+ isTestingJob: true
+ # Just uploading artifacts/logs/ files can take 15 minutes. Doubling the cancel timeout for this job.
+ cancelTimeoutInMinutes: 30
+ buildArgs: -all -pack -test /p:SkipHelixReadyTests=true /p:SkipIISNewHandlerTests=true /p:SkipIISTests=true
+ /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false
+ /p:SkipComponentsE2ETests=true
+ $(_InternalRuntimeDownloadArgs)
+ beforeBuild:
+ - powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
+ displayName: Setup IISExpress test certificates and schema
+ artifacts:
+ - name: Windows_Test_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: Windows_Test_Results
+ path: artifacts/TestResults/
+ publishOnError: true
+ includeForks: true
+
+ - template: jobs/default-build.yml
+ parameters:
+ condition: ne(variables['SkipTests'], 'true')
+ jobName: MacOS_Test
+ jobDisplayName: "Test: macOS"
+ agentOs: macOS
+ timeoutInMinutes: 240
+ isTestingJob: true
+ buildArgs: --all --test "/p:RunTemplateTests=false /p:SkipComponentsE2ETests=true /p:SkipHelixReadyTests=true" $(_InternalRuntimeDownloadArgs)
+ beforeBuild:
+ - bash: "./eng/scripts/install-nginx-mac.sh"
+ displayName: Installing Nginx
+ artifacts:
+ - name: MacOS_Test_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: MacOS_Test_Results
+ path: artifacts/TestResults/
+ publishOnError: true
+ includeForks: true
+
+ - template: jobs/default-build.yml
+ parameters:
+ condition: ne(variables['SkipTests'], 'true')
+ jobName: Linux_Test
+ jobDisplayName: "Test: Ubuntu x64"
+ agentOs: Linux
+ isTestingJob: true
+ useHostedUbuntu: false
+ buildArgs: --all --test "/p:RunTemplateTests=false /p:SkipComponentsE2ETests=true /p:SkipHelixReadyTests=true" $(_InternalRuntimeDownloadArgs)
+ beforeBuild:
+ - bash: "./eng/scripts/install-nginx-linux.sh"
+ displayName: Installing Nginx
+ - bash: "echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p"
+ displayName: Increase inotify limit
+ artifacts:
+ - name: Linux_Test_Logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+ - name: Linux_Test_Results
+ path: artifacts/TestResults/
+ publishOnError: true
+ includeForks: true
+
+ # Helix x64
+ - template: jobs/default-build.yml
+ parameters:
+ jobName: Helix_x64
+ jobDisplayName: 'Tests: Helix x64'
+ agentOs: Windows
+ timeoutInMinutes: 240
+ steps:
+ # Build the shared framework
+ - script: ./eng/build.cmd -ci -nobl -all -pack -arch x64
+ /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log $(_InternalRuntimeDownloadArgs)
+ displayName: Build shared fx
+ - script: ./eng/build.cmd -ci -nobl -noBuildRepoTasks -restore -noBuild -noBuildNative -projects src/Grpc/**/*.csproj
+ /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log $(_InternalRuntimeDownloadArgs)
+ displayName: Restore interop projects
+ - script: ./eng/build.cmd -ci -nobl -noBuildRepoTasks -noRestore -test -all -noBuildNative -projects eng\helix\helix.proj
+ /p:IsRequiredCheck=true /p:IsHelixJob=true /p:BuildInteropProjects=true /p:RunTemplateTests=true /p:SkipComponentsE2ETests=true
+ /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log $(_InternalRuntimeDownloadArgs)
+ displayName: Run build.cmd helix target
+ env:
+ HelixApiAccessToken: $(HelixApiAccessToken) # Needed for internal queues
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken) # We need to set this env var to publish helix results to Azure Dev Ops
+
+ artifacts:
+ - name: Helix_logs
+ path: artifacts/log/
+ publishOnError: true
+ includeForks: true
+
+ # Source build
+ - template: /eng/common/templates/job/source-build.yml
parameters:
- dependsOn:
- - Windows_build
- - Windows_arm_build
- - Windows_arm64_build
- - ${{ if ne(variables['PostBuildSign'], 'true') }}:
- - CodeSign_Xplat_MacOS_arm64
- - CodeSign_Xplat_MacOS_x64
- - CodeSign_Xplat_Linux_x64
- - CodeSign_Xplat_Linux_arm
- - CodeSign_Xplat_Linux_arm64
- - CodeSign_Xplat_Linux_musl_x64
- - CodeSign_Xplat_Linux_musl_arm
- - CodeSign_Xplat_Linux_musl_arm64
- - ${{ if eq(variables['PostBuildSign'], 'true') }}:
- - MacOs_arm64_build
- - MacOs_x64_build
- - Linux_x64_build
- - Linux_arm_build
- - Linux_arm64_build
- - Linux_musl_x64_build
- - Linux_musl_arm_build
- - Linux_musl_arm64_build
- # In addition to the dependencies above, ensure the build was successful overall.
- - Source_Build_Managed
- pool:
- name: NetCore1ESPool-Svc-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
- publishUsingPipelines: ${{ variables._PublishUsingPipelines }}
- enablePublishBuildArtifacts: true # publish artifacts/log files
-
-- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ platform:
+ name: 'Managed'
+ container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7'
+ buildScript: './eng/build.sh $(_PublishArgs) --no-build-repo-tasks $(_InternalRuntimeDownloadArgs)'
+ skipPublishValidation: true
+ jobProperties:
+ timeoutInMinutes: 120
+
+ # Publish to the BAR
+ - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - template: /eng/common/templates/job/publish-build-assets.yml
+ parameters:
+ dependsOn:
+ - Windows_build
+ - Windows_arm_build
+ - Windows_arm64_build
+ - ${{ if ne(variables['PostBuildSign'], 'true') }}:
+ - CodeSign_Xplat_MacOS_arm64
+ - CodeSign_Xplat_MacOS_x64
+ - CodeSign_Xplat_Linux_x64
+ - CodeSign_Xplat_Linux_arm
+ - CodeSign_Xplat_Linux_arm64
+ - CodeSign_Xplat_Linux_musl_x64
+ - CodeSign_Xplat_Linux_musl_arm
+ - CodeSign_Xplat_Linux_musl_arm64
+ - ${{ if eq(variables['PostBuildSign'], 'true') }}:
+ - MacOs_arm64_build
+ - MacOs_x64_build
+ - Linux_x64_build
+ - Linux_arm_build
+ - Linux_arm64_build
+ - Linux_musl_x64_build
+ - Linux_musl_arm_build
+ - Linux_musl_arm64_build
+ # In addition to the dependencies above, ensure the build was successful overall.
+ - Source_Build_Managed
+ pool:
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals 1es-windows-2019
+ publishUsingPipelines: ${{ variables._PublishUsingPipelines }}
+ enablePublishBuildArtifacts: true # publish artifacts/log files
+
+- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), ne(variables.runCodeQL3000, 'true')) }}:
- template: /eng/common/templates/post-build/post-build.yml
parameters:
publishingInfraVersion: 3
diff --git a/.azure/pipelines/components-e2e-tests.yml b/.azure/pipelines/components-e2e-tests.yml
index 057a64027727..8e3b37199c23 100644
--- a/.azure/pipelines/components-e2e-tests.yml
+++ b/.azure/pipelines/components-e2e-tests.yml
@@ -75,4 +75,5 @@ jobs:
artifacts:
- name: Components_E2E_Test_Logs
path: '$(Build.SourcesDirectory)/artifacts/TestResults/$(BuildConfiguration)'
+ includeForks: true
publishOnError: true
diff --git a/.azure/pipelines/helix-matrix.yml b/.azure/pipelines/helix-matrix.yml
index 476871dea82d..c6f19d1e3de6 100644
--- a/.azure/pipelines/helix-matrix.yml
+++ b/.azure/pipelines/helix-matrix.yml
@@ -11,9 +11,7 @@ schedules:
- cron: "0 9 * * *"
branches:
include:
- - release/5.0
- release/6.0
- always: false
variables:
- ${{ if ne(variables['System.TeamProject'], 'internal') }}:
diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml
index 2908d5bb869a..62a380ba67c2 100644
--- a/.azure/pipelines/jobs/default-build.yml
+++ b/.azure/pipelines/jobs/default-build.yml
@@ -33,8 +33,10 @@
# This build definition is enabled for code signing. (Only applies to Windows)
# buildDirectory: string
# Specifies what directory to run build.sh/cmd
-# skipComponentGovernanceDetection: boolean
-# Determines if component governance detection can be skipped
+# enableSbom: boolean
+# Determines if an SBOM should be created. Defaults to true. Ignored in public builds.
+# variables: [array]
+# Job-specific variables. Defined using either name/value pairs or a variable list (using name or group syntax).
#
# See https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema for details
#
@@ -53,12 +55,13 @@ parameters:
# jobDisplayName: '' - use agentOs by default.
artifacts: []
buildDirectory: $(System.DefaultWorkingDirectory)/eng/
+ enableSbom: true
+ variables: []
installNodeJs: true
installJdk: true
timeoutInMinutes: 180
testRunTitle: $(AgentOsName)-$(BuildConfiguration)
useHostedUbuntu: true
- skipComponentGovernanceDetection: false
# We need longer than the default amount of 5 minutes to upload our logs/artifacts. (We currently take around 5 mins in the best case).
# This makes sure we have time to upload everything in the case of a build timeout - really important for investigating a build
@@ -85,6 +88,7 @@ jobs:
enablePublishTestResults: ${{ eq(parameters.isTestingJob, 'true') }} # publish test results to AzDO (populates AzDO Tests tab)
mergeTestResults: true
testRunTitle: ${{ parameters.testRunTitle }}
+ enableSbom: ${{ parameters.enableSbom }}
enableTelemetry: true
helixRepo: dotnet/aspnetcore
helixType: build.product/
@@ -97,22 +101,22 @@ jobs:
vmImage: macOS-11
${{ if eq(parameters.agentOs, 'Linux') }}:
${{ if and(eq(parameters.useHostedUbuntu, true), or(ne(variables['System.TeamProject'], 'internal'), in(variables['Build.Reason'], 'Manual', 'PullRequest', 'Schedule'))) }}:
- vmImage: ubuntu-18.04
+ vmImage: ubuntu-20.04
${{ if or(eq(parameters.useHostedUbuntu, false), and(eq(variables['System.TeamProject'], 'internal'), notin(variables['Build.Reason'], 'Manual', 'PullRequest', 'Schedule'))) }}:
${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: NetCore1ESPool-Svc-Public
- demands: ImageOverride -equals Build.Ubuntu.1804.Amd64.Open
+ name: NetCore-Svc-Public
+ demands: ImageOverride -equals Build.Ubuntu.2004.Amd64.Open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: NetCore1ESPool-Svc-Internal
- demands: ImageOverride -equals Build.Ubuntu.1804.Amd64
+ demands: ImageOverride -equals Build.Ubuntu.2004.Amd64
${{ if eq(parameters.agentOs, 'Windows') }}:
${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: NetCore1ESPool-Svc-Public
+ name: NetCore-Svc-Public
demands: ImageOverride -equals 1es-windows-2019-open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: NetCore1ESPool-Svc-Internal
# Visual Studio Enterprise - contains some stuff, like SQL Server and IIS Express, that we use for testing
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals 1es-windows-2019
${{ if ne(parameters.container, '') }}:
container: ${{ parameters.container }}
${{ if ne(parameters.disableComponentGovernance, '') }}:
@@ -146,6 +150,28 @@ jobs:
- LC_ALL: 'en_US.UTF-8'
- LANG: 'en_US.UTF-8'
- LANGUAGE: 'en_US.UTF-8'
+ # Rely on task Arcade injects, not auto-injected build step.
+ - skipComponentGovernanceDetection: true
+ - ${{ each variable in parameters.variables }}:
+ # handle a variable list using "name" and "value" properties
+ # example:
+ # - name: [key]
+ # value: [value]
+ - ${{ if ne(variable.name, '') }}:
+ - name: ${{ variable.name }}
+ value: ${{ variable.value }}
+
+ # handle variable groups
+ - ${{ if ne(variable.group, '') }}:
+ - group: ${{ variable.group }}
+
+ # handle name/value pairs (converting them into variable list entries)
+ # example:
+ # - [name]: [value]
+ - ${{ if and(eq(variable.name, ''), eq(variable.group, '')) }}:
+ - ${{ each pair in variable }}:
+ - name: ${{ pair.key }}
+ value: ${{ pair.value }}
steps:
- ${{ if ne(parameters.agentOs, 'Windows') }}:
- script: df -h
@@ -259,12 +285,6 @@ jobs:
continueOnError: true
condition: always()
- # Run component detection after all successful Build:* jobs unless overridden e.g. for Alpine build.
- # Make sure auto-injected component detection does _not_ execute in other jobs nor when overridden.
- - ${{ if or(not(startsWith(parameters.jobDisplayName, 'Build:')), eq(parameters.skipComponentGovernanceDetection, 'true')) }}:
- - script: echo "##vso[task.setvariable variable=CG_RAN]true"
- displayName: 'Skip Component Detection'
-
- ${{ each artifact in parameters.artifacts }}:
- task: PublishBuildArtifacts@1
displayName: Upload artifacts from ${{ artifact.path }}
diff --git a/.config/tsaoptions.json b/.config/tsaoptions.json
new file mode 100644
index 000000000000..1688609163cf
--- /dev/null
+++ b/.config/tsaoptions.json
@@ -0,0 +1,12 @@
+{
+ "areaPath": "DevDiv\\ASP.NET Core",
+ "codebaseName": "AspNetCore",
+ "instanceUrl": "https://devdiv.visualstudio.com/",
+ "iterationPath": "DevDiv",
+ "notificationAliases": [
+ "aspnetcore-build@microsoft.com"
+ ],
+ "projectName": "DEVDIV",
+ "repositoryName": "AspNetCore",
+ "template": "TFSDEVDIV"
+}
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 678baa705669..b5626eb88003 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,7 +1,6 @@
# Users referenced in this file will automatically be requested as reviewers for PRs that modify the given paths.
# See https://help.github.com/articles/about-code-owners/
-* @Pilchie
/global.json @dotnet/aspnet-build
/.azure/ @dotnet/aspnet-build
/.config/ @dotnet/aspnet-build
diff --git a/AspNetCore.sln b/AspNetCore.sln
index 9311efd01efe..fbf4290fac83 100644
--- a/AspNetCore.sln
+++ b/AspNetCore.sln
@@ -1606,8 +1606,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Featur
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Features.Tests", "src\Extensions\Features\test\Microsoft.Extensions.Features.Tests.csproj", "{09FFBC53-3EFF-45C4-9822-5D66089CD6AD}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Migration.E2ETests", "src\Components\test\E2ETestMigration\Microsoft.AspNetCore.Components.Migration.E2ETests.csproj", "{A1D02CE6-1077-410A-81CB-D4BD500FD765}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.WebView", "src\Components\WebView\WebView\src\Microsoft.AspNetCore.Components.WebView.csproj", "{3044DFA5-DE4F-44D8-8DD8-EDF547BE513E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.WebView.Test", "src\Components\WebView\WebView\test\Microsoft.AspNetCore.Components.WebView.Test.csproj", "{4BD6F0DB-BE9C-4C54-B52A-D20B88855ED5}"
diff --git a/Directory.Build.props b/Directory.Build.props
index 721f099a7734..9979b084ffc2 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -173,6 +173,8 @@
freebsd-x64
+ $(SupportedRuntimeIdentifiers);$(TargetRuntimeIdentifier)
+
true
diff --git a/NuGet.config b/NuGet.config
index 63330d10bbf3..c9d0181e19da 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -4,22 +4,20 @@
-
+
-
+
-
-
-
-
+
+
@@ -27,10 +25,10 @@
-
+
-
+
diff --git a/docs/BuildFromSource.md b/docs/BuildFromSource.md
index 4d93c4d7e78b..1a37b39bc792 100644
--- a/docs/BuildFromSource.md
+++ b/docs/BuildFromSource.md
@@ -88,9 +88,9 @@ Visual Studio 2019 (16.10 Preview 3) is required to build the repo locally. If y
> You can do so by running the `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser` command
> in PowerShell. For more information on execution policies, you can read the [execution policy docs](https://docs.microsoft.com/powershell/module/microsoft.powershell.security/set-executionpolicy).
-The [global.json](/global.json) file specifies the minimum requirements needed to build using `msbuild`. The [eng/scripts/vs.json](/eng/scripts/vs.json) file provides a description of the components needed to build within VS. If you plan on developing in Visual Studio, you will need to have these components installed.
+The [global.json](/global.json) file specifies the minimum requirements needed to build using `msbuild`. The [eng/scripts/vs.16.json](/eng/scripts/vs.16.json) file provides a description of the components needed to build within VS. If you plan on developing in Visual Studio, you will need to have these components installed.
-> :bulb: The `InstallVisualStudio.ps1` script mentioned above reads from the `vs.json` file to determine what components to install.
+> :bulb: The `InstallVisualStudio.ps1` script mentioned above reads from the `vs.16.json` file to determine what components to install.
#### [Git](https://git-scm.org) on Windows
@@ -284,7 +284,7 @@ To build a code change associated with a modification, run the build script in t
On Windows, you can run the command script:
```powershell
-.\build.cmd
+.\eng\build.cmd
```
On macOS/Linux, you can run the shell script:
@@ -293,7 +293,7 @@ On macOS/Linux, you can run the shell script:
./build.sh
```
-> :bulb: Before using the `build.cmd` or `build.sh` at the top-level or in a subfolder, you will need to make sure that [the dependencies documented above](#step-2-install-pre-requisites) have been installed.
+> :bulb: Before using the `.\eng\build.cmd` or `.\eng\build.sh` at the top-level or in a subfolder, you will need to make sure that [the dependencies documented above](#step-2-install-pre-requisites) have been installed.
By default, all of the C# projects are built. Some C# projects require NodeJS to be installed to compile JavaScript assets which are then checked in as source. If NodeJS is detected on the path, the NodeJS projects will be compiled as part of building C# projects. If NodeJS is not detected on the path, the JavaScript assets checked in previously will be used instead. To disable building NodeJS projects, specify `-noBuildNodeJS` or `--no-build-nodejs` on the command line.
@@ -369,9 +369,9 @@ See ["Artifacts"](./Artifacts.md) for more explanation of the different folders
Building installers does not run as part of `build.cmd` run without parameters, so you should opt-in for building them:
```powershell
-.\build.cmd -all -pack -arch x64
-.\build.cmd -all -pack -arch x86 -noBuildJava
-.\build.cmd -buildInstallers
+.\eng\build.cmd -all -pack -arch x64
+.\eng\build.cmd -all -pack -arch x86 -noBuildJava
+.\eng\build.cmd -buildInstallers
```
_Note_: Additional build steps listed above aren't necessary on Linux or macOS.
diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props
index 28042e9d0222..0f2cb2ccdf46 100644
--- a/eng/Baseline.Designer.props
+++ b/eng/Baseline.Designer.props
@@ -2,28 +2,28 @@
$(MSBuildAllProjects);$(MSBuildThisFileFullPath)
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
-
+
+
+
@@ -34,120 +34,120 @@
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
@@ -155,114 +155,114 @@
- 6.0.8
+ 6.0.14
-
-
+
+
-
-
+
+
-
-
+
+
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
-
-
-
-
+
+
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
+
+
@@ -270,81 +270,81 @@
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
-
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
+
@@ -352,130 +352,130 @@
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
-
-
+
+
-
-
+
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
-
+
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
@@ -491,195 +491,195 @@
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
+
+
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
-
+
- 6.0.8
+ 6.0.14
-
-
+
+
-
-
+
+
-
-
+
+
- 6.0.8
+ 6.0.14
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
-
-
-
+
+
+
+
- 6.0.8
+ 6.0.14
@@ -688,69 +688,69 @@
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
@@ -769,7 +769,7 @@
- 6.0.8
+ 6.0.14
@@ -788,7 +788,7 @@
- 6.0.8
+ 6.0.14
@@ -804,46 +804,46 @@
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
-
-
+
+
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
@@ -853,7 +853,7 @@
- 6.0.8
+ 6.0.14
@@ -862,79 +862,79 @@
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
-
+
-
+
-
+
-
+
-
+
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
@@ -943,7 +943,7 @@
-
+
@@ -951,17 +951,17 @@
-
+
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
@@ -979,13 +979,13 @@
- 6.0.8
+ 6.0.14
- 6.0.8
+ 6.0.14
-
+
\ No newline at end of file
diff --git a/eng/Baseline.xml b/eng/Baseline.xml
index 549d55431ba9..ab396eac0ba5 100644
--- a/eng/Baseline.xml
+++ b/eng/Baseline.xml
@@ -4,111 +4,111 @@ This file contains a list of all the packages and their versions which were rele
Update this list when preparing for a new patch.
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/eng/Common.props b/eng/Common.props
index a9a69bde9f22..3dcca1c6b54d 100644
--- a/eng/Common.props
+++ b/eng/Common.props
@@ -6,6 +6,8 @@
freebsd
x64
$(TargetOsName)-$(TargetArchitecture)
+ true
+ $(TargetRuntimeIdentifier)
diff --git a/eng/Dependencies.props b/eng/Dependencies.props
index 75c41177ffa6..d39473508c3b 100644
--- a/eng/Dependencies.props
+++ b/eng/Dependencies.props
@@ -95,6 +95,7 @@ and are generated based on the last package release.
+
@@ -109,6 +110,7 @@ and are generated based on the last package release.
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index bf05f45e33d6..d9e2a29100f3 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -9,37 +9,37 @@
-->
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-efcore
- 33e3c950af2eb996c0b3c48e30eb4471138da675
+ 7e231732e524f5ddc81f07f1eb5cd153734481c2
https://github.com/dotnet/runtime
@@ -93,9 +93,9 @@
https://github.com/dotnet/runtime
4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
-
- https://github.com/dotnet/runtime
- 4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
+
+ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
+ 5a400c212afdf8e675c9a1d38442e6d2f19f7b74
https://github.com/dotnet/runtime
@@ -129,9 +129,9 @@
https://github.com/dotnet/runtime
4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 943474ca16db7c65ba6cff4a89c3ebd219dde3e5
https://github.com/dotnet/runtime
@@ -177,13 +177,13 @@
https://github.com/dotnet/runtime
4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
- https://github.com/dotnet/runtime
- 4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
+
+ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
https://github.com/dotnet/runtime
@@ -197,9 +197,9 @@
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
70ae3df4a6f3c92fb6b315afc405edd10ff38579
-
- https://github.com/dotnet/runtime
- 4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
+
+ https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
@@ -217,9 +217,9 @@
https://github.com/dotnet/runtime
4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 70ae3df4a6f3c92fb6b315afc405edd10ff38579
+ 2a90daa2cc41ae8f11a2c1519cb8b235f609251a
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
@@ -233,9 +233,9 @@
https://github.com/dotnet/runtime
4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 943474ca16db7c65ba6cff4a89c3ebd219dde3e5
https://github.com/dotnet/runtime
@@ -245,57 +245,57 @@
https://github.com/dotnet/runtime
4822e3c3aa77eb82b2fb33c9321f923cf11ddde6
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- 163a63591cf9e9b682063cf3995948c2b885a042
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-runtime
- f316191dbb5782d76ceb457018dcd80ff8ce8692
+ 5edef4b20babd4c3ddac7460e536f86fd0f2d724
-
+
https://github.com/dotnet/arcade
- fdd3a242bc813f371023adff4e4c05c0be705d2a
+ 0c93c1cb1ef9c9d5c1a59f4ab98c2f7e37f12197
-
+
https://github.com/dotnet/arcade
- fdd3a242bc813f371023adff4e4c05c0be705d2a
+ 0c93c1cb1ef9c9d5c1a59f4ab98c2f7e37f12197
-
+
https://github.com/dotnet/arcade
- fdd3a242bc813f371023adff4e4c05c0be705d2a
+ 0c93c1cb1ef9c9d5c1a59f4ab98c2f7e37f12197
-
+
https://github.com/dotnet/arcade
- fdd3a242bc813f371023adff4e4c05c0be705d2a
+ 0c93c1cb1ef9c9d5c1a59f4ab98c2f7e37f12197
diff --git a/eng/Versions.props b/eng/Versions.props
index bc3e57278226..271e72b3007b 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -8,7 +8,7 @@
6
0
- 9
+ 15
true
6.0.0
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9-servicing.22419.5
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15-servicing.23115.7
6.0.0
6.0.1
6.0.0
@@ -82,7 +82,7 @@
6.0.1
6.0.0
6.0.0
- 6.0.0
+ 6.0.1
6.0.0
6.0.0
6.0.0
@@ -91,7 +91,7 @@
6.0.0
6.0.1
6.0.0
- 6.0.2
+ 6.0.3
6.0.0
6.0.0
6.0.0
@@ -103,36 +103,36 @@
6.0.0
6.0.0
6.0.0
- 6.0.9-servicing.22419.5
- 6.0.0
+ 6.0.15-servicing.23115.7
+ 6.0.1
6.0.0
6.0.1
6.0.3
- 6.0.0
+ 6.0.1
6.0.1
6.0.1
6.0.0
6.0.0
- 6.0.1
+ 6.0.2
6.0.1
6.0.0
6.0.0
- 6.0.6
+ 6.0.7
6.0.0
- 6.0.5
+ 6.0.8
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
- 6.0.9
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
+ 6.0.15
- 6.0.0-beta.22314.7
- 6.0.0-beta.22314.7
+ 6.0.0-beta.23114.5
+ 6.0.0-beta.23114.5
- 5.0.0-preview.4.20180.4
+
+
+ 5.0.0-preview.3.20215.2
15.9.3032
@@ -214,7 +215,7 @@
2.1.1
2.2.0
- 3.1.28-servicing-22364-2
+ 3.1.32-servicing-22566-10
$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version)
$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version)
5.0.17-servicing-22215-7
@@ -250,9 +251,9 @@
0.192.0
3.0.0
7.2.2
- 4.1.0
- 98.0.4758.10200
- 4.1.0
+ 4.3.0
+ 103.0.5060.13400
+ 4.3.0
1.4.0
4.0.0
2.2.4
diff --git a/eng/common/build.ps1 b/eng/common/build.ps1
index 8943da242f6e..33a6f2d0e248 100644
--- a/eng/common/build.ps1
+++ b/eng/common/build.ps1
@@ -26,6 +26,7 @@ Param(
[string] $runtimeSourceFeed = '',
[string] $runtimeSourceFeedKey = '',
[switch] $excludePrereleaseVS,
+ [switch] $nativeToolsOnMachine,
[switch] $help,
[Parameter(ValueFromRemainingArguments=$true)][String[]]$properties
)
@@ -67,6 +68,7 @@ function Print-Usage() {
Write-Host " -warnAsError Sets warnaserror msbuild parameter ('true' or 'false')"
Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)."
Write-Host " -excludePrereleaseVS Set to exclude build engines in prerelease versions of Visual Studio"
+ Write-Host " -nativeToolsOnMachine Sets the native tools on machine environment variable (indicating that the script should use native tools on machine)"
Write-Host ""
Write-Host "Command line arguments not listed above are passed thru to msbuild."
@@ -146,6 +148,9 @@ try {
$nodeReuse = $false
}
+ if ($nativeToolsOnMachine) {
+ $env:NativeToolsOnMachine = $true
+ }
if ($restore) {
InitializeNativeTools
}
diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake
index ec8971eb0195..51f30e53dd43 100644
--- a/eng/common/cross/toolchain.cmake
+++ b/eng/common/cross/toolchain.cmake
@@ -1,5 +1,12 @@
set(CROSS_ROOTFS $ENV{ROOTFS_DIR})
+# reset platform variables (e.g. cmake 3.25 sets LINUX=1)
+unset(LINUX)
+unset(FREEBSD)
+unset(ILLUMOS)
+unset(ANDROID)
+unset(TIZEN)
+
set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH})
if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version)
set(CMAKE_SYSTEM_NAME FreeBSD)
diff --git a/eng/common/dotnet-install.sh b/eng/common/dotnet-install.sh
index fdfeea66e7d4..b09ea669f9c0 100755
--- a/eng/common/dotnet-install.sh
+++ b/eng/common/dotnet-install.sh
@@ -52,7 +52,7 @@ done
# Use uname to determine what the CPU is, see https://en.wikipedia.org/wiki/Uname#Examples
cpuname=$(uname -m)
case $cpuname in
- aarch64)
+ arm64|aarch64)
buildarch=arm64
;;
amd64|x86_64)
@@ -61,7 +61,7 @@ case $cpuname in
armv*l)
buildarch=arm
;;
- i686)
+ i[3-6]86)
buildarch=x86
;;
*)
diff --git a/eng/common/generate-sbom-prep.ps1 b/eng/common/generate-sbom-prep.ps1
index a733a8885824..3e5c1c74a1c5 100644
--- a/eng/common/generate-sbom-prep.ps1
+++ b/eng/common/generate-sbom-prep.ps1
@@ -2,6 +2,8 @@ Param(
[Parameter(Mandatory=$true)][string] $ManifestDirPath # Manifest directory where sbom will be placed
)
+. $PSScriptRoot\pipeline-logging-functions.ps1
+
Write-Host "Creating dir $ManifestDirPath"
# create directory for sbom manifest to be placed
if (!(Test-Path -path $ManifestDirPath))
diff --git a/eng/common/generate-sbom-prep.sh b/eng/common/generate-sbom-prep.sh
index f6c77453142a..d5c76dc827b4 100644
--- a/eng/common/generate-sbom-prep.sh
+++ b/eng/common/generate-sbom-prep.sh
@@ -2,6 +2,18 @@
source="${BASH_SOURCE[0]}"
+# resolve $SOURCE until the file is no longer a symlink
+while [[ -h $source ]]; do
+ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
+ source="$(readlink "$source")"
+
+ # if $source was a relative symlink, we need to resolve it relative to the path where the
+ # symlink file was located
+ [[ $source != /* ]] && source="$scriptroot/$source"
+done
+scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
+. $scriptroot/pipeline-logging-functions.sh
+
manifest_dir=$1
if [ ! -d "$manifest_dir" ] ; then
diff --git a/eng/common/init-tools-native.ps1 b/eng/common/init-tools-native.ps1
index db830c00a6f8..6c7a851a8087 100644
--- a/eng/common/init-tools-native.ps1
+++ b/eng/common/init-tools-native.ps1
@@ -31,6 +31,10 @@ Wait time between retry attempts in seconds
.PARAMETER GlobalJsonFile
File path to global.json file
+.PARAMETER PathPromotion
+Optional switch to enable either promote native tools specified in the global.json to the path (in Azure Pipelines)
+or break the build if a native tool is not found on the path (on a local dev machine)
+
.NOTES
#>
[CmdletBinding(PositionalBinding=$false)]
@@ -41,7 +45,8 @@ Param (
[switch] $Force = $False,
[int] $DownloadRetries = 5,
[int] $RetryWaitTimeInSeconds = 30,
- [string] $GlobalJsonFile
+ [string] $GlobalJsonFile,
+ [switch] $PathPromotion
)
if (!$GlobalJsonFile) {
@@ -77,53 +82,101 @@ try {
ConvertFrom-Json |
Select-Object -Expand 'native-tools' -ErrorAction SilentlyContinue
if ($NativeTools) {
- $NativeTools.PSObject.Properties | ForEach-Object {
- $ToolName = $_.Name
- $ToolVersion = $_.Value
- $LocalInstallerArguments = @{ ToolName = "$ToolName" }
- $LocalInstallerArguments += @{ InstallPath = "$InstallBin" }
- $LocalInstallerArguments += @{ BaseUri = "$BaseUri" }
- $LocalInstallerArguments += @{ CommonLibraryDirectory = "$EngCommonBaseDir" }
- $LocalInstallerArguments += @{ Version = "$ToolVersion" }
-
- if ($Verbose) {
- $LocalInstallerArguments += @{ Verbose = $True }
- }
- if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') {
- if($Force) {
- $LocalInstallerArguments += @{ Force = $True }
- }
- }
- if ($Clean) {
- $LocalInstallerArguments += @{ Clean = $True }
- }
-
- Write-Verbose "Installing $ToolName version $ToolVersion"
- Write-Verbose "Executing '$InstallerPath $($LocalInstallerArguments.Keys.ForEach({"-$_ '$($LocalInstallerArguments.$_)'"}) -join ' ')'"
- & $InstallerPath @LocalInstallerArguments
- if ($LASTEXITCODE -Ne "0") {
- $errMsg = "$ToolName installation failed"
- if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) {
- $showNativeToolsWarning = $true
- if ((Get-Variable 'DoNotDisplayNativeToolsInstallationWarnings' -ErrorAction 'SilentlyContinue') -and $DoNotDisplayNativeToolsInstallationWarnings) {
- $showNativeToolsWarning = $false
+ if ($PathPromotion -eq $True) {
+ if ($env:SYSTEM_TEAMPROJECT) { # check to see if we're in an Azure pipelines build
+ $NativeTools.PSObject.Properties | ForEach-Object {
+ $ToolName = $_.Name
+ $ToolVersion = $_.Value
+ $InstalledTools = @{}
+
+ if ((Get-Command "$ToolName" -ErrorAction SilentlyContinue) -eq $null) {
+ if ($ToolVersion -eq "latest") {
+ $ToolVersion = ""
+ }
+ $ArcadeToolsDirectory = "C:\arcade-tools"
+ if (-not (Test-Path $ArcadeToolsDirectory)) {
+ Write-Error "Arcade tools directory '$ArcadeToolsDirectory' was not found; artifacts were not properly installed."
+ exit 1
+ }
+ $ToolDirectory = (Get-ChildItem -Path "$ArcadeToolsDirectory" -Filter "$ToolName-$ToolVersion*" | Sort-Object -Descending)[0]
+ if ([string]::IsNullOrWhiteSpace($ToolDirectory)) {
+ Write-Error "Unable to find directory for $ToolName $ToolVersion; please make sure the tool is installed on this image."
+ exit 1
}
- if ($showNativeToolsWarning) {
- Write-Warning $errMsg
+ $BinPathFile = "$($ToolDirectory.FullName)\binpath.txt"
+ if (-not (Test-Path -Path "$BinPathFile")) {
+ Write-Error "Unable to find binpath.txt in '$($ToolDirectory.FullName)' ($ToolName $ToolVersion); artifact is either installed incorrectly or is not a bootstrappable tool."
+ exit 1
}
- $toolInstallationFailure = $true
- } else {
- # We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
- Write-Host $errMsg
- exit 1
+ $BinPath = Get-Content "$BinPathFile"
+ $ToolPath = Convert-Path -Path $BinPath
+ Write-Host "Adding $ToolName to the path ($ToolPath)..."
+ Write-Host "##vso[task.prependpath]$ToolPath"
+ $env:PATH = "$ToolPath;$env:PATH"
+ $InstalledTools += @{ $ToolName = $ToolDirectory.FullName }
+ }
}
+ return $InstalledTools
+ } else {
+ $NativeTools.PSObject.Properties | ForEach-Object {
+ $ToolName = $_.Name
+ $ToolVersion = $_.Value
+
+ if ((Get-Command "$ToolName" -ErrorAction SilentlyContinue) -eq $null) {
+ Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message "$ToolName not found on path. Please install $ToolName $ToolVersion before proceeding."
+ }
+ }
+ exit 0
+ }
+ } else {
+ $NativeTools.PSObject.Properties | ForEach-Object {
+ $ToolName = $_.Name
+ $ToolVersion = $_.Value
+ $LocalInstallerArguments = @{ ToolName = "$ToolName" }
+ $LocalInstallerArguments += @{ InstallPath = "$InstallBin" }
+ $LocalInstallerArguments += @{ BaseUri = "$BaseUri" }
+ $LocalInstallerArguments += @{ CommonLibraryDirectory = "$EngCommonBaseDir" }
+ $LocalInstallerArguments += @{ Version = "$ToolVersion" }
+
+ if ($Verbose) {
+ $LocalInstallerArguments += @{ Verbose = $True }
+ }
+ if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') {
+ if($Force) {
+ $LocalInstallerArguments += @{ Force = $True }
+ }
+ }
+ if ($Clean) {
+ $LocalInstallerArguments += @{ Clean = $True }
+ }
+
+ Write-Verbose "Installing $ToolName version $ToolVersion"
+ Write-Verbose "Executing '$InstallerPath $($LocalInstallerArguments.Keys.ForEach({"-$_ '$($LocalInstallerArguments.$_)'"}) -join ' ')'"
+ & $InstallerPath @LocalInstallerArguments
+ if ($LASTEXITCODE -Ne "0") {
+ $errMsg = "$ToolName installation failed"
+ if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) {
+ $showNativeToolsWarning = $true
+ if ((Get-Variable 'DoNotDisplayNativeToolsInstallationWarnings' -ErrorAction 'SilentlyContinue') -and $DoNotDisplayNativeToolsInstallationWarnings) {
+ $showNativeToolsWarning = $false
+ }
+ if ($showNativeToolsWarning) {
+ Write-Warning $errMsg
+ }
+ $toolInstallationFailure = $true
+ } else {
+ # We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
+ Write-Host $errMsg
+ exit 1
+ }
+ }
+ }
+
+ if ((Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue') -and $toolInstallationFailure) {
+ # We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
+ Write-Host 'Native tools bootstrap failed'
+ exit 1
}
- }
-
- if ((Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue') -and $toolInstallationFailure) {
- # We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
- Write-Host 'Native tools bootstrap failed'
- exit 1
}
}
else {
@@ -139,7 +192,7 @@ try {
Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)"
return $InstallBin
}
- else {
+ elseif (-not ($PathPromotion)) {
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message 'Native tools install directory does not exist, installation failed'
exit 1
}
@@ -149,4 +202,4 @@ catch {
Write-Host $_.ScriptStackTrace
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message $_
ExitWithExitCode 1
-}
+}
\ No newline at end of file
diff --git a/eng/common/internal/NuGet.config b/eng/common/internal/NuGet.config
new file mode 100644
index 000000000000..19d3d311b166
--- /dev/null
+++ b/eng/common/internal/NuGet.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/eng/common/internal/Tools.csproj b/eng/common/internal/Tools.csproj
index beb9c4648ea1..7f5ce6d60813 100644
--- a/eng/common/internal/Tools.csproj
+++ b/eng/common/internal/Tools.csproj
@@ -8,6 +8,9 @@
+
+
+
diff --git a/eng/common/sdl/sdl.ps1 b/eng/common/sdl/sdl.ps1
new file mode 100644
index 000000000000..648c5068d7d6
--- /dev/null
+++ b/eng/common/sdl/sdl.ps1
@@ -0,0 +1,38 @@
+
+function Install-Gdn {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string]$Path,
+
+ # If omitted, install the latest version of Guardian, otherwise install that specific version.
+ [string]$Version
+ )
+
+ $ErrorActionPreference = 'Stop'
+ Set-StrictMode -Version 2.0
+ $disableConfigureToolsetImport = $true
+ $global:LASTEXITCODE = 0
+
+ # `tools.ps1` checks $ci to perform some actions. Since the SDL
+ # scripts don't necessarily execute in the same agent that run the
+ # build.ps1/sh script this variable isn't automatically set.
+ $ci = $true
+ . $PSScriptRoot\..\tools.ps1
+
+ $argumentList = @("install", "Microsoft.Guardian.Cli", "-Source https://securitytools.pkgs.visualstudio.com/_packaging/Guardian/nuget/v3/index.json", "-OutputDirectory $Path", "-NonInteractive", "-NoCache")
+
+ if ($Version) {
+ $argumentList += "-Version $Version"
+ }
+
+ Start-Process nuget -Verbose -ArgumentList $argumentList -NoNewWindow -Wait
+
+ $gdnCliPath = Get-ChildItem -Filter guardian.cmd -Recurse -Path $Path
+
+ if (!$gdnCliPath)
+ {
+ Write-PipelineTelemetryError -Category 'Sdl' -Message 'Failure installing Guardian'
+ }
+
+ return $gdnCliPath.FullName
+}
\ No newline at end of file
diff --git a/eng/common/templates/job/execute-sdl.yml b/eng/common/templates/job/execute-sdl.yml
index 24cec0424e5d..aaeb83b4dcbd 100644
--- a/eng/common/templates/job/execute-sdl.yml
+++ b/eng/common/templates/job/execute-sdl.yml
@@ -53,8 +53,8 @@ jobs:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- checkout: self
clean: true
diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml
index 9d1e3042d8a6..5b1b77d1c74a 100644
--- a/eng/common/templates/job/onelocbuild.yml
+++ b/eng/common/templates/job/onelocbuild.yml
@@ -40,8 +40,8 @@ jobs:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
variables:
- group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
diff --git a/eng/common/templates/job/source-build.yml b/eng/common/templates/job/source-build.yml
index 5cd5325d7b4e..b6137f44ada1 100644
--- a/eng/common/templates/job/source-build.yml
+++ b/eng/common/templates/job/source-build.yml
@@ -46,10 +46,10 @@ jobs:
# source-build builds run in Docker, including the default managed platform.
pool:
${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: NetCore1ESPool-Public
+ name: NetCore-Svc-Public
demands: ImageOverride -equals Build.Ubuntu.1804.Amd64.Open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
- name: NetCore1ESPool-Internal
+ name: NetCore1ESPool-Svc-Internal
demands: ImageOverride -equals Build.Ubuntu.1804.Amd64
${{ if ne(parameters.platform.pool, '') }}:
pool: ${{ parameters.platform.pool }}
diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml
index 554e71cfc436..9c4becbc8592 100644
--- a/eng/common/templates/jobs/jobs.yml
+++ b/eng/common/templates/jobs/jobs.yml
@@ -89,8 +89,8 @@ jobs:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
runAsPublic: ${{ parameters.runAsPublic }}
publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }}
diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml
index 24e92a275a4f..fc022ca9b266 100644
--- a/eng/common/templates/post-build/post-build.yml
+++ b/eng/common/templates/post-build/post-build.yml
@@ -100,8 +100,8 @@ stages:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
@@ -137,8 +137,8 @@ stages:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
parameters:
@@ -197,8 +197,8 @@ stages:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
parameters:
@@ -254,8 +254,8 @@ stages:
demands: Cmd
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ name: NetCore1ESPool-Svc-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
parameters:
diff --git a/eng/common/templates/steps/execute-sdl.yml b/eng/common/templates/steps/execute-sdl.yml
index 7b8ee18a28d7..9dd5709f66dc 100644
--- a/eng/common/templates/steps/execute-sdl.yml
+++ b/eng/common/templates/steps/execute-sdl.yml
@@ -8,29 +8,28 @@ parameters:
condition: ''
steps:
-- ${{ if ne(parameters.overrideGuardianVersion, '') }}:
- - powershell: |
- $content = Get-Content $(GuardianPackagesConfigFile)
-
- Write-Host "packages.config content was:`n$content"
-
- $content = $content.Replace('$(DefaultGuardianVersion)', '$(GuardianVersion)')
- $content | Set-Content $(GuardianPackagesConfigFile)
-
- Write-Host "packages.config content updated to:`n$content"
- displayName: Use overridden Guardian version ${{ parameters.overrideGuardianVersion }}
+- task: NuGetAuthenticate@1
+ inputs:
+ nuGetServiceConnections: GuardianConnect
- task: NuGetToolInstaller@1
displayName: 'Install NuGet.exe'
-- task: NuGetCommand@2
- displayName: 'Install Guardian'
- inputs:
- restoreSolution: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
- feedsToUse: config
- nugetConfigPath: $(Build.SourcesDirectory)\eng\common\sdl\NuGet.config
- externalFeedCredentials: GuardianConnect
- restoreDirectory: $(Build.SourcesDirectory)\.packages
+- ${{ if ne(parameters.overrideGuardianVersion, '') }}:
+ - pwsh: |
+ Set-Location -Path $(Build.SourcesDirectory)\eng\common\sdl
+ . .\sdl.ps1
+ $guardianCliLocation = Install-Gdn -Path $(Build.SourcesDirectory)\.artifacts -Version ${{ parameters.overrideGuardianVersion }}
+ Write-Host "##vso[task.setvariable variable=GuardianCliLocation]$guardianCliLocation"
+ displayName: Install Guardian (Overridden)
+
+- ${{ if eq(parameters.overrideGuardianVersion, '') }}:
+ - pwsh: |
+ Set-Location -Path $(Build.SourcesDirectory)\eng\common\sdl
+ . .\sdl.ps1
+ $guardianCliLocation = Install-Gdn -Path $(Build.SourcesDirectory)\.artifacts
+ Write-Host "##vso[task.setvariable variable=GuardianCliLocation]$guardianCliLocation"
+ displayName: Install Guardian
- ${{ if ne(parameters.overrideParameters, '') }}:
- powershell: ${{ parameters.executeAllSdlToolsScript }} ${{ parameters.overrideParameters }}
@@ -40,7 +39,7 @@ steps:
- ${{ if eq(parameters.overrideParameters, '') }}:
- powershell: ${{ parameters.executeAllSdlToolsScript }}
- -GuardianPackageName Microsoft.Guardian.Cli.$(GuardianVersion)
+ -GuardianCliLocation $(GuardianCliLocation)
-NugetPackageDirectory $(Build.SourcesDirectory)\.packages
-AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw)
${{ parameters.additionalParameters }}
@@ -62,7 +61,28 @@ steps:
c
i
condition: succeededOrFailed()
+
- publish: $(Agent.BuildDirectory)/.gdn
artifact: GuardianConfiguration
displayName: Publish GuardianConfiguration
+ condition: succeededOrFailed()
+
+ # Publish the SARIF files in a container named CodeAnalysisLogs to enable integration
+ # with the "SARIF SAST Scans Tab" Azure DevOps extension
+ - task: CopyFiles@2
+ displayName: Copy SARIF files
+ inputs:
+ flattenFolders: true
+ sourceFolder: $(Agent.BuildDirectory)/.gdn/rc/
+ contents: '**/*.sarif'
+ targetFolder: $(Build.SourcesDirectory)/CodeAnalysisLogs
+ condition: succeededOrFailed()
+
+ # Use PublishBuildArtifacts because the SARIF extension only checks this case
+ # see microsoft/sarif-azuredevops-extension#4
+ - task: PublishBuildArtifacts@1
+ displayName: Publish SARIF files to CodeAnalysisLogs container
+ inputs:
+ pathToPublish: $(Build.SourcesDirectory)/CodeAnalysisLogs
+ artifactName: CodeAnalysisLogs
condition: succeededOrFailed()
\ No newline at end of file
diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml
index abb1b2bcda42..b5b3e5aeb3b9 100644
--- a/eng/common/templates/steps/source-build.yml
+++ b/eng/common/templates/steps/source-build.yml
@@ -63,6 +63,11 @@ steps:
targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}'
fi
+ runtimeOsArgs=
+ if [ '${{ parameters.platform.runtimeOS }}' != '' ]; then
+ runtimeOsArgs='/p:RuntimeOS=${{ parameters.platform.runtimeOS }}'
+ fi
+
publishArgs=
if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then
publishArgs='--publish'
@@ -75,6 +80,7 @@ steps:
$internalRuntimeDownloadArgs \
$internalRestoreArgs \
$targetRidArgs \
+ $runtimeOsArgs \
/p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \
/p:ArcadeBuildFromSource=true
displayName: Build
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index f1e1cb53953b..81d7b0355e38 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -635,6 +635,10 @@ function InitializeNativeTools() {
InstallDirectory = "$ToolsDir"
}
}
+ if ($env:NativeToolsOnMachine) {
+ Write-Host "Variable NativeToolsOnMachine detected, enabling native tool path promotion..."
+ $nativeArgs += @{ PathPromotion = $true }
+ }
& "$PSScriptRoot/init-tools-native.ps1" @nativeArgs
}
}
diff --git a/eng/docker/rhel.Dockerfile b/eng/docker/rhel.Dockerfile
index d42ab7b38993..3305ca5d2fe3 100644
--- a/eng/docker/rhel.Dockerfile
+++ b/eng/docker/rhel.Dockerfile
@@ -1,5 +1,5 @@
# Dockerfile that creates a container suitable to build dotnet-cli
-FROM mcr.microsoft.com/dotnet-buildtools/prereqs:rhel-7-rpmpkg-e1b4a89-20175311035359
+FROM mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-rpmpkg
# Setup User to match Host User, and give superuser permissions
ARG USER
diff --git a/eng/helix/helix.proj b/eng/helix/helix.proj
index f31e087b0868..cbd82fae4fda 100644
--- a/eng/helix/helix.proj
+++ b/eng/helix/helix.proj
@@ -1,18 +1,4 @@
-
-
-
- false
-
-
-
-
-
+
runtime
+
+
+ $([System.Environment]::GetEnvironmentVariable('DotNetBuildsInternalReadSasToken'))
+
diff --git a/eng/scripts/InstallVisualStudio.ps1 b/eng/scripts/InstallVisualStudio.ps1
index 5bee0e949bcf..15add81bb68c 100644
--- a/eng/scripts/InstallVisualStudio.ps1
+++ b/eng/scripts/InstallVisualStudio.ps1
@@ -70,7 +70,6 @@ if ("$Version" -eq "2019") {
}
if ("$Version" -eq "2022") {
$vsversion = 17;
- $Channel = "Preview";
}
$channelUri = "https://aka.ms/vs/$vsversion/release"
$responseFileName = "vs.$vsversion"
diff --git a/eng/scripts/RunHelix.ps1 b/eng/scripts/RunHelix.ps1
index ebe46bd6fcef..8716f8443855 100644
--- a/eng/scripts/RunHelix.ps1
+++ b/eng/scripts/RunHelix.ps1
@@ -11,9 +11,7 @@
Debian.11.Amd64.Open
Mariner
Redhat.7.Amd64.Open
- Ubuntu.1804.Amd64.Open
Ubuntu.2004.Amd64.Open
- OSX.1015.Amd64.Open
OSX.1100.Amd64.Open
Windows.10.Amd64.Server20H2.Open
Windows.11.Amd64.Client.Open
diff --git a/eng/scripts/vs.17.buildtools.json b/eng/scripts/vs.17.buildtools.json
new file mode 100644
index 000000000000..bebc094c3afe
--- /dev/null
+++ b/eng/scripts/vs.17.buildtools.json
@@ -0,0 +1,25 @@
+{
+ "channelUri": "https://aka.ms/vs/17/release/channel",
+ "channelId": "VisualStudio.17.Release",
+ "includeRecommended": false,
+ "addProductLang": [
+ "en-US"
+ ],
+ "add": [
+ "Microsoft.Net.Component.4.6.2.TargetingPack",
+ "Microsoft.Net.Component.4.7.2.SDK",
+ "Microsoft.Net.Component.4.7.2.TargetingPack",
+ "Microsoft.VisualStudio.Component.FSharp.MSBuild",
+ "Microsoft.VisualStudio.Component.NuGet",
+ "Microsoft.VisualStudio.Component.NuGet.BuildTools",
+ "Microsoft.VisualStudio.Component.VC.ATL",
+ "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
+ "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools",
+ "Microsoft.VisualStudio.Workload.MSBuildTools",
+ "Microsoft.VisualStudio.Workload.NetCoreBuildTools",
+ "Microsoft.VisualStudio.Workload.VCTools",
+ "Microsoft.VisualStudio.Workload.VisualStudioExtensionBuildTools",
+ "Microsoft.VisualStudio.Workload.WebBuildTools"
+ ]
+}
diff --git a/eng/scripts/vs.17.json b/eng/scripts/vs.17.json
new file mode 100644
index 000000000000..fcf999c6a5ca
--- /dev/null
+++ b/eng/scripts/vs.17.json
@@ -0,0 +1,20 @@
+{
+ "channelUri": "https://aka.ms/vs/17/release/channel",
+ "channelId": "VisualStudio.17.Release",
+ "includeRecommended": false,
+ "addProductLang": [
+ "en-US"
+ ],
+ "add": [
+ "Microsoft.Net.Component.4.6.2.TargetingPack",
+ "Microsoft.Net.Component.4.7.2.SDK",
+ "Microsoft.Net.Component.4.7.2.TargetingPack",
+ "Microsoft.VisualStudio.Component.VC.ATL",
+ "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
+ "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Workload.ManagedDesktop",
+ "Microsoft.VisualStudio.Workload.NativeDesktop",
+ "Microsoft.VisualStudio.Workload.NetWeb",
+ "Microsoft.VisualStudio.Workload.VisualStudioExtension"
+ ]
+}
diff --git a/eng/targets/CSharp.Common.props b/eng/targets/CSharp.Common.props
index 87c1a48d9900..dbe98181cf3e 100644
--- a/eng/targets/CSharp.Common.props
+++ b/eng/targets/CSharp.Common.props
@@ -1,7 +1,7 @@
- preview
+ 10.0
strict
diff --git a/eng/targets/CSharp.Common.targets b/eng/targets/CSharp.Common.targets
index 18757af70ae9..04c0356b9a22 100644
--- a/eng/targets/CSharp.Common.targets
+++ b/eng/targets/CSharp.Common.targets
@@ -116,7 +116,7 @@
-->
+ (('$(TargetFrameworkIdentifier)' == '.NETStandard' AND $([MSBuild]::VersionLessThanOrEquals('$(TargetFrameworkVersion)', '2.1'))) OR '$(TargetFrameworkIdentifier)' == '.NETFramework')">
$(DefineConstants),INTERNAL_NULLABLE_ATTRIBUTES
$(NoWarn);nullable
diff --git a/eng/targets/Helix.Common.props b/eng/targets/Helix.Common.props
index 99b2ae03ea45..ace38de8e19a 100644
--- a/eng/targets/Helix.Common.props
+++ b/eng/targets/Helix.Common.props
@@ -1,11 +1,11 @@
- (Alpine.314.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.14-helix-amd64-20210910135833-1848e19
- (Debian.11.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64-20211001171307-0ece9b3
- (Fedora.34.Amd64.Open)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-34-helix-20210924174119-4f64125
- (Mariner)Ubuntu.1804.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-1.0-helix-20210528192219-92bf620
- (Debian.11.Arm64.Open)Ubuntu.1804.Armarch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm64v8-20211001171229-97d8652
+ (Alpine.314.Amd64.Open)Ubuntu.2004.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.14-helix-amd64
+ (Debian.11.Amd64.Open)Ubuntu.2004.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-amd64
+ (Fedora.34.Amd64.Open)Ubuntu.2004.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-34-helix
+ (Mariner)Ubuntu.2004.Amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-1.0-helix
+ (Debian.11.Arm64.Open)ubuntu.2004.armarch.open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm64v8
@@ -20,7 +20,7 @@
-
+
@@ -29,7 +29,6 @@
-
@@ -43,7 +42,6 @@
-
@@ -60,13 +58,13 @@
-
+
false
- true
+ true
false
- true
+ true
diff --git a/eng/tools/GenerateFiles/Directory.Build.targets.in b/eng/tools/GenerateFiles/Directory.Build.targets.in
index c5206ec8c611..5e693b6d7cc9 100644
--- a/eng/tools/GenerateFiles/Directory.Build.targets.in
+++ b/eng/tools/GenerateFiles/Directory.Build.targets.in
@@ -39,8 +39,15 @@
${MicrosoftNETCoreAppRuntimeVersion}
+ $(TargetRuntimeIdentifier)
+
+ ${MicrosoftNETCoreAppRuntimeVersion}
+ $(TargetRuntimeIdentifier)
+
+
{"use strict";var e,t,n,r={};r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",s="__byte[]";class i{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const a={},c={0:new i(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,h=1,u=1,d=null;function p(e){t.push(e)}function f(e){if(e&&"object"==typeof e){c[u]=new i(e);const t={[o]:u};return u++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function g(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=f(e);n.__jsObjectId=t.__jsObjectId}catch{throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function m(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function y(e,t,n,r){const o=v();if(o.invokeDotNetFromJS){const s=D(r),i=o.invokeDotNetFromJS(e,t,n,s);return i?m(i):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function w(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=h++,s=new Promise(((e,t)=>{a[o]={resolve:e,reject:t}}));try{const s=D(r);v().beginInvokeDotNetFromJS(o,e,t,n,s)}catch(e){b(o,!1,e)}return s}function v(){if(null!==d)return d;throw new Error("No .NET call dispatcher has been set.")}function b(e,t,n){if(!a.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=a[e];delete a[e],t?r.resolve(n):r.reject(n)}function _(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function E(e,t){let n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function S(e){delete c[e]}e.attachDispatcher=function(e){d=e},e.attachReviver=p,e.invokeMethod=function(e,t,...n){return y(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return w(e,t,null,n)},e.createJSObjectReference=f,e.createJSStreamReference=g,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&S(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:E,disposeJSObjectReferenceById:S,invokeJSFromDotNet:(e,t,n,r)=>{const o=T(E(e,r).apply(null,m(t)),n);return null==o?null:D(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const s=new Promise((e=>{e(E(t,o).apply(null,m(n)))}));e&&s.then((t=>v().endInvokeJSFromDotNet(e,!0,D([e,!0,T(t,r)]))),(t=>v().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,_(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?m(n):new Error(n);b(parseInt(e),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new k;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return y(null,e,this._id,t)}invokeMethodAsync(e,...t){return w(null,e,this._id,t)}dispose(){w(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,p((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(s)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new I(t.__dotNetStream)}return t}));class I{constructor(e){var t;if(r.has(e))this._streamPromise=null===(t=r.get(e))||void 0===t?void 0:t.streamPromise,r.delete(e);else{const t=new k;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class k{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function T(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return f(e);case l.JSStreamReference:return g(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let x=0;function D(e){return x=0,JSON.stringify(e,R)}function R(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){d.sendByteArray(x,t);const e={[s]:x};return x++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class o{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new o(e,t.value)}return null}}const s=new Map,i=new Map,a=[];function c(e){return s.get(e)}function l(e){const t=s.get(e);return(null==t?void 0:t.browserEventName)||e}function h(e,t){e.forEach((e=>s.set(e,t)))}function u(e){const t=[];for(let n=0;ne.selected)).map((e=>e.value))}}return{value:function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t)?!!t.checked:t.value}}}),h(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),h(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),h(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),h(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","dblclick"],{createEventArgs:e=>d(e)}),h(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),h(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),h(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),h(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),h(["toggle"],{createEventArgs:()=>({})});const p=["date","datetime-local","month","time","week"],f=new Map;let g,m,y=0;const w={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++y).toString();f.set(r,e);const o=await _().invokeMethodAsync("AddRootComponent",t,r),s=new b(o,m[t]);return await s.setParameters(n),s}};class v{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class b{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new v)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return _().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await _().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function _(){if(!g)throw new Error("Dynamic root components have not been enabled in this application.");return g}const E=new Map;let S;const C=new Promise((e=>{S=e}));function I(e,t,n){return T(e,t.eventHandlerId,(()=>k(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function k(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let T=(e,t,n)=>n();const x=N(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),D={submit:!0},R=N(["click","dblclick","mousedown","mousemove","mouseup"]);class P{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++P.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new U(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),s=o.getHandler(t);if(s)this.eventInfoStore.update(s.eventHandlerId,n);else{const s={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(s),o.setHandler(t,s)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,i.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let r=n.shift(),s=null,i=!1;const a=x.hasOwnProperty(e);let l=!1;for(;r;){const d=r,p=this.getEventHandlerInfosForElement(d,!1);if(p){const n=p.getHandler(e);if(n&&(h=d,u=t.type,!((h instanceof HTMLButtonElement||h instanceof HTMLInputElement||h instanceof HTMLTextAreaElement||h instanceof HTMLSelectElement)&&R.hasOwnProperty(u)&&h.disabled))){if(!i){const n=c(e);s=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},i=!0}D.hasOwnProperty(t.type)&&t.preventDefault(),I(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:o.fromEvent(n.renderingComponentId,t)},s)}p.stopPropagation(e)&&(l=!0),p.preventDefault(e)&&t.preventDefault()}r=a||l?void 0:n.shift()}var h,u}getEventHandlerInfosForElement(e,t){return e.hasOwnProperty(this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new A:null}}P.nextEventDelegatorId=0;class U{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},a.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=l(e),this.countByEventName.hasOwnProperty(e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=x.hasOwnProperty(e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(this.infosByEventHandlerId.hasOwnProperty(t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=l(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(this.countByEventName.hasOwnProperty(e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class A{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return this.handlers.hasOwnProperty(e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function N(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const $=G("_blazorLogicalChildren"),B=G("_blazorLogicalParent"),L=G("_blazorLogicalEnd");function M(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return $ in e||(e[$]=[]),e}function O(e,t){const n=document.createComment("!");return F(n,e,t),n}function F(e,t,n){const r=e;if(e instanceof Comment&&J(r)&&J(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(j(r))throw new Error("Not implemented: moving existing logical children");const o=J(t);if(n0;)H(n,0)}const r=n;r.parentNode.removeChild(r)}function j(e){return e[B]||null}function W(e,t){return J(e)[t]}function z(e){var t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function J(e){return e[$]}function q(e,t){const n=J(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let s=r;for(;s;){const e=s.nextSibling;if(n.insertBefore(s,t),s===o)break;s=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function K(e){const t=J(j(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=K(t);n?n.parentNode.insertBefore(e,n):X(e,j(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=K(e);if(t)return t.previousSibling;{const t=j(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function Q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&t.hasOwnProperty("__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${Q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",ee=document.createElement("template"),te=document.createElementNS("http://www.w3.org/2000/svg","g"),ne={},re="__internal_",oe="preventDefault_",se="stopPropagation_";class ie{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new P(e),this.eventDelegator.notifyAfterClick((e=>{if(!fe)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;ebe(!1))))},enableNavigationInterception:function(){fe=!0},navigateTo:we,getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function we(e,t,n=!1){const r=Ee(e),o=t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n};!o.forceLoad&&Ce(r)?ve(r,!1,o.replaceHistoryEntry):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,o.replaceHistoryEntry)}function ve(e,t,n){pe=!0,n?history.replaceState(null,"",e):history.pushState(null,"",e),be(t)}async function be(e){me&&await me(location.href,e)}let _e;function Ee(e){return _e=_e||document.createElement("a"),_e.href=e,_e.href}function Se(e,t){return e?e.tagName===t?e:Se(e.parentElement,t):null}function Ce(e){const t=(n=document.baseURI).substr(0,n.lastIndexOf("/")+1);var n;return e.startsWith(t)}const Ie={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},ke={init:function(e,t,n,r=50){const o=xe(t);(o||document.documentElement).style.overflowAnchor="none";const s=document.createRange();h(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const i=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;s.setStartAfter(t),s.setEndBefore(n);const i=s.getBoundingClientRect().height,a=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,i,a):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,i,a)}))}),{root:o,rootMargin:`${r}px`});i.observe(t),i.observe(n);const a=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{h(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),i.unobserve(e),i.observe(e)}));return n.observe(e,t),n}function h(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}Te[e._id]={intersectionObserver:i,mutationObserverBefore:a,mutationObserverAfter:c}},dispose:function(e){const t=Te[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete Te[e._id])}},Te={};function xe(e){return e?"visible"!==getComputedStyle(e).overflowY?e:xe(e.parentElement):null}const De={getAndRemoveExistingTitle:function(){var e;const t=document.getElementsByTagName("title");if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],s=o.previousSibling;s instanceof Comment&&null!==j(s)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Re={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const s=Pe(e,t),i=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(s.blob)})),a=await new Promise((function(e){var t;const s=Math.min(1,r/i.width),a=Math.min(1,o/i.height),c=Math.min(s,a),l=document.createElement("canvas");l.width=Math.round(i.width*c),l.height=Math.round(i.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(i,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:s.lastModified,name:s.name,size:(null==a?void 0:a.size)||0,contentType:n,blob:a||s.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Pe(e,t).blob}};function Pe(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed.`);return n}async function Ue(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)}const Ae=new Map,Ne={navigateTo:we,registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(s.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=i.get(t.browserEventName);n?n.push(e):i.set(t.browserEventName,[e]),a.forEach((n=>n(e,t.browserEventName)))}s.set(e,t)},rootComponents:w,_internal:{navigationManager:ye,domWrapper:Ie,Virtualize:ke,PageTitle:De,InputFile:Re,getJSDataStreamChunk:Ue,receiveDotNetDataStream:function(t,n,r,o){let s=Ae.get(t);if(!s){const n=new ReadableStream({start(e){Ae.set(t,e),s=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(s.error(o),Ae.delete(t)):0===r?(s.close(),Ae.delete(t)):s.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(g)throw new Error("Dynamic root components have already been enabled.");g=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(k(t),r,o),S()}}};window.Blazor=Ne;const $e=[0,2e3,1e4,3e4,null];class Be{constructor(e){this._retryDelays=void 0!==e?[...e,null]:$e}nextRetryDelayInMilliseconds(e){return this._retryDelays[e.previousRetryCount]}}class Le extends Error{constructor(e,t){const n=new.target.prototype;super(`${e}: Status code '${t}'`),this.statusCode=t,this.__proto__=n}}class Me extends Error{constructor(e="A timeout occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Oe extends Error{constructor(e="An abort occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Fe extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="UnsupportedTransportError",this.__proto__=n}}class He extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="DisabledTransportError",this.__proto__=n}}class je extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="FailedToStartTransportError",this.__proto__=n}}class We extends Error{constructor(e){const t=new.target.prototype;super(e),this.errorType="FailedToNegotiateWithServerError",this.__proto__=t}}class ze extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.innerErrors=t,this.__proto__=n}}class Je{constructor(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}}class qe{get(e,t){return this.send({...t,method:"GET",url:e})}post(e,t){return this.send({...t,method:"POST",url:e})}delete(e,t){return this.send({...t,method:"DELETE",url:e})}getCookieString(e){return""}}var Ve,Ke,Xe,Ye,Ge;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(Ve||(Ve={}));class Qe{constructor(){}log(e,t){}}Qe.instance=new Qe;class Ze{static isRequired(e,t){if(null==e)throw new Error(`The '${t}' argument is required.`)}static isNotEmpty(e,t){if(!e||e.match(/^\s*$/))throw new Error(`The '${t}' argument should not be empty.`)}static isIn(e,t,n){if(!(e in t))throw new Error(`Unknown ${n} value: ${e}.`)}}class et{static get isBrowser(){return"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return"object"==typeof self&&"importScripts"in self}static get isReactNative(){return"object"==typeof window&&void 0===window.document}static get isNode(){return!this.isBrowser&&!this.isWebWorker&&!this.isReactNative}}function tt(e,t){let n="";return nt(e)?(n=`Binary data of length ${e.byteLength}`,t&&(n+=`. Content: '${function(e){const t=new Uint8Array(e);let n="";return t.forEach((e=>{n+=`0x${e<16?"0":""}${e.toString(16)} `})),n.substr(0,n.length-1)}(e)}'`)):"string"==typeof e&&(n=`String data of length ${e.length}`,t&&(n+=`. Content: '${e}'`)),n}function nt(e){return e&&"undefined"!=typeof ArrayBuffer&&(e instanceof ArrayBuffer||e.constructor&&"ArrayBuffer"===e.constructor.name)}async function rt(e,t,n,r,o,s,i){let a={};if(o){const e=await o();e&&(a={Authorization:`Bearer ${e}`})}const[c,l]=it();a[c]=l,e.log(Ve.Trace,`(${t} transport) sending data. ${tt(s,i.logMessageContent)}.`);const h=nt(s)?"arraybuffer":"text",u=await n.post(r,{content:s,headers:{...a,...i.headers},responseType:h,timeout:i.timeout,withCredentials:i.withCredentials});e.log(Ve.Trace,`(${t} transport) request complete. Response status: ${u.statusCode}.`)}class ot{constructor(e,t){this._subject=e,this._observer=t}dispose(){const e=this._subject.observers.indexOf(this._observer);e>-1&&this._subject.observers.splice(e,1),0===this._subject.observers.length&&this._subject.cancelCallback&&this._subject.cancelCallback().catch((e=>{}))}}class st{constructor(e){this._minLevel=e,this.out=console}log(e,t){if(e>=this._minLevel){const n=`[${(new Date).toISOString()}] ${Ve[e]}: ${t}`;switch(e){case Ve.Critical:case Ve.Error:this.out.error(n);break;case Ve.Warning:this.out.warn(n);break;case Ve.Information:this.out.info(n);break;default:this.out.log(n)}}}}function it(){let e="X-SignalR-User-Agent";return et.isNode&&(e="User-Agent"),[e,at("0.0.0-DEV_BUILD",ct(),et.isNode?"NodeJS":"Browser",lt())]}function at(e,t,n,r){let o="Microsoft SignalR/";const s=e.split(".");return o+=`${s[0]}.${s[1]}`,o+=` (${e}; `,o+=t&&""!==t?`${t}; `:"Unknown OS; ",o+=`${n}`,o+=r?`; ${r}`:"; Unknown Runtime Version",o+=")",o}function ct(){if(!et.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function lt(){if(et.isNode)return process.versions.node}function ht(e){return e.stack?e.stack:e.message?e.message:`${e}`}class ut extends qe{constructor(e){if(super(),this._logger=e,"undefined"==typeof fetch){const e=require;this._jar=new(e("tough-cookie").CookieJar),this._fetchType=e("node-fetch"),this._fetchType=e("fetch-cookie")(this._fetchType,this._jar)}else this._fetchType=fetch.bind(function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("could not find global")}());if("undefined"==typeof AbortController){const e=require;this._abortControllerType=e("abort-controller")}else this._abortControllerType=AbortController}async send(e){if(e.abortSignal&&e.abortSignal.aborted)throw new Oe;if(!e.method)throw new Error("No method defined.");if(!e.url)throw new Error("No url defined.");const t=new this._abortControllerType;let n;e.abortSignal&&(e.abortSignal.onabort=()=>{t.abort(),n=new Oe});let r,o=null;if(e.timeout){const r=e.timeout;o=setTimeout((()=>{t.abort(),this._logger.log(Ve.Warning,"Timeout from HTTP request."),n=new Me}),r)}try{r=await this._fetchType(e.url,{body:e.content,cache:"no-cache",credentials:!0===e.withCredentials?"include":"same-origin",headers:{"Content-Type":"text/plain;charset=UTF-8","X-Requested-With":"XMLHttpRequest",...e.headers},method:e.method,mode:"cors",redirect:"follow",signal:t.signal})}catch(e){if(n)throw n;throw this._logger.log(Ve.Warning,`Error from HTTP request. ${e}.`),e}finally{o&&clearTimeout(o),e.abortSignal&&(e.abortSignal.onabort=null)}if(!r.ok){const e=await dt(r,"text");throw new Le(e||r.statusText,r.status)}const s=dt(r,e.responseType),i=await s;return new Je(r.status,r.statusText,i)}getCookieString(e){return""}}function dt(e,t){let n;switch(t){case"arraybuffer":n=e.arrayBuffer();break;case"text":n=e.text();break;case"blob":case"document":case"json":throw new Error(`${t} is not supported.`);default:n=e.text()}return n}class pt extends qe{constructor(e){super(),this._logger=e}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Oe):e.method?e.url?new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),r.withCredentials=void 0===e.withCredentials||e.withCredentials,r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.setRequestHeader("Content-Type","text/plain;charset=UTF-8");const o=e.headers;o&&Object.keys(o).forEach((e=>{r.setRequestHeader(e,o[e])})),e.responseType&&(r.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=()=>{r.abort(),n(new Oe)}),e.timeout&&(r.timeout=e.timeout),r.onload=()=>{e.abortSignal&&(e.abortSignal.onabort=null),r.status>=200&&r.status<300?t(new Je(r.status,r.statusText,r.response||r.responseText)):n(new Le(r.response||r.responseText||r.statusText,r.status))},r.onerror=()=>{this._logger.log(Ve.Warning,`Error from HTTP request. ${r.status}: ${r.statusText}.`),n(new Le(r.statusText,r.status))},r.ontimeout=()=>{this._logger.log(Ve.Warning,"Timeout from HTTP request."),n(new Me)},r.send(e.content||"")})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class ft extends qe{constructor(e){if(super(),"undefined"!=typeof fetch)this._httpClient=new ut(e);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this._httpClient=new pt(e)}}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Oe):e.method?e.url?this._httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}getCookieString(e){return this._httpClient.getCookieString(e)}}class gt{}gt.Authorization="Authorization",gt.Cookie="Cookie",function(e){e[e.None=0]="None",e[e.WebSockets=1]="WebSockets",e[e.ServerSentEvents=2]="ServerSentEvents",e[e.LongPolling=4]="LongPolling"}(Ke||(Ke={})),function(e){e[e.Text=1]="Text",e[e.Binary=2]="Binary"}(Xe||(Xe={}));class mt{constructor(){this._isAborted=!1,this.onabort=null}abort(){this._isAborted||(this._isAborted=!0,this.onabort&&this.onabort())}get signal(){return this}get aborted(){return this._isAborted}}class yt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._pollAbort=new mt,this._options=r,this._running=!1,this.onreceive=null,this.onclose=null}get pollAborted(){return this._pollAbort.aborted}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._url=e,this._logger.log(Ve.Trace,"(LongPolling transport) Connecting."),t===Xe.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[n,r]=it(),o={[n]:r,...this._options.headers},s={abortSignal:this._pollAbort.signal,headers:o,timeout:1e5,withCredentials:this._options.withCredentials};t===Xe.Binary&&(s.responseType="arraybuffer");const i=await this._getAccessToken();this._updateHeaderToken(s,i);const a=`${e}&_=${Date.now()}`;this._logger.log(Ve.Trace,`(LongPolling transport) polling: ${a}.`);const c=await this._httpClient.get(a,s);200!==c.statusCode?(this._logger.log(Ve.Error,`(LongPolling transport) Unexpected response code: ${c.statusCode}.`),this._closeError=new Le(c.statusText||"",c.statusCode),this._running=!1):this._running=!0,this._receiving=this._poll(this._url,s)}async _getAccessToken(){return this._accessTokenFactory?await this._accessTokenFactory():null}_updateHeaderToken(e,t){e.headers||(e.headers={}),t?e.headers[gt.Authorization]=`Bearer ${t}`:e.headers[gt.Authorization]&&delete e.headers[gt.Authorization]}async _poll(e,t){try{for(;this._running;){const n=await this._getAccessToken();this._updateHeaderToken(t,n);try{const n=`${e}&_=${Date.now()}`;this._logger.log(Ve.Trace,`(LongPolling transport) polling: ${n}.`);const r=await this._httpClient.get(n,t);204===r.statusCode?(this._logger.log(Ve.Information,"(LongPolling transport) Poll terminated by server."),this._running=!1):200!==r.statusCode?(this._logger.log(Ve.Error,`(LongPolling transport) Unexpected response code: ${r.statusCode}.`),this._closeError=new Le(r.statusText||"",r.statusCode),this._running=!1):r.content?(this._logger.log(Ve.Trace,`(LongPolling transport) data received. ${tt(r.content,this._options.logMessageContent)}.`),this.onreceive&&this.onreceive(r.content)):this._logger.log(Ve.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(e){this._running?e instanceof Me?this._logger.log(Ve.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this._closeError=e,this._running=!1):this._logger.log(Ve.Trace,`(LongPolling transport) Poll errored after shutdown: ${e.message}`)}}}finally{this._logger.log(Ve.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this._raiseOnClose()}}async send(e){return this._running?rt(this._logger,"LongPolling",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}async stop(){this._logger.log(Ve.Trace,"(LongPolling transport) Stopping polling."),this._running=!1,this._pollAbort.abort();try{await this._receiving,this._logger.log(Ve.Trace,`(LongPolling transport) sending DELETE request to ${this._url}.`);const e={},[t,n]=it();e[t]=n;const r={headers:{...e,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials},o=await this._getAccessToken();this._updateHeaderToken(r,o),await this._httpClient.delete(this._url,r),this._logger.log(Ve.Trace,"(LongPolling transport) DELETE request sent.")}finally{this._logger.log(Ve.Trace,"(LongPolling transport) Stop finished."),this._raiseOnClose()}}_raiseOnClose(){if(this.onclose){let e="(LongPolling transport) Firing onclose event.";this._closeError&&(e+=" Error: "+this._closeError),this._logger.log(Ve.Trace,e),this.onclose(this._closeError)}}}class wt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._options=r,this.onreceive=null,this.onclose=null}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._logger.log(Ve.Trace,"(SSE transport) Connecting."),this._url=e,this._accessTokenFactory){const t=await this._accessTokenFactory();t&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(t)}`)}return new Promise(((n,r)=>{let o,s=!1;if(t===Xe.Text){if(et.isBrowser||et.isWebWorker)o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials});else{const t=this._httpClient.getCookieString(e),n={};n.Cookie=t;const[r,s]=it();n[r]=s,o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials,headers:{...n,...this._options.headers}})}try{o.onmessage=e=>{if(this.onreceive)try{this._logger.log(Ve.Trace,`(SSE transport) data received. ${tt(e.data,this._options.logMessageContent)}.`),this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onerror=e=>{s?this._close():r(new Error("EventSource failed to connect. The connection could not be found on the server, either the connection ID is not present on the server, or a proxy is refusing/buffering the connection. If you have multiple servers check that sticky sessions are enabled."))},o.onopen=()=>{this._logger.log(Ve.Information,`SSE connected to ${this._url}`),this._eventSource=o,s=!0,n()}}catch(e){return void r(e)}}else r(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(e){return this._eventSource?rt(this._logger,"SSE",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}stop(){return this._close(),Promise.resolve()}_close(e){this._eventSource&&(this._eventSource.close(),this._eventSource=void 0,this.onclose&&this.onclose(e))}}class vt{constructor(e,t,n,r,o,s){this._logger=n,this._accessTokenFactory=t,this._logMessageContent=r,this._webSocketConstructor=o,this._httpClient=e,this.onreceive=null,this.onclose=null,this._headers=s}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._logger.log(Ve.Trace,"(WebSockets transport) Connecting."),this._accessTokenFactory){const t=await this._accessTokenFactory();t&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(t)}`)}return new Promise(((n,r)=>{let o;e=e.replace(/^http/,"ws"),this._httpClient.getCookieString(e);let s=!1;o||(o=new this._webSocketConstructor(e)),t===Xe.Binary&&(o.binaryType="arraybuffer"),o.onopen=t=>{this._logger.log(Ve.Information,`WebSocket connected to ${e}.`),this._webSocket=o,s=!0,n()},o.onerror=e=>{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"There was an error with the transport",this._logger.log(Ve.Information,`(WebSockets transport) ${t}.`)},o.onmessage=e=>{if(this._logger.log(Ve.Trace,`(WebSockets transport) data received. ${tt(e.data,this._logMessageContent)}.`),this.onreceive)try{this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onclose=e=>{if(s)this._close(e);else{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.",r(new Error(t))}}}))}send(e){return this._webSocket&&this._webSocket.readyState===this._webSocketConstructor.OPEN?(this._logger.log(Ve.Trace,`(WebSockets transport) sending data. ${tt(e,this._logMessageContent)}.`),this._webSocket.send(e),Promise.resolve()):Promise.reject("WebSocket is not in the OPEN state")}stop(){return this._webSocket&&this._close(void 0),Promise.resolve()}_close(e){this._webSocket&&(this._webSocket.onclose=()=>{},this._webSocket.onmessage=()=>{},this._webSocket.onerror=()=>{},this._webSocket.close(),this._webSocket=void 0),this._logger.log(Ve.Trace,"(WebSockets transport) socket closed."),this.onclose&&(!this._isCloseEvent(e)||!1!==e.wasClean&&1e3===e.code?e instanceof Error?this.onclose(e):this.onclose():this.onclose(new Error(`WebSocket closed with status code: ${e.code} (${e.reason||"no reason given"}).`)))}_isCloseEvent(e){return e&&"boolean"==typeof e.wasClean&&"number"==typeof e.code}}class bt{constructor(e,t={}){var n;if(this._stopPromiseResolver=()=>{},this.features={},this._negotiateVersion=1,Ze.isRequired(e,"url"),this._logger=void 0===(n=t.logger)?new st(Ve.Information):null===n?Qe.instance:void 0!==n.log?n:new st(n),this.baseUrl=this._resolveUrl(e),(t=t||{}).logMessageContent=void 0!==t.logMessageContent&&t.logMessageContent,"boolean"!=typeof t.withCredentials&&void 0!==t.withCredentials)throw new Error("withCredentials option was not a 'boolean' or 'undefined' value");t.withCredentials=void 0===t.withCredentials||t.withCredentials,t.timeout=void 0===t.timeout?1e5:t.timeout,"undefined"==typeof WebSocket||t.WebSocket||(t.WebSocket=WebSocket),"undefined"==typeof EventSource||t.EventSource||(t.EventSource=EventSource),this._httpClient=t.httpClient||new ft(this._logger),this._connectionState="Disconnected",this._connectionStarted=!1,this._options=t,this.onreceive=null,this.onclose=null}async start(e){if(e=e||Xe.Binary,Ze.isIn(e,Xe,"transferFormat"),this._logger.log(Ve.Debug,`Starting connection with transfer format '${Xe[e]}'.`),"Disconnected"!==this._connectionState)return Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."));if(this._connectionState="Connecting",this._startInternalPromise=this._startInternal(e),await this._startInternalPromise,"Disconnecting"===this._connectionState){const e="Failed to start the HttpConnection before stop() was called.";return this._logger.log(Ve.Error,e),await this._stopPromise,Promise.reject(new Error(e))}if("Connected"!==this._connectionState){const e="HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!";return this._logger.log(Ve.Error,e),Promise.reject(new Error(e))}this._connectionStarted=!0}send(e){return"Connected"!==this._connectionState?Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")):(this._sendQueue||(this._sendQueue=new _t(this.transport)),this._sendQueue.send(e))}async stop(e){return"Disconnected"===this._connectionState?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this._connectionState?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState="Disconnecting",this._stopPromise=new Promise((e=>{this._stopPromiseResolver=e})),await this._stopInternal(e),void await this._stopPromise)}async _stopInternal(e){this._stopError=e;try{await this._startInternalPromise}catch(e){}if(this.transport){try{await this.transport.stop()}catch(e){this._logger.log(Ve.Error,`HttpConnection.transport.stop() threw error '${e}'.`),this._stopConnection()}this.transport=void 0}else this._logger.log(Ve.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async _startInternal(e){let t=this.baseUrl;this._accessTokenFactory=this._options.accessTokenFactory;try{if(this._options.skipNegotiation){if(this._options.transport!==Ke.WebSockets)throw new Error("Negotiation can only be skipped when using the WebSocket transport directly.");this.transport=this._constructTransport(Ke.WebSockets),await this._startTransport(t,e)}else{let n=null,r=0;do{if(n=await this._getNegotiationResponse(t),"Disconnecting"===this._connectionState||"Disconnected"===this._connectionState)throw new Error("The connection was stopped during negotiation.");if(n.error)throw new Error(n.error);if(n.ProtocolVersion)throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.");if(n.url&&(t=n.url),n.accessToken){const e=n.accessToken;this._accessTokenFactory=()=>e}r++}while(n.url&&r<100);if(100===r&&n.url)throw new Error("Negotiate redirection limit exceeded.");await this._createTransport(t,this._options.transport,n,e)}this.transport instanceof yt&&(this.features.inherentKeepAlive=!0),"Connecting"===this._connectionState&&(this._logger.log(Ve.Debug,"The HttpConnection connected successfully."),this._connectionState="Connected")}catch(e){return this._logger.log(Ve.Error,"Failed to start the connection: "+e),this._connectionState="Disconnected",this.transport=void 0,this._stopPromiseResolver(),Promise.reject(e)}}async _getNegotiationResponse(e){const t={};if(this._accessTokenFactory){const e=await this._accessTokenFactory();e&&(t[gt.Authorization]=`Bearer ${e}`)}const[n,r]=it();t[n]=r;const o=this._resolveNegotiateUrl(e);this._logger.log(Ve.Debug,`Sending negotiation request: ${o}.`);try{const e=await this._httpClient.post(o,{content:"",headers:{...t,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials});if(200!==e.statusCode)return Promise.reject(new Error(`Unexpected status code returned from negotiate '${e.statusCode}'`));const n=JSON.parse(e.content);return(!n.negotiateVersion||n.negotiateVersion<1)&&(n.connectionToken=n.connectionId),n}catch(e){let t="Failed to complete negotiation with the server: "+e;return e instanceof Le&&404===e.statusCode&&(t+=" Either this is not a SignalR endpoint or there is a proxy blocking the connection."),this._logger.log(Ve.Error,t),Promise.reject(new We(t))}}_createConnectUrl(e,t){return t?e+(-1===e.indexOf("?")?"?":"&")+`id=${t}`:e}async _createTransport(e,t,n,r){let o=this._createConnectUrl(e,n.connectionToken);if(this._isITransport(t))return this._logger.log(Ve.Debug,"Connection was provided an instance of ITransport, using that directly."),this.transport=t,await this._startTransport(o,r),void(this.connectionId=n.connectionId);const s=[],i=n.availableTransports||[];let a=n;for(const n of i){const i=this._resolveTransportOrError(n,t,r);if(i instanceof Error)s.push(`${n.transport} failed:`),s.push(i);else if(this._isITransport(i)){if(this.transport=i,!a){try{a=await this._getNegotiationResponse(e)}catch(e){return Promise.reject(e)}o=this._createConnectUrl(e,a.connectionToken)}try{return await this._startTransport(o,r),void(this.connectionId=a.connectionId)}catch(e){if(this._logger.log(Ve.Error,`Failed to start the transport '${n.transport}': ${e}`),a=void 0,s.push(new je(`${n.transport} failed: ${e}`,Ke[n.transport])),"Connecting"!==this._connectionState){const e="Failed to select transport before stop() was called.";return this._logger.log(Ve.Debug,e),Promise.reject(new Error(e))}}}}return s.length>0?Promise.reject(new ze(`Unable to connect to the server with any of the available transports. ${s.join(" ")}`,s)):Promise.reject(new Error("None of the transports supported by the client are supported by the server."))}_constructTransport(e){switch(e){case Ke.WebSockets:if(!this._options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new vt(this._httpClient,this._accessTokenFactory,this._logger,this._options.logMessageContent,this._options.WebSocket,this._options.headers||{});case Ke.ServerSentEvents:if(!this._options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new wt(this._httpClient,this._accessTokenFactory,this._logger,this._options);case Ke.LongPolling:return new yt(this._httpClient,this._accessTokenFactory,this._logger,this._options);default:throw new Error(`Unknown transport: ${e}.`)}}_startTransport(e,t){return this.transport.onreceive=this.onreceive,this.transport.onclose=e=>this._stopConnection(e),this.transport.connect(e,t)}_resolveTransportOrError(e,t,n){const r=Ke[e.transport];if(null==r)return this._logger.log(Ve.Debug,`Skipping transport '${e.transport}' because it is not supported by this client.`),new Error(`Skipping transport '${e.transport}' because it is not supported by this client.`);if(!function(e,t){return!e||0!=(t&e)}(t,r))return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it was disabled by the client.`),new He(`'${Ke[r]}' is disabled by the client.`,r);if(!(e.transferFormats.map((e=>Xe[e])).indexOf(n)>=0))return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it does not support the requested transfer format '${Xe[n]}'.`),new Error(`'${Ke[r]}' does not support ${Xe[n]}.`);if(r===Ke.WebSockets&&!this._options.WebSocket||r===Ke.ServerSentEvents&&!this._options.EventSource)return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it is not supported in your environment.'`),new Fe(`'${Ke[r]}' is not supported in your environment.`,r);this._logger.log(Ve.Debug,`Selecting transport '${Ke[r]}'.`);try{return this._constructTransport(r)}catch(e){return e}}_isITransport(e){return e&&"object"==typeof e&&"connect"in e}_stopConnection(e){if(this._logger.log(Ve.Debug,`HttpConnection.stopConnection(${e}) called while in state ${this._connectionState}.`),this.transport=void 0,e=this._stopError||e,this._stopError=void 0,"Disconnected"!==this._connectionState){if("Connecting"===this._connectionState)throw this._logger.log(Ve.Warning,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is still in the connecting state.`),new Error(`HttpConnection.stopConnection(${e}) was called while the connection is still in the connecting state.`);if("Disconnecting"===this._connectionState&&this._stopPromiseResolver(),e?this._logger.log(Ve.Error,`Connection disconnected with error '${e}'.`):this._logger.log(Ve.Information,"Connection disconnected."),this._sendQueue&&(this._sendQueue.stop().catch((e=>{this._logger.log(Ve.Error,`TransportSendQueue.stop() threw error '${e}'.`)})),this._sendQueue=void 0),this.connectionId=void 0,this._connectionState="Disconnected",this._connectionStarted){this._connectionStarted=!1;try{this.onclose&&this.onclose(e)}catch(t){this._logger.log(Ve.Error,`HttpConnection.onclose(${e}) threw error '${t}'.`)}}}else this._logger.log(Ve.Debug,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is already in the disconnected state.`)}_resolveUrl(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!et.isBrowser)throw new Error(`Cannot resolve '${e}'.`);const t=window.document.createElement("a");return t.href=e,this._logger.log(Ve.Information,`Normalizing '${e}' to '${t.href}'.`),t.href}_resolveNegotiateUrl(e){const t=e.indexOf("?");let n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",n+=-1===t?"":e.substring(t),-1===n.indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this._negotiateVersion),n}}class _t{constructor(e){this._transport=e,this._buffer=[],this._executing=!0,this._sendBufferedData=new Et,this._transportResult=new Et,this._sendLoopPromise=this._sendLoop()}send(e){return this._bufferData(e),this._transportResult||(this._transportResult=new Et),this._transportResult.promise}stop(){return this._executing=!1,this._sendBufferedData.resolve(),this._sendLoopPromise}_bufferData(e){if(this._buffer.length&&typeof this._buffer[0]!=typeof e)throw new Error(`Expected data to be of type ${typeof this._buffer} but was of type ${typeof e}`);this._buffer.push(e),this._sendBufferedData.resolve()}async _sendLoop(){for(;;){if(await this._sendBufferedData.promise,!this._executing){this._transportResult&&this._transportResult.reject("Connection stopped.");break}this._sendBufferedData=new Et;const e=this._transportResult;this._transportResult=void 0;const t="string"==typeof this._buffer[0]?this._buffer.join(""):_t._concatBuffers(this._buffer);this._buffer.length=0;try{await this._transport.send(t),e.resolve()}catch(t){e.reject(t)}}}static _concatBuffers(e){const t=e.map((e=>e.byteLength)).reduce(((e,t)=>e+t)),n=new Uint8Array(t);let r=0;for(const t of e)n.set(new Uint8Array(t),r),r+=t.byteLength;return n.buffer}}class Et{constructor(){this.promise=new Promise(((e,t)=>[this._resolver,this._rejecter]=[e,t]))}resolve(){this._resolver()}reject(e){this._rejecter(e)}}class St{static write(e){return`${e}${St.RecordSeparator}`}static parse(e){if(e[e.length-1]!==St.RecordSeparator)throw new Error("Message is incomplete.");const t=e.split(St.RecordSeparator);return t.pop(),t}}St.RecordSeparatorCode=30,St.RecordSeparator=String.fromCharCode(St.RecordSeparatorCode);class Ct{writeHandshakeRequest(e){return St.write(JSON.stringify(e))}parseHandshakeResponse(e){let t,n;if(nt(e)){const r=new Uint8Array(e),o=r.indexOf(St.RecordSeparatorCode);if(-1===o)throw new Error("Message is incomplete.");const s=o+1;t=String.fromCharCode.apply(null,Array.prototype.slice.call(r.slice(0,s))),n=r.byteLength>s?r.slice(s).buffer:null}else{const r=e,o=r.indexOf(St.RecordSeparator);if(-1===o)throw new Error("Message is incomplete.");const s=o+1;t=r.substring(0,s),n=r.length>s?r.substring(s):null}const r=St.parse(t),o=JSON.parse(r[0]);if(o.type)throw new Error("Expected a handshake response from the server.");return[n,o]}}!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(Ye||(Ye={}));class It{constructor(){this.observers=[]}next(e){for(const t of this.observers)t.next(e)}error(e){for(const t of this.observers)t.error&&t.error(e)}complete(){for(const e of this.observers)e.complete&&e.complete()}subscribe(e){return this.observers.push(e),new ot(this,e)}}!function(e){e.Disconnected="Disconnected",e.Connecting="Connecting",e.Connected="Connected",e.Disconnecting="Disconnecting",e.Reconnecting="Reconnecting"}(Ge||(Ge={}));class kt{constructor(e,t,n,r){this._nextKeepAlive=0,this._freezeEventListener=()=>{this._logger.log(Ve.Warning,"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://docs.microsoft.com/aspnet/core/signalr/javascript-client#bsleep")},Ze.isRequired(e,"connection"),Ze.isRequired(t,"logger"),Ze.isRequired(n,"protocol"),this.serverTimeoutInMilliseconds=3e4,this.keepAliveIntervalInMilliseconds=15e3,this._logger=t,this._protocol=n,this.connection=e,this._reconnectPolicy=r,this._handshakeProtocol=new Ct,this.connection.onreceive=e=>this._processIncomingData(e),this.connection.onclose=e=>this._connectionClosed(e),this._callbacks={},this._methods={},this._closedCallbacks=[],this._reconnectingCallbacks=[],this._reconnectedCallbacks=[],this._invocationId=0,this._receivedHandshakeResponse=!1,this._connectionState=Ge.Disconnected,this._connectionStarted=!1,this._cachedPingMessage=this._protocol.writeMessage({type:Ye.Ping})}static create(e,t,n,r){return new kt(e,t,n,r)}get state(){return this._connectionState}get connectionId(){return this.connection&&this.connection.connectionId||null}get baseUrl(){return this.connection.baseUrl||""}set baseUrl(e){if(this._connectionState!==Ge.Disconnected&&this._connectionState!==Ge.Reconnecting)throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url.");if(!e)throw new Error("The HubConnection url must be a valid url.");this.connection.baseUrl=e}start(){return this._startPromise=this._startWithStateTransitions(),this._startPromise}async _startWithStateTransitions(){if(this._connectionState!==Ge.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this._connectionState=Ge.Connecting,this._logger.log(Ve.Debug,"Starting HubConnection.");try{await this._startInternal(),et.isBrowser&&window.document.addEventListener("freeze",this._freezeEventListener),this._connectionState=Ge.Connected,this._connectionStarted=!0,this._logger.log(Ve.Debug,"HubConnection connected successfully.")}catch(e){return this._connectionState=Ge.Disconnected,this._logger.log(Ve.Debug,`HubConnection failed to start successfully because of error '${e}'.`),Promise.reject(e)}}async _startInternal(){this._stopDuringStartError=void 0,this._receivedHandshakeResponse=!1;const e=new Promise(((e,t)=>{this._handshakeResolver=e,this._handshakeRejecter=t}));await this.connection.start(this._protocol.transferFormat);try{const t={protocol:this._protocol.name,version:this._protocol.version};if(this._logger.log(Ve.Debug,"Sending handshake request."),await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(t)),this._logger.log(Ve.Information,`Using HubProtocol '${this._protocol.name}'.`),this._cleanupTimeout(),this._resetTimeoutPeriod(),this._resetKeepAliveInterval(),await e,this._stopDuringStartError)throw this._stopDuringStartError}catch(e){throw this._logger.log(Ve.Debug,`Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`),this._cleanupTimeout(),this._cleanupPingTimer(),await this.connection.stop(e),e}}async stop(){const e=this._startPromise;this._stopPromise=this._stopInternal(),await this._stopPromise;try{await e}catch(e){}}_stopInternal(e){return this._connectionState===Ge.Disconnected?(this._logger.log(Ve.Debug,`Call to HubConnection.stop(${e}) ignored because it is already in the disconnected state.`),Promise.resolve()):this._connectionState===Ge.Disconnecting?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState=Ge.Disconnecting,this._logger.log(Ve.Debug,"Stopping HubConnection."),this._reconnectDelayHandle?(this._logger.log(Ve.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this._reconnectDelayHandle),this._reconnectDelayHandle=void 0,this._completeClose(),Promise.resolve()):(this._cleanupTimeout(),this._cleanupPingTimer(),this._stopDuringStartError=e||new Error("The connection was stopped before the hub handshake could complete."),this.connection.stop(e)))}stream(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createStreamInvocation(e,t,r);let s;const i=new It;return i.cancelCallback=()=>{const e=this._createCancelInvocation(o.invocationId);return delete this._callbacks[o.invocationId],s.then((()=>this._sendWithProtocol(e)))},this._callbacks[o.invocationId]=(e,t)=>{t?i.error(t):e&&(e.type===Ye.Completion?e.error?i.error(new Error(e.error)):i.complete():i.next(e.item))},s=this._sendWithProtocol(o).catch((e=>{i.error(e),delete this._callbacks[o.invocationId]})),this._launchStreams(n,s),i}_sendMessage(e){return this._resetKeepAliveInterval(),this.connection.send(e)}_sendWithProtocol(e){return this._sendMessage(this._protocol.writeMessage(e))}send(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._sendWithProtocol(this._createInvocation(e,t,!0,r));return this._launchStreams(n,o),o}invoke(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createInvocation(e,t,!1,r);return new Promise(((e,t)=>{this._callbacks[o.invocationId]=(n,r)=>{r?t(r):n&&(n.type===Ye.Completion?n.error?t(new Error(n.error)):e(n.result):t(new Error(`Unexpected message type: ${n.type}`)))};const r=this._sendWithProtocol(o).catch((e=>{t(e),delete this._callbacks[o.invocationId]}));this._launchStreams(n,r)}))}on(e,t){e&&t&&(e=e.toLowerCase(),this._methods[e]||(this._methods[e]=[]),-1===this._methods[e].indexOf(t)&&this._methods[e].push(t))}off(e,t){if(!e)return;e=e.toLowerCase();const n=this._methods[e];if(n)if(t){const r=n.indexOf(t);-1!==r&&(n.splice(r,1),0===n.length&&delete this._methods[e])}else delete this._methods[e]}onclose(e){e&&this._closedCallbacks.push(e)}onreconnecting(e){e&&this._reconnectingCallbacks.push(e)}onreconnected(e){e&&this._reconnectedCallbacks.push(e)}_processIncomingData(e){if(this._cleanupTimeout(),this._receivedHandshakeResponse||(e=this._processHandshakeResponse(e),this._receivedHandshakeResponse=!0),e){const t=this._protocol.parseMessages(e,this._logger);for(const e of t)switch(e.type){case Ye.Invocation:this._invokeClientMethod(e);break;case Ye.StreamItem:case Ye.Completion:{const t=this._callbacks[e.invocationId];if(t){e.type===Ye.Completion&&delete this._callbacks[e.invocationId];try{t(e)}catch(e){this._logger.log(Ve.Error,`Stream callback threw error: ${ht(e)}`)}}break}case Ye.Ping:break;case Ye.Close:{this._logger.log(Ve.Information,"Close message received from server.");const t=e.error?new Error("Server returned an error on close: "+e.error):void 0;!0===e.allowReconnect?this.connection.stop(t):this._stopPromise=this._stopInternal(t);break}default:this._logger.log(Ve.Warning,`Invalid message type: ${e.type}.`)}}this._resetTimeoutPeriod()}_processHandshakeResponse(e){let t,n;try{[n,t]=this._handshakeProtocol.parseHandshakeResponse(e)}catch(e){const t="Error parsing handshake response: "+e;this._logger.log(Ve.Error,t);const n=new Error(t);throw this._handshakeRejecter(n),n}if(t.error){const e="Server returned handshake error: "+t.error;this._logger.log(Ve.Error,e);const n=new Error(e);throw this._handshakeRejecter(n),n}return this._logger.log(Ve.Debug,"Server handshake complete."),this._handshakeResolver(),n}_resetKeepAliveInterval(){this.connection.features.inherentKeepAlive||(this._nextKeepAlive=(new Date).getTime()+this.keepAliveIntervalInMilliseconds,this._cleanupPingTimer())}_resetTimeoutPeriod(){if(!(this.connection.features&&this.connection.features.inherentKeepAlive||(this._timeoutHandle=setTimeout((()=>this.serverTimeout()),this.serverTimeoutInMilliseconds),void 0!==this._pingServerHandle))){let e=this._nextKeepAlive-(new Date).getTime();e<0&&(e=0),this._pingServerHandle=setTimeout((async()=>{if(this._connectionState===Ge.Connected)try{await this._sendMessage(this._cachedPingMessage)}catch{this._cleanupPingTimer()}}),e)}}serverTimeout(){this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."))}_invokeClientMethod(e){const t=this._methods[e.target.toLowerCase()];if(t){try{t.forEach((t=>t.apply(this,e.arguments)))}catch(t){this._logger.log(Ve.Error,`A callback for the method ${e.target.toLowerCase()} threw error '${t}'.`)}if(e.invocationId){const e="Server requested a response, which is not supported in this version of the client.";this._logger.log(Ve.Error,e),this._stopPromise=this._stopInternal(new Error(e))}}else this._logger.log(Ve.Warning,`No client method with the name '${e.target}' found.`)}_connectionClosed(e){this._logger.log(Ve.Debug,`HubConnection.connectionClosed(${e}) called while in state ${this._connectionState}.`),this._stopDuringStartError=this._stopDuringStartError||e||new Error("The underlying connection was closed before the hub handshake could complete."),this._handshakeResolver&&this._handshakeResolver(),this._cancelCallbacksWithError(e||new Error("Invocation canceled due to the underlying connection being closed.")),this._cleanupTimeout(),this._cleanupPingTimer(),this._connectionState===Ge.Disconnecting?this._completeClose(e):this._connectionState===Ge.Connected&&this._reconnectPolicy?this._reconnect(e):this._connectionState===Ge.Connected&&this._completeClose(e)}_completeClose(e){if(this._connectionStarted){this._connectionState=Ge.Disconnected,this._connectionStarted=!1,et.isBrowser&&window.document.removeEventListener("freeze",this._freezeEventListener);try{this._closedCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(Ve.Error,`An onclose callback called with error '${e}' threw error '${t}'.`)}}}async _reconnect(e){const t=Date.now();let n=0,r=void 0!==e?e:new Error("Attempting to reconnect due to a unknown error."),o=this._getNextRetryDelay(n++,0,r);if(null===o)return this._logger.log(Ve.Debug,"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."),void this._completeClose(e);if(this._connectionState=Ge.Reconnecting,e?this._logger.log(Ve.Information,`Connection reconnecting because of error '${e}'.`):this._logger.log(Ve.Information,"Connection reconnecting."),0!==this._reconnectingCallbacks.length){try{this._reconnectingCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(Ve.Error,`An onreconnecting callback called with error '${e}' threw error '${t}'.`)}if(this._connectionState!==Ge.Reconnecting)return void this._logger.log(Ve.Debug,"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.")}for(;null!==o;){if(this._logger.log(Ve.Information,`Reconnect attempt number ${n} will start in ${o} ms.`),await new Promise((e=>{this._reconnectDelayHandle=setTimeout(e,o)})),this._reconnectDelayHandle=void 0,this._connectionState!==Ge.Reconnecting)return void this._logger.log(Ve.Debug,"Connection left the reconnecting state during reconnect delay. Done reconnecting.");try{if(await this._startInternal(),this._connectionState=Ge.Connected,this._logger.log(Ve.Information,"HubConnection reconnected successfully."),0!==this._reconnectedCallbacks.length)try{this._reconnectedCallbacks.forEach((e=>e.apply(this,[this.connection.connectionId])))}catch(e){this._logger.log(Ve.Error,`An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`)}return}catch(e){if(this._logger.log(Ve.Information,`Reconnect attempt failed because of error '${e}'.`),this._connectionState!==Ge.Reconnecting)return this._logger.log(Ve.Debug,`Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`),void(this._connectionState===Ge.Disconnecting&&this._completeClose());r=e instanceof Error?e:new Error(e.toString()),o=this._getNextRetryDelay(n++,Date.now()-t,r)}}this._logger.log(Ve.Information,`Reconnect retries have been exhausted after ${Date.now()-t} ms and ${n} failed attempts. Connection disconnecting.`),this._completeClose()}_getNextRetryDelay(e,t,n){try{return this._reconnectPolicy.nextRetryDelayInMilliseconds({elapsedMilliseconds:t,previousRetryCount:e,retryReason:n})}catch(n){return this._logger.log(Ve.Error,`IRetryPolicy.nextRetryDelayInMilliseconds(${e}, ${t}) threw error '${n}'.`),null}}_cancelCallbacksWithError(e){const t=this._callbacks;this._callbacks={},Object.keys(t).forEach((n=>{const r=t[n];try{r(null,e)}catch(t){this._logger.log(Ve.Error,`Stream 'error' callback called with '${e}' threw error: ${ht(t)}`)}}))}_cleanupPingTimer(){this._pingServerHandle&&(clearTimeout(this._pingServerHandle),this._pingServerHandle=void 0)}_cleanupTimeout(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}_createInvocation(e,t,n,r){if(n)return 0!==r.length?{arguments:t,streamIds:r,target:e,type:Ye.Invocation}:{arguments:t,target:e,type:Ye.Invocation};{const n=this._invocationId;return this._invocationId++,0!==r.length?{arguments:t,invocationId:n.toString(),streamIds:r,target:e,type:Ye.Invocation}:{arguments:t,invocationId:n.toString(),target:e,type:Ye.Invocation}}}_launchStreams(e,t){if(0!==e.length){t||(t=Promise.resolve());for(const n in e)e[n].subscribe({complete:()=>{t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n))))},error:e=>{let r;r=e instanceof Error?e.message:e&&e.toString?e.toString():"Unknown error",t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n,r))))},next:e=>{t=t.then((()=>this._sendWithProtocol(this._createStreamItemMessage(n,e))))}})}}_replaceStreamingParams(e){const t=[],n=[];for(let r=0;r=55296&&o<=56319&&r65535&&(h-=65536,s.push(h>>>10&1023|55296),h=56320|1023&h),s.push(h)}else s.push(a);s.length>=4096&&(i+=String.fromCharCode.apply(String,s),s.length=0)}return s.length>0&&(i+=String.fromCharCode.apply(String,s)),i}var Ot,Ft=At?new TextDecoder:null,Ht=At?"undefined"!=typeof process&&"force"!==process.env.TEXT_DECODER?200:0:Rt,jt=function(e,t){this.type=e,this.data=t},Wt=(Ot=function(e,t){return(Ot=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Ot(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),zt=function(e){function t(n){var r=e.call(this,n)||this,o=Object.create(t.prototype);return Object.setPrototypeOf(r,o),Object.defineProperty(r,"name",{configurable:!0,enumerable:!1,value:t.name}),r}return Wt(t,e),t}(Error),Jt={type:-1,encode:function(e){var t,n,r,o;return e instanceof Date?function(e){var t,n=e.sec,r=e.nsec;if(n>=0&&r>=0&&n<=17179869183){if(0===r&&n<=4294967295){var o=new Uint8Array(4);return(t=new DataView(o.buffer)).setUint32(0,n),o}var s=n/4294967296,i=4294967295&n;return o=new Uint8Array(8),(t=new DataView(o.buffer)).setUint32(0,r<<2|3&s),t.setUint32(4,i),o}return o=new Uint8Array(12),(t=new DataView(o.buffer)).setUint32(0,r),Pt(t,4,n),o}((r=1e6*((t=e.getTime())-1e3*(n=Math.floor(t/1e3))),{sec:n+(o=Math.floor(r/1e9)),nsec:r-1e9*o})):null},decode:function(e){var t=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:var n=t.getUint32(0);return{sec:4294967296*(3&n)+t.getUint32(4),nsec:n>>>2};case 12:return{sec:Ut(t,4),nsec:t.getUint32(0)};default:throw new zt("Unrecognized data size for timestamp (expected 4, 8, or 12): "+e.length)}}(e);return new Date(1e3*t.sec+t.nsec/1e6)}},qt=function(){function e(){this.builtInEncoders=[],this.builtInDecoders=[],this.encoders=[],this.decoders=[],this.register(Jt)}return e.prototype.register=function(e){var t=e.type,n=e.encode,r=e.decode;if(t>=0)this.encoders[t]=n,this.decoders[t]=r;else{var o=1+t;this.builtInEncoders[o]=n,this.builtInDecoders[o]=r}},e.prototype.tryToEncode=function(e,t){for(var n=0;nthis.maxDepth)throw new Error("Too deep objects in depth "+t);null==e?this.encodeNil():"boolean"==typeof e?this.encodeBoolean(e):"number"==typeof e?this.encodeNumber(e):"string"==typeof e?this.encodeString(e):this.encodeObject(e,t)},e.prototype.ensureBufferSizeToWrite=function(e){var t=this.pos+e;this.view.byteLength=0?e<128?this.writeU8(e):e<256?(this.writeU8(204),this.writeU8(e)):e<65536?(this.writeU8(205),this.writeU16(e)):e<4294967296?(this.writeU8(206),this.writeU32(e)):(this.writeU8(207),this.writeU64(e)):e>=-32?this.writeU8(224|e+32):e>=-128?(this.writeU8(208),this.writeI8(e)):e>=-32768?(this.writeU8(209),this.writeI16(e)):e>=-2147483648?(this.writeU8(210),this.writeI32(e)):(this.writeU8(211),this.writeI64(e)):this.forceFloat32?(this.writeU8(202),this.writeF32(e)):(this.writeU8(203),this.writeF64(e))},e.prototype.writeStringHeader=function(e){if(e<32)this.writeU8(160+e);else if(e<256)this.writeU8(217),this.writeU8(e);else if(e<65536)this.writeU8(218),this.writeU16(e);else{if(!(e<4294967296))throw new Error("Too long string: "+e+" bytes in UTF-8");this.writeU8(219),this.writeU32(e)}},e.prototype.encodeString=function(e){if(e.length>Bt){var t=Nt(e);this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),Lt(e,this.bytes,this.pos),this.pos+=t}else t=Nt(e),this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),function(e,t,n){for(var r=e.length,o=n,s=0;s>6&31|192;else{if(i>=55296&&i<=56319&&s>12&15|224,t[o++]=i>>6&63|128):(t[o++]=i>>18&7|240,t[o++]=i>>12&63|128,t[o++]=i>>6&63|128)}t[o++]=63&i|128}else t[o++]=i}}(e,this.bytes,this.pos),this.pos+=t},e.prototype.encodeObject=function(e,t){var n=this.extensionCodec.tryToEncode(e,this.context);if(null!=n)this.encodeExtension(n);else if(Array.isArray(e))this.encodeArray(e,t);else if(ArrayBuffer.isView(e))this.encodeBinary(e);else{if("object"!=typeof e)throw new Error("Unrecognized object: "+Object.prototype.toString.apply(e));this.encodeMap(e,t)}},e.prototype.encodeBinary=function(e){var t=e.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else{if(!(t<4294967296))throw new Error("Too large binary: "+t);this.writeU8(198),this.writeU32(t)}var n=Vt(e);this.writeU8a(n)},e.prototype.encodeArray=function(e,t){var n=e.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else{if(!(n<4294967296))throw new Error("Too large array: "+n);this.writeU8(221),this.writeU32(n)}for(var r=0,o=e;r0&&e<=this.maxKeyLength},e.prototype.find=function(e,t,n){e:for(var r=0,o=this.caches[n-1];r=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)},e.prototype.decode=function(e,t,n){var r=this.find(e,t,n);if(null!=r)return this.hit++,r;this.miss++;var o=Mt(e,t,n),s=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(s,o),o},e}(),Gt=function(e,t){var n,r,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]1||a(e,t)}))})}function a(e,t){try{(n=o[e](t)).value instanceof Zt?Promise.resolve(n.value.v).then(c,l):h(s[0][2],n)}catch(e){h(s[0][3],e)}var n}function c(e){a("next",e)}function l(e){a("throw",e)}function h(e,t){e(t),s.shift(),s.length&&a(s[0][0],s[0][1])}},tn=new DataView(new ArrayBuffer(0)),nn=new Uint8Array(tn.buffer),rn=function(){try{tn.getInt8(0)}catch(e){return e.constructor}throw new Error("never reached")}(),on=new rn("Insufficient data"),sn=new Yt,an=function(){function e(e,t,n,r,o,s,i,a){void 0===e&&(e=qt.defaultCodec),void 0===t&&(t=void 0),void 0===n&&(n=Rt),void 0===r&&(r=Rt),void 0===o&&(o=Rt),void 0===s&&(s=Rt),void 0===i&&(i=Rt),void 0===a&&(a=sn),this.extensionCodec=e,this.context=t,this.maxStrLength=n,this.maxBinLength=r,this.maxArrayLength=o,this.maxMapLength=s,this.maxExtLength=i,this.keyDecoder=a,this.totalPos=0,this.pos=0,this.view=tn,this.bytes=nn,this.headByte=-1,this.stack=[]}return e.prototype.reinitializeState=function(){this.totalPos=0,this.headByte=-1,this.stack.length=0},e.prototype.setBuffer=function(e){this.bytes=Vt(e),this.view=function(e){if(e instanceof ArrayBuffer)return new DataView(e);var t=Vt(e);return new DataView(t.buffer,t.byteOffset,t.byteLength)}(this.bytes),this.pos=0},e.prototype.appendBuffer=function(e){if(-1!==this.headByte||this.hasRemaining(1)){var t=this.bytes.subarray(this.pos),n=Vt(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}else this.setBuffer(e)},e.prototype.hasRemaining=function(e){return this.view.byteLength-this.pos>=e},e.prototype.createExtraByteError=function(e){var t=this.view,n=this.pos;return new RangeError("Extra "+(t.byteLength-n)+" of "+t.byteLength+" byte(s) found at buffer["+e+"]")},e.prototype.decode=function(e){this.reinitializeState(),this.setBuffer(e);var t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t},e.prototype.decodeMulti=function(e){return Gt(this,(function(t){switch(t.label){case 0:this.reinitializeState(),this.setBuffer(e),t.label=1;case 1:return this.hasRemaining(1)?[4,this.doDecodeSync()]:[3,3];case 2:return t.sent(),[3,1];case 3:return[2]}}))},e.prototype.decodeAsync=function(e){var t,n,r,o,s,i,a;return s=this,void 0,a=function(){var s,i,a,c,l,h,u,d;return Gt(this,(function(p){switch(p.label){case 0:s=!1,p.label=1;case 1:p.trys.push([1,6,7,12]),t=Qt(e),p.label=2;case 2:return[4,t.next()];case 3:if((n=p.sent()).done)return[3,5];if(a=n.value,s)throw this.createExtraByteError(this.totalPos);this.appendBuffer(a);try{i=this.doDecodeSync(),s=!0}catch(e){if(!(e instanceof rn))throw e}this.totalPos+=this.pos,p.label=4;case 4:return[3,2];case 5:return[3,12];case 6:return c=p.sent(),r={error:c},[3,12];case 7:return p.trys.push([7,,10,11]),n&&!n.done&&(o=t.return)?[4,o.call(t)]:[3,9];case 8:p.sent(),p.label=9;case 9:return[3,11];case 10:if(r)throw r.error;return[7];case 11:return[7];case 12:if(s){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return[2,i]}throw h=(l=this).headByte,u=l.pos,d=l.totalPos,new RangeError("Insufficient data in parsing "+Xt(h)+" at "+d+" ("+u+" in the current buffer)")}}))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{o(a.next(e))}catch(e){t(e)}}function r(e){try{o(a.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,r)}o((a=a.apply(s,[])).next())}))},e.prototype.decodeArrayStream=function(e){return this.decodeMultiAsync(e,!0)},e.prototype.decodeStream=function(e){return this.decodeMultiAsync(e,!1)},e.prototype.decodeMultiAsync=function(e,t){return en(this,arguments,(function(){var n,r,o,s,i,a,c,l,h;return Gt(this,(function(u){switch(u.label){case 0:n=t,r=-1,u.label=1;case 1:u.trys.push([1,13,14,19]),o=Qt(e),u.label=2;case 2:return[4,Zt(o.next())];case 3:if((s=u.sent()).done)return[3,12];if(i=s.value,t&&0===r)throw this.createExtraByteError(this.totalPos);this.appendBuffer(i),n&&(r=this.readArraySize(),n=!1,this.complete()),u.label=4;case 4:u.trys.push([4,9,,10]),u.label=5;case 5:return[4,Zt(this.doDecodeSync())];case 6:return[4,u.sent()];case 7:return u.sent(),0==--r?[3,8]:[3,5];case 8:return[3,10];case 9:if(!((a=u.sent())instanceof rn))throw a;return[3,10];case 10:this.totalPos+=this.pos,u.label=11;case 11:return[3,2];case 12:return[3,19];case 13:return c=u.sent(),l={error:c},[3,19];case 14:return u.trys.push([14,,17,18]),s&&!s.done&&(h=o.return)?[4,Zt(h.call(o))]:[3,16];case 15:u.sent(),u.label=16;case 16:return[3,18];case 17:if(l)throw l.error;return[7];case 18:return[7];case 19:return[2]}}))}))},e.prototype.doDecodeSync=function(){e:for(;;){var e=this.readHeadByte(),t=void 0;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){if(0!=(r=e-128)){this.pushMapState(r),this.complete();continue e}t={}}else if(e<160){if(0!=(r=e-144)){this.pushArrayState(r),this.complete();continue e}t=[]}else{var n=e-160;t=this.decodeUtf8String(n,0)}else if(192===e)t=null;else if(194===e)t=!1;else if(195===e)t=!0;else if(202===e)t=this.readF32();else if(203===e)t=this.readF64();else if(204===e)t=this.readU8();else if(205===e)t=this.readU16();else if(206===e)t=this.readU32();else if(207===e)t=this.readU64();else if(208===e)t=this.readI8();else if(209===e)t=this.readI16();else if(210===e)t=this.readI32();else if(211===e)t=this.readI64();else if(217===e)n=this.lookU8(),t=this.decodeUtf8String(n,1);else if(218===e)n=this.lookU16(),t=this.decodeUtf8String(n,2);else if(219===e)n=this.lookU32(),t=this.decodeUtf8String(n,4);else if(220===e){if(0!==(r=this.readU16())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(221===e){if(0!==(r=this.readU32())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(222===e){if(0!==(r=this.readU16())){this.pushMapState(r),this.complete();continue e}t={}}else if(223===e){if(0!==(r=this.readU32())){this.pushMapState(r),this.complete();continue e}t={}}else if(196===e){var r=this.lookU8();t=this.decodeBinary(r,1)}else if(197===e)r=this.lookU16(),t=this.decodeBinary(r,2);else if(198===e)r=this.lookU32(),t=this.decodeBinary(r,4);else if(212===e)t=this.decodeExtension(1,0);else if(213===e)t=this.decodeExtension(2,0);else if(214===e)t=this.decodeExtension(4,0);else if(215===e)t=this.decodeExtension(8,0);else if(216===e)t=this.decodeExtension(16,0);else if(199===e)r=this.lookU8(),t=this.decodeExtension(r,1);else if(200===e)r=this.lookU16(),t=this.decodeExtension(r,2);else{if(201!==e)throw new zt("Unrecognized type byte: "+Xt(e));r=this.lookU32(),t=this.decodeExtension(r,4)}this.complete();for(var o=this.stack;o.length>0;){var s=o[o.length-1];if(0===s.type){if(s.array[s.position]=t,s.position++,s.position!==s.size)continue e;o.pop(),t=s.array}else{if(1===s.type){if("string"!=(i=typeof t)&&"number"!==i)throw new zt("The type of key must be string or number but "+typeof t);if("__proto__"===t)throw new zt("The key __proto__ is not allowed");s.key=t,s.type=2;continue e}if(s.map[s.key]=t,s.readCount++,s.readCount!==s.size){s.key=null,s.type=1;continue e}o.pop(),t=s.map}}return t}var i},e.prototype.readHeadByte=function(){return-1===this.headByte&&(this.headByte=this.readU8()),this.headByte},e.prototype.complete=function(){this.headByte=-1},e.prototype.readArraySize=function(){var e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new zt("Unrecognized array type byte: "+Xt(e))}},e.prototype.pushMapState=function(e){if(e>this.maxMapLength)throw new zt("Max length exceeded: map length ("+e+") > maxMapLengthLength ("+this.maxMapLength+")");this.stack.push({type:1,size:e,key:null,readCount:0,map:{}})},e.prototype.pushArrayState=function(e){if(e>this.maxArrayLength)throw new zt("Max length exceeded: array length ("+e+") > maxArrayLength ("+this.maxArrayLength+")");this.stack.push({type:0,size:e,array:new Array(e),position:0})},e.prototype.decodeUtf8String=function(e,t){var n;if(e>this.maxStrLength)throw new zt("Max length exceeded: UTF-8 byte length ("+e+") > maxStrLength ("+this.maxStrLength+")");if(this.bytes.byteLengthHt?function(e,t,n){var r=e.subarray(t,t+n);return Ft.decode(r)}(this.bytes,o,e):Mt(this.bytes,o,e),this.pos+=t+e,r},e.prototype.stateIsMapKey=function(){return this.stack.length>0&&1===this.stack[this.stack.length-1].type},e.prototype.decodeBinary=function(e,t){if(e>this.maxBinLength)throw new zt("Max length exceeded: bin length ("+e+") > maxBinLength ("+this.maxBinLength+")");if(!this.hasRemaining(e+t))throw on;var n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r},e.prototype.decodeExtension=function(e,t){if(e>this.maxExtLength)throw new zt("Max length exceeded: ext length ("+e+") > maxExtLength ("+this.maxExtLength+")");var n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)},e.prototype.lookU8=function(){return this.view.getUint8(this.pos)},e.prototype.lookU16=function(){return this.view.getUint16(this.pos)},e.prototype.lookU32=function(){return this.view.getUint32(this.pos)},e.prototype.readU8=function(){var e=this.view.getUint8(this.pos);return this.pos++,e},e.prototype.readI8=function(){var e=this.view.getInt8(this.pos);return this.pos++,e},e.prototype.readU16=function(){var e=this.view.getUint16(this.pos);return this.pos+=2,e},e.prototype.readI16=function(){var e=this.view.getInt16(this.pos);return this.pos+=2,e},e.prototype.readU32=function(){var e=this.view.getUint32(this.pos);return this.pos+=4,e},e.prototype.readI32=function(){var e=this.view.getInt32(this.pos);return this.pos+=4,e},e.prototype.readU64=function(){var e,t,n=(e=this.view,t=this.pos,4294967296*e.getUint32(t)+e.getUint32(t+4));return this.pos+=8,n},e.prototype.readI64=function(){var e=Ut(this.view,this.pos);return this.pos+=8,e},e.prototype.readF32=function(){var e=this.view.getFloat32(this.pos);return this.pos+=4,e},e.prototype.readF64=function(){var e=this.view.getFloat64(this.pos);return this.pos+=8,e},e}();class cn{static write(e){let t=e.byteLength||e.length;const n=[];do{let e=127&t;t>>=7,t>0&&(e|=128),n.push(e)}while(t>0);t=e.byteLength||e.length;const r=new Uint8Array(n.length+t);return r.set(n,0),r.set(e,n.length),r.buffer}static parse(e){const t=[],n=new Uint8Array(e),r=[0,7,14,21,28];for(let o=0;o7)throw new Error("Messages bigger than 2GB are not supported.");if(!(n.byteLength>=o+i+a))throw new Error("Incomplete message.");t.push(n.slice?n.slice(o+i,o+i+a):n.subarray(o+i,o+i+a)),o=o+i+a}return t}}const ln=new Uint8Array([145,Ye.Ping]);class hn{constructor(e){this.name="messagepack",this.version=1,this.transferFormat=Xe.Binary,this._errorResult=1,this._voidResult=2,this._nonVoidResult=3,e=e||{},this._encoder=new Kt(e.extensionCodec,e.context,e.maxDepth,e.initialBufferSize,e.sortKeys,e.forceFloat32,e.ignoreUndefined,e.forceIntegerToFloat),this._decoder=new an(e.extensionCodec,e.context,e.maxStrLength,e.maxBinLength,e.maxArrayLength,e.maxMapLength,e.maxExtLength)}parseMessages(e,t){if(!(n=e)||"undefined"==typeof ArrayBuffer||!(n instanceof ArrayBuffer||n.constructor&&"ArrayBuffer"===n.constructor.name))throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer.");var n;null===t&&(t=Qe.instance);const r=cn.parse(e),o=[];for(const e of r){const n=this._parseMessage(e,t);n&&o.push(n)}return o}writeMessage(e){switch(e.type){case Ye.Invocation:return this._writeInvocation(e);case Ye.StreamInvocation:return this._writeStreamInvocation(e);case Ye.StreamItem:return this._writeStreamItem(e);case Ye.Completion:return this._writeCompletion(e);case Ye.Ping:return cn.write(ln);case Ye.CancelInvocation:return this._writeCancelInvocation(e);default:throw new Error("Invalid message type.")}}_parseMessage(e,t){if(0===e.length)throw new Error("Invalid payload.");const n=this._decoder.decode(e);if(0===n.length||!(n instanceof Array))throw new Error("Invalid payload.");const r=n[0];switch(r){case Ye.Invocation:return this._createInvocationMessage(this._readHeaders(n),n);case Ye.StreamItem:return this._createStreamItemMessage(this._readHeaders(n),n);case Ye.Completion:return this._createCompletionMessage(this._readHeaders(n),n);case Ye.Ping:return this._createPingMessage(n);case Ye.Close:return this._createCloseMessage(n);default:return t.log(Ve.Information,"Unknown message type '"+r+"' ignored."),null}}_createCloseMessage(e){if(e.length<2)throw new Error("Invalid payload for Close message.");return{allowReconnect:e.length>=3?e[2]:void 0,error:e[1],type:Ye.Close}}_createPingMessage(e){if(e.length<1)throw new Error("Invalid payload for Ping message.");return{type:Ye.Ping}}_createInvocationMessage(e,t){if(t.length<5)throw new Error("Invalid payload for Invocation message.");const n=t[2];return n?{arguments:t[4],headers:e,invocationId:n,streamIds:[],target:t[3],type:Ye.Invocation}:{arguments:t[4],headers:e,streamIds:[],target:t[3],type:Ye.Invocation}}_createStreamItemMessage(e,t){if(t.length<4)throw new Error("Invalid payload for StreamItem message.");return{headers:e,invocationId:t[2],item:t[3],type:Ye.StreamItem}}_createCompletionMessage(e,t){if(t.length<4)throw new Error("Invalid payload for Completion message.");const n=t[3];if(n!==this._voidResult&&t.length<5)throw new Error("Invalid payload for Completion message.");let r,o;switch(n){case this._errorResult:r=t[4];break;case this._nonVoidResult:o=t[4]}return{error:r,headers:e,invocationId:t[2],result:o,type:Ye.Completion}}_writeInvocation(e){let t;return t=e.streamIds?this._encoder.encode([Ye.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments,e.streamIds]):this._encoder.encode([Ye.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments]),cn.write(t.slice())}_writeStreamInvocation(e){let t;return t=e.streamIds?this._encoder.encode([Ye.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments,e.streamIds]):this._encoder.encode([Ye.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments]),cn.write(t.slice())}_writeStreamItem(e){const t=this._encoder.encode([Ye.StreamItem,e.headers||{},e.invocationId,e.item]);return cn.write(t.slice())}_writeCompletion(e){const t=e.error?this._errorResult:e.result?this._nonVoidResult:this._voidResult;let n;switch(t){case this._errorResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t,e.error]);break;case this._voidResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t]);break;case this._nonVoidResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t,e.result])}return cn.write(n.slice())}_writeCancelInvocation(e){const t=this._encoder.encode([Ye.CancelInvocation,e.headers||{},e.invocationId]);return cn.write(t.slice())}_readHeaders(e){const t=e[1];if("object"!=typeof t)throw new Error("Invalid headers.");return t}}let un=!1;async function dn(){let e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),un||(un=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}const pn="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,fn=pn?pn.decode.bind(pn):function(e){let t=0;const n=e.length,r=[],o=[];for(;t65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},gn=Math.pow(2,32),mn=Math.pow(2,21)-1;function yn(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function wn(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function vn(e,t){const n=wn(e,t+4);if(n>mn)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*gn+wn(e,t)}class bn{constructor(e){this.batchData=e;const t=new Cn(e);this.arrayRangeReader=new In(e),this.arrayBuilderSegmentReader=new kn(e),this.diffReader=new _n(e),this.editReader=new En(e,t),this.frameReader=new Sn(e,t)}updatedComponents(){return yn(this.batchData,this.batchData.length-20)}referenceFrames(){return yn(this.batchData,this.batchData.length-16)}disposedComponentIds(){return yn(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return yn(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return yn(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return yn(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return vn(this.batchData,n)}}class _n{constructor(e){this.batchDataUint8=e}componentId(e){return yn(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class En{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return yn(this.batchDataUint8,e)}siblingIndex(e){return yn(this.batchDataUint8,e+4)}newTreeIndex(e){return yn(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return yn(this.batchDataUint8,e+8)}removedAttributeName(e){const t=yn(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class Sn{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return yn(this.batchDataUint8,e)}subtreeLength(e){return yn(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return yn(this.batchDataUint8,e+8)}elementName(e){const t=yn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=yn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return vn(this.batchDataUint8,e+12)}}class Cn{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=yn(e,e.length-4)}readString(e){if(-1===e)return null;{const n=yn(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const s=e[t+o];if(n|=(127&s)<this.nextBatchId)return this.fatalError?(this.logger.log(Tn.Debug,`Received a new batch ${e} but errored out on a previous batch ${this.nextBatchId-1}`),void await n.send("OnRenderCompleted",this.nextBatchId-1,this.fatalError.toString())):void this.logger.log(Tn.Debug,`Waiting for batch ${this.nextBatchId}. Batch ${e} not processed.`);try{this.nextBatchId++,this.logger.log(Tn.Debug,`Applying batch ${e}.`),function(e,t){const n=de[e];if(!n)throw new Error(`There is no browser renderer with ID ${e}.`);const r=t.arrayRangeReader,o=t.updatedComponents(),s=r.values(o),i=r.count(o),a=t.referenceFrames(),c=r.values(a),l=t.diffReader;for(let e=0;e=this.minLevel){const n=`[${(new Date).toISOString()}] ${Tn[e]}: ${t}`;switch(e){case Tn.Critical:case Tn.Error:console.error(n);break;case Tn.Warning:console.warn(n);break;case Tn.Information:console.info(n);break;default:console.log(n)}}}}class Pn{constructor(e,t){this.circuitId=void 0,this.components=e,this.applicationState=t}reconnect(e){if(!this.circuitId)throw new Error("Circuit host not initialized.");return e.state!==Ge.Connected?Promise.resolve(!1):e.invoke("ConnectCircuit",this.circuitId)}initialize(e){if(this.circuitId)throw new Error(`Circuit host '${this.circuitId}' already initialized.`);this.circuitId=e}async startCircuit(e){if(e.state!==Ge.Connected)return!1;const t=await e.invoke("StartCircuit",ye.getBaseURI(),ye.getLocationHref(),JSON.stringify(this.components.map((e=>e.toRecord()))),this.applicationState||"");return!!t&&(this.initialize(t),!0)}resolveElement(e){const t=function(e){const t=f.get(e);if(t)return f.delete(e),t}(e);if(t)return M(t,!0);const n=Number.parseInt(e);if(!Number.isNaN(n))return function(e,t){if(!e.parentNode)throw new Error(`Comment not connected to the DOM ${e.textContent}`);const n=e.parentNode,r=M(n,!0),o=J(r);return Array.from(n.childNodes).forEach((e=>o.push(e))),e[B]=r,t&&(e[L]=t,M(t)),M(e)}(this.components[n].start,this.components[n].end);throw new Error(`Invalid sequence number or identifier '${e}'.`)}}const Un={configureSignalR:e=>{},logLevel:Tn.Warning,reconnectionOptions:{maxRetries:8,retryIntervalMilliseconds:2e4,dialogId:"components-reconnect-modal"}};class An{constructor(e,t,n,r){this.maxRetries=t,this.document=n,this.logger=r,this.addedToDom=!1,this.modal=this.document.createElement("div"),this.modal.id=e,this.maxRetries=t,this.modal.style.cssText=["position: fixed","top: 0","right: 0","bottom: 0","left: 0","z-index: 1050","display: none","overflow: hidden","background-color: #fff","opacity: 0.8","text-align: center","font-weight: bold","transition: visibility 0s linear 500ms"].join(";"),this.message=this.document.createElement("h5"),this.message.style.cssText="margin-top: 20px",this.button=this.document.createElement("button"),this.button.style.cssText="margin:5px auto 5px",this.button.textContent="Retry";const o=this.document.createElement("a");o.addEventListener("click",(()=>location.reload())),o.textContent="reload",this.reloadParagraph=this.document.createElement("p"),this.reloadParagraph.textContent="Alternatively, ",this.reloadParagraph.appendChild(o),this.modal.appendChild(this.message),this.modal.appendChild(this.button),this.modal.appendChild(this.reloadParagraph),this.loader=this.getLoader(),this.message.after(this.loader),this.button.addEventListener("click",(async()=>{this.show();try{await Ne.reconnect()||this.rejected()}catch(e){this.logger.log(Tn.Error,e),this.failed()}}))}show(){this.addedToDom||(this.addedToDom=!0,this.document.body.appendChild(this.modal)),this.modal.style.display="block",this.loader.style.display="inline-block",this.button.style.display="none",this.reloadParagraph.style.display="none",this.message.textContent="Attempting to reconnect to the server...",this.modal.style.visibility="hidden",setTimeout((()=>{this.modal.style.visibility="visible"}),0)}update(e){this.message.textContent=`Attempting to reconnect to the server: ${e} of ${this.maxRetries}`}hide(){this.modal.style.display="none"}failed(){this.button.style.display="block",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Reconnection failed. Try "),t=this.document.createElement("a");t.textContent="reloading",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page if you're unable to reconnect.");this.message.replaceChildren(e,t,n)}rejected(){this.button.style.display="none",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Could not reconnect to the server. "),t=this.document.createElement("a");t.textContent="Reload",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page to restore functionality.");this.message.replaceChildren(e,t,n)}getLoader(){const e=this.document.createElement("div");return e.style.cssText=["border: 0.3em solid #f3f3f3","border-top: 0.3em solid #3498db","border-radius: 50%","width: 2em","height: 2em","display: inline-block"].join(";"),e.animate([{transform:"rotate(0deg)"},{transform:"rotate(360deg)"}],{duration:2e3,iterations:1/0}),e}}class Nn{constructor(e,t,n){this.dialog=e,this.maxRetries=t,this.document=n,this.document=n;const r=this.document.getElementById(Nn.MaxRetriesId);r&&(r.innerText=this.maxRetries.toString())}show(){this.removeClasses(),this.dialog.classList.add(Nn.ShowClassName)}update(e){const t=this.document.getElementById(Nn.CurrentAttemptId);t&&(t.innerText=e.toString())}hide(){this.removeClasses(),this.dialog.classList.add(Nn.HideClassName)}failed(){this.removeClasses(),this.dialog.classList.add(Nn.FailedClassName)}rejected(){this.removeClasses(),this.dialog.classList.add(Nn.RejectedClassName)}removeClasses(){this.dialog.classList.remove(Nn.ShowClassName,Nn.HideClassName,Nn.FailedClassName,Nn.RejectedClassName)}}Nn.ShowClassName="components-reconnect-show",Nn.HideClassName="components-reconnect-hide",Nn.FailedClassName="components-reconnect-failed",Nn.RejectedClassName="components-reconnect-rejected",Nn.MaxRetriesId="components-reconnect-max-retries",Nn.CurrentAttemptId="components-reconnect-current-attempt";class $n{constructor(e,t,n){this._currentReconnectionProcess=null,this._logger=e,this._reconnectionDisplay=t,this._reconnectCallback=n||Ne.reconnect}onConnectionDown(e,t){if(!this._reconnectionDisplay){const t=document.getElementById(e.dialogId);this._reconnectionDisplay=t?new Nn(t,e.maxRetries,document):new An(e.dialogId,e.maxRetries,document,this._logger)}this._currentReconnectionProcess||(this._currentReconnectionProcess=new Bn(e,this._logger,this._reconnectCallback,this._reconnectionDisplay))}onConnectionUp(){this._currentReconnectionProcess&&(this._currentReconnectionProcess.dispose(),this._currentReconnectionProcess=null)}}class Bn{constructor(e,t,n,r){this.logger=t,this.reconnectCallback=n,this.isDisposed=!1,this.reconnectDisplay=r,this.reconnectDisplay.show(),this.attemptPeriodicReconnection(e)}dispose(){this.isDisposed=!0,this.reconnectDisplay.hide()}async attemptPeriodicReconnection(e){for(let t=0;tBn.MaximumFirstRetryInterval?Bn.MaximumFirstRetryInterval:e.retryIntervalMilliseconds;if(await this.delay(n),this.isDisposed)break;try{return await this.reconnectCallback()?void 0:void this.reconnectDisplay.rejected()}catch(e){this.logger.log(Tn.Error,e)}}this.reconnectDisplay.failed()}delay(e){return new Promise((t=>setTimeout(t,e)))}}Bn.MaximumFirstRetryInterval=3e3;const Ln=/^\s*Blazor-Component-State:(?[a-zA-Z0-9\+\/=]+)$/;function Mn(e){var t;if(e.nodeType===Node.COMMENT_NODE){const n=e.textContent||"",r=Ln.exec(n),o=r&&r.groups&&r.groups.state;return o&&(null===(t=e.parentNode)||void 0===t||t.removeChild(e)),o}if(!e.hasChildNodes())return;const n=e.childNodes;for(let e=0;e.*)$/);function Hn(e,t){const n=e.currentElement;if(n&&n.nodeType===Node.COMMENT_NODE&&n.textContent){const r=Fn.exec(n.textContent),o=r&&r.groups&&r.groups.descriptor;if(!o)return;try{const r=function(e){const t=JSON.parse(e),{type:n}=t;if("server"!==n&&"webassembly"!==n)throw new Error(`Invalid component type '${n}'.`);return t}(o);switch(t){case"webassembly":return function(e,t,n){const{type:r,assembly:o,typeName:s,parameterDefinitions:i,parameterValues:a,prerenderId:c}=e;if("webassembly"===r){if(!o)throw new Error("assembly must be defined when using a descriptor.");if(!s)throw new Error("typeName must be defined when using a descriptor.");if(c){const e=jn(c,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,assembly:o,typeName:s,parameterDefinitions:i&&atob(i),parameterValues:a&&atob(a),start:t,prerenderId:c,end:e}}return{type:r,assembly:o,typeName:s,parameterDefinitions:i&&atob(i),parameterValues:a&&atob(a),start:t}}}(r,n,e);case"server":return function(e,t,n){const{type:r,descriptor:o,sequence:s,prerenderId:i}=e;if("server"===r){if(!o)throw new Error("descriptor must be defined when using a descriptor.");if(void 0===s)throw new Error("sequence must be defined when using a descriptor.");if(!Number.isInteger(s))throw new Error(`Error parsing the sequence '${s}' for component '${JSON.stringify(e)}'`);if(i){const e=jn(i,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,sequence:s,descriptor:o,start:t,prerenderId:i,end:e}}return{type:r,sequence:s,descriptor:o,start:t}}}(r,n,e)}}catch(e){throw new Error(`Found malformed component comment at ${n.textContent}`)}}}function jn(e,t){for(;t.next()&&t.currentElement;){const n=t.currentElement;if(n.nodeType!==Node.COMMENT_NODE)continue;if(!n.textContent)continue;const r=Fn.exec(n.textContent),o=r&&r[1];if(o)return Wn(o,e),n}}function Wn(e,t){const n=JSON.parse(e);if(1!==Object.keys(n).length)throw new Error(`Invalid end of component comment: '${e}'`);const r=n.prerenderId;if(!r)throw new Error(`End of component comment must have a value for the prerendered property: '${e}'`);if(r!==t)throw new Error(`End of component comment prerendered property must match the start comment prerender id: '${t}', '${r}'`)}class zn{constructor(e){this.childNodes=e,this.currentIndex=-1,this.length=e.length}next(){return this.currentIndex++,this.currentIndexasync function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:s,afterStarted:i}=o;return i&&e.afterStartedCallbacks.push(i),s?s(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await C,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let Kn=!1,Xn=!1;async function Yn(e){if(Xn)throw new Error("Blazor has already started.");Xn=!0;const t=function(e){const t={...Un,...e};return e&&e.reconnectionOptions&&(t.reconnectionOptions={...Un.reconnectionOptions,...e.reconnectionOptions}),t}(e),n=await async function(e){const t=await fetch("_blazor/initializers",{method:"GET",credentials:"include",cache:"no-cache"}),n=await t.json(),r=new Vn;return await r.importInitializersAsync(n,[e]),r}(t),r=new Rn(t.logLevel);Ne.reconnect=async e=>{if(Kn)return!1;const n=e||await Gn(t,r,i);return await i.reconnect(n)?(t.reconnectionHandler.onConnectionUp(),!0):(r.log(Tn.Information,"Reconnection attempt to the circuit was rejected by the server. This may indicate that the associated state is no longer available on the server."),!1)},Ne.defaultReconnectionHandler=new $n(r),t.reconnectionHandler=t.reconnectionHandler||Ne.defaultReconnectionHandler,r.log(Tn.Information,"Starting up Blazor server-side application.");const o=function(e,t){return function(e){const t=On(e,"server"),n=[];for(let e=0;ee.sequence-t.sequence))}(e)}(document),s=Mn(document),i=new Pn(o,s||""),a=await Gn(t,r,i);if(!await i.startCircuit(a))return void r.log(Tn.Error,"Failed to start the circuit.");let c=!1;const l=()=>{if(!c){const e=new FormData,t=i.circuitId;e.append("circuitId",t),c=navigator.sendBeacon("_blazor/disconnect",e)}};Ne.disconnect=l,window.addEventListener("unload",l,{capture:!1,once:!0}),r.log(Tn.Information,"Blazor server-side application started."),n.invokeAfterStartedCallbacks(Ne)}async function Gn(t,n,r){var o,s;const i=new hn;i.name="blazorpack";const a=(new Dt).withUrl("_blazor").withHubProtocol(i);t.configureSignalR(a);const c=a.build();Ne._internal.navigationManager.listenForNavigationEvents(((e,t)=>c.send("OnLocationChanged",e,t))),c.on("JS.AttachComponent",((e,t)=>function(e,t,n,r){let o=de[0];o||(o=de[0]=new ie(0)),o.attachRootComponentToLogicalElement(n,t,!1)}(0,r.resolveElement(t),e))),c.on("JS.BeginInvokeJS",e.jsCallDispatcher.beginInvokeJSFromDotNet),c.on("JS.EndInvokeDotNet",e.jsCallDispatcher.endInvokeDotNetFromJS),c.on("JS.ReceiveByteArray",e.jsCallDispatcher.receiveByteArray),c.on("JS.BeginTransmitStream",(t=>{const n=new ReadableStream({start(e){c.stream("SendDotNetStreamToJS",t).subscribe({next:t=>e.enqueue(t),complete:()=>e.close(),error:t=>e.error(t)})}});e.jsCallDispatcher.supplyDotNetStream(t,n)}));const l=xn.getOrCreate(n);c.on("JS.RenderBatch",((e,t)=>{n.log(Tn.Debug,`Received render batch with id ${e} and ${t.byteLength} bytes.`),l.processBatch(e,t,c)})),c.onclose((e=>!Kn&&t.reconnectionHandler.onConnectionDown(t.reconnectionOptions,e))),c.on("JS.Error",(e=>{Kn=!0,Qn(c,e,n),dn()})),Ne._internal.forceCloseConnection=()=>c.stop(),Ne._internal.sendJSDataStream=(e,t,n)=>function(e,t,n,r){setTimeout((async()=>{let o=5,s=(new Date).valueOf();try{const i=t instanceof Blob?t.size:t.byteLength;let a=0,c=0;for(;a1)await e.send("ReceiveJSDataChunk",n,c,h,null);else{if(!await e.invoke("ReceiveJSDataChunk",n,c,h,null))break;const t=(new Date).valueOf(),r=t-s;s=t,o=Math.max(1,Math.round(500/Math.max(1,r)))}a+=l,c++}}catch(t){await e.send("ReceiveJSDataChunk",n,-1,null,t.toString())}}),0)}(c,e,t,n);try{await c.start()}catch(e){if(Qn(c,e,n),"FailedToNegotiateWithServerError"===e.errorType)throw e;dn(),e.innerErrors&&(e.innerErrors.some((e=>"UnsupportedTransportError"===e.errorType&&e.transport===Ke.WebSockets))?n.log(Tn.Error,"Unable to connect, please ensure you are using an updated browser that supports WebSockets."):e.innerErrors.some((e=>"FailedToStartTransportError"===e.errorType&&e.transport===Ke.WebSockets))?n.log(Tn.Error,"Unable to connect, please ensure WebSockets are available. A VPN or proxy may be blocking the connection."):e.innerErrors.some((e=>"DisabledTransportError"===e.errorType&&e.transport===Ke.LongPolling))&&n.log(Tn.Error,"Unable to initiate a SignalR connection to the server. This might be because the server is not configured to support WebSockets. For additional details, visit https://aka.ms/blazor-server-websockets-error."))}return(null===(s=null===(o=c.connection)||void 0===o?void 0:o.features)||void 0===s?void 0:s.inherentKeepAlive)&&n.log(Tn.Warning,"Failed to connect via WebSockets, using the Long Polling fallback transport. This may be due to a VPN or proxy blocking the connection. To troubleshoot this, visit https://aka.ms/blazor-server-using-fallback-long-polling."),e.attachDispatcher({beginInvokeDotNetFromJS:(e,t,n,r,o)=>{c.send("BeginInvokeDotNetFromJS",e?e.toString():null,t,n,r||0,o)},endInvokeJSFromDotNet:(e,t,n)=>{c.send("EndInvokeJSFromDotNet",e,t,n)},sendByteArray:(e,t)=>{c.send("ReceiveByteArray",e,t)}}),c}function Qn(e,t,n){n.log(Tn.Error,t),e&&e.stop()}Ne.start=Yn,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&Yn()})();
\ No newline at end of file
+(()=>{"use strict";var e,t,n,r={};r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",s="__byte[]";class i{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const a={},c={0:new i(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,h=1,u=1,d=null;function p(e){t.push(e)}function f(e){if(e&&"object"==typeof e){c[u]=new i(e);const t={[o]:u};return u++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function g(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=f(e);n.__jsObjectId=t.__jsObjectId}catch{throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function m(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function y(e,t,n,r){const o=v();if(o.invokeDotNetFromJS){const s=D(r),i=o.invokeDotNetFromJS(e,t,n,s);return i?m(i):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function w(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=h++,s=new Promise(((e,t)=>{a[o]={resolve:e,reject:t}}));try{const s=D(r);v().beginInvokeDotNetFromJS(o,e,t,n,s)}catch(e){b(o,!1,e)}return s}function v(){if(null!==d)return d;throw new Error("No .NET call dispatcher has been set.")}function b(e,t,n){if(!a.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=a[e];delete a[e],t?r.resolve(n):r.reject(n)}function _(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function E(e,t){let n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function S(e){delete c[e]}e.attachDispatcher=function(e){d=e},e.attachReviver=p,e.invokeMethod=function(e,t,...n){return y(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return w(e,t,null,n)},e.createJSObjectReference=f,e.createJSStreamReference=g,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&S(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:E,disposeJSObjectReferenceById:S,invokeJSFromDotNet:(e,t,n,r)=>{const o=T(E(e,r).apply(null,m(t)),n);return null==o?null:D(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const s=new Promise((e=>{e(E(t,o).apply(null,m(n)))}));e&&s.then((t=>v().endInvokeJSFromDotNet(e,!0,D([e,!0,T(t,r)]))),(t=>v().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,_(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?m(n):new Error(n);b(parseInt(e),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new k;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return y(null,e,this._id,t)}invokeMethodAsync(e,...t){return w(null,e,this._id,t)}dispose(){w(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,p((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(s)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new I(t.__dotNetStream)}return t}));class I{constructor(e){var t;if(r.has(e))this._streamPromise=null===(t=r.get(e))||void 0===t?void 0:t.streamPromise,r.delete(e);else{const t=new k;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class k{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function T(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return f(e);case l.JSStreamReference:return g(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let x=0;function D(e){return x=0,JSON.stringify(e,R)}function R(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){d.sendByteArray(x,t);const e={[s]:x};return x++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class o{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new o(e,t.value)}return null}}const s=new Map,i=new Map,a=[];function c(e){return s.get(e)}function l(e){const t=s.get(e);return(null==t?void 0:t.browserEventName)||e}function h(e,t){e.forEach((e=>s.set(e,t)))}function u(e){const t=[];for(let n=0;ne.selected)).map((e=>e.value))}}{const e=function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t);return{value:e?!!t.checked:t.value}}}}),h(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),h(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),h(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),h(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","dblclick"],{createEventArgs:e=>d(e)}),h(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),h(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),h(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),h(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),h(["toggle"],{createEventArgs:()=>({})});const p=["date","datetime-local","month","time","week"],f=new Map;let g,m,y=0;const w={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++y).toString();f.set(r,e);const o=await _().invokeMethodAsync("AddRootComponent",t,r),s=new b(o,m[t]);return await s.setParameters(n),s}};class v{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class b{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new v)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return _().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await _().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function _(){if(!g)throw new Error("Dynamic root components have not been enabled in this application.");return g}const E=new Map;let S;const C=new Promise((e=>{S=e}));function I(e,t,n){return T(e,t.eventHandlerId,(()=>k(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function k(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let T=(e,t,n)=>n();const x=N(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),D={submit:!0},R=N(["click","dblclick","mousedown","mousemove","mouseup"]);class P{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++P.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new U(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),s=o.getHandler(t);if(s)this.eventInfoStore.update(s.eventHandlerId,n);else{const s={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(s),o.setHandler(t,s)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,i.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let r=n.shift(),s=null,i=!1;const a=x.hasOwnProperty(e);let l=!1;for(;r;){const d=r,p=this.getEventHandlerInfosForElement(d,!1);if(p){const n=p.getHandler(e);if(n&&(h=d,u=t.type,!((h instanceof HTMLButtonElement||h instanceof HTMLInputElement||h instanceof HTMLTextAreaElement||h instanceof HTMLSelectElement)&&R.hasOwnProperty(u)&&h.disabled))){if(!i){const n=c(e);s=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},i=!0}D.hasOwnProperty(t.type)&&t.preventDefault(),I(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:o.fromEvent(n.renderingComponentId,t)},s)}p.stopPropagation(e)&&(l=!0),p.preventDefault(e)&&t.preventDefault()}r=a||l?void 0:n.shift()}var h,u}getEventHandlerInfosForElement(e,t){return e.hasOwnProperty(this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new A:null}}P.nextEventDelegatorId=0;class U{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},a.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=l(e),this.countByEventName.hasOwnProperty(e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=x.hasOwnProperty(e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(this.infosByEventHandlerId.hasOwnProperty(t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=l(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(this.countByEventName.hasOwnProperty(e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class A{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return this.handlers.hasOwnProperty(e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function N(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const $=G("_blazorLogicalChildren"),B=G("_blazorLogicalParent"),L=G("_blazorLogicalEnd");function M(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return $ in e||(e[$]=[]),e}function O(e,t){const n=document.createComment("!");return F(n,e,t),n}function F(e,t,n){const r=e;if(e instanceof Comment&&J(r)&&J(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(j(r))throw new Error("Not implemented: moving existing logical children");const o=J(t);if(n0;)H(n,0)}const r=n;r.parentNode.removeChild(r)}function j(e){return e[B]||null}function W(e,t){return J(e)[t]}function z(e){var t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function J(e){return e[$]}function q(e,t){const n=J(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let s=r;for(;s;){const e=s.nextSibling;if(n.insertBefore(s,t),s===o)break;s=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function K(e){const t=J(j(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=K(t);n?n.parentNode.insertBefore(e,n):X(e,j(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=K(e);if(t)return t.previousSibling;{const t=j(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function Q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&t.hasOwnProperty("__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${Q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",ee=document.createElement("template"),te=document.createElementNS("http://www.w3.org/2000/svg","g"),ne={},re="__internal_",oe="preventDefault_",se="stopPropagation_";class ie{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new P(e),this.eventDelegator.notifyAfterClick((e=>{if(!fe)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;ebe(!1))))},enableNavigationInterception:function(){fe=!0},navigateTo:we,getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function we(e,t,n=!1){const r=Ee(e),o=t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n};!o.forceLoad&&Ce(r)?ve(r,!1,o.replaceHistoryEntry):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,o.replaceHistoryEntry)}function ve(e,t,n){pe=!0,n?history.replaceState(null,"",e):history.pushState(null,"",e),be(t)}async function be(e){me&&await me(location.href,e)}let _e;function Ee(e){return _e=_e||document.createElement("a"),_e.href=e,_e.href}function Se(e,t){return e?e.tagName===t?e:Se(e.parentElement,t):null}function Ce(e){const t=(n=document.baseURI).substr(0,n.lastIndexOf("/")+1);var n;return e.startsWith(t)}const Ie={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},ke={init:function(e,t,n,r=50){const o=xe(t);(o||document.documentElement).style.overflowAnchor="none";const s=document.createRange();h(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const i=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;s.setStartAfter(t),s.setEndBefore(n);const i=s.getBoundingClientRect().height,a=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,i,a):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,i,a)}))}),{root:o,rootMargin:`${r}px`});i.observe(t),i.observe(n);const a=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{h(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),i.unobserve(e),i.observe(e)}));return n.observe(e,t),n}function h(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}Te[e._id]={intersectionObserver:i,mutationObserverBefore:a,mutationObserverAfter:c}},dispose:function(e){const t=Te[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete Te[e._id])}},Te={};function xe(e){return e?"visible"!==getComputedStyle(e).overflowY?e:xe(e.parentElement):null}const De={getAndRemoveExistingTitle:function(){var e;const t=document.head?document.head.getElementsByTagName("title"):[];if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],s=o.previousSibling;s instanceof Comment&&null!==j(s)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Re={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const s=Pe(e,t),i=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(s.blob)})),a=await new Promise((function(e){var t;const s=Math.min(1,r/i.width),a=Math.min(1,o/i.height),c=Math.min(s,a),l=document.createElement("canvas");l.width=Math.round(i.width*c),l.height=Math.round(i.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(i,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:s.lastModified,name:s.name,size:(null==a?void 0:a.size)||0,contentType:n,blob:a||s.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Pe(e,t).blob}};function Pe(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed.`);return n}async function Ue(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)}const Ae=new Map,Ne={navigateTo:we,registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(s.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=i.get(t.browserEventName);n?n.push(e):i.set(t.browserEventName,[e]),a.forEach((n=>n(e,t.browserEventName)))}s.set(e,t)},rootComponents:w,_internal:{navigationManager:ye,domWrapper:Ie,Virtualize:ke,PageTitle:De,InputFile:Re,getJSDataStreamChunk:Ue,receiveDotNetDataStream:function(t,n,r,o){let s=Ae.get(t);if(!s){const n=new ReadableStream({start(e){Ae.set(t,e),s=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(s.error(o),Ae.delete(t)):0===r?(s.close(),Ae.delete(t)):s.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(g)throw new Error("Dynamic root components have already been enabled.");g=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(k(t),r,o),S()}}};window.Blazor=Ne;const $e=[0,2e3,1e4,3e4,null];class Be{constructor(e){this._retryDelays=void 0!==e?[...e,null]:$e}nextRetryDelayInMilliseconds(e){return this._retryDelays[e.previousRetryCount]}}class Le extends Error{constructor(e,t){const n=new.target.prototype;super(`${e}: Status code '${t}'`),this.statusCode=t,this.__proto__=n}}class Me extends Error{constructor(e="A timeout occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Oe extends Error{constructor(e="An abort occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Fe extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="UnsupportedTransportError",this.__proto__=n}}class He extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="DisabledTransportError",this.__proto__=n}}class je extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="FailedToStartTransportError",this.__proto__=n}}class We extends Error{constructor(e){const t=new.target.prototype;super(e),this.errorType="FailedToNegotiateWithServerError",this.__proto__=t}}class ze extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.innerErrors=t,this.__proto__=n}}class Je{constructor(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}}class qe{get(e,t){return this.send({...t,method:"GET",url:e})}post(e,t){return this.send({...t,method:"POST",url:e})}delete(e,t){return this.send({...t,method:"DELETE",url:e})}getCookieString(e){return""}}var Ve,Ke,Xe,Ye,Ge;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(Ve||(Ve={}));class Qe{constructor(){}log(e,t){}}Qe.instance=new Qe;class Ze{static isRequired(e,t){if(null==e)throw new Error(`The '${t}' argument is required.`)}static isNotEmpty(e,t){if(!e||e.match(/^\s*$/))throw new Error(`The '${t}' argument should not be empty.`)}static isIn(e,t,n){if(!(e in t))throw new Error(`Unknown ${n} value: ${e}.`)}}class et{static get isBrowser(){return"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return"object"==typeof self&&"importScripts"in self}static get isReactNative(){return"object"==typeof window&&void 0===window.document}static get isNode(){return!this.isBrowser&&!this.isWebWorker&&!this.isReactNative}}function tt(e,t){let n="";return nt(e)?(n=`Binary data of length ${e.byteLength}`,t&&(n+=`. Content: '${function(e){const t=new Uint8Array(e);let n="";return t.forEach((e=>{n+=`0x${e<16?"0":""}${e.toString(16)} `})),n.substr(0,n.length-1)}(e)}'`)):"string"==typeof e&&(n=`String data of length ${e.length}`,t&&(n+=`. Content: '${e}'`)),n}function nt(e){return e&&"undefined"!=typeof ArrayBuffer&&(e instanceof ArrayBuffer||e.constructor&&"ArrayBuffer"===e.constructor.name)}async function rt(e,t,n,r,o,s,i){let a={};if(o){const e=await o();e&&(a={Authorization:`Bearer ${e}`})}const[c,l]=it();a[c]=l,e.log(Ve.Trace,`(${t} transport) sending data. ${tt(s,i.logMessageContent)}.`);const h=nt(s)?"arraybuffer":"text",u=await n.post(r,{content:s,headers:{...a,...i.headers},responseType:h,timeout:i.timeout,withCredentials:i.withCredentials});e.log(Ve.Trace,`(${t} transport) request complete. Response status: ${u.statusCode}.`)}class ot{constructor(e,t){this._subject=e,this._observer=t}dispose(){const e=this._subject.observers.indexOf(this._observer);e>-1&&this._subject.observers.splice(e,1),0===this._subject.observers.length&&this._subject.cancelCallback&&this._subject.cancelCallback().catch((e=>{}))}}class st{constructor(e){this._minLevel=e,this.out=console}log(e,t){if(e>=this._minLevel){const n=`[${(new Date).toISOString()}] ${Ve[e]}: ${t}`;switch(e){case Ve.Critical:case Ve.Error:this.out.error(n);break;case Ve.Warning:this.out.warn(n);break;case Ve.Information:this.out.info(n);break;default:this.out.log(n)}}}}function it(){let e="X-SignalR-User-Agent";return et.isNode&&(e="User-Agent"),[e,at("0.0.0-DEV_BUILD",ct(),et.isNode?"NodeJS":"Browser",lt())]}function at(e,t,n,r){let o="Microsoft SignalR/";const s=e.split(".");return o+=`${s[0]}.${s[1]}`,o+=` (${e}; `,o+=t&&""!==t?`${t}; `:"Unknown OS; ",o+=`${n}`,o+=r?`; ${r}`:"; Unknown Runtime Version",o+=")",o}function ct(){if(!et.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function lt(){if(et.isNode)return process.versions.node}function ht(e){return e.stack?e.stack:e.message?e.message:`${e}`}class ut extends qe{constructor(e){if(super(),this._logger=e,"undefined"==typeof fetch){const e=require;this._jar=new(e("tough-cookie").CookieJar),this._fetchType=e("node-fetch"),this._fetchType=e("fetch-cookie")(this._fetchType,this._jar)}else this._fetchType=fetch.bind(function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("could not find global")}());if("undefined"==typeof AbortController){const e=require;this._abortControllerType=e("abort-controller")}else this._abortControllerType=AbortController}async send(e){if(e.abortSignal&&e.abortSignal.aborted)throw new Oe;if(!e.method)throw new Error("No method defined.");if(!e.url)throw new Error("No url defined.");const t=new this._abortControllerType;let n;e.abortSignal&&(e.abortSignal.onabort=()=>{t.abort(),n=new Oe});let r,o=null;if(e.timeout){const r=e.timeout;o=setTimeout((()=>{t.abort(),this._logger.log(Ve.Warning,"Timeout from HTTP request."),n=new Me}),r)}try{r=await this._fetchType(e.url,{body:e.content,cache:"no-cache",credentials:!0===e.withCredentials?"include":"same-origin",headers:{"Content-Type":"text/plain;charset=UTF-8","X-Requested-With":"XMLHttpRequest",...e.headers},method:e.method,mode:"cors",redirect:"follow",signal:t.signal})}catch(e){if(n)throw n;throw this._logger.log(Ve.Warning,`Error from HTTP request. ${e}.`),e}finally{o&&clearTimeout(o),e.abortSignal&&(e.abortSignal.onabort=null)}if(!r.ok){const e=await dt(r,"text");throw new Le(e||r.statusText,r.status)}const s=dt(r,e.responseType),i=await s;return new Je(r.status,r.statusText,i)}getCookieString(e){return""}}function dt(e,t){let n;switch(t){case"arraybuffer":n=e.arrayBuffer();break;case"text":default:n=e.text();break;case"blob":case"document":case"json":throw new Error(`${t} is not supported.`)}return n}class pt extends qe{constructor(e){super(),this._logger=e}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Oe):e.method?e.url?new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),r.withCredentials=void 0===e.withCredentials||e.withCredentials,r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.setRequestHeader("Content-Type","text/plain;charset=UTF-8");const o=e.headers;o&&Object.keys(o).forEach((e=>{r.setRequestHeader(e,o[e])})),e.responseType&&(r.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=()=>{r.abort(),n(new Oe)}),e.timeout&&(r.timeout=e.timeout),r.onload=()=>{e.abortSignal&&(e.abortSignal.onabort=null),r.status>=200&&r.status<300?t(new Je(r.status,r.statusText,r.response||r.responseText)):n(new Le(r.response||r.responseText||r.statusText,r.status))},r.onerror=()=>{this._logger.log(Ve.Warning,`Error from HTTP request. ${r.status}: ${r.statusText}.`),n(new Le(r.statusText,r.status))},r.ontimeout=()=>{this._logger.log(Ve.Warning,"Timeout from HTTP request."),n(new Me)},r.send(e.content||"")})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class ft extends qe{constructor(e){if(super(),"undefined"!=typeof fetch)this._httpClient=new ut(e);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this._httpClient=new pt(e)}}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Oe):e.method?e.url?this._httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}getCookieString(e){return this._httpClient.getCookieString(e)}}class gt{}gt.Authorization="Authorization",gt.Cookie="Cookie",function(e){e[e.None=0]="None",e[e.WebSockets=1]="WebSockets",e[e.ServerSentEvents=2]="ServerSentEvents",e[e.LongPolling=4]="LongPolling"}(Ke||(Ke={})),function(e){e[e.Text=1]="Text",e[e.Binary=2]="Binary"}(Xe||(Xe={}));class mt{constructor(){this._isAborted=!1,this.onabort=null}abort(){this._isAborted||(this._isAborted=!0,this.onabort&&this.onabort())}get signal(){return this}get aborted(){return this._isAborted}}class yt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._pollAbort=new mt,this._options=r,this._running=!1,this.onreceive=null,this.onclose=null}get pollAborted(){return this._pollAbort.aborted}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._url=e,this._logger.log(Ve.Trace,"(LongPolling transport) Connecting."),t===Xe.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[n,r]=it(),o={[n]:r,...this._options.headers},s={abortSignal:this._pollAbort.signal,headers:o,timeout:1e5,withCredentials:this._options.withCredentials};t===Xe.Binary&&(s.responseType="arraybuffer");const i=await this._getAccessToken();this._updateHeaderToken(s,i);const a=`${e}&_=${Date.now()}`;this._logger.log(Ve.Trace,`(LongPolling transport) polling: ${a}.`);const c=await this._httpClient.get(a,s);200!==c.statusCode?(this._logger.log(Ve.Error,`(LongPolling transport) Unexpected response code: ${c.statusCode}.`),this._closeError=new Le(c.statusText||"",c.statusCode),this._running=!1):this._running=!0,this._receiving=this._poll(this._url,s)}async _getAccessToken(){return this._accessTokenFactory?await this._accessTokenFactory():null}_updateHeaderToken(e,t){e.headers||(e.headers={}),t?e.headers[gt.Authorization]=`Bearer ${t}`:e.headers[gt.Authorization]&&delete e.headers[gt.Authorization]}async _poll(e,t){try{for(;this._running;){const n=await this._getAccessToken();this._updateHeaderToken(t,n);try{const n=`${e}&_=${Date.now()}`;this._logger.log(Ve.Trace,`(LongPolling transport) polling: ${n}.`);const r=await this._httpClient.get(n,t);204===r.statusCode?(this._logger.log(Ve.Information,"(LongPolling transport) Poll terminated by server."),this._running=!1):200!==r.statusCode?(this._logger.log(Ve.Error,`(LongPolling transport) Unexpected response code: ${r.statusCode}.`),this._closeError=new Le(r.statusText||"",r.statusCode),this._running=!1):r.content?(this._logger.log(Ve.Trace,`(LongPolling transport) data received. ${tt(r.content,this._options.logMessageContent)}.`),this.onreceive&&this.onreceive(r.content)):this._logger.log(Ve.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(e){this._running?e instanceof Me?this._logger.log(Ve.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this._closeError=e,this._running=!1):this._logger.log(Ve.Trace,`(LongPolling transport) Poll errored after shutdown: ${e.message}`)}}}finally{this._logger.log(Ve.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this._raiseOnClose()}}async send(e){return this._running?rt(this._logger,"LongPolling",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}async stop(){this._logger.log(Ve.Trace,"(LongPolling transport) Stopping polling."),this._running=!1,this._pollAbort.abort();try{await this._receiving,this._logger.log(Ve.Trace,`(LongPolling transport) sending DELETE request to ${this._url}.`);const e={},[t,n]=it();e[t]=n;const r={headers:{...e,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials},o=await this._getAccessToken();this._updateHeaderToken(r,o),await this._httpClient.delete(this._url,r),this._logger.log(Ve.Trace,"(LongPolling transport) DELETE request sent.")}finally{this._logger.log(Ve.Trace,"(LongPolling transport) Stop finished."),this._raiseOnClose()}}_raiseOnClose(){if(this.onclose){let e="(LongPolling transport) Firing onclose event.";this._closeError&&(e+=" Error: "+this._closeError),this._logger.log(Ve.Trace,e),this.onclose(this._closeError)}}}class wt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._options=r,this.onreceive=null,this.onclose=null}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._logger.log(Ve.Trace,"(SSE transport) Connecting."),this._url=e,this._accessTokenFactory){const t=await this._accessTokenFactory();t&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(t)}`)}return new Promise(((n,r)=>{let o,s=!1;if(t===Xe.Text){if(et.isBrowser||et.isWebWorker)o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials});else{const t=this._httpClient.getCookieString(e),n={};n.Cookie=t;const[r,s]=it();n[r]=s,o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials,headers:{...n,...this._options.headers}})}try{o.onmessage=e=>{if(this.onreceive)try{this._logger.log(Ve.Trace,`(SSE transport) data received. ${tt(e.data,this._options.logMessageContent)}.`),this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onerror=e=>{s?this._close():r(new Error("EventSource failed to connect. The connection could not be found on the server, either the connection ID is not present on the server, or a proxy is refusing/buffering the connection. If you have multiple servers check that sticky sessions are enabled."))},o.onopen=()=>{this._logger.log(Ve.Information,`SSE connected to ${this._url}`),this._eventSource=o,s=!0,n()}}catch(e){return void r(e)}}else r(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(e){return this._eventSource?rt(this._logger,"SSE",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}stop(){return this._close(),Promise.resolve()}_close(e){this._eventSource&&(this._eventSource.close(),this._eventSource=void 0,this.onclose&&this.onclose(e))}}class vt{constructor(e,t,n,r,o,s){this._logger=n,this._accessTokenFactory=t,this._logMessageContent=r,this._webSocketConstructor=o,this._httpClient=e,this.onreceive=null,this.onclose=null,this._headers=s}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._logger.log(Ve.Trace,"(WebSockets transport) Connecting."),this._accessTokenFactory){const t=await this._accessTokenFactory();t&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(t)}`)}return new Promise(((n,r)=>{let o;e=e.replace(/^http/,"ws"),this._httpClient.getCookieString(e);let s=!1;o||(o=new this._webSocketConstructor(e)),t===Xe.Binary&&(o.binaryType="arraybuffer"),o.onopen=t=>{this._logger.log(Ve.Information,`WebSocket connected to ${e}.`),this._webSocket=o,s=!0,n()},o.onerror=e=>{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"There was an error with the transport",this._logger.log(Ve.Information,`(WebSockets transport) ${t}.`)},o.onmessage=e=>{if(this._logger.log(Ve.Trace,`(WebSockets transport) data received. ${tt(e.data,this._logMessageContent)}.`),this.onreceive)try{this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onclose=e=>{if(s)this._close(e);else{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.",r(new Error(t))}}}))}send(e){return this._webSocket&&this._webSocket.readyState===this._webSocketConstructor.OPEN?(this._logger.log(Ve.Trace,`(WebSockets transport) sending data. ${tt(e,this._logMessageContent)}.`),this._webSocket.send(e),Promise.resolve()):Promise.reject("WebSocket is not in the OPEN state")}stop(){return this._webSocket&&this._close(void 0),Promise.resolve()}_close(e){this._webSocket&&(this._webSocket.onclose=()=>{},this._webSocket.onmessage=()=>{},this._webSocket.onerror=()=>{},this._webSocket.close(),this._webSocket=void 0),this._logger.log(Ve.Trace,"(WebSockets transport) socket closed."),this.onclose&&(!this._isCloseEvent(e)||!1!==e.wasClean&&1e3===e.code?e instanceof Error?this.onclose(e):this.onclose():this.onclose(new Error(`WebSocket closed with status code: ${e.code} (${e.reason||"no reason given"}).`)))}_isCloseEvent(e){return e&&"boolean"==typeof e.wasClean&&"number"==typeof e.code}}class bt{constructor(e,t={}){var n;if(this._stopPromiseResolver=()=>{},this.features={},this._negotiateVersion=1,Ze.isRequired(e,"url"),this._logger=void 0===(n=t.logger)?new st(Ve.Information):null===n?Qe.instance:void 0!==n.log?n:new st(n),this.baseUrl=this._resolveUrl(e),(t=t||{}).logMessageContent=void 0!==t.logMessageContent&&t.logMessageContent,"boolean"!=typeof t.withCredentials&&void 0!==t.withCredentials)throw new Error("withCredentials option was not a 'boolean' or 'undefined' value");t.withCredentials=void 0===t.withCredentials||t.withCredentials,t.timeout=void 0===t.timeout?1e5:t.timeout,"undefined"==typeof WebSocket||t.WebSocket||(t.WebSocket=WebSocket),"undefined"==typeof EventSource||t.EventSource||(t.EventSource=EventSource),this._httpClient=t.httpClient||new ft(this._logger),this._connectionState="Disconnected",this._connectionStarted=!1,this._options=t,this.onreceive=null,this.onclose=null}async start(e){if(e=e||Xe.Binary,Ze.isIn(e,Xe,"transferFormat"),this._logger.log(Ve.Debug,`Starting connection with transfer format '${Xe[e]}'.`),"Disconnected"!==this._connectionState)return Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."));if(this._connectionState="Connecting",this._startInternalPromise=this._startInternal(e),await this._startInternalPromise,"Disconnecting"===this._connectionState){const e="Failed to start the HttpConnection before stop() was called.";return this._logger.log(Ve.Error,e),await this._stopPromise,Promise.reject(new Error(e))}if("Connected"!==this._connectionState){const e="HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!";return this._logger.log(Ve.Error,e),Promise.reject(new Error(e))}this._connectionStarted=!0}send(e){return"Connected"!==this._connectionState?Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")):(this._sendQueue||(this._sendQueue=new _t(this.transport)),this._sendQueue.send(e))}async stop(e){return"Disconnected"===this._connectionState?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this._connectionState?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState="Disconnecting",this._stopPromise=new Promise((e=>{this._stopPromiseResolver=e})),await this._stopInternal(e),void await this._stopPromise)}async _stopInternal(e){this._stopError=e;try{await this._startInternalPromise}catch(e){}if(this.transport){try{await this.transport.stop()}catch(e){this._logger.log(Ve.Error,`HttpConnection.transport.stop() threw error '${e}'.`),this._stopConnection()}this.transport=void 0}else this._logger.log(Ve.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async _startInternal(e){let t=this.baseUrl;this._accessTokenFactory=this._options.accessTokenFactory;try{if(this._options.skipNegotiation){if(this._options.transport!==Ke.WebSockets)throw new Error("Negotiation can only be skipped when using the WebSocket transport directly.");this.transport=this._constructTransport(Ke.WebSockets),await this._startTransport(t,e)}else{let n=null,r=0;do{if(n=await this._getNegotiationResponse(t),"Disconnecting"===this._connectionState||"Disconnected"===this._connectionState)throw new Error("The connection was stopped during negotiation.");if(n.error)throw new Error(n.error);if(n.ProtocolVersion)throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.");if(n.url&&(t=n.url),n.accessToken){const e=n.accessToken;this._accessTokenFactory=()=>e}r++}while(n.url&&r<100);if(100===r&&n.url)throw new Error("Negotiate redirection limit exceeded.");await this._createTransport(t,this._options.transport,n,e)}this.transport instanceof yt&&(this.features.inherentKeepAlive=!0),"Connecting"===this._connectionState&&(this._logger.log(Ve.Debug,"The HttpConnection connected successfully."),this._connectionState="Connected")}catch(e){return this._logger.log(Ve.Error,"Failed to start the connection: "+e),this._connectionState="Disconnected",this.transport=void 0,this._stopPromiseResolver(),Promise.reject(e)}}async _getNegotiationResponse(e){const t={};if(this._accessTokenFactory){const e=await this._accessTokenFactory();e&&(t[gt.Authorization]=`Bearer ${e}`)}const[n,r]=it();t[n]=r;const o=this._resolveNegotiateUrl(e);this._logger.log(Ve.Debug,`Sending negotiation request: ${o}.`);try{const e=await this._httpClient.post(o,{content:"",headers:{...t,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials});if(200!==e.statusCode)return Promise.reject(new Error(`Unexpected status code returned from negotiate '${e.statusCode}'`));const n=JSON.parse(e.content);return(!n.negotiateVersion||n.negotiateVersion<1)&&(n.connectionToken=n.connectionId),n}catch(e){let t="Failed to complete negotiation with the server: "+e;return e instanceof Le&&404===e.statusCode&&(t+=" Either this is not a SignalR endpoint or there is a proxy blocking the connection."),this._logger.log(Ve.Error,t),Promise.reject(new We(t))}}_createConnectUrl(e,t){return t?e+(-1===e.indexOf("?")?"?":"&")+`id=${t}`:e}async _createTransport(e,t,n,r){let o=this._createConnectUrl(e,n.connectionToken);if(this._isITransport(t))return this._logger.log(Ve.Debug,"Connection was provided an instance of ITransport, using that directly."),this.transport=t,await this._startTransport(o,r),void(this.connectionId=n.connectionId);const s=[],i=n.availableTransports||[];let a=n;for(const n of i){const i=this._resolveTransportOrError(n,t,r);if(i instanceof Error)s.push(`${n.transport} failed:`),s.push(i);else if(this._isITransport(i)){if(this.transport=i,!a){try{a=await this._getNegotiationResponse(e)}catch(e){return Promise.reject(e)}o=this._createConnectUrl(e,a.connectionToken)}try{return await this._startTransport(o,r),void(this.connectionId=a.connectionId)}catch(e){if(this._logger.log(Ve.Error,`Failed to start the transport '${n.transport}': ${e}`),a=void 0,s.push(new je(`${n.transport} failed: ${e}`,Ke[n.transport])),"Connecting"!==this._connectionState){const e="Failed to select transport before stop() was called.";return this._logger.log(Ve.Debug,e),Promise.reject(new Error(e))}}}}return s.length>0?Promise.reject(new ze(`Unable to connect to the server with any of the available transports. ${s.join(" ")}`,s)):Promise.reject(new Error("None of the transports supported by the client are supported by the server."))}_constructTransport(e){switch(e){case Ke.WebSockets:if(!this._options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new vt(this._httpClient,this._accessTokenFactory,this._logger,this._options.logMessageContent,this._options.WebSocket,this._options.headers||{});case Ke.ServerSentEvents:if(!this._options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new wt(this._httpClient,this._accessTokenFactory,this._logger,this._options);case Ke.LongPolling:return new yt(this._httpClient,this._accessTokenFactory,this._logger,this._options);default:throw new Error(`Unknown transport: ${e}.`)}}_startTransport(e,t){return this.transport.onreceive=this.onreceive,this.transport.onclose=e=>this._stopConnection(e),this.transport.connect(e,t)}_resolveTransportOrError(e,t,n){const r=Ke[e.transport];if(null==r)return this._logger.log(Ve.Debug,`Skipping transport '${e.transport}' because it is not supported by this client.`),new Error(`Skipping transport '${e.transport}' because it is not supported by this client.`);if(!function(e,t){return!e||0!=(t&e)}(t,r))return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it was disabled by the client.`),new He(`'${Ke[r]}' is disabled by the client.`,r);if(!(e.transferFormats.map((e=>Xe[e])).indexOf(n)>=0))return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it does not support the requested transfer format '${Xe[n]}'.`),new Error(`'${Ke[r]}' does not support ${Xe[n]}.`);if(r===Ke.WebSockets&&!this._options.WebSocket||r===Ke.ServerSentEvents&&!this._options.EventSource)return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it is not supported in your environment.'`),new Fe(`'${Ke[r]}' is not supported in your environment.`,r);this._logger.log(Ve.Debug,`Selecting transport '${Ke[r]}'.`);try{return this._constructTransport(r)}catch(e){return e}}_isITransport(e){return e&&"object"==typeof e&&"connect"in e}_stopConnection(e){if(this._logger.log(Ve.Debug,`HttpConnection.stopConnection(${e}) called while in state ${this._connectionState}.`),this.transport=void 0,e=this._stopError||e,this._stopError=void 0,"Disconnected"!==this._connectionState){if("Connecting"===this._connectionState)throw this._logger.log(Ve.Warning,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is still in the connecting state.`),new Error(`HttpConnection.stopConnection(${e}) was called while the connection is still in the connecting state.`);if("Disconnecting"===this._connectionState&&this._stopPromiseResolver(),e?this._logger.log(Ve.Error,`Connection disconnected with error '${e}'.`):this._logger.log(Ve.Information,"Connection disconnected."),this._sendQueue&&(this._sendQueue.stop().catch((e=>{this._logger.log(Ve.Error,`TransportSendQueue.stop() threw error '${e}'.`)})),this._sendQueue=void 0),this.connectionId=void 0,this._connectionState="Disconnected",this._connectionStarted){this._connectionStarted=!1;try{this.onclose&&this.onclose(e)}catch(t){this._logger.log(Ve.Error,`HttpConnection.onclose(${e}) threw error '${t}'.`)}}}else this._logger.log(Ve.Debug,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is already in the disconnected state.`)}_resolveUrl(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!et.isBrowser)throw new Error(`Cannot resolve '${e}'.`);const t=window.document.createElement("a");return t.href=e,this._logger.log(Ve.Information,`Normalizing '${e}' to '${t.href}'.`),t.href}_resolveNegotiateUrl(e){const t=e.indexOf("?");let n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",n+=-1===t?"":e.substring(t),-1===n.indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this._negotiateVersion),n}}class _t{constructor(e){this._transport=e,this._buffer=[],this._executing=!0,this._sendBufferedData=new Et,this._transportResult=new Et,this._sendLoopPromise=this._sendLoop()}send(e){return this._bufferData(e),this._transportResult||(this._transportResult=new Et),this._transportResult.promise}stop(){return this._executing=!1,this._sendBufferedData.resolve(),this._sendLoopPromise}_bufferData(e){if(this._buffer.length&&typeof this._buffer[0]!=typeof e)throw new Error(`Expected data to be of type ${typeof this._buffer} but was of type ${typeof e}`);this._buffer.push(e),this._sendBufferedData.resolve()}async _sendLoop(){for(;;){if(await this._sendBufferedData.promise,!this._executing){this._transportResult&&this._transportResult.reject("Connection stopped.");break}this._sendBufferedData=new Et;const e=this._transportResult;this._transportResult=void 0;const t="string"==typeof this._buffer[0]?this._buffer.join(""):_t._concatBuffers(this._buffer);this._buffer.length=0;try{await this._transport.send(t),e.resolve()}catch(t){e.reject(t)}}}static _concatBuffers(e){const t=e.map((e=>e.byteLength)).reduce(((e,t)=>e+t)),n=new Uint8Array(t);let r=0;for(const t of e)n.set(new Uint8Array(t),r),r+=t.byteLength;return n.buffer}}class Et{constructor(){this.promise=new Promise(((e,t)=>[this._resolver,this._rejecter]=[e,t]))}resolve(){this._resolver()}reject(e){this._rejecter(e)}}class St{static write(e){return`${e}${St.RecordSeparator}`}static parse(e){if(e[e.length-1]!==St.RecordSeparator)throw new Error("Message is incomplete.");const t=e.split(St.RecordSeparator);return t.pop(),t}}St.RecordSeparatorCode=30,St.RecordSeparator=String.fromCharCode(St.RecordSeparatorCode);class Ct{writeHandshakeRequest(e){return St.write(JSON.stringify(e))}parseHandshakeResponse(e){let t,n;if(nt(e)){const r=new Uint8Array(e),o=r.indexOf(St.RecordSeparatorCode);if(-1===o)throw new Error("Message is incomplete.");const s=o+1;t=String.fromCharCode.apply(null,Array.prototype.slice.call(r.slice(0,s))),n=r.byteLength>s?r.slice(s).buffer:null}else{const r=e,o=r.indexOf(St.RecordSeparator);if(-1===o)throw new Error("Message is incomplete.");const s=o+1;t=r.substring(0,s),n=r.length>s?r.substring(s):null}const r=St.parse(t),o=JSON.parse(r[0]);if(o.type)throw new Error("Expected a handshake response from the server.");return[n,o]}}!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(Ye||(Ye={}));class It{constructor(){this.observers=[]}next(e){for(const t of this.observers)t.next(e)}error(e){for(const t of this.observers)t.error&&t.error(e)}complete(){for(const e of this.observers)e.complete&&e.complete()}subscribe(e){return this.observers.push(e),new ot(this,e)}}!function(e){e.Disconnected="Disconnected",e.Connecting="Connecting",e.Connected="Connected",e.Disconnecting="Disconnecting",e.Reconnecting="Reconnecting"}(Ge||(Ge={}));class kt{constructor(e,t,n,r){this._nextKeepAlive=0,this._freezeEventListener=()=>{this._logger.log(Ve.Warning,"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://docs.microsoft.com/aspnet/core/signalr/javascript-client#bsleep")},Ze.isRequired(e,"connection"),Ze.isRequired(t,"logger"),Ze.isRequired(n,"protocol"),this.serverTimeoutInMilliseconds=3e4,this.keepAliveIntervalInMilliseconds=15e3,this._logger=t,this._protocol=n,this.connection=e,this._reconnectPolicy=r,this._handshakeProtocol=new Ct,this.connection.onreceive=e=>this._processIncomingData(e),this.connection.onclose=e=>this._connectionClosed(e),this._callbacks={},this._methods={},this._closedCallbacks=[],this._reconnectingCallbacks=[],this._reconnectedCallbacks=[],this._invocationId=0,this._receivedHandshakeResponse=!1,this._connectionState=Ge.Disconnected,this._connectionStarted=!1,this._cachedPingMessage=this._protocol.writeMessage({type:Ye.Ping})}static create(e,t,n,r){return new kt(e,t,n,r)}get state(){return this._connectionState}get connectionId(){return this.connection&&this.connection.connectionId||null}get baseUrl(){return this.connection.baseUrl||""}set baseUrl(e){if(this._connectionState!==Ge.Disconnected&&this._connectionState!==Ge.Reconnecting)throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url.");if(!e)throw new Error("The HubConnection url must be a valid url.");this.connection.baseUrl=e}start(){return this._startPromise=this._startWithStateTransitions(),this._startPromise}async _startWithStateTransitions(){if(this._connectionState!==Ge.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this._connectionState=Ge.Connecting,this._logger.log(Ve.Debug,"Starting HubConnection.");try{await this._startInternal(),et.isBrowser&&window.document.addEventListener("freeze",this._freezeEventListener),this._connectionState=Ge.Connected,this._connectionStarted=!0,this._logger.log(Ve.Debug,"HubConnection connected successfully.")}catch(e){return this._connectionState=Ge.Disconnected,this._logger.log(Ve.Debug,`HubConnection failed to start successfully because of error '${e}'.`),Promise.reject(e)}}async _startInternal(){this._stopDuringStartError=void 0,this._receivedHandshakeResponse=!1;const e=new Promise(((e,t)=>{this._handshakeResolver=e,this._handshakeRejecter=t}));await this.connection.start(this._protocol.transferFormat);try{const t={protocol:this._protocol.name,version:this._protocol.version};if(this._logger.log(Ve.Debug,"Sending handshake request."),await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(t)),this._logger.log(Ve.Information,`Using HubProtocol '${this._protocol.name}'.`),this._cleanupTimeout(),this._resetTimeoutPeriod(),this._resetKeepAliveInterval(),await e,this._stopDuringStartError)throw this._stopDuringStartError}catch(e){throw this._logger.log(Ve.Debug,`Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`),this._cleanupTimeout(),this._cleanupPingTimer(),await this.connection.stop(e),e}}async stop(){const e=this._startPromise;this._stopPromise=this._stopInternal(),await this._stopPromise;try{await e}catch(e){}}_stopInternal(e){return this._connectionState===Ge.Disconnected?(this._logger.log(Ve.Debug,`Call to HubConnection.stop(${e}) ignored because it is already in the disconnected state.`),Promise.resolve()):this._connectionState===Ge.Disconnecting?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState=Ge.Disconnecting,this._logger.log(Ve.Debug,"Stopping HubConnection."),this._reconnectDelayHandle?(this._logger.log(Ve.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this._reconnectDelayHandle),this._reconnectDelayHandle=void 0,this._completeClose(),Promise.resolve()):(this._cleanupTimeout(),this._cleanupPingTimer(),this._stopDuringStartError=e||new Error("The connection was stopped before the hub handshake could complete."),this.connection.stop(e)))}stream(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createStreamInvocation(e,t,r);let s;const i=new It;return i.cancelCallback=()=>{const e=this._createCancelInvocation(o.invocationId);return delete this._callbacks[o.invocationId],s.then((()=>this._sendWithProtocol(e)))},this._callbacks[o.invocationId]=(e,t)=>{t?i.error(t):e&&(e.type===Ye.Completion?e.error?i.error(new Error(e.error)):i.complete():i.next(e.item))},s=this._sendWithProtocol(o).catch((e=>{i.error(e),delete this._callbacks[o.invocationId]})),this._launchStreams(n,s),i}_sendMessage(e){return this._resetKeepAliveInterval(),this.connection.send(e)}_sendWithProtocol(e){return this._sendMessage(this._protocol.writeMessage(e))}send(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._sendWithProtocol(this._createInvocation(e,t,!0,r));return this._launchStreams(n,o),o}invoke(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createInvocation(e,t,!1,r);return new Promise(((e,t)=>{this._callbacks[o.invocationId]=(n,r)=>{r?t(r):n&&(n.type===Ye.Completion?n.error?t(new Error(n.error)):e(n.result):t(new Error(`Unexpected message type: ${n.type}`)))};const r=this._sendWithProtocol(o).catch((e=>{t(e),delete this._callbacks[o.invocationId]}));this._launchStreams(n,r)}))}on(e,t){e&&t&&(e=e.toLowerCase(),this._methods[e]||(this._methods[e]=[]),-1===this._methods[e].indexOf(t)&&this._methods[e].push(t))}off(e,t){if(!e)return;e=e.toLowerCase();const n=this._methods[e];if(n)if(t){const r=n.indexOf(t);-1!==r&&(n.splice(r,1),0===n.length&&delete this._methods[e])}else delete this._methods[e]}onclose(e){e&&this._closedCallbacks.push(e)}onreconnecting(e){e&&this._reconnectingCallbacks.push(e)}onreconnected(e){e&&this._reconnectedCallbacks.push(e)}_processIncomingData(e){if(this._cleanupTimeout(),this._receivedHandshakeResponse||(e=this._processHandshakeResponse(e),this._receivedHandshakeResponse=!0),e){const t=this._protocol.parseMessages(e,this._logger);for(const e of t)switch(e.type){case Ye.Invocation:this._invokeClientMethod(e);break;case Ye.StreamItem:case Ye.Completion:{const t=this._callbacks[e.invocationId];if(t){e.type===Ye.Completion&&delete this._callbacks[e.invocationId];try{t(e)}catch(e){this._logger.log(Ve.Error,`Stream callback threw error: ${ht(e)}`)}}break}case Ye.Ping:break;case Ye.Close:{this._logger.log(Ve.Information,"Close message received from server.");const t=e.error?new Error("Server returned an error on close: "+e.error):void 0;!0===e.allowReconnect?this.connection.stop(t):this._stopPromise=this._stopInternal(t);break}default:this._logger.log(Ve.Warning,`Invalid message type: ${e.type}.`)}}this._resetTimeoutPeriod()}_processHandshakeResponse(e){let t,n;try{[n,t]=this._handshakeProtocol.parseHandshakeResponse(e)}catch(e){const t="Error parsing handshake response: "+e;this._logger.log(Ve.Error,t);const n=new Error(t);throw this._handshakeRejecter(n),n}if(t.error){const e="Server returned handshake error: "+t.error;this._logger.log(Ve.Error,e);const n=new Error(e);throw this._handshakeRejecter(n),n}return this._logger.log(Ve.Debug,"Server handshake complete."),this._handshakeResolver(),n}_resetKeepAliveInterval(){this.connection.features.inherentKeepAlive||(this._nextKeepAlive=(new Date).getTime()+this.keepAliveIntervalInMilliseconds,this._cleanupPingTimer())}_resetTimeoutPeriod(){if(!(this.connection.features&&this.connection.features.inherentKeepAlive||(this._timeoutHandle=setTimeout((()=>this.serverTimeout()),this.serverTimeoutInMilliseconds),void 0!==this._pingServerHandle))){let e=this._nextKeepAlive-(new Date).getTime();e<0&&(e=0),this._pingServerHandle=setTimeout((async()=>{if(this._connectionState===Ge.Connected)try{await this._sendMessage(this._cachedPingMessage)}catch{this._cleanupPingTimer()}}),e)}}serverTimeout(){this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."))}_invokeClientMethod(e){const t=this._methods[e.target.toLowerCase()];if(t){try{t.forEach((t=>t.apply(this,e.arguments)))}catch(t){this._logger.log(Ve.Error,`A callback for the method ${e.target.toLowerCase()} threw error '${t}'.`)}if(e.invocationId){const e="Server requested a response, which is not supported in this version of the client.";this._logger.log(Ve.Error,e),this._stopPromise=this._stopInternal(new Error(e))}}else this._logger.log(Ve.Warning,`No client method with the name '${e.target}' found.`)}_connectionClosed(e){this._logger.log(Ve.Debug,`HubConnection.connectionClosed(${e}) called while in state ${this._connectionState}.`),this._stopDuringStartError=this._stopDuringStartError||e||new Error("The underlying connection was closed before the hub handshake could complete."),this._handshakeResolver&&this._handshakeResolver(),this._cancelCallbacksWithError(e||new Error("Invocation canceled due to the underlying connection being closed.")),this._cleanupTimeout(),this._cleanupPingTimer(),this._connectionState===Ge.Disconnecting?this._completeClose(e):this._connectionState===Ge.Connected&&this._reconnectPolicy?this._reconnect(e):this._connectionState===Ge.Connected&&this._completeClose(e)}_completeClose(e){if(this._connectionStarted){this._connectionState=Ge.Disconnected,this._connectionStarted=!1,et.isBrowser&&window.document.removeEventListener("freeze",this._freezeEventListener);try{this._closedCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(Ve.Error,`An onclose callback called with error '${e}' threw error '${t}'.`)}}}async _reconnect(e){const t=Date.now();let n=0,r=void 0!==e?e:new Error("Attempting to reconnect due to a unknown error."),o=this._getNextRetryDelay(n++,0,r);if(null===o)return this._logger.log(Ve.Debug,"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."),void this._completeClose(e);if(this._connectionState=Ge.Reconnecting,e?this._logger.log(Ve.Information,`Connection reconnecting because of error '${e}'.`):this._logger.log(Ve.Information,"Connection reconnecting."),0!==this._reconnectingCallbacks.length){try{this._reconnectingCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(Ve.Error,`An onreconnecting callback called with error '${e}' threw error '${t}'.`)}if(this._connectionState!==Ge.Reconnecting)return void this._logger.log(Ve.Debug,"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.")}for(;null!==o;){if(this._logger.log(Ve.Information,`Reconnect attempt number ${n} will start in ${o} ms.`),await new Promise((e=>{this._reconnectDelayHandle=setTimeout(e,o)})),this._reconnectDelayHandle=void 0,this._connectionState!==Ge.Reconnecting)return void this._logger.log(Ve.Debug,"Connection left the reconnecting state during reconnect delay. Done reconnecting.");try{if(await this._startInternal(),this._connectionState=Ge.Connected,this._logger.log(Ve.Information,"HubConnection reconnected successfully."),0!==this._reconnectedCallbacks.length)try{this._reconnectedCallbacks.forEach((e=>e.apply(this,[this.connection.connectionId])))}catch(e){this._logger.log(Ve.Error,`An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`)}return}catch(e){if(this._logger.log(Ve.Information,`Reconnect attempt failed because of error '${e}'.`),this._connectionState!==Ge.Reconnecting)return this._logger.log(Ve.Debug,`Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`),void(this._connectionState===Ge.Disconnecting&&this._completeClose());r=e instanceof Error?e:new Error(e.toString()),o=this._getNextRetryDelay(n++,Date.now()-t,r)}}this._logger.log(Ve.Information,`Reconnect retries have been exhausted after ${Date.now()-t} ms and ${n} failed attempts. Connection disconnecting.`),this._completeClose()}_getNextRetryDelay(e,t,n){try{return this._reconnectPolicy.nextRetryDelayInMilliseconds({elapsedMilliseconds:t,previousRetryCount:e,retryReason:n})}catch(n){return this._logger.log(Ve.Error,`IRetryPolicy.nextRetryDelayInMilliseconds(${e}, ${t}) threw error '${n}'.`),null}}_cancelCallbacksWithError(e){const t=this._callbacks;this._callbacks={},Object.keys(t).forEach((n=>{const r=t[n];try{r(null,e)}catch(t){this._logger.log(Ve.Error,`Stream 'error' callback called with '${e}' threw error: ${ht(t)}`)}}))}_cleanupPingTimer(){this._pingServerHandle&&(clearTimeout(this._pingServerHandle),this._pingServerHandle=void 0)}_cleanupTimeout(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}_createInvocation(e,t,n,r){if(n)return 0!==r.length?{arguments:t,streamIds:r,target:e,type:Ye.Invocation}:{arguments:t,target:e,type:Ye.Invocation};{const n=this._invocationId;return this._invocationId++,0!==r.length?{arguments:t,invocationId:n.toString(),streamIds:r,target:e,type:Ye.Invocation}:{arguments:t,invocationId:n.toString(),target:e,type:Ye.Invocation}}}_launchStreams(e,t){if(0!==e.length){t||(t=Promise.resolve());for(const n in e)e[n].subscribe({complete:()=>{t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n))))},error:e=>{let r;r=e instanceof Error?e.message:e&&e.toString?e.toString():"Unknown error",t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n,r))))},next:e=>{t=t.then((()=>this._sendWithProtocol(this._createStreamItemMessage(n,e))))}})}}_replaceStreamingParams(e){const t=[],n=[];for(let r=0;r=55296&&o<=56319&&r65535&&(h-=65536,s.push(h>>>10&1023|55296),h=56320|1023&h),s.push(h)}else s.push(a);s.length>=4096&&(i+=String.fromCharCode.apply(String,s),s.length=0)}return s.length>0&&(i+=String.fromCharCode.apply(String,s)),i}var jt,Wt=Bt?new TextDecoder:null,zt=Bt?"undefined"!=typeof process&&"force"!==(null===(Ut=null===process||void 0===process?void 0:process.env)||void 0===Ut?void 0:Ut.TEXT_DECODER)?200:0:At,Jt=function(e,t){this.type=e,this.data=t},qt=(jt=function(e,t){return jt=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},jt(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}jt(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),Vt=function(e){function t(n){var r=e.call(this,n)||this,o=Object.create(t.prototype);return Object.setPrototypeOf(r,o),Object.defineProperty(r,"name",{configurable:!0,enumerable:!1,value:t.name}),r}return qt(t,e),t}(Error),Kt={type:-1,encode:function(e){var t,n,r,o;return e instanceof Date?function(e){var t,n=e.sec,r=e.nsec;if(n>=0&&r>=0&&n<=17179869183){if(0===r&&n<=4294967295){var o=new Uint8Array(4);return(t=new DataView(o.buffer)).setUint32(0,n),o}var s=n/4294967296,i=4294967295&n;return o=new Uint8Array(8),(t=new DataView(o.buffer)).setUint32(0,r<<2|3&s),t.setUint32(4,i),o}return o=new Uint8Array(12),(t=new DataView(o.buffer)).setUint32(0,r),Nt(t,4,n),o}((r=1e6*((t=e.getTime())-1e3*(n=Math.floor(t/1e3))),{sec:n+(o=Math.floor(r/1e9)),nsec:r-1e9*o})):null},decode:function(e){var t=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:var n=t.getUint32(0);return{sec:4294967296*(3&n)+t.getUint32(4),nsec:n>>>2};case 12:return{sec:$t(t,4),nsec:t.getUint32(0)};default:throw new Vt("Unrecognized data size for timestamp (expected 4, 8, or 12): ".concat(e.length))}}(e);return new Date(1e3*t.sec+t.nsec/1e6)}},Xt=function(){function e(){this.builtInEncoders=[],this.builtInDecoders=[],this.encoders=[],this.decoders=[],this.register(Kt)}return e.prototype.register=function(e){var t=e.type,n=e.encode,r=e.decode;if(t>=0)this.encoders[t]=n,this.decoders[t]=r;else{var o=1+t;this.builtInEncoders[o]=n,this.builtInDecoders[o]=r}},e.prototype.tryToEncode=function(e,t){for(var n=0;nthis.maxDepth)throw new Error("Too deep objects in depth ".concat(t));null==e?this.encodeNil():"boolean"==typeof e?this.encodeBoolean(e):"number"==typeof e?this.encodeNumber(e):"string"==typeof e?this.encodeString(e):this.encodeObject(e,t)},e.prototype.ensureBufferSizeToWrite=function(e){var t=this.pos+e;this.view.byteLength=0?e<128?this.writeU8(e):e<256?(this.writeU8(204),this.writeU8(e)):e<65536?(this.writeU8(205),this.writeU16(e)):e<4294967296?(this.writeU8(206),this.writeU32(e)):(this.writeU8(207),this.writeU64(e)):e>=-32?this.writeU8(224|e+32):e>=-128?(this.writeU8(208),this.writeI8(e)):e>=-32768?(this.writeU8(209),this.writeI16(e)):e>=-2147483648?(this.writeU8(210),this.writeI32(e)):(this.writeU8(211),this.writeI64(e)):this.forceFloat32?(this.writeU8(202),this.writeF32(e)):(this.writeU8(203),this.writeF64(e))},e.prototype.writeStringHeader=function(e){if(e<32)this.writeU8(160+e);else if(e<256)this.writeU8(217),this.writeU8(e);else if(e<65536)this.writeU8(218),this.writeU16(e);else{if(!(e<4294967296))throw new Error("Too long string: ".concat(e," bytes in UTF-8"));this.writeU8(219),this.writeU32(e)}},e.prototype.encodeString=function(e){if(e.length>Ot){var t=Lt(e);this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),Ft(e,this.bytes,this.pos),this.pos+=t}else t=Lt(e),this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),function(e,t,n){for(var r=e.length,o=n,s=0;s>6&31|192;else{if(i>=55296&&i<=56319&&s>12&15|224,t[o++]=i>>6&63|128):(t[o++]=i>>18&7|240,t[o++]=i>>12&63|128,t[o++]=i>>6&63|128)}t[o++]=63&i|128}else t[o++]=i}}(e,this.bytes,this.pos),this.pos+=t},e.prototype.encodeObject=function(e,t){var n=this.extensionCodec.tryToEncode(e,this.context);if(null!=n)this.encodeExtension(n);else if(Array.isArray(e))this.encodeArray(e,t);else if(ArrayBuffer.isView(e))this.encodeBinary(e);else{if("object"!=typeof e)throw new Error("Unrecognized object: ".concat(Object.prototype.toString.apply(e)));this.encodeMap(e,t)}},e.prototype.encodeBinary=function(e){var t=e.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else{if(!(t<4294967296))throw new Error("Too large binary: ".concat(t));this.writeU8(198),this.writeU32(t)}var n=Yt(e);this.writeU8a(n)},e.prototype.encodeArray=function(e,t){var n=e.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else{if(!(n<4294967296))throw new Error("Too large array: ".concat(n));this.writeU8(221),this.writeU32(n)}for(var r=0,o=e;r0&&e<=this.maxKeyLength},e.prototype.find=function(e,t,n){e:for(var r=0,o=this.caches[n-1];r=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)},e.prototype.decode=function(e,t,n){var r=this.find(e,t,n);if(null!=r)return this.hit++,r;this.miss++;var o=Ht(e,t,n),s=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(s,o),o},e}(),en=function(e,t){var n,r,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]1||a(e,t)}))})}function a(e,t){try{(n=o[e](t)).value instanceof nn?Promise.resolve(n.value.v).then(c,l):h(s[0][2],n)}catch(e){h(s[0][3],e)}var n}function c(e){a("next",e)}function l(e){a("throw",e)}function h(e,t){e(t),s.shift(),s.length&&a(s[0][0],s[0][1])}},on=new DataView(new ArrayBuffer(0)),sn=new Uint8Array(on.buffer),an=function(){try{on.getInt8(0)}catch(e){return e.constructor}throw new Error("never reached")}(),cn=new an("Insufficient data"),ln=new Zt,hn=function(){function e(e,t,n,r,o,s,i,a){void 0===e&&(e=Xt.defaultCodec),void 0===t&&(t=void 0),void 0===n&&(n=At),void 0===r&&(r=At),void 0===o&&(o=At),void 0===s&&(s=At),void 0===i&&(i=At),void 0===a&&(a=ln),this.extensionCodec=e,this.context=t,this.maxStrLength=n,this.maxBinLength=r,this.maxArrayLength=o,this.maxMapLength=s,this.maxExtLength=i,this.keyDecoder=a,this.totalPos=0,this.pos=0,this.view=on,this.bytes=sn,this.headByte=-1,this.stack=[]}return e.prototype.reinitializeState=function(){this.totalPos=0,this.headByte=-1,this.stack.length=0},e.prototype.setBuffer=function(e){this.bytes=Yt(e),this.view=function(e){if(e instanceof ArrayBuffer)return new DataView(e);var t=Yt(e);return new DataView(t.buffer,t.byteOffset,t.byteLength)}(this.bytes),this.pos=0},e.prototype.appendBuffer=function(e){if(-1!==this.headByte||this.hasRemaining(1)){var t=this.bytes.subarray(this.pos),n=Yt(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}else this.setBuffer(e)},e.prototype.hasRemaining=function(e){return this.view.byteLength-this.pos>=e},e.prototype.createExtraByteError=function(e){var t=this.view,n=this.pos;return new RangeError("Extra ".concat(t.byteLength-n," of ").concat(t.byteLength," byte(s) found at buffer[").concat(e,"]"))},e.prototype.decode=function(e){this.reinitializeState(),this.setBuffer(e);var t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t},e.prototype.decodeMulti=function(e){return en(this,(function(t){switch(t.label){case 0:this.reinitializeState(),this.setBuffer(e),t.label=1;case 1:return this.hasRemaining(1)?[4,this.doDecodeSync()]:[3,3];case 2:return t.sent(),[3,1];case 3:return[2]}}))},e.prototype.decodeAsync=function(e){var t,n,r,o,s,i,a;return s=this,void 0,a=function(){var s,i,a,c,l,h,u,d;return en(this,(function(p){switch(p.label){case 0:s=!1,p.label=1;case 1:p.trys.push([1,6,7,12]),t=tn(e),p.label=2;case 2:return[4,t.next()];case 3:if((n=p.sent()).done)return[3,5];if(a=n.value,s)throw this.createExtraByteError(this.totalPos);this.appendBuffer(a);try{i=this.doDecodeSync(),s=!0}catch(e){if(!(e instanceof an))throw e}this.totalPos+=this.pos,p.label=4;case 4:return[3,2];case 5:return[3,12];case 6:return c=p.sent(),r={error:c},[3,12];case 7:return p.trys.push([7,,10,11]),n&&!n.done&&(o=t.return)?[4,o.call(t)]:[3,9];case 8:p.sent(),p.label=9;case 9:return[3,11];case 10:if(r)throw r.error;return[7];case 11:return[7];case 12:if(s){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return[2,i]}throw h=(l=this).headByte,u=l.pos,d=l.totalPos,new RangeError("Insufficient data in parsing ".concat(Qt(h)," at ").concat(d," (").concat(u," in the current buffer)"))}}))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{o(a.next(e))}catch(e){t(e)}}function r(e){try{o(a.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,r)}o((a=a.apply(s,[])).next())}))},e.prototype.decodeArrayStream=function(e){return this.decodeMultiAsync(e,!0)},e.prototype.decodeStream=function(e){return this.decodeMultiAsync(e,!1)},e.prototype.decodeMultiAsync=function(e,t){return rn(this,arguments,(function(){var n,r,o,s,i,a,c,l,h;return en(this,(function(u){switch(u.label){case 0:n=t,r=-1,u.label=1;case 1:u.trys.push([1,13,14,19]),o=tn(e),u.label=2;case 2:return[4,nn(o.next())];case 3:if((s=u.sent()).done)return[3,12];if(i=s.value,t&&0===r)throw this.createExtraByteError(this.totalPos);this.appendBuffer(i),n&&(r=this.readArraySize(),n=!1,this.complete()),u.label=4;case 4:u.trys.push([4,9,,10]),u.label=5;case 5:return[4,nn(this.doDecodeSync())];case 6:return[4,u.sent()];case 7:return u.sent(),0==--r?[3,8]:[3,5];case 8:return[3,10];case 9:if(!((a=u.sent())instanceof an))throw a;return[3,10];case 10:this.totalPos+=this.pos,u.label=11;case 11:return[3,2];case 12:return[3,19];case 13:return c=u.sent(),l={error:c},[3,19];case 14:return u.trys.push([14,,17,18]),s&&!s.done&&(h=o.return)?[4,nn(h.call(o))]:[3,16];case 15:u.sent(),u.label=16;case 16:return[3,18];case 17:if(l)throw l.error;return[7];case 18:return[7];case 19:return[2]}}))}))},e.prototype.doDecodeSync=function(){e:for(;;){var e=this.readHeadByte(),t=void 0;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){if(0!=(r=e-128)){this.pushMapState(r),this.complete();continue e}t={}}else if(e<160){if(0!=(r=e-144)){this.pushArrayState(r),this.complete();continue e}t=[]}else{var n=e-160;t=this.decodeUtf8String(n,0)}else if(192===e)t=null;else if(194===e)t=!1;else if(195===e)t=!0;else if(202===e)t=this.readF32();else if(203===e)t=this.readF64();else if(204===e)t=this.readU8();else if(205===e)t=this.readU16();else if(206===e)t=this.readU32();else if(207===e)t=this.readU64();else if(208===e)t=this.readI8();else if(209===e)t=this.readI16();else if(210===e)t=this.readI32();else if(211===e)t=this.readI64();else if(217===e)n=this.lookU8(),t=this.decodeUtf8String(n,1);else if(218===e)n=this.lookU16(),t=this.decodeUtf8String(n,2);else if(219===e)n=this.lookU32(),t=this.decodeUtf8String(n,4);else if(220===e){if(0!==(r=this.readU16())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(221===e){if(0!==(r=this.readU32())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(222===e){if(0!==(r=this.readU16())){this.pushMapState(r),this.complete();continue e}t={}}else if(223===e){if(0!==(r=this.readU32())){this.pushMapState(r),this.complete();continue e}t={}}else if(196===e){var r=this.lookU8();t=this.decodeBinary(r,1)}else if(197===e)r=this.lookU16(),t=this.decodeBinary(r,2);else if(198===e)r=this.lookU32(),t=this.decodeBinary(r,4);else if(212===e)t=this.decodeExtension(1,0);else if(213===e)t=this.decodeExtension(2,0);else if(214===e)t=this.decodeExtension(4,0);else if(215===e)t=this.decodeExtension(8,0);else if(216===e)t=this.decodeExtension(16,0);else if(199===e)r=this.lookU8(),t=this.decodeExtension(r,1);else if(200===e)r=this.lookU16(),t=this.decodeExtension(r,2);else{if(201!==e)throw new Vt("Unrecognized type byte: ".concat(Qt(e)));r=this.lookU32(),t=this.decodeExtension(r,4)}this.complete();for(var o=this.stack;o.length>0;){var s=o[o.length-1];if(0===s.type){if(s.array[s.position]=t,s.position++,s.position!==s.size)continue e;o.pop(),t=s.array}else{if(1===s.type){if("string"!=(i=typeof t)&&"number"!==i)throw new Vt("The type of key must be string or number but "+typeof t);if("__proto__"===t)throw new Vt("The key __proto__ is not allowed");s.key=t,s.type=2;continue e}if(s.map[s.key]=t,s.readCount++,s.readCount!==s.size){s.key=null,s.type=1;continue e}o.pop(),t=s.map}}return t}var i},e.prototype.readHeadByte=function(){return-1===this.headByte&&(this.headByte=this.readU8()),this.headByte},e.prototype.complete=function(){this.headByte=-1},e.prototype.readArraySize=function(){var e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new Vt("Unrecognized array type byte: ".concat(Qt(e)))}},e.prototype.pushMapState=function(e){if(e>this.maxMapLength)throw new Vt("Max length exceeded: map length (".concat(e,") > maxMapLengthLength (").concat(this.maxMapLength,")"));this.stack.push({type:1,size:e,key:null,readCount:0,map:{}})},e.prototype.pushArrayState=function(e){if(e>this.maxArrayLength)throw new Vt("Max length exceeded: array length (".concat(e,") > maxArrayLength (").concat(this.maxArrayLength,")"));this.stack.push({type:0,size:e,array:new Array(e),position:0})},e.prototype.decodeUtf8String=function(e,t){var n;if(e>this.maxStrLength)throw new Vt("Max length exceeded: UTF-8 byte length (".concat(e,") > maxStrLength (").concat(this.maxStrLength,")"));if(this.bytes.byteLengthzt?function(e,t,n){var r=e.subarray(t,t+n);return Wt.decode(r)}(this.bytes,o,e):Ht(this.bytes,o,e),this.pos+=t+e,r},e.prototype.stateIsMapKey=function(){return this.stack.length>0&&1===this.stack[this.stack.length-1].type},e.prototype.decodeBinary=function(e,t){if(e>this.maxBinLength)throw new Vt("Max length exceeded: bin length (".concat(e,") > maxBinLength (").concat(this.maxBinLength,")"));if(!this.hasRemaining(e+t))throw cn;var n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r},e.prototype.decodeExtension=function(e,t){if(e>this.maxExtLength)throw new Vt("Max length exceeded: ext length (".concat(e,") > maxExtLength (").concat(this.maxExtLength,")"));var n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)},e.prototype.lookU8=function(){return this.view.getUint8(this.pos)},e.prototype.lookU16=function(){return this.view.getUint16(this.pos)},e.prototype.lookU32=function(){return this.view.getUint32(this.pos)},e.prototype.readU8=function(){var e=this.view.getUint8(this.pos);return this.pos++,e},e.prototype.readI8=function(){var e=this.view.getInt8(this.pos);return this.pos++,e},e.prototype.readU16=function(){var e=this.view.getUint16(this.pos);return this.pos+=2,e},e.prototype.readI16=function(){var e=this.view.getInt16(this.pos);return this.pos+=2,e},e.prototype.readU32=function(){var e=this.view.getUint32(this.pos);return this.pos+=4,e},e.prototype.readI32=function(){var e=this.view.getInt32(this.pos);return this.pos+=4,e},e.prototype.readU64=function(){var e,t,n=(e=this.view,t=this.pos,4294967296*e.getUint32(t)+e.getUint32(t+4));return this.pos+=8,n},e.prototype.readI64=function(){var e=$t(this.view,this.pos);return this.pos+=8,e},e.prototype.readF32=function(){var e=this.view.getFloat32(this.pos);return this.pos+=4,e},e.prototype.readF64=function(){var e=this.view.getFloat64(this.pos);return this.pos+=8,e},e}();class un{static write(e){let t=e.byteLength||e.length;const n=[];do{let e=127&t;t>>=7,t>0&&(e|=128),n.push(e)}while(t>0);t=e.byteLength||e.length;const r=new Uint8Array(n.length+t);return r.set(n,0),r.set(e,n.length),r.buffer}static parse(e){const t=[],n=new Uint8Array(e),r=[0,7,14,21,28];for(let o=0;o7)throw new Error("Messages bigger than 2GB are not supported.");if(!(n.byteLength>=o+i+a))throw new Error("Incomplete message.");t.push(n.slice?n.slice(o+i,o+i+a):n.subarray(o+i,o+i+a)),o=o+i+a}return t}}const dn=new Uint8Array([145,Ye.Ping]);class pn{constructor(e){this.name="messagepack",this.version=1,this.transferFormat=Xe.Binary,this._errorResult=1,this._voidResult=2,this._nonVoidResult=3,e=e||{},this._encoder=new Gt(e.extensionCodec,e.context,e.maxDepth,e.initialBufferSize,e.sortKeys,e.forceFloat32,e.ignoreUndefined,e.forceIntegerToFloat),this._decoder=new hn(e.extensionCodec,e.context,e.maxStrLength,e.maxBinLength,e.maxArrayLength,e.maxMapLength,e.maxExtLength)}parseMessages(e,t){if(!(n=e)||"undefined"==typeof ArrayBuffer||!(n instanceof ArrayBuffer||n.constructor&&"ArrayBuffer"===n.constructor.name))throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer.");var n;null===t&&(t=Qe.instance);const r=un.parse(e),o=[];for(const e of r){const n=this._parseMessage(e,t);n&&o.push(n)}return o}writeMessage(e){switch(e.type){case Ye.Invocation:return this._writeInvocation(e);case Ye.StreamInvocation:return this._writeStreamInvocation(e);case Ye.StreamItem:return this._writeStreamItem(e);case Ye.Completion:return this._writeCompletion(e);case Ye.Ping:return un.write(dn);case Ye.CancelInvocation:return this._writeCancelInvocation(e);default:throw new Error("Invalid message type.")}}_parseMessage(e,t){if(0===e.length)throw new Error("Invalid payload.");const n=this._decoder.decode(e);if(0===n.length||!(n instanceof Array))throw new Error("Invalid payload.");const r=n[0];switch(r){case Ye.Invocation:return this._createInvocationMessage(this._readHeaders(n),n);case Ye.StreamItem:return this._createStreamItemMessage(this._readHeaders(n),n);case Ye.Completion:return this._createCompletionMessage(this._readHeaders(n),n);case Ye.Ping:return this._createPingMessage(n);case Ye.Close:return this._createCloseMessage(n);default:return t.log(Ve.Information,"Unknown message type '"+r+"' ignored."),null}}_createCloseMessage(e){if(e.length<2)throw new Error("Invalid payload for Close message.");return{allowReconnect:e.length>=3?e[2]:void 0,error:e[1],type:Ye.Close}}_createPingMessage(e){if(e.length<1)throw new Error("Invalid payload for Ping message.");return{type:Ye.Ping}}_createInvocationMessage(e,t){if(t.length<5)throw new Error("Invalid payload for Invocation message.");const n=t[2];return n?{arguments:t[4],headers:e,invocationId:n,streamIds:[],target:t[3],type:Ye.Invocation}:{arguments:t[4],headers:e,streamIds:[],target:t[3],type:Ye.Invocation}}_createStreamItemMessage(e,t){if(t.length<4)throw new Error("Invalid payload for StreamItem message.");return{headers:e,invocationId:t[2],item:t[3],type:Ye.StreamItem}}_createCompletionMessage(e,t){if(t.length<4)throw new Error("Invalid payload for Completion message.");const n=t[3];if(n!==this._voidResult&&t.length<5)throw new Error("Invalid payload for Completion message.");let r,o;switch(n){case this._errorResult:r=t[4];break;case this._nonVoidResult:o=t[4]}return{error:r,headers:e,invocationId:t[2],result:o,type:Ye.Completion}}_writeInvocation(e){let t;return t=e.streamIds?this._encoder.encode([Ye.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments,e.streamIds]):this._encoder.encode([Ye.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments]),un.write(t.slice())}_writeStreamInvocation(e){let t;return t=e.streamIds?this._encoder.encode([Ye.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments,e.streamIds]):this._encoder.encode([Ye.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments]),un.write(t.slice())}_writeStreamItem(e){const t=this._encoder.encode([Ye.StreamItem,e.headers||{},e.invocationId,e.item]);return un.write(t.slice())}_writeCompletion(e){const t=e.error?this._errorResult:e.result?this._nonVoidResult:this._voidResult;let n;switch(t){case this._errorResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t,e.error]);break;case this._voidResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t]);break;case this._nonVoidResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t,e.result])}return un.write(n.slice())}_writeCancelInvocation(e){const t=this._encoder.encode([Ye.CancelInvocation,e.headers||{},e.invocationId]);return un.write(t.slice())}_readHeaders(e){const t=e[1];if("object"!=typeof t)throw new Error("Invalid headers.");return t}}let fn=!1;async function gn(){let e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),fn||(fn=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}const mn="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,yn=mn?mn.decode.bind(mn):function(e){let t=0;const n=e.length,r=[],o=[];for(;t65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},wn=Math.pow(2,32),vn=Math.pow(2,21)-1;function bn(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function _n(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function En(e,t){const n=_n(e,t+4);if(n>vn)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*wn+_n(e,t)}class Sn{constructor(e){this.batchData=e;const t=new Tn(e);this.arrayRangeReader=new xn(e),this.arrayBuilderSegmentReader=new Dn(e),this.diffReader=new Cn(e),this.editReader=new In(e,t),this.frameReader=new kn(e,t)}updatedComponents(){return bn(this.batchData,this.batchData.length-20)}referenceFrames(){return bn(this.batchData,this.batchData.length-16)}disposedComponentIds(){return bn(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return bn(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return bn(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return bn(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return En(this.batchData,n)}}class Cn{constructor(e){this.batchDataUint8=e}componentId(e){return bn(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class In{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return bn(this.batchDataUint8,e)}siblingIndex(e){return bn(this.batchDataUint8,e+4)}newTreeIndex(e){return bn(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return bn(this.batchDataUint8,e+8)}removedAttributeName(e){const t=bn(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class kn{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return bn(this.batchDataUint8,e)}subtreeLength(e){return bn(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=bn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return bn(this.batchDataUint8,e+8)}elementName(e){const t=bn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=bn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=bn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=bn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=bn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return En(this.batchDataUint8,e+12)}}class Tn{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=bn(e,e.length-4)}readString(e){if(-1===e)return null;{const n=bn(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const s=e[t+o];if(n|=(127&s)<this.nextBatchId)return this.fatalError?(this.logger.log(Rn.Debug,`Received a new batch ${e} but errored out on a previous batch ${this.nextBatchId-1}`),void await n.send("OnRenderCompleted",this.nextBatchId-1,this.fatalError.toString())):void this.logger.log(Rn.Debug,`Waiting for batch ${this.nextBatchId}. Batch ${e} not processed.`);try{this.nextBatchId++,this.logger.log(Rn.Debug,`Applying batch ${e}.`),function(e,t){const n=de[e];if(!n)throw new Error(`There is no browser renderer with ID ${e}.`);const r=t.arrayRangeReader,o=t.updatedComponents(),s=r.values(o),i=r.count(o),a=t.referenceFrames(),c=r.values(a),l=t.diffReader;for(let e=0;e=this.minLevel){const n=`[${(new Date).toISOString()}] ${Rn[e]}: ${t}`;switch(e){case Rn.Critical:case Rn.Error:console.error(n);break;case Rn.Warning:console.warn(n);break;case Rn.Information:console.info(n);break;default:console.log(n)}}}}class Nn{constructor(e,t){this.circuitId=void 0,this.components=e,this.applicationState=t}reconnect(e){if(!this.circuitId)throw new Error("Circuit host not initialized.");return e.state!==Ge.Connected?Promise.resolve(!1):e.invoke("ConnectCircuit",this.circuitId)}initialize(e){if(this.circuitId)throw new Error(`Circuit host '${this.circuitId}' already initialized.`);this.circuitId=e}async startCircuit(e){if(e.state!==Ge.Connected)return!1;const t=await e.invoke("StartCircuit",ye.getBaseURI(),ye.getLocationHref(),JSON.stringify(this.components.map((e=>e.toRecord()))),this.applicationState||"");return!!t&&(this.initialize(t),!0)}resolveElement(e){const t=function(e){const t=f.get(e);if(t)return f.delete(e),t}(e);if(t)return M(t,!0);const n=Number.parseInt(e);if(!Number.isNaN(n))return function(e,t){if(!e.parentNode)throw new Error(`Comment not connected to the DOM ${e.textContent}`);const n=e.parentNode,r=M(n,!0),o=J(r);return Array.from(n.childNodes).forEach((e=>o.push(e))),e[B]=r,t&&(e[L]=t,M(t)),M(e)}(this.components[n].start,this.components[n].end);throw new Error(`Invalid sequence number or identifier '${e}'.`)}}const $n={configureSignalR:e=>{},logLevel:Rn.Warning,reconnectionOptions:{maxRetries:8,retryIntervalMilliseconds:2e4,dialogId:"components-reconnect-modal"}};class Bn{constructor(e,t,n,r){this.maxRetries=t,this.document=n,this.logger=r,this.addedToDom=!1,this.modal=this.document.createElement("div"),this.modal.id=e,this.maxRetries=t,this.modal.style.cssText=["position: fixed","top: 0","right: 0","bottom: 0","left: 0","z-index: 1050","display: none","overflow: hidden","background-color: #fff","opacity: 0.8","text-align: center","font-weight: bold","transition: visibility 0s linear 500ms"].join(";"),this.message=this.document.createElement("h5"),this.message.style.cssText="margin-top: 20px",this.button=this.document.createElement("button"),this.button.style.cssText="margin:5px auto 5px",this.button.textContent="Retry";const o=this.document.createElement("a");o.addEventListener("click",(()=>location.reload())),o.textContent="reload",this.reloadParagraph=this.document.createElement("p"),this.reloadParagraph.textContent="Alternatively, ",this.reloadParagraph.appendChild(o),this.modal.appendChild(this.message),this.modal.appendChild(this.button),this.modal.appendChild(this.reloadParagraph),this.loader=this.getLoader(),this.message.after(this.loader),this.button.addEventListener("click",(async()=>{this.show();try{await Ne.reconnect()||this.rejected()}catch(e){this.logger.log(Rn.Error,e),this.failed()}}))}show(){this.addedToDom||(this.addedToDom=!0,this.document.body.appendChild(this.modal)),this.modal.style.display="block",this.loader.style.display="inline-block",this.button.style.display="none",this.reloadParagraph.style.display="none",this.message.textContent="Attempting to reconnect to the server...",this.modal.style.visibility="hidden",setTimeout((()=>{this.modal.style.visibility="visible"}),0)}update(e){this.message.textContent=`Attempting to reconnect to the server: ${e} of ${this.maxRetries}`}hide(){this.modal.style.display="none"}failed(){this.button.style.display="block",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Reconnection failed. Try "),t=this.document.createElement("a");t.textContent="reloading",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page if you're unable to reconnect.");this.message.replaceChildren(e,t,n)}rejected(){this.button.style.display="none",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Could not reconnect to the server. "),t=this.document.createElement("a");t.textContent="Reload",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page to restore functionality.");this.message.replaceChildren(e,t,n)}getLoader(){const e=this.document.createElement("div");return e.style.cssText=["border: 0.3em solid #f3f3f3","border-top: 0.3em solid #3498db","border-radius: 50%","width: 2em","height: 2em","display: inline-block"].join(";"),e.animate([{transform:"rotate(0deg)"},{transform:"rotate(360deg)"}],{duration:2e3,iterations:1/0}),e}}class Ln{constructor(e,t,n){this.dialog=e,this.maxRetries=t,this.document=n,this.document=n;const r=this.document.getElementById(Ln.MaxRetriesId);r&&(r.innerText=this.maxRetries.toString())}show(){this.removeClasses(),this.dialog.classList.add(Ln.ShowClassName)}update(e){const t=this.document.getElementById(Ln.CurrentAttemptId);t&&(t.innerText=e.toString())}hide(){this.removeClasses(),this.dialog.classList.add(Ln.HideClassName)}failed(){this.removeClasses(),this.dialog.classList.add(Ln.FailedClassName)}rejected(){this.removeClasses(),this.dialog.classList.add(Ln.RejectedClassName)}removeClasses(){this.dialog.classList.remove(Ln.ShowClassName,Ln.HideClassName,Ln.FailedClassName,Ln.RejectedClassName)}}Ln.ShowClassName="components-reconnect-show",Ln.HideClassName="components-reconnect-hide",Ln.FailedClassName="components-reconnect-failed",Ln.RejectedClassName="components-reconnect-rejected",Ln.MaxRetriesId="components-reconnect-max-retries",Ln.CurrentAttemptId="components-reconnect-current-attempt";class Mn{constructor(e,t,n){this._currentReconnectionProcess=null,this._logger=e,this._reconnectionDisplay=t,this._reconnectCallback=n||Ne.reconnect}onConnectionDown(e,t){if(!this._reconnectionDisplay){const t=document.getElementById(e.dialogId);this._reconnectionDisplay=t?new Ln(t,e.maxRetries,document):new Bn(e.dialogId,e.maxRetries,document,this._logger)}this._currentReconnectionProcess||(this._currentReconnectionProcess=new On(e,this._logger,this._reconnectCallback,this._reconnectionDisplay))}onConnectionUp(){this._currentReconnectionProcess&&(this._currentReconnectionProcess.dispose(),this._currentReconnectionProcess=null)}}class On{constructor(e,t,n,r){this.logger=t,this.reconnectCallback=n,this.isDisposed=!1,this.reconnectDisplay=r,this.reconnectDisplay.show(),this.attemptPeriodicReconnection(e)}dispose(){this.isDisposed=!0,this.reconnectDisplay.hide()}async attemptPeriodicReconnection(e){for(let t=0;tOn.MaximumFirstRetryInterval?On.MaximumFirstRetryInterval:e.retryIntervalMilliseconds;if(await this.delay(n),this.isDisposed)break;try{return await this.reconnectCallback()?void 0:void this.reconnectDisplay.rejected()}catch(e){this.logger.log(Rn.Error,e)}}this.reconnectDisplay.failed()}delay(e){return new Promise((t=>setTimeout(t,e)))}}On.MaximumFirstRetryInterval=3e3;const Fn=/^\s*Blazor-Component-State:(?[a-zA-Z0-9\+\/=]+)$/;function Hn(e){var t;if(e.nodeType===Node.COMMENT_NODE){const n=e.textContent||"",r=Fn.exec(n),o=r&&r.groups&&r.groups.state;return o&&(null===(t=e.parentNode)||void 0===t||t.removeChild(e)),o}if(!e.hasChildNodes())return;const n=e.childNodes;for(let e=0;e.*)$/);function zn(e,t){const n=e.currentElement;if(n&&n.nodeType===Node.COMMENT_NODE&&n.textContent){const r=Wn.exec(n.textContent),o=r&&r.groups&&r.groups.descriptor;if(!o)return;try{const r=function(e){const t=JSON.parse(e),{type:n}=t;if("server"!==n&&"webassembly"!==n)throw new Error(`Invalid component type '${n}'.`);return t}(o);switch(t){case"webassembly":return function(e,t,n){const{type:r,assembly:o,typeName:s,parameterDefinitions:i,parameterValues:a,prerenderId:c}=e;if("webassembly"===r){if(!o)throw new Error("assembly must be defined when using a descriptor.");if(!s)throw new Error("typeName must be defined when using a descriptor.");if(c){const e=Jn(c,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,assembly:o,typeName:s,parameterDefinitions:i&&atob(i),parameterValues:a&&atob(a),start:t,prerenderId:c,end:e}}return{type:r,assembly:o,typeName:s,parameterDefinitions:i&&atob(i),parameterValues:a&&atob(a),start:t}}}(r,n,e);case"server":return function(e,t,n){const{type:r,descriptor:o,sequence:s,prerenderId:i}=e;if("server"===r){if(!o)throw new Error("descriptor must be defined when using a descriptor.");if(void 0===s)throw new Error("sequence must be defined when using a descriptor.");if(!Number.isInteger(s))throw new Error(`Error parsing the sequence '${s}' for component '${JSON.stringify(e)}'`);if(i){const e=Jn(i,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,sequence:s,descriptor:o,start:t,prerenderId:i,end:e}}return{type:r,sequence:s,descriptor:o,start:t}}}(r,n,e)}}catch(e){throw new Error(`Found malformed component comment at ${n.textContent}`)}}}function Jn(e,t){for(;t.next()&&t.currentElement;){const n=t.currentElement;if(n.nodeType!==Node.COMMENT_NODE)continue;if(!n.textContent)continue;const r=Wn.exec(n.textContent),o=r&&r[1];if(o)return qn(o,e),n}}function qn(e,t){const n=JSON.parse(e);if(1!==Object.keys(n).length)throw new Error(`Invalid end of component comment: '${e}'`);const r=n.prerenderId;if(!r)throw new Error(`End of component comment must have a value for the prerendered property: '${e}'`);if(r!==t)throw new Error(`End of component comment prerendered property must match the start comment prerender id: '${t}', '${r}'`)}class Vn{constructor(e){this.childNodes=e,this.currentIndex=-1,this.length=e.length}next(){return this.currentIndex++,this.currentIndexasync function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:s,afterStarted:i}=o;return i&&e.afterStartedCallbacks.push(i),s?s(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await C,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let Gn=!1,Qn=!1;async function Zn(e){if(Qn)throw new Error("Blazor has already started.");Qn=!0;const t=function(e){const t={...$n,...e};return e&&e.reconnectionOptions&&(t.reconnectionOptions={...$n.reconnectionOptions,...e.reconnectionOptions}),t}(e),n=await async function(e){const t=await fetch("_blazor/initializers",{method:"GET",credentials:"include",cache:"no-cache"}),n=await t.json(),r=new Yn;return await r.importInitializersAsync(n,[e]),r}(t),r=new An(t.logLevel);Ne.reconnect=async e=>{if(Gn)return!1;const n=e||await er(t,r,i);return await i.reconnect(n)?(t.reconnectionHandler.onConnectionUp(),!0):(r.log(Rn.Information,"Reconnection attempt to the circuit was rejected by the server. This may indicate that the associated state is no longer available on the server."),!1)},Ne.defaultReconnectionHandler=new Mn(r),t.reconnectionHandler=t.reconnectionHandler||Ne.defaultReconnectionHandler,r.log(Rn.Information,"Starting up Blazor server-side application.");const o=function(e,t){return function(e){const t=jn(e,"server"),n=[];for(let e=0;ee.sequence-t.sequence))}(e)}(document),s=Hn(document),i=new Nn(o,s||""),a=await er(t,r,i);if(!await i.startCircuit(a))return void r.log(Rn.Error,"Failed to start the circuit.");let c=!1;const l=()=>{if(!c){const e=new FormData,t=i.circuitId;e.append("circuitId",t),c=navigator.sendBeacon("_blazor/disconnect",e)}};Ne.disconnect=l,window.addEventListener("unload",l,{capture:!1,once:!0}),r.log(Rn.Information,"Blazor server-side application started."),n.invokeAfterStartedCallbacks(Ne)}async function er(t,n,r){var o,s;const i=new pn;i.name="blazorpack";const a=(new Dt).withUrl("_blazor").withHubProtocol(i);t.configureSignalR(a);const c=a.build();Ne._internal.navigationManager.listenForNavigationEvents(((e,t)=>c.send("OnLocationChanged",e,t))),c.on("JS.AttachComponent",((e,t)=>function(e,t,n,r){let o=de[0];o||(o=de[0]=new ie(0)),o.attachRootComponentToLogicalElement(n,t,!1)}(0,r.resolveElement(t),e))),c.on("JS.BeginInvokeJS",e.jsCallDispatcher.beginInvokeJSFromDotNet),c.on("JS.EndInvokeDotNet",e.jsCallDispatcher.endInvokeDotNetFromJS),c.on("JS.ReceiveByteArray",e.jsCallDispatcher.receiveByteArray),c.on("JS.BeginTransmitStream",(t=>{const n=new ReadableStream({start(e){c.stream("SendDotNetStreamToJS",t).subscribe({next:t=>e.enqueue(t),complete:()=>e.close(),error:t=>e.error(t)})}});e.jsCallDispatcher.supplyDotNetStream(t,n)}));const l=Pn.getOrCreate(n);c.on("JS.RenderBatch",((e,t)=>{n.log(Rn.Debug,`Received render batch with id ${e} and ${t.byteLength} bytes.`),l.processBatch(e,t,c)})),c.onclose((e=>!Gn&&t.reconnectionHandler.onConnectionDown(t.reconnectionOptions,e))),c.on("JS.Error",(e=>{Gn=!0,tr(c,e,n),gn()})),Ne._internal.forceCloseConnection=()=>c.stop(),Ne._internal.sendJSDataStream=(e,t,n)=>function(e,t,n,r){setTimeout((async()=>{let o=5,s=(new Date).valueOf();try{const i=t instanceof Blob?t.size:t.byteLength;let a=0,c=0;for(;a1)await e.send("ReceiveJSDataChunk",n,c,h,null);else{if(!await e.invoke("ReceiveJSDataChunk",n,c,h,null))break;const t=(new Date).valueOf(),r=t-s;s=t,o=Math.max(1,Math.round(500/Math.max(1,r)))}a+=l,c++}}catch(t){await e.send("ReceiveJSDataChunk",n,-1,null,t.toString())}}),0)}(c,e,t,n);try{await c.start()}catch(e){if(tr(c,e,n),"FailedToNegotiateWithServerError"===e.errorType)throw e;gn(),e.innerErrors&&(e.innerErrors.some((e=>"UnsupportedTransportError"===e.errorType&&e.transport===Ke.WebSockets))?n.log(Rn.Error,"Unable to connect, please ensure you are using an updated browser that supports WebSockets."):e.innerErrors.some((e=>"FailedToStartTransportError"===e.errorType&&e.transport===Ke.WebSockets))?n.log(Rn.Error,"Unable to connect, please ensure WebSockets are available. A VPN or proxy may be blocking the connection."):e.innerErrors.some((e=>"DisabledTransportError"===e.errorType&&e.transport===Ke.LongPolling))&&n.log(Rn.Error,"Unable to initiate a SignalR connection to the server. This might be because the server is not configured to support WebSockets. For additional details, visit https://aka.ms/blazor-server-websockets-error."))}return(null===(s=null===(o=c.connection)||void 0===o?void 0:o.features)||void 0===s?void 0:s.inherentKeepAlive)&&n.log(Rn.Warning,"Failed to connect via WebSockets, using the Long Polling fallback transport. This may be due to a VPN or proxy blocking the connection. To troubleshoot this, visit https://aka.ms/blazor-server-using-fallback-long-polling."),e.attachDispatcher({beginInvokeDotNetFromJS:(e,t,n,r,o)=>{c.send("BeginInvokeDotNetFromJS",e?e.toString():null,t,n,r||0,o)},endInvokeJSFromDotNet:(e,t,n)=>{c.send("EndInvokeJSFromDotNet",e,t,n)},sendByteArray:(e,t)=>{c.send("ReceiveByteArray",e,t)}}),c}function tr(e,t,n){n.log(Rn.Error,t),e&&e.stop()}Ne.start=Zn,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&Zn()})();
\ No newline at end of file
diff --git a/src/Components/Web.JS/dist/Release/blazor.webview.js b/src/Components/Web.JS/dist/Release/blazor.webview.js
index 20b6dd99bd09..d98c2bb6892c 100644
--- a/src/Components/Web.JS/dist/Release/blazor.webview.js
+++ b/src/Components/Web.JS/dist/Release/blazor.webview.js
@@ -1 +1 @@
-(()=>{"use strict";var e,t,n;!function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",a="__byte[]";class s{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const i={},c={0:new s(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,u=1,d=1,f=null;function h(e){t.push(e)}function p(e){if(e&&"object"==typeof e){c[d]=new s(e);const t={[o]:d};return d++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function m(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=p(e);n.__jsObjectId=t.__jsObjectId}catch{throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function b(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function v(e,t,n,r){const o=y();if(o.invokeDotNetFromJS){const a=T(r),s=o.invokeDotNetFromJS(e,t,n,a);return s?b(s):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function g(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=u++,a=new Promise(((e,t)=>{i[o]={resolve:e,reject:t}}));try{const a=T(r);y().beginInvokeDotNetFromJS(o,e,t,n,a)}catch(e){w(o,!1,e)}return a}function y(){if(null!==f)return f;throw new Error("No .NET call dispatcher has been set.")}function w(e,t,n){if(!i.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=i[e];delete i[e],t?r.resolve(n):r.reject(n)}function E(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function S(e,t){let n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function I(e){delete c[e]}e.attachDispatcher=function(e){f=e},e.attachReviver=h,e.invokeMethod=function(e,t,...n){return v(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return g(e,t,null,n)},e.createJSObjectReference=p,e.createJSStreamReference=m,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&I(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:S,disposeJSObjectReferenceById:I,invokeJSFromDotNet:(e,t,n,r)=>{const o=k(S(e,r).apply(null,b(t)),n);return null==o?null:T(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const a=new Promise((e=>{e(S(t,o).apply(null,b(n)))}));e&&a.then((t=>y().endInvokeJSFromDotNet(e,!0,T([e,!0,k(t,r)]))),(t=>y().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,E(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?b(n):new Error(n);w(parseInt(e),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new D;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return v(null,e,this._id,t)}invokeMethodAsync(e,...t){return g(null,e,this._id,t)}dispose(){g(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,h((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(a)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new A(t.__dotNetStream)}return t}));class A{constructor(e){var t;if(r.has(e))this._streamPromise=null===(t=r.get(e))||void 0===t?void 0:t.streamPromise,r.delete(e);else{const t=new D;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class D{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function k(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return p(e);case l.JSStreamReference:return m(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let R=0;function T(e){return R=0,JSON.stringify(e,N)}function N(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){f.sendByteArray(R,t);const e={[a]:R};return R++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class r{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new r(e,t.value)}return null}}const o=new Map,a=new Map,s=[];function i(e){return o.get(e)}function c(e){const t=o.get(e);return(null==t?void 0:t.browserEventName)||e}function l(e,t){e.forEach((e=>o.set(e,t)))}function u(e){const t=[];for(let n=0;ne.selected)).map((e=>e.value))}}return{value:function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t)?!!t.checked:t.value}}}),l(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),l(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),l(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),l(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","dblclick"],{createEventArgs:e=>d(e)}),l(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),l(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),l(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),l(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),l(["toggle"],{createEventArgs:()=>({})});const f=["date","datetime-local","month","time","week"],h=new Map;let p,m,b=0;const v={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++b).toString();h.set(r,e);const o=await w().invokeMethodAsync("AddRootComponent",t,r),a=new y(o,m[t]);return await a.setParameters(n),a}};class g{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class y{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new g)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return w().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await w().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function w(){if(!p)throw new Error("Dynamic root components have not been enabled in this application.");return p}const E=new Map;let S;const I=new Promise((e=>{S=e}));function C(e,t,n){return D(e,t.eventHandlerId,(()=>A(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function A(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let D=(e,t,n)=>n();const k=F(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),R={submit:!0},T=F(["click","dblclick","mousedown","mousemove","mouseup"]);class N{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++N.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new _(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),a=o.getHandler(t);if(a)this.eventInfoStore.update(a.eventHandlerId,n);else{const a={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(a),o.setHandler(t,a)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,a.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let o=n.shift(),a=null,s=!1;const c=k.hasOwnProperty(e);let l=!1;for(;o;){const f=o,h=this.getEventHandlerInfosForElement(f,!1);if(h){const n=h.getHandler(e);if(n&&(u=f,d=t.type,!((u instanceof HTMLButtonElement||u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement)&&T.hasOwnProperty(d)&&u.disabled))){if(!s){const n=i(e);a=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},s=!0}R.hasOwnProperty(t.type)&&t.preventDefault(),C(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:r.fromEvent(n.renderingComponentId,t)},a)}h.stopPropagation(e)&&(l=!0),h.preventDefault(e)&&t.preventDefault()}o=c||l?void 0:n.shift()}var u,d}getEventHandlerInfosForElement(e,t){return e.hasOwnProperty(this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new O:null}}N.nextEventDelegatorId=0;class _{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},s.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=c(e),this.countByEventName.hasOwnProperty(e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=k.hasOwnProperty(e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(this.infosByEventHandlerId.hasOwnProperty(t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=c(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(this.countByEventName.hasOwnProperty(e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class O{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return this.handlers.hasOwnProperty(e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function F(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const x=G("_blazorLogicalChildren"),L=G("_blazorLogicalParent"),P=G("_blazorLogicalEnd");function j(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return x in e||(e[x]=[]),e}function M(e,t){const n=document.createComment("!");return H(n,e,t),n}function H(e,t,n){const r=e;if(e instanceof Comment&&z(r)&&z(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(U(r))throw new Error("Not implemented: moving existing logical children");const o=z(t);if(n0;)B(n,0)}const r=n;r.parentNode.removeChild(r)}function U(e){return e[L]||null}function J(e,t){return z(e)[t]}function $(e){var t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function z(e){return e[x]}function K(e,t){const n=z(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let a=r;for(;a;){const e=a.nextSibling;if(n.insertBefore(a,t),a===o)break;a=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function W(e){const t=z(U(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=W(t);n?n.parentNode.insertBefore(e,n):X(e,U(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=W(e);if(t)return t.previousSibling;{const t=U(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&t.hasOwnProperty("__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",Q=document.createElement("template"),ee=document.createElementNS("http://www.w3.org/2000/svg","g"),te={},ne="__internal_",re="preventDefault_",oe="stopPropagation_";class ae{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new N(e),this.eventDelegator.notifyAfterClick((e=>{if(!he)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;eye(!1))))},enableNavigationInterception:function(){he=!0},navigateTo:ve,getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function ve(e,t,n=!1){const r=Ee(e),o=t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n};!o.forceLoad&&Ie(r)?ge(r,!1,o.replaceHistoryEntry):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,o.replaceHistoryEntry)}function ge(e,t,n){fe=!0,n?history.replaceState(null,"",e):history.pushState(null,"",e),ye(t)}async function ye(e){me&&await me(location.href,e)}let we;function Ee(e){return we=we||document.createElement("a"),we.href=e,we.href}function Se(e,t){return e?e.tagName===t?e:Se(e.parentElement,t):null}function Ie(e){const t=(n=document.baseURI).substr(0,n.lastIndexOf("/")+1);var n;return e.startsWith(t)}const Ce={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},Ae={init:function(e,t,n,r=50){const o=ke(t);(o||document.documentElement).style.overflowAnchor="none";const a=document.createRange();u(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const s=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;a.setStartAfter(t),a.setEndBefore(n);const s=a.getBoundingClientRect().height,i=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,s,i):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,s,i)}))}),{root:o,rootMargin:`${r}px`});s.observe(t),s.observe(n);const i=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{u(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),s.unobserve(e),s.observe(e)}));return n.observe(e,t),n}function u(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}De[e._id]={intersectionObserver:s,mutationObserverBefore:i,mutationObserverAfter:c}},dispose:function(e){const t=De[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete De[e._id])}},De={};function ke(e){return e?"visible"!==getComputedStyle(e).overflowY?e:ke(e.parentElement):null}const Re={getAndRemoveExistingTitle:function(){var e;const t=document.getElementsByTagName("title");if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],a=o.previousSibling;a instanceof Comment&&null!==U(a)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Te={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const a=Ne(e,t),s=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(a.blob)})),i=await new Promise((function(e){var t;const a=Math.min(1,r/s.width),i=Math.min(1,o/s.height),c=Math.min(a,i),l=document.createElement("canvas");l.width=Math.round(s.width*c),l.height=Math.round(s.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(s,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:a.lastModified,name:a.name,size:(null==i?void 0:i.size)||0,contentType:n,blob:i||a.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Ne(e,t).blob}};function Ne(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed.`);return n}const _e=new Map,Oe={navigateTo:ve,registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(o.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=a.get(t.browserEventName);n?n.push(e):a.set(t.browserEventName,[e]),s.forEach((n=>n(e,t.browserEventName)))}o.set(e,t)},rootComponents:v,_internal:{navigationManager:be,domWrapper:Ce,Virtualize:Ae,PageTitle:Re,InputFile:Te,getJSDataStreamChunk:async function(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)},receiveDotNetDataStream:function(t,n,r,o){let a=_e.get(t);if(!a){const n=new ReadableStream({start(e){_e.set(t,e),a=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(a.error(o),_e.delete(t)):0===r?(a.close(),_e.delete(t)):a.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(p)throw new Error("Dynamic root components have already been enabled.");p=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(A(t),r,o),S()}}};window.Blazor=Oe;let Fe=!1;const xe="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,Le=xe?xe.decode.bind(xe):function(e){let t=0;const n=e.length,r=[],o=[];for(;t65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},Pe=Math.pow(2,32),je=Math.pow(2,21)-1;function Me(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function He(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function Be(e,t){const n=He(e,t+4);if(n>je)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*Pe+He(e,t)}class Ue{constructor(e){this.batchData=e;const t=new Ke(e);this.arrayRangeReader=new Ve(e),this.arrayBuilderSegmentReader=new We(e),this.diffReader=new Je(e),this.editReader=new $e(e,t),this.frameReader=new ze(e,t)}updatedComponents(){return Me(this.batchData,this.batchData.length-20)}referenceFrames(){return Me(this.batchData,this.batchData.length-16)}disposedComponentIds(){return Me(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return Me(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return Me(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return Me(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return Be(this.batchData,n)}}class Je{constructor(e){this.batchDataUint8=e}componentId(e){return Me(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class $e{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return Me(this.batchDataUint8,e)}siblingIndex(e){return Me(this.batchDataUint8,e+4)}newTreeIndex(e){return Me(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return Me(this.batchDataUint8,e+8)}removedAttributeName(e){const t=Me(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class ze{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return Me(this.batchDataUint8,e)}subtreeLength(e){return Me(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return Me(this.batchDataUint8,e+8)}elementName(e){const t=Me(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=Me(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return Be(this.batchDataUint8,e+12)}}class Ke{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=Me(e,e.length-4)}readString(e){if(-1===e)return null;{const n=Me(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const a=e[t+o];if(n|=(127&a)<async function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:a,afterStarted:s}=o;return s&&e.afterStartedCallbacks.push(s),a?a(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await I,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let at=!1;async function st(){if(at)throw new Error("Blazor has already started.");at=!0;const t=await async function(){const e=await fetch("_framework/blazor.modules.json",{method:"GET",credentials:"include",cache:"no-cache"}),t=await e.json(),n=new ot;return await n.importInitializersAsync(t,[]),n}();(function(){const t={AttachToDocument:(e,t)=>{!function(e,t,n){const r="::after";let o=!1;if(e.endsWith(r))e=e.slice(0,-r.length),o=!0;else if(e.endsWith("::before"))throw new Error("The '::before' selector is not supported.");const a=function(e){const t=h.get(e);if(t)return h.delete(e),t}(e)||document.querySelector(e);if(!a)throw new Error(`Could not find any element matching selector '${e}'.`);!function(e,t,n,r){let o=de[0];o||(o=de[0]=new ae(0)),o.attachRootComponentToLogicalElement(n,t,r)}(0,j(a,!0),t,o)}(t,e)},RenderBatch:(e,t)=>{try{const n=rt(t);(function(e,t){const n=de[0];if(!n)throw new Error("There is no browser renderer with ID 0.");const r=t.arrayRangeReader,o=t.updatedComponents(),a=r.values(o),s=r.count(o),i=t.referenceFrames(),c=r.values(i),l=t.diffReader;for(let e=0;e{Ye=!0,console.error(`${e}\n${t}`),async function(){let e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),Fe||(Fe=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}()},BeginInvokeJS:e.jsCallDispatcher.beginInvokeJSFromDotNet,EndInvokeDotNet:e.jsCallDispatcher.endInvokeDotNetFromJS,SendByteArrayToJS:nt,Navigate:be.navigateTo};window.external.receiveMessage((e=>{const n=function(e){if(Ye||!e||!e.startsWith(Xe))return null;const t=e.substring(Xe.length),[n,...r]=JSON.parse(t);return{messageType:n,args:r}}(e);if(n){if(!t.hasOwnProperty(n.messageType))throw new Error(`Unsupported IPC message type '${n.messageType}'`);t[n.messageType].apply(null,n.args)}}))})(),e.attachDispatcher({beginInvokeDotNetFromJS:qe,endInvokeJSFromDotNet:Ze,sendByteArray:Qe}),be.enableNavigationInterception(),be.listenForNavigationEvents(et),tt("AttachPage",be.getBaseURI(),be.getLocationHref()),await t.invokeAfterStartedCallbacks(Oe)}Oe.start=st,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&st()})();
\ No newline at end of file
+(()=>{"use strict";var e,t,n;!function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",a="__byte[]";class s{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const i={},c={0:new s(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,u=1,d=1,f=null;function h(e){t.push(e)}function p(e){if(e&&"object"==typeof e){c[d]=new s(e);const t={[o]:d};return d++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function m(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=p(e);n.__jsObjectId=t.__jsObjectId}catch{throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function b(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function v(e,t,n,r){const o=y();if(o.invokeDotNetFromJS){const a=T(r),s=o.invokeDotNetFromJS(e,t,n,a);return s?b(s):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function g(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=u++,a=new Promise(((e,t)=>{i[o]={resolve:e,reject:t}}));try{const a=T(r);y().beginInvokeDotNetFromJS(o,e,t,n,a)}catch(e){w(o,!1,e)}return a}function y(){if(null!==f)return f;throw new Error("No .NET call dispatcher has been set.")}function w(e,t,n){if(!i.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=i[e];delete i[e],t?r.resolve(n):r.reject(n)}function E(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function S(e,t){let n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function I(e){delete c[e]}e.attachDispatcher=function(e){f=e},e.attachReviver=h,e.invokeMethod=function(e,t,...n){return v(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return g(e,t,null,n)},e.createJSObjectReference=p,e.createJSStreamReference=m,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&I(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:S,disposeJSObjectReferenceById:I,invokeJSFromDotNet:(e,t,n,r)=>{const o=k(S(e,r).apply(null,b(t)),n);return null==o?null:T(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const a=new Promise((e=>{e(S(t,o).apply(null,b(n)))}));e&&a.then((t=>y().endInvokeJSFromDotNet(e,!0,T([e,!0,k(t,r)]))),(t=>y().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,E(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?b(n):new Error(n);w(parseInt(e),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new D;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return v(null,e,this._id,t)}invokeMethodAsync(e,...t){return g(null,e,this._id,t)}dispose(){g(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,h((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(a)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new A(t.__dotNetStream)}return t}));class A{constructor(e){var t;if(r.has(e))this._streamPromise=null===(t=r.get(e))||void 0===t?void 0:t.streamPromise,r.delete(e);else{const t=new D;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class D{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function k(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return p(e);case l.JSStreamReference:return m(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let R=0;function T(e){return R=0,JSON.stringify(e,N)}function N(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){f.sendByteArray(R,t);const e={[a]:R};return R++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class r{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new r(e,t.value)}return null}}const o=new Map,a=new Map,s=[];function i(e){return o.get(e)}function c(e){const t=o.get(e);return(null==t?void 0:t.browserEventName)||e}function l(e,t){e.forEach((e=>o.set(e,t)))}function u(e){const t=[];for(let n=0;ne.selected)).map((e=>e.value))}}{const e=function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t);return{value:e?!!t.checked:t.value}}}}),l(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),l(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),l(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),l(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","dblclick"],{createEventArgs:e=>d(e)}),l(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),l(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),l(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),l(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),l(["toggle"],{createEventArgs:()=>({})});const f=["date","datetime-local","month","time","week"],h=new Map;let p,m,b=0;const v={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++b).toString();h.set(r,e);const o=await w().invokeMethodAsync("AddRootComponent",t,r),a=new y(o,m[t]);return await a.setParameters(n),a}};class g{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class y{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new g)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return w().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await w().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function w(){if(!p)throw new Error("Dynamic root components have not been enabled in this application.");return p}const E=new Map;let S;const I=new Promise((e=>{S=e}));function C(e,t,n){return D(e,t.eventHandlerId,(()=>A(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function A(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let D=(e,t,n)=>n();const k=F(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),R={submit:!0},T=F(["click","dblclick","mousedown","mousemove","mouseup"]);class N{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++N.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new _(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),a=o.getHandler(t);if(a)this.eventInfoStore.update(a.eventHandlerId,n);else{const a={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(a),o.setHandler(t,a)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,a.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let o=n.shift(),a=null,s=!1;const c=k.hasOwnProperty(e);let l=!1;for(;o;){const f=o,h=this.getEventHandlerInfosForElement(f,!1);if(h){const n=h.getHandler(e);if(n&&(u=f,d=t.type,!((u instanceof HTMLButtonElement||u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement)&&T.hasOwnProperty(d)&&u.disabled))){if(!s){const n=i(e);a=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},s=!0}R.hasOwnProperty(t.type)&&t.preventDefault(),C(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:r.fromEvent(n.renderingComponentId,t)},a)}h.stopPropagation(e)&&(l=!0),h.preventDefault(e)&&t.preventDefault()}o=c||l?void 0:n.shift()}var u,d}getEventHandlerInfosForElement(e,t){return e.hasOwnProperty(this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new O:null}}N.nextEventDelegatorId=0;class _{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},s.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=c(e),this.countByEventName.hasOwnProperty(e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=k.hasOwnProperty(e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(this.infosByEventHandlerId.hasOwnProperty(t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=c(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(this.countByEventName.hasOwnProperty(e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class O{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return this.handlers.hasOwnProperty(e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function F(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const x=G("_blazorLogicalChildren"),L=G("_blazorLogicalParent"),P=G("_blazorLogicalEnd");function j(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return x in e||(e[x]=[]),e}function M(e,t){const n=document.createComment("!");return H(n,e,t),n}function H(e,t,n){const r=e;if(e instanceof Comment&&z(r)&&z(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(U(r))throw new Error("Not implemented: moving existing logical children");const o=z(t);if(n0;)B(n,0)}const r=n;r.parentNode.removeChild(r)}function U(e){return e[L]||null}function J(e,t){return z(e)[t]}function $(e){var t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function z(e){return e[x]}function K(e,t){const n=z(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let a=r;for(;a;){const e=a.nextSibling;if(n.insertBefore(a,t),a===o)break;a=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function W(e){const t=z(U(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=W(t);n?n.parentNode.insertBefore(e,n):X(e,U(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=W(e);if(t)return t.previousSibling;{const t=U(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&t.hasOwnProperty("__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",Q=document.createElement("template"),ee=document.createElementNS("http://www.w3.org/2000/svg","g"),te={},ne="__internal_",re="preventDefault_",oe="stopPropagation_";class ae{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new N(e),this.eventDelegator.notifyAfterClick((e=>{if(!he)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;eye(!1))))},enableNavigationInterception:function(){he=!0},navigateTo:ve,getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function ve(e,t,n=!1){const r=Ee(e),o=t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n};!o.forceLoad&&Ie(r)?ge(r,!1,o.replaceHistoryEntry):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,o.replaceHistoryEntry)}function ge(e,t,n){fe=!0,n?history.replaceState(null,"",e):history.pushState(null,"",e),ye(t)}async function ye(e){me&&await me(location.href,e)}let we;function Ee(e){return we=we||document.createElement("a"),we.href=e,we.href}function Se(e,t){return e?e.tagName===t?e:Se(e.parentElement,t):null}function Ie(e){const t=(n=document.baseURI).substr(0,n.lastIndexOf("/")+1);var n;return e.startsWith(t)}const Ce={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},Ae={init:function(e,t,n,r=50){const o=ke(t);(o||document.documentElement).style.overflowAnchor="none";const a=document.createRange();u(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const s=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;a.setStartAfter(t),a.setEndBefore(n);const s=a.getBoundingClientRect().height,i=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,s,i):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,s,i)}))}),{root:o,rootMargin:`${r}px`});s.observe(t),s.observe(n);const i=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{u(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),s.unobserve(e),s.observe(e)}));return n.observe(e,t),n}function u(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}De[e._id]={intersectionObserver:s,mutationObserverBefore:i,mutationObserverAfter:c}},dispose:function(e){const t=De[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete De[e._id])}},De={};function ke(e){return e?"visible"!==getComputedStyle(e).overflowY?e:ke(e.parentElement):null}const Re={getAndRemoveExistingTitle:function(){var e;const t=document.head?document.head.getElementsByTagName("title"):[];if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],a=o.previousSibling;a instanceof Comment&&null!==U(a)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Te={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const a=Ne(e,t),s=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(a.blob)})),i=await new Promise((function(e){var t;const a=Math.min(1,r/s.width),i=Math.min(1,o/s.height),c=Math.min(a,i),l=document.createElement("canvas");l.width=Math.round(s.width*c),l.height=Math.round(s.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(s,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:a.lastModified,name:a.name,size:(null==i?void 0:i.size)||0,contentType:n,blob:i||a.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Ne(e,t).blob}};function Ne(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed.`);return n}const _e=new Map,Oe={navigateTo:ve,registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(o.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=a.get(t.browserEventName);n?n.push(e):a.set(t.browserEventName,[e]),s.forEach((n=>n(e,t.browserEventName)))}o.set(e,t)},rootComponents:v,_internal:{navigationManager:be,domWrapper:Ce,Virtualize:Ae,PageTitle:Re,InputFile:Te,getJSDataStreamChunk:async function(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)},receiveDotNetDataStream:function(t,n,r,o){let a=_e.get(t);if(!a){const n=new ReadableStream({start(e){_e.set(t,e),a=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(a.error(o),_e.delete(t)):0===r?(a.close(),_e.delete(t)):a.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(p)throw new Error("Dynamic root components have already been enabled.");p=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(A(t),r,o),S()}}};window.Blazor=Oe;let Fe=!1;const xe="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,Le=xe?xe.decode.bind(xe):function(e){let t=0;const n=e.length,r=[],o=[];for(;t65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},Pe=Math.pow(2,32),je=Math.pow(2,21)-1;function Me(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function He(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function Be(e,t){const n=He(e,t+4);if(n>je)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*Pe+He(e,t)}class Ue{constructor(e){this.batchData=e;const t=new Ke(e);this.arrayRangeReader=new Ve(e),this.arrayBuilderSegmentReader=new We(e),this.diffReader=new Je(e),this.editReader=new $e(e,t),this.frameReader=new ze(e,t)}updatedComponents(){return Me(this.batchData,this.batchData.length-20)}referenceFrames(){return Me(this.batchData,this.batchData.length-16)}disposedComponentIds(){return Me(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return Me(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return Me(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return Me(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return Be(this.batchData,n)}}class Je{constructor(e){this.batchDataUint8=e}componentId(e){return Me(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class $e{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return Me(this.batchDataUint8,e)}siblingIndex(e){return Me(this.batchDataUint8,e+4)}newTreeIndex(e){return Me(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return Me(this.batchDataUint8,e+8)}removedAttributeName(e){const t=Me(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class ze{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return Me(this.batchDataUint8,e)}subtreeLength(e){return Me(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return Me(this.batchDataUint8,e+8)}elementName(e){const t=Me(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=Me(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return Be(this.batchDataUint8,e+12)}}class Ke{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=Me(e,e.length-4)}readString(e){if(-1===e)return null;{const n=Me(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const a=e[t+o];if(n|=(127&a)<async function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:a,afterStarted:s}=o;return s&&e.afterStartedCallbacks.push(s),a?a(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await I,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let at=!1;async function st(){if(at)throw new Error("Blazor has already started.");at=!0;const t=await async function(){const e=await fetch("_framework/blazor.modules.json",{method:"GET",credentials:"include",cache:"no-cache"}),t=await e.json(),n=new ot;return await n.importInitializersAsync(t,[]),n}();(function(){const t={AttachToDocument:(e,t)=>{!function(e,t,n){const r="::after";let o=!1;if(e.endsWith(r))e=e.slice(0,-r.length),o=!0;else if(e.endsWith("::before"))throw new Error("The '::before' selector is not supported.");const a=function(e){const t=h.get(e);if(t)return h.delete(e),t}(e)||document.querySelector(e);if(!a)throw new Error(`Could not find any element matching selector '${e}'.`);!function(e,t,n,r){let o=de[0];o||(o=de[0]=new ae(0)),o.attachRootComponentToLogicalElement(n,t,r)}(0,j(a,!0),t,o)}(t,e)},RenderBatch:(e,t)=>{try{const n=rt(t);(function(e,t){const n=de[0];if(!n)throw new Error("There is no browser renderer with ID 0.");const r=t.arrayRangeReader,o=t.updatedComponents(),a=r.values(o),s=r.count(o),i=t.referenceFrames(),c=r.values(i),l=t.diffReader;for(let e=0;e{Ye=!0,console.error(`${e}\n${t}`),async function(){let e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),Fe||(Fe=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}()},BeginInvokeJS:e.jsCallDispatcher.beginInvokeJSFromDotNet,EndInvokeDotNet:e.jsCallDispatcher.endInvokeDotNetFromJS,SendByteArrayToJS:nt,Navigate:be.navigateTo};window.external.receiveMessage((e=>{const n=function(e){if(Ye||!e||!e.startsWith(Xe))return null;const t=e.substring(Xe.length),[n,...r]=JSON.parse(t);return{messageType:n,args:r}}(e);if(n){if(!t.hasOwnProperty(n.messageType))throw new Error(`Unsupported IPC message type '${n.messageType}'`);t[n.messageType].apply(null,n.args)}}))})(),e.attachDispatcher({beginInvokeDotNetFromJS:qe,endInvokeJSFromDotNet:Ze,sendByteArray:Qe}),be.enableNavigationInterception(),be.listenForNavigationEvents(et),tt("AttachPage",be.getBaseURI(),be.getLocationHref()),await t.invokeAfterStartedCallbacks(Oe)}Oe.start=st,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&st()})();
\ No newline at end of file
diff --git a/src/Components/Web.JS/src/PageTitle.ts b/src/Components/Web.JS/src/PageTitle.ts
index 9c213b5907c2..ed2fabc53565 100644
--- a/src/Components/Web.JS/src/PageTitle.ts
+++ b/src/Components/Web.JS/src/PageTitle.ts
@@ -5,7 +5,8 @@ export const PageTitle = {
};
function getAndRemoveExistingTitle(): string | null {
- const titleElements = document.getElementsByTagName('title');
+ // Other elements may exist outside (e.g., inside
diff --git a/src/Components/test/E2ETest/Infrastructure/WebDriverExtensions/BasicTestAppAuthenticationWebDriverExtensions.cs b/src/Components/test/E2ETest/Infrastructure/WebDriverExtensions/BasicTestAppAuthenticationWebDriverExtensions.cs
index 518ce4e3203c..a7627281f3ba 100644
--- a/src/Components/test/E2ETest/Infrastructure/WebDriverExtensions/BasicTestAppAuthenticationWebDriverExtensions.cs
+++ b/src/Components/test/E2ETest/Infrastructure/WebDriverExtensions/BasicTestAppAuthenticationWebDriverExtensions.cs
@@ -22,13 +22,11 @@ public static void SignInAs(this IWebDriver browser, Uri baseUri, string usernam
{
// Some tests need to change the authentication state without discarding the
// original page, but this adds several seconds of delay
- var javascript = (IJavaScriptExecutor)browser;
var originalWindow = browser.CurrentWindowHandle;
- javascript.ExecuteScript("window.open()");
- browser.SwitchTo().Window(browser.WindowHandles.Last());
+ browser.SwitchTo().NewWindow(WindowType.Tab);
browser.Navigate(baseUri, baseRelativeUri, noReload: false);
browser.Exists(By.CssSelector("h1#authentication"));
- javascript.ExecuteScript("window.close()");
+ browser.Close();
browser.SwitchTo().Window(originalWindow);
}
else
diff --git a/src/Components/test/E2ETest/ServerExecutionTests/CircuitGracefulTerminationTests.cs b/src/Components/test/E2ETest/ServerExecutionTests/CircuitGracefulTerminationTests.cs
index 7f14ac9b0829..aba2951cf7ee 100644
--- a/src/Components/test/E2ETest/ServerExecutionTests/CircuitGracefulTerminationTests.cs
+++ b/src/Components/test/E2ETest/ServerExecutionTests/CircuitGracefulTerminationTests.cs
@@ -7,8 +7,8 @@
using BasicTestApp;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
-using Microsoft.AspNetCore.Testing;
using Microsoft.AspNetCore.E2ETesting;
+using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Testing;
using OpenQA.Selenium;
@@ -66,6 +66,7 @@ public async Task ReloadingThePage_GracefullyDisconnects_TheCurrentCircuit()
}
[Fact]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/44185")]
public async Task ClosingTheBrowserWindow_GracefullyDisconnects_TheCurrentCircuit()
{
// Arrange & Act
diff --git a/src/Components/test/E2ETest/ServerExecutionTests/HeadModificationPrerenderingTest.cs b/src/Components/test/E2ETest/ServerExecutionTests/HeadModificationPrerenderingTest.cs
index ab29926a26f4..eea4511eb66d 100644
--- a/src/Components/test/E2ETest/ServerExecutionTests/HeadModificationPrerenderingTest.cs
+++ b/src/Components/test/E2ETest/ServerExecutionTests/HeadModificationPrerenderingTest.cs
@@ -36,6 +36,10 @@ public void CanModifyHeadDuringAndAfterPrerendering()
Browser.Equal("Title 1", () => Browser.Title);
Browser.Exists(By.Id("meta-description"));
+ // Check that unrelated elements were left alone
+ Browser.Equal("This element is used to test that PageTitle prerendering doesn't interfere with non-head title elements.",
+ () => Browser.Exists(By.CssSelector("#svg-for-title-prerendering-test title")).Text);
+
var titleText1 = Browser.FindElement(By.Id("title-text-1"));
titleText1.Clear();
titleText1.SendKeys("Updated title 1\n");
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ComponentTestBase.cs b/src/Components/test/E2ETestMigration/Infrastructure/ComponentTestBase.cs
deleted file mode 100644
index a7f7b1280629..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ComponentTestBase.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.BrowserTesting;
-using Microsoft.AspNetCore.Testing;
-using PlaywrightSharp;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure
-{
- public abstract class ComponentBrowserTestBase : BrowserTestBase
- {
- public ComponentBrowserTestBase(ITestOutputHelper output = null) : base(output) { }
-
- protected abstract Type TestComponent { get; }
- protected string MountUri { get; set; }
- protected IPage TestPage { get; set; }
- protected IBrowserContext TestBrowser { get; set; }
- protected BrowserKind BrowserKind { get; set; }
-
- protected async Task MountTestComponentAsync(IPage page)
- {
- var componentTypeName = TestComponent.Assembly == typeof(BasicTestApp.Program).Assembly ?
- TestComponent.FullName :
- TestComponent.AssemblyQualifiedName;
- var testSelector = await page.WaitForSelectorAsync("#test-selector > select");
- Assert.NotNull(testSelector);
-
- Output.WriteLine("Selecting test: " + componentTypeName);
-
- var selected = await page.SelectOptionAsync("#test-selector > select", componentTypeName);
- Assert.True(selected.Length == 1);
- Assert.Equal(componentTypeName, selected.First());
- }
-
- public bool ShouldSkip(BrowserKind browserKind) => !BrowserManager.IsAvailable(browserKind);
-
- protected override async Task InitializeCoreAsync(TestContext context)
- {
- await base.InitializeCoreAsync(context);
-
- // Default to Chrome
- var browserKind = BrowserKind.Chromium;
-
- // Check if a different browser is requested
- var browserKindArgument = context.MethodArguments.FirstOrDefault();
- if (browserKindArgument != null &&
- browserKindArgument.GetType() == typeof(BrowserKind))
- {
- browserKind = (BrowserKind)browserKindArgument;
- }
-
- if (ShouldSkip(browserKind))
- {
- var avail = String.Join(",", BrowserManager.GetAvailableBrowsers());
- var error = $"Skipping browser: {browserKind}: Available: {avail}";
- Output.WriteLine(error);
- return;
- }
-
- TestBrowser = await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo);
- TestPage = await TestBrowser.NewPageAsync();
- var response = await TestPage.GoToAsync(MountUri);
-
- Assert.True(response.Ok, $"Got: {response.StatusText} from: {MountUri}");
- Output.WriteLine($"Loaded MountUri: {MountUri}");
-
- await MountTestComponentAsync(TestPage);
- }
-
- public override async Task DisposeAsync()
- {
- if (TestPage != null)
- {
- await TestPage.CloseAsync();
- }
- await base.DisposeAsync();
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/AspNetEnvironment.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/AspNetEnvironment.cs
deleted file mode 100644
index e53519a841be..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/AspNetEnvironment.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public enum AspNetEnvironment
- {
- Development,
- Production
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/AspNetSiteServerFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/AspNetSiteServerFixture.cs
deleted file mode 100644
index c7f36123aca0..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/AspNetSiteServerFixture.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Hosting;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public class AspNetSiteServerFixture : WebHostServerFixture
- {
- public delegate IHost BuildWebHost(string[] args);
-
- public Assembly ApplicationAssembly { get; set; }
-
- public BuildWebHost BuildWebHostMethod { get; set; }
-
- public AspNetEnvironment Environment { get; set; } = AspNetEnvironment.Production;
-
- public List AdditionalArguments { get; set; } = new List { "--test-execution-mode", "server" };
-
- protected override IHost CreateWebHost()
- {
- if (BuildWebHostMethod == null)
- {
- throw new InvalidOperationException(
- $"No value was provided for {nameof(BuildWebHostMethod)}");
- }
-
- var assembly = ApplicationAssembly ?? BuildWebHostMethod.Method.DeclaringType.Assembly;
- var sampleSitePath = FindSampleOrTestSitePath(assembly.FullName);
-
- var host = "127.0.0.1";
-
- return BuildWebHostMethod(new[]
- {
- "--urls", $"http://{host}:0",
- "--contentroot", sampleSitePath,
- "--environment", Environment.ToString(),
- }.Concat(AdditionalArguments).ToArray());
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/BasicTestAppServerSiteFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/BasicTestAppServerSiteFixture.cs
deleted file mode 100644
index 76891c2be229..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/BasicTestAppServerSiteFixture.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public class BasicTestAppServerSiteFixture : AspNetSiteServerFixture where TStartup : class
- {
- public BasicTestAppServerSiteFixture()
- {
- BuildWebHostMethod = TestServer.Program.BuildWebHost;
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/BlazorWasmTestAppFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/BlazorWasmTestAppFixture.cs
deleted file mode 100644
index 3c43dbc86742..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/BlazorWasmTestAppFixture.cs
+++ /dev/null
@@ -1,108 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using DevHostServerProgram = Microsoft.AspNetCore.Components.WebAssembly.DevServer.Server.Program;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public class BlazorWasmTestAppFixture : WebHostServerFixture
- {
- public readonly bool TestTrimmedApps = false;
- //typeof(ToggleExecutionModeServerFixture<>).Assembly
- // .GetCustomAttributes()
- // .First(m => m.Key == "Microsoft.AspNetCore.E2ETesting.TestTrimmedApps")
- // .Value == "true";
-
- public string Environment { get; set; }
- public string PathBase { get; set; }
- public string ContentRoot { get; private set; }
-
- protected override IHost CreateWebHost()
- {
- if (TestTrimmedApps)
- {
- var staticFilePath = Path.Combine(AppContext.BaseDirectory, "trimmed", typeof(TProgram).Assembly.GetName().Name);
- if (!Directory.Exists(staticFilePath))
- {
- throw new DirectoryNotFoundException($"Test is configured to use trimmed outputs, but trimmed outputs were not found in {staticFilePath}.");
- }
-
- return CreateStaticWebHost(staticFilePath);
- }
-
- ContentRoot = FindSampleOrTestSitePath(
- typeof(TProgram).Assembly.FullName);
-
- var host = "127.0.0.1";
-
- var args = new List
- {
- "--urls", $"http://{host}:0",
- "--contentroot", ContentRoot,
- "--pathbase", PathBase,
- "--applicationpath", typeof(TProgram).Assembly.Location,
- };
-
- if (!string.IsNullOrEmpty(Environment))
- {
- args.Add("--environment");
- args.Add(Environment);
- }
-
- return DevHostServerProgram.BuildWebHost(args.ToArray());
- }
-
- private IHost CreateStaticWebHost(string contentRoot)
- {
- var host = "127.0.0.1";
- return new HostBuilder()
- .ConfigureWebHost(webHostBuilder => webHostBuilder
- .UseKestrel()
- .UseContentRoot(contentRoot)
- .UseStartup(_ => new StaticSiteStartup { PathBase = PathBase })
- .UseUrls($"http://{host}:0"))
- .Build();
- }
-
- private class StaticSiteStartup
- {
- public string PathBase { get; init; }
-
- public void ConfigureServices(IServiceCollection serviceCollection)
- {
- serviceCollection.AddRouting();
- }
-
- public void Configure(IApplicationBuilder app)
- {
- app.UseBlazorFrameworkFiles();
- app.UseStaticFiles(new StaticFileOptions
- {
- ServeUnknownFileTypes = true,
- });
-
- app.UseRouting();
-
- app.UseEndpoints(endpoints =>
- {
- var fallback = "index.html";
- if (!string.IsNullOrEmpty(PathBase))
- {
- fallback = PathBase + '/' + fallback;
- }
-
- endpoints.MapFallbackToFile(fallback);
- });
- }
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/ServerFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/ServerFixture.cs
deleted file mode 100644
index 137c7cd54011..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/ServerFixture.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Runtime.ExceptionServices;
-using System.Threading;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public abstract class ServerFixture : IDisposable
- {
- public Uri RootUri => _rootUriInitializer.Value;
-
- private readonly Lazy _rootUriInitializer;
-
- public ServerFixture()
- {
- _rootUriInitializer = new Lazy(() =>
- {
- var uri = new Uri(StartAndGetRootUri());
-
- return uri;
- });
- }
-
- public abstract void Dispose();
-
- protected abstract string StartAndGetRootUri();
-
- public static string FindSampleOrTestSitePath(string projectName)
- {
- var comma = projectName.IndexOf(",", StringComparison.Ordinal);
- if (comma != -1)
- {
- projectName = projectName.Substring(0, comma);
- }
-
- if (string.Equals(projectName, "Components.TestServer", StringComparison.Ordinal))
- {
- projectName = "TestServer"; // This testasset doesn't match the folder name for some reason
- }
- var path = Path.Combine(AppContext.BaseDirectory, "testassets", projectName);
- if (!Directory.Exists(path))
- {
- throw new ArgumentException($"Cannot find a sample or test site directory: '{path}'.");
- }
- return path;
- }
-
- protected static void RunInBackgroundThread(Action action)
- {
- var isDone = new ManualResetEvent(false);
-
- ExceptionDispatchInfo edi = null;
- new Thread(() =>
- {
- try
- {
- action();
- }
- catch (Exception ex)
- {
- edi = ExceptionDispatchInfo.Capture(ex);
- }
-
- isDone.Set();
- }).Start();
-
- if (!isDone.WaitOne(TimeSpan.FromSeconds(10)))
- {
- throw new TimeoutException("Timed out waiting for: " + action);
- }
-
- if (edi != null)
- {
- throw edi.SourceException;
- }
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/StaticSiteServerFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/StaticSiteServerFixture.cs
deleted file mode 100644
index c00345daf5a8..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/StaticSiteServerFixture.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.IO;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Hosting;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- // Although this is not used for anything meaningful related to Blazor yet, it
- // will be used later when there's a mechanism for publishing standalone Blazor
- // apps as a set of purely static files and we need E2E testing on the result.
-
- public class StaticSiteServerFixture : WebHostServerFixture
- {
- public string SampleSiteName { get; set; }
-
- protected override IHost CreateWebHost()
- {
- if (string.IsNullOrEmpty(SampleSiteName))
- {
- throw new InvalidOperationException($"No value was provided for {nameof(SampleSiteName)}");
- }
-
- var sampleSitePath = FindSampleOrTestSitePath(SampleSiteName);
-
- var host = "127.0.0.1";
-
- return new HostBuilder()
- .ConfigureWebHost(webHostBuilder => webHostBuilder
- .UseKestrel()
- .UseContentRoot(sampleSitePath)
- .UseWebRoot(string.Empty)
- .UseStartup()
- .UseUrls($"http://{host}:0"))
- .Build();
- }
-
- private class StaticSiteStartup
- {
- public void Configure(IApplicationBuilder app)
- {
- app.UseFileServer();
- }
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/ToggleExecutionModeServerFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/ToggleExecutionModeServerFixture.cs
deleted file mode 100644
index d47c6ea8d659..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/ToggleExecutionModeServerFixture.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using Microsoft.Extensions.Hosting;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public class ToggleExecutionModeServerFixture
- : ServerFixture
- {
- public string PathBase { get; set; }
-
- public IHost Host { get; set; }
-
- public ExecutionMode ExecutionMode { get; set; } = ExecutionMode.Client;
-
- private AspNetSiteServerFixture.BuildWebHost _buildWebHostMethod;
- private IDisposable _serverToDispose;
-
- public List AspNetFixtureAdditionalArguments { get; set; } = new List();
-
- public void UseAspNetHost(AspNetSiteServerFixture.BuildWebHost buildWebHostMethod)
- {
- _buildWebHostMethod = buildWebHostMethod
- ?? throw new ArgumentNullException(nameof(buildWebHostMethod));
- }
-
- protected override string StartAndGetRootUri()
- {
- if (_buildWebHostMethod == null)
- {
- var underlying = new BlazorWasmTestAppFixture();
- underlying.PathBase = "/subdir";
- _serverToDispose = underlying;
- var uri = underlying.RootUri.AbsoluteUri; // As a side-effect, this starts the server
-
- Host = underlying.Host;
-
- return uri;
- }
- else
- {
- // Use specified ASP.NET host server
- var underlying = new AspNetSiteServerFixture();
- underlying.AdditionalArguments.AddRange(AspNetFixtureAdditionalArguments);
- underlying.BuildWebHostMethod = _buildWebHostMethod;
- _serverToDispose = underlying;
- var uri = underlying.RootUri.AbsoluteUri; // As a side-effect, this starts the server
-
- Host = underlying.Host;
-
- return uri;
- }
- }
-
- public override void Dispose()
- {
- _serverToDispose?.Dispose();
- }
-
- internal ToggleExecutionModeServerFixture WithAdditionalArguments(string[] additionalArguments)
- {
- AspNetFixtureAdditionalArguments.AddRange(additionalArguments);
- return this;
- }
- }
-
- public enum ExecutionMode { Client, Server }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/WebHostServerFixture.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/WebHostServerFixture.cs
deleted file mode 100644
index 7e63222edb0e..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerFixtures/WebHostServerFixture.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Hosting.Server.Features;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.DependencyInjection;
-using System.Linq;
-using Microsoft.AspNetCore.Hosting.Server;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures
-{
- public abstract class WebHostServerFixture : ServerFixture
- {
- protected override string StartAndGetRootUri()
- {
- Host = CreateWebHost();
- RunInBackgroundThread(Host.Start);
- return Host.Services.GetRequiredService().Features
- .Get()
- .Addresses.Single();
- }
-
- public IHost Host { get; set; }
-
- public override void Dispose()
- {
- // This can be null if creating the webhost throws, we don't want to throw here and hide
- // the original exception.
- Host?.Dispose();
- Host?.StopAsync();
- }
-
- protected abstract IHost CreateWebHost();
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Infrastructure/ServerTestBase.cs b/src/Components/test/E2ETestMigration/Infrastructure/ServerTestBase.cs
deleted file mode 100644
index 27a3340f495f..000000000000
--- a/src/Components/test/E2ETestMigration/Infrastructure/ServerTestBase.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.BrowserTesting;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
-using Microsoft.AspNetCore.Testing;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Infrastructure
-{
- public abstract class ServerTestBase
- : ComponentBrowserTestBase,
- IClassFixture
- where TServerFixture: ServerFixture
- {
- public string ServerPathBase => "/subdir";
-
- protected readonly TServerFixture _serverFixture;
-
- public ServerTestBase(
- TServerFixture serverFixture,
- ITestOutputHelper output)
- : base(output)
- {
- _serverFixture = serverFixture;
- MountUri = _serverFixture.RootUri + "subdir";
- }
-
- protected override async Task InitializeCoreAsync(TestContext context)
- {
- await base.InitializeCoreAsync(context);
-
- if (TestPage != null)
- {
- // Clear logs - we check these during tests in some cases.
- // Make sure each test starts clean.
- await TestPage.EvaluateAsync("console.clear()");
- }
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Microsoft.AspNetCore.Components.Migration.E2ETests.csproj b/src/Components/test/E2ETestMigration/Microsoft.AspNetCore.Components.Migration.E2ETests.csproj
deleted file mode 100644
index 8d5ec2e57df6..000000000000
--- a/src/Components/test/E2ETestMigration/Microsoft.AspNetCore.Components.Migration.E2ETests.csproj
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
- $(DefaultNetCoreTargetFramework)
- Components.Migration.E2ETests
-
- true
-
-
- false
-
- true
- true
-
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
- playwrightSettings.json
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <_DefaultProjectRoot>$([System.IO.Path]::GetFullPath($(_DefaultProjectFilter)))
-
-
- <_ContentRootProjectReferences
- Include="@(ReferencePath)"
- Condition="'%(ReferencePath.ReferenceSourceTarget)' == 'ProjectReference' AND $([System.String]::Copy(%(ReferencePath.MSBuildSourceProjectFile)).StartsWith('$(_DefaultProjectRoot)'))" />
-
-
-
-
-
- PreserveNewest
-
-
-
-
-
-
-
-
-
- <_PublishBasicFiles Include="$(OutputPath)helixcontent\BasicTestApp\**\*.*" />
-
-
-
-
-
-
-
- <_PublishFiles Include="$(OutputPath).playwright\**\*.*" />
- <_PublishBasicFiles Include="$(OutputPath)helixcontent\BasicTestApp\**\*.*" />
-
-
-
-
-
-
diff --git a/src/Components/test/E2ETestMigration/Properties/AssemblyInfo.cs b/src/Components/test/E2ETestMigration/Properties/AssemblyInfo.cs
deleted file mode 100644
index 92234b218205..000000000000
--- a/src/Components/test/E2ETestMigration/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Xunit;
-
-[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/src/Components/test/E2ETestMigration/TestJsonSerializerOptionsProvider.cs b/src/Components/test/E2ETestMigration/TestJsonSerializerOptionsProvider.cs
deleted file mode 100644
index de0a5cadbc41..000000000000
--- a/src/Components/test/E2ETestMigration/TestJsonSerializerOptionsProvider.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Text.Json;
-
-namespace Microsoft.AspNetCore.Components.E2ETest
-{
- internal static class TestJsonSerializerOptionsProvider
- {
- public static JsonSerializerOptions Options { get; } = new JsonSerializerOptions
- {
- PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
- PropertyNameCaseInsensitive = true,
- };
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Tests/BinaryHttpClientTest.cs b/src/Components/test/E2ETestMigration/Tests/BinaryHttpClientTest.cs
deleted file mode 100644
index 1694ddef6765..000000000000
--- a/src/Components/test/E2ETestMigration/Tests/BinaryHttpClientTest.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using BasicTestApp.HttpClientTest;
-using Microsoft.AspNetCore.BrowserTesting;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
-using Microsoft.AspNetCore.Testing;
-using PlaywrightSharp;
-using TestServer;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Tests
-{
- public class BinaryHttpClientTest : ComponentBrowserTestBase,
- IClassFixture>,
- IClassFixture>
- {
- private readonly BlazorWasmTestAppFixture _devHostServerFixture;
- readonly ServerFixture _apiServerFixture;
-
- protected override Type TestComponent { get; } = typeof(BinaryHttpRequestsComponent);
-
- public BinaryHttpClientTest(
- BlazorWasmTestAppFixture devHostServerFixture,
- BasicTestAppServerSiteFixture apiServerFixture,
- ITestOutputHelper output)
- : base(output)
- {
- _devHostServerFixture = devHostServerFixture;
- _devHostServerFixture.PathBase = "/subdir";
- _apiServerFixture = apiServerFixture;
- MountUri = _devHostServerFixture.RootUri + "subdir";
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- [InlineData(BrowserKind.Webkit)]
- // NOTE: BrowserKind argument must be first
- public async Task CanSendAndReceiveBytes(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- var targetUri = new Uri(_apiServerFixture.RootUri, "/subdir/api/data");
- await TestPage.TypeAsync("#request-uri", targetUri.AbsoluteUri);
- await TestPage.ClickAsync("#send-request");
-
- var status = await TestPage.GetTextContentAsync("#response-status");
- var statusText = await TestPage.GetTextContentAsync("#response-status-text");
- var testOutcome = await TestPage.GetTextContentAsync("#test-outcome");
-
- Assert.Equal("OK", status);
- Assert.Equal("OK", statusText);
- Assert.Equal("", testOutcome);
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Tests/BindTest.cs b/src/Components/test/E2ETestMigration/Tests/BindTest.cs
deleted file mode 100644
index ee07e198fce7..000000000000
--- a/src/Components/test/E2ETestMigration/Tests/BindTest.cs
+++ /dev/null
@@ -1,1360 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Threading.Tasks;
-using BasicTestApp;
-using Microsoft.AspNetCore.BrowserTesting;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
-using Microsoft.AspNetCore.Testing;
-using PlaywrightSharp;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Tests
-{
- public class BindTest : ServerTestBase>
- {
- public BindTest(
- ToggleExecutionModeServerFixture serverFixture,
- ITestOutputHelper output)
- : base(serverFixture, output)
- {
- }
-
- protected override Type TestComponent { get; } = typeof(BindCasesComponent);
-
- protected async Task GetInputValue(string selector)
- => await TestPage.EvalOnSelectorAsync(selector, "e => e.value");
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- [InlineData(BrowserKind.Webkit)]
- // NOTE: BrowserKind argument must be first
- public async Task CanBindTextbox_InitiallyBlank(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- var target = await TestPage.QuerySelectorAsync("#textbox-initially-blank");
- Assert.Equal(string.Empty, await GetInputValue("#textbox-initially-blank"));
- Assert.Equal(string.Empty, await TestPage.GetInnerTextAsync("#textbox-initially-blank-value"));
- Assert.Equal(string.Empty, await GetInputValue("#textbox-initially-blank-mirror"));
-
- // Modify target; verify value is updated and that textboxes linked to the same data are updated
- await target.TypeAsync("Changed value");
- // Doesn't update until change event
- Assert.Equal(string.Empty, await TestPage.GetInnerTextAsync("#textbox-initially-blank-value"));
- Assert.Equal(string.Empty, await GetInputValue("#textbox-initially-blank-mirror"));
- await target.PressAsync("Tab");
- Assert.Equal("Changed value", await TestPage.GetInnerTextAsync("#textbox-initially-blank-value"));
- Assert.Equal("Changed value", await GetInputValue("#textbox-initially-blank-mirror"));
-
- // Remove the value altogether
- await TestPage.ClickAsync("#textbox-initially-blank-setnull");
- Assert.Equal(string.Empty, await GetInputValue("#textbox-initially-blank"));
- Assert.Equal(string.Empty, await TestPage.GetInnerTextAsync("#textbox-initially-blank-value"));
- Assert.Equal(string.Empty, await GetInputValue("#textbox-initially-blank-mirror"));
- }
-
- //[Fact]
- //public void CanBindTextbox_InitiallyPopulated()
- //{
- // var target = Browser.Exists(By.Id("textbox-initially-populated"));
- // var boundValue = Browser.Exists(By.Id("textbox-initially-populated-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-initially-populated-mirror"));
- // var setNullButton = Browser.Exists(By.Id("textbox-initially-populated-setnull"));
- // Assert.Equal("Hello", target.GetAttribute("value"));
- // Assert.Equal("Hello", boundValue.Text);
- // Assert.Equal("Hello", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("Changed value\t");
- // Browser.Equal("Changed value", () => boundValue.Text);
- // Assert.Equal("Changed value", mirrorValue.GetAttribute("value"));
-
- // // Remove the value altogether
- // setNullButton.Click();
- // Browser.Equal(string.Empty, () => target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextbox_WithBindSuffixInitiallyPopulated()
- //{
- // var target = Browser.Exists(By.Id("bind-with-suffix-textbox-initially-populated"));
- // var boundValue = Browser.Exists(By.Id("bind-with-suffix-textbox-initially-populated-value"));
- // var mirrorValue = Browser.Exists(By.Id("bind-with-suffix-textbox-initially-populated-mirror"));
- // var setNullButton = Browser.Exists(By.Id("bind-with-suffix-textbox-initially-populated-setnull"));
- // Assert.Equal("Hello", target.GetAttribute("value"));
- // Assert.Equal("Hello", boundValue.Text);
- // Assert.Equal("Hello", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("Changed value\t");
- // Browser.Equal("Changed value", () => boundValue.Text);
- // Assert.Equal("Changed value", mirrorValue.GetAttribute("value"));
-
- // // Remove the value altogether
- // setNullButton.Click();
- // Browser.Equal(string.Empty, () => target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextArea_InitiallyBlank()
- //{
- // var target = Browser.Exists(By.Id("textarea-initially-blank"));
- // var boundValue = Browser.Exists(By.Id("textarea-initially-blank-value"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.SendKeys("Changed value");
- // Assert.Equal(string.Empty, boundValue.Text); // Don't update as there's no change event fired yet.
- // target.SendKeys("\t");
- // Browser.Equal("Changed value", () => boundValue.Text);
- //}
-
- //[Fact]
- //public void CanBindTextArea_InitiallyPopulated()
- //{
- // var target = Browser.Exists(By.Id("textarea-initially-populated"));
- // var boundValue = Browser.Exists(By.Id("textarea-initially-populated-value"));
- // Assert.Equal("Hello", target.GetAttribute("value"));
- // Assert.Equal("Hello", boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.Clear();
- // target.SendKeys("Changed value\t");
- // Browser.Equal("Changed value", () => boundValue.Text);
- //}
-
- //[Fact]
- //public void CanBindCheckbox_InitiallyNull()
- //{
- // var target = Browser.Exists(By.Id("checkbox-initially-null"));
- // var boundValue = Browser.Exists(By.Id("checkbox-initially-null-value"));
- // var invertButton = Browser.Exists(By.Id("checkbox-initially-null-invert"));
- // Assert.False(target.Selected);
- // Assert.Equal(string.Empty, boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.Click();
- // Browser.True(() => target.Selected);
- // Browser.Equal("True", () => boundValue.Text);
-
- // // Modify data; verify checkbox is updated
- // invertButton.Click();
- // Browser.False(() => target.Selected);
- // Browser.Equal("False", () => boundValue.Text);
- //}
-
- //[Fact]
- //public void CanBindCheckbox_InitiallyUnchecked()
- //{
- // var target = Browser.Exists(By.Id("checkbox-initially-unchecked"));
- // var boundValue = Browser.Exists(By.Id("checkbox-initially-unchecked-value"));
- // var invertButton = Browser.Exists(By.Id("checkbox-initially-unchecked-invert"));
- // Assert.False(target.Selected);
- // Assert.Equal("False", boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.Click();
- // Browser.True(() => target.Selected);
- // Browser.Equal("True", () => boundValue.Text);
-
- // // Modify data; verify checkbox is updated
- // invertButton.Click();
- // Browser.False(() => target.Selected);
- // Browser.Equal("False", () => boundValue.Text);
- //}
-
- //[Fact]
- //public void CanBindCheckbox_InitiallyChecked()
- //{
- // var target = Browser.Exists(By.Id("checkbox-initially-checked"));
- // var boundValue = Browser.Exists(By.Id("checkbox-initially-checked-value"));
- // var invertButton = Browser.Exists(By.Id("checkbox-initially-checked-invert"));
- // Assert.True(target.Selected);
- // Assert.Equal("True", boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.Click();
- // Browser.False(() => target.Selected);
- // Browser.Equal("False", () => boundValue.Text);
-
- // // Modify data; verify checkbox is updated
- // invertButton.Click();
- // Browser.True(() => target.Selected);
- // Browser.Equal("True", () => boundValue.Text);
- //}
-
- //[Fact]
- //public void CanBindSelect()
- //{
- // var target = new SelectElement(Browser.Exists(By.Id("select-box")));
- // var boundValue = Browser.Exists(By.Id("select-box-value"));
- // Assert.Equal("Second choice", target.SelectedOption.Text);
- // Assert.Equal("Second", boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.SelectByText("Third choice");
- // Browser.Equal("Third", () => boundValue.Text);
-
- // // Also verify we can add and select new options atomically
- // // Don't move this into a separate test, because then the previous assertions
- // // would be dependent on test execution order (or would require a full page reload)
- // Browser.Exists(By.Id("select-box-add-option")).Click();
- // Browser.Equal("Fourth", () => boundValue.Text);
- // Assert.Equal("Fourth choice", target.SelectedOption.Text);
-
- // // verify that changing an option value and selected value at the same time works.
- // Browser.Exists(By.Id("change-variable-value")).Click();
- // Browser.Equal("Sixth", () => boundValue.Text);
-
- // // Verify we can select options whose value is empty
- // // https://github.com/dotnet/aspnetcore/issues/17735
- // target.SelectByText("Empty value");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Browser.Equal("Empty value", () => target.SelectedOption.Text);
- //}
-
- //[Fact]
- //public void CanBindSelectToMarkup()
- //{
- // var target = new SelectElement(Browser.Exists(By.Id("select-markup-box")));
- // var boundValue = Browser.Exists(By.Id("select-markup-box-value"));
- // Assert.Equal("Second choice", target.SelectedOption.Text);
- // Assert.Equal("Second", boundValue.Text);
-
- // // Modify target; verify value is updated
- // target.SelectByText("Third choice");
- // Browser.Equal("Third", () => boundValue.Text);
-
- // // Verify we can select options whose value is empty
- // // https://github.com/dotnet/aspnetcore/issues/17735
- // target.SelectByText("Empty value");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Browser.Equal("Empty value", () => target.SelectedOption.Text);
- //}
-
- //[Fact]
- //public void CanBindTextboxInt()
- //{
- // var target = Browser.Exists(By.Id("textbox-int"));
- // var boundValue = Browser.Exists(By.Id("textbox-int-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-int-mirror"));
- // Assert.Equal("-42", target.GetAttribute("value"));
- // Assert.Equal("-42", boundValue.Text);
- // Assert.Equal("-42", mirrorValue.GetAttribute("value"));
-
- // // Clear target; value resets to zero
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // Leading zeros are not preserved
- // target.SendKeys("42");
- // Browser.Equal("042", () => target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal("42", () => target.GetAttribute("value"));
- // Assert.Equal("42", boundValue.Text);
- // Assert.Equal("42", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxNullableInt()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-int"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-int-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-int-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("-42\t");
- // Browser.Equal("-42", () => boundValue.Text);
- // Assert.Equal("-42", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("42\t");
- // Browser.Equal("42", () => boundValue.Text);
- // Assert.Equal("42", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxLong()
- //{
- // var target = Browser.Exists(By.Id("textbox-long"));
- // var boundValue = Browser.Exists(By.Id("textbox-long-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-long-mirror"));
- // Assert.Equal("3000000000", target.GetAttribute("value"));
- // Assert.Equal("3000000000", boundValue.Text);
- // Assert.Equal("3000000000", mirrorValue.GetAttribute("value"));
-
- // // Clear target; value resets to zero
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Backspace);
- // target.SendKeys("-3000000000\t");
- // Browser.Equal("-3000000000", () => target.GetAttribute("value"));
- // Assert.Equal("-3000000000", boundValue.Text);
- // Assert.Equal("-3000000000", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxNullableLong()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-long"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-long-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-long-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("3000000000\t");
- // Browser.Equal("3000000000", () => boundValue.Text);
- // Assert.Equal("3000000000", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("-3000000000\t");
- // Browser.Equal("-3000000000", () => boundValue.Text);
- // Assert.Equal("-3000000000", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxShort()
- //{
- // var target = Browser.Exists(By.Id("textbox-short"));
- // var boundValue = Browser.Exists(By.Id("textbox-short-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-short-mirror"));
- // Assert.Equal("-42", target.GetAttribute("value"));
- // Assert.Equal("-42", boundValue.Text);
- // Assert.Equal("-42", mirrorValue.GetAttribute("value"));
-
- // // Clear target; value resets to zero
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // Leading zeros are not preserved
- // target.SendKeys("42");
- // Browser.Equal("042", () => target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal("42", () => target.GetAttribute("value"));
- // Assert.Equal("42", boundValue.Text);
- // Assert.Equal("42", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxNullableShort()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-short"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-short-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-short-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("-42\t");
- // Browser.Equal("-42", () => boundValue.Text);
- // Browser.Equal("-42", () => mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("42\t");
- // Browser.Equal("42", () => boundValue.Text);
- // Browser.Equal("42", () => mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxFloat()
- //{
- // var target = Browser.Exists(By.Id("textbox-float"));
- // var boundValue = Browser.Exists(By.Id("textbox-float-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-float-mirror"));
- // Assert.Equal("3.141", target.GetAttribute("value"));
- // Assert.Equal("3.141", boundValue.Text);
- // Assert.Equal("3.141", mirrorValue.GetAttribute("value"));
-
- // // Clear target; value resets to zero
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Backspace);
- // target.SendKeys("-3.141\t");
- // Browser.Equal("-3.141", () => target.GetAttribute("value"));
- // Browser.Equal("-3.141", () => boundValue.Text);
- // Browser.Equal("-3.141", () => mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxNullableFloat()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-float"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-float-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-float-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("3.141\t");
- // Browser.Equal("3.141", () => boundValue.Text);
- // Assert.Equal("3.141", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("-3.141\t");
- // Browser.Equal("-3.141", () => boundValue.Text);
- // Assert.Equal("-3.141", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxDouble()
- //{
- // var target = Browser.Exists(By.Id("textbox-double"));
- // var boundValue = Browser.Exists(By.Id("textbox-double-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-double-mirror"));
- // Assert.Equal("3.14159265359", target.GetAttribute("value"));
- // Assert.Equal("3.14159265359", boundValue.Text);
- // Assert.Equal("3.14159265359", mirrorValue.GetAttribute("value"));
-
- // // Clear target; value resets to default
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Backspace);
- // target.SendKeys("-3.14159265359\t");
- // Browser.Equal("-3.14159265359", () => boundValue.Text);
- // Assert.Equal("-3.14159265359", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // Double shouldn't preserve trailing zeros
- // target.Clear();
- // target.SendKeys(Keys.Backspace);
- // target.SendKeys("0.010\t");
- // Browser.Equal("0.01", () => target.GetAttribute("value"));
- // Assert.Equal("0.01", boundValue.Text);
- // Assert.Equal("0.01", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxNullableDouble()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-double"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-double-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-double-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("3.14159265359\t");
- // Browser.Equal("3.14159265359", () => boundValue.Text);
- // Assert.Equal("3.14159265359", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("-3.14159265359\t");
- // Browser.Equal("-3.14159265359", () => boundValue.Text);
- // Assert.Equal("-3.14159265359", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // Double shouldn't preserve trailing zeros
- // target.Clear();
- // target.SendKeys("0.010\t");
- // Browser.Equal("0.01", () => boundValue.Text);
- // Assert.Equal("0.01", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxDecimal()
- //{
- // var target = Browser.Exists(By.Id("textbox-decimal"));
- // var boundValue = Browser.Exists(By.Id("textbox-decimal-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-decimal-mirror"));
- // Assert.Equal("0.0000000000000000000000000001", target.GetAttribute("value"));
- // Assert.Equal("0.0000000000000000000000000001", boundValue.Text);
- // Assert.Equal("0.0000000000000000000000000001", mirrorValue.GetAttribute("value"));
-
- // // Clear textbox; value updates to zero because that's the default
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // Decimal should preserve trailing zeros
- // target.SendKeys("0.010\t");
- // Browser.Equal("0.010", () => boundValue.Text);
- // Assert.Equal("0.010", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxNullableDecimal()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-decimal"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-decimal-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-decimal-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("0.0000000000000000000000000001\t");
- // Browser.Equal("0.0000000000000000000000000001", () => boundValue.Text);
- // Assert.Equal("0.0000000000000000000000000001", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // Decimal should preserve trailing zeros
- // target.Clear();
- // target.SendKeys("0.010\t");
- // Browser.Equal("0.010", () => boundValue.Text);
- // Browser.Equal("0.010", () => mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// This tests what happens you put invalid (unconvertable) input in. This is separate from the
- //// other tests because it requires type="text" - the other tests use type="number"
- //[Fact]
- //public void CanBindTextbox_Decimal_InvalidInput()
- //{
- // var target = Browser.Exists(By.Id("textbox-decimal-invalid"));
- // var boundValue = Browser.Exists(By.Id("textbox-decimal-invalid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-decimal-invalid-mirror"));
- // Assert.Equal("0.0000000000000000000000000001", target.GetAttribute("value"));
- // Assert.Equal("0.0000000000000000000000000001", boundValue.Text);
- // Assert.Equal("0.0000000000000000000000000001", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("0.01\t");
- // Browser.Equal("0.01", () => boundValue.Text);
- // Assert.Equal("0.01", mirrorValue.GetAttribute("value"));
-
- // // Modify target to something invalid - the invalid change is reverted
- // // back to the last valid value
- // target.SendKeys("2A");
- // Assert.Equal("0.012A", target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal("0.01", () => boundValue.Text);
- // Browser.Equal("0.01", () => mirrorValue.GetAttribute("value"));
- // Browser.Equal("0.01", () => target.GetAttribute("value"));
-
- // // Continue editing with valid inputs
- // target.SendKeys(Keys.Backspace);
- // target.SendKeys("2\t");
- // Browser.Equal("0.02", () => boundValue.Text);
- // Browser.Equal("0.02", () => mirrorValue.GetAttribute("value"));
- //}
-
- //// This tests what happens you put invalid (unconvertable) input in. This is separate from the
- //// other tests because it requires type="text" - the other tests use type="number"
- //[Fact]
- //public void CanBindTextbox_NullableDecimal_InvalidInput()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-decimal-invalid"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-decimal-invalid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-decimal-invalid-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("0.01\t");
- // Browser.Equal("0.01", () => boundValue.Text);
- // Assert.Equal("0.01", mirrorValue.GetAttribute("value"));
-
- // // Modify target to something invalid - the invalid change is reverted
- // // back to the last valid value
- // target.SendKeys("2A");
- // Assert.Equal("0.012A", target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal("0.01", () => boundValue.Text);
- // Assert.Equal("0.01", mirrorValue.GetAttribute("value"));
- // Assert.Equal("0.01", target.GetAttribute("value"));
-
- // // Continue editing with valid inputs
- // target.SendKeys(Keys.Backspace);
- // target.SendKeys("2\t");
- // Browser.Equal("0.02", () => boundValue.Text);
- // Assert.Equal("0.02", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxGenericInt()
- //{
- // var target = Browser.Exists(By.Id("textbox-generic-int"));
- // var boundValue = Browser.Exists(By.Id("textbox-generic-int-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-generic-int-mirror"));
- // Assert.Equal("-42", target.GetAttribute("value"));
- // Assert.Equal("-42", boundValue.Text);
- // Assert.Equal("-42", mirrorValue.GetAttribute("value"));
-
- // // Clear target; value resets to zero
- // target.Clear();
- // Browser.Equal("0", () => target.GetAttribute("value"));
- // Assert.Equal("0", boundValue.Text);
- // Assert.Equal("0", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("42\t");
- // Browser.Equal("42", () => boundValue.Text);
- // Assert.Equal("42", mirrorValue.GetAttribute("value"));
- //}
-
- //[Fact]
- //public void CanBindTextboxGenericGuid()
- //{
- // var target = Browser.Exists(By.Id("textbox-generic-guid"));
- // var boundValue = Browser.Exists(By.Id("textbox-generic-guid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-generic-guid-mirror"));
- // Assert.Equal("00000000-0000-0000-0000-000000000000", target.GetAttribute("value"));
- // Assert.Equal("00000000-0000-0000-0000-000000000000", boundValue.Text);
- // Assert.Equal("00000000-0000-0000-0000-000000000000", mirrorValue.GetAttribute("value"));
-
- // // Modify target; value is not updated because it's not convertable.
- // target.Clear();
- // Browser.Equal("00000000-0000-0000-0000-000000000000", () => boundValue.Text);
- // Assert.Equal("00000000-0000-0000-0000-000000000000", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // var newValue = Guid.NewGuid().ToString();
- // target.SendKeys(newValue + "\t");
- // Browser.Equal(newValue, () => boundValue.Text);
- // Assert.Equal(newValue, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxDateTime()
- //{
- // var target = Browser.Exists(By.Id("textbox-datetime"));
- // var boundValue = Browser.Exists(By.Id("textbox-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-datetime-mirror"));
- // var expected = new DateTime(1985, 3, 4);
- // Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to 01/01/0001 because that's the default
- // target.Clear();
- // expected = default;
- // Browser.Equal(expected, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("01/02/2000 00:00:00\t");
- // expected = new DateTime(2000, 1, 2);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxNullableDateTime()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-datetime"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-datetime-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // var expected = new DateTime(2000, 1, 2);
- // target.SendKeys("01/02/2000 00:00:00\t");
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxDateTimeOffset()
- //{
- // var target = Browser.Exists(By.Id("textbox-datetimeoffset"));
- // var boundValue = Browser.Exists(By.Id("textbox-datetimeoffset-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-datetimeoffset-mirror"));
- // var expected = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
- // Assert.Equal(expected, DateTimeOffset.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to 01/01/0001 because that's the default
- // target.Clear();
- // expected = default;
- // Browser.Equal(expected, () => DateTimeOffset.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("01/02/2000 00:00:00 +08:00\t");
- // expected = new DateTimeOffset(new DateTime(2000, 1, 2), TimeSpan.FromHours(8));
- // Browser.Equal(expected, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxNullableDateTimeOffset()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-datetimeoffset"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("01/02/2000 00:00:00 +08:00" + "\t");
- // var expected = new DateTimeOffset(new DateTime(2000, 1, 2), TimeSpan.FromHours(8));
- // Browser.Equal(expected, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxDateTimeWithFormat()
- //{
- // var target = Browser.Exists(By.Id("textbox-datetime-format"));
- // var boundValue = Browser.Exists(By.Id("textbox-datetime-format-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-datetime-format-mirror"));
- // var expected = new DateTime(1985, 3, 4);
- // Assert.Equal("03-04", target.GetAttribute("value"));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to the default
- // target.Clear();
- // target.SendKeys("\t");
- // expected = default;
- // Browser.Equal("01-01", () => target.GetAttribute("value"));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("01-02\t");
- // expected = new DateTime(DateTime.Now.Year, 1, 2);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxNullableDateTimeWithFormat()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-datetime-format"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-datetime-format-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-datetime-format-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("01-02\t");
- // var expected = new DateTime(DateTime.Now.Year, 1, 2);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxDateTimeOffsetWithFormat()
- //{
- // var target = Browser.Exists(By.Id("textbox-datetimeoffset-format"));
- // var boundValue = Browser.Exists(By.Id("textbox-datetimeoffset-format-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-datetimeoffset-format-mirror"));
- // var expected = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
- // Assert.Equal("03-04", target.GetAttribute("value"));
- // Assert.Equal(expected, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to the default
- // target.Clear();
- // expected = default;
- // Browser.Equal("01-01", () => target.GetAttribute("value"));
- // Assert.Equal(expected, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("01-02\t");
- // expected = new DateTimeOffset(new DateTime(DateTime.Now.Year, 1, 2), TimeSpan.FromHours(0));
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- ////
- //// Guess what! Client-side and server-side also understand timezones differently. So for now we're comparing
- //// the parsed output without consideration for the timezone
- //[Fact]
- //public void CanBindTextboxNullableDateTimeOffsetWithFormat()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-datetimeoffset"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.SendKeys("01-02" + "\t");
- // var expected = new DateTimeOffset(new DateTime(DateTime.Now.Year, 1, 2), TimeSpan.FromHours(0));
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxNullableDateTime_InvalidValue()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-datetime-invalid"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-datetime-invalid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-datetime-invalid-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // var expected = new DateTime(2000, 1, 2);
- // target.SendKeys("01/02/2000 00:00:00\t");
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target to something invalid - the invalid change is reverted
- // // back to the last valid value
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05/06X");
- // Browser.Equal("05/06X", () => target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal(expected, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Now change it to something valid
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05/06\t");
- // expected = new DateTime(DateTime.Now.Year, 5, 6);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxDateTimeOffset_InvalidValue()
- //{
- // var target = Browser.Exists(By.Id("textbox-datetimeoffset-invalid"));
- // var boundValue = Browser.Exists(By.Id("textbox-datetimeoffset-invalid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-datetimeoffset-invalid-mirror"));
- // var expected = new DateTimeOffset(new DateTime(1985, 3, 4), TimeSpan.FromHours(8));
- // Assert.Equal(expected, DateTimeOffset.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // expected = new DateTime(2000, 1, 2);
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("01/02/2000 00:00:00\t");
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
-
- // // Modify target to something invalid - the invalid change is reverted
- // // back to the last valid value
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05/06X");
- // Browser.Equal("05/06X", () => target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
-
- // // Now change it to something valid
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05/06\t");
- // expected = new DateTime(DateTime.Now.Year, 5, 6);
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxDateTimeWithFormat_InvalidValue()
- //{
- // var target = Browser.Exists(By.Id("textbox-datetime-format-invalid"));
- // var boundValue = Browser.Exists(By.Id("textbox-datetime-format-invalid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-datetime-format-invalid-mirror"));
- // var expected = new DateTime(1985, 3, 4);
- // Assert.Equal("03-04", target.GetAttribute("value"));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target to something invalid - the invalid change is reverted
- // // back to the last valid value
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05/06");
- // Browser.Equal("05/06", () => target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal("03-04", () => target.GetAttribute("value"));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Now change it to something valid
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05-06\t");
- // expected = new DateTime(DateTime.Now.Year, 5, 6);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTextboxNullableDateTimeOffsetWithFormat_InvalidValue()
- //{
- // var target = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-format-invalid"));
- // var boundValue = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-format-invalid-value"));
- // var mirrorValue = Browser.Exists(By.Id("textbox-nullable-datetimeoffset-format-invalid-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // var expected = new DateTimeOffset(new DateTime(DateTime.Now.Year, 1, 2));
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("01-02\t");
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
-
- // // Modify target to something invalid - the invalid change is reverted
- // // back to the last valid value
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05/06");
- // Browser.Equal("05/06", () => target.GetAttribute("value"));
- // target.SendKeys("\t");
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
-
- // // Now change it to something valid
- // target.SendKeys(Keys.Control + "a"); // select all
- // target.SendKeys("05-06\t");
- // expected = new DateTime(DateTime.Now.Year, 5, 6);
- // Browser.Equal(expected.DateTime, () => DateTimeOffset.Parse(boundValue.Text, CultureInfo.InvariantCulture).DateTime);
- // Assert.Equal(expected.DateTime, DateTimeOffset.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture).DateTime);
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindDateTimeLocalTextboxDateTime()
- //{
- // var target = Browser.Exists(By.Id("datetime-local-textbox-datetime"));
- // var boundValue = Browser.Exists(By.Id("datetime-local-textbox-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("datetime-local-textbox-datetime-mirror"));
- // var expected = new DateTime(1985, 3, 4);
- // Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to 01/01/0001 because that's the default
- // target.Clear();
- // expected = default;
- // Browser.Equal(expected, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#datetime-local-textbox-datetime", "2000-01-02T04:05:06");
- // expected = new DateTime(2000, 1, 2, 04, 05, 06);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindDateTimeLocalTextboxNullableDateTime()
- //{
- // var target = Browser.Exists(By.Id("datetime-local-textbox-nullable-datetime"));
- // var boundValue = Browser.Exists(By.Id("datetime-local-textbox-nullable-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("datetime-local-textbox-nullable-datetime-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#datetime-local-textbox-nullable-datetime", "2000-01-02T04:05:06");
- // var expected = new DateTime(2000, 1, 2, 04, 05, 06);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindMonthTextboxDateTime()
- //{
- // var target = Browser.Exists(By.Id("month-textbox-datetime"));
- // var boundValue = Browser.Exists(By.Id("month-textbox-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("month-textbox-datetime-mirror"));
- // var expected = new DateTime(1985, 3, 1);
- // Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // // When the value gets displayed the first time it gets truncated to the 1st day,
- // // until there is no change the bound value doesn't get updated.
- // Assert.Equal(expected.AddDays(3), DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected.AddDays(3), DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to 01/01/0001 because that's the default
- // target.Clear();
- // expected = default;
- // Browser.Equal(expected, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#month-textbox-datetime", "2000-02");
- // expected = new DateTime(2000, 2, 1);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindMonthTextboxNullableDateTime()
- //{
- // var target = Browser.Exists(By.Id("month-textbox-nullable-datetime"));
- // var boundValue = Browser.Exists(By.Id("month-textbox-nullable-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("month-textbox-nullable-datetime-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#month-textbox-nullable-datetime", "2000-02");
- // var expected = new DateTime(2000, 2, 1);
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTimeTextboxDateTime()
- //{
- // var target = Browser.Exists(By.Id("time-textbox-datetime"));
- // var boundValue = Browser.Exists(By.Id("time-textbox-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("time-textbox-datetime-mirror"));
- // var expected = DateTime.Now.Date.AddHours(8).AddMinutes(5);
- // Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to 00:00 because that's the default
- // target.Clear();
- // expected = default;
- // Browser.Equal(DateTime.Now.Date, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(default, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(default, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#time-textbox-datetime", "04:05");
- // expected = DateTime.Now.Date.Add(new TimeSpan(4, 5, 0));
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTimeTextboxNullableDateTime()
- //{
- // var target = Browser.Exists(By.Id("time-textbox-nullable-datetime"));
- // var boundValue = Browser.Exists(By.Id("time-textbox-nullable-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("time-textbox-nullable-datetime-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#time-textbox-nullable-datetime", "05:06");
- // var expected = DateTime.Now.Date.Add(new TimeSpan(05, 06, 0));
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTimeStepTextboxDateTime()
- //{
- // var target = Browser.Exists(By.Id("time-step-textbox-datetime"));
- // var boundValue = Browser.Exists(By.Id("time-step-textbox-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("time-step-textbox-datetime-mirror"));
- // var expected = DateTime.Now.Date.Add(new TimeSpan(8, 5, 30));
- // Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Clear textbox; value updates to 00:00 because that's the default
- // target.Clear();
- // expected = default;
- // Browser.Equal(DateTime.Now.Date, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
- // Assert.Equal(default, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(default, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#time-step-textbox-datetime", "04:05:06");
- // expected = DateTime.Now.Date.Add(new TimeSpan(4, 5, 6));
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
- //}
-
- //// For date comparisons, we parse (non-formatted) values to compare them. Client-side and server-side
- //// Blazor have different formatting behaviour by default.
- //[Fact]
- //public void CanBindTimeStepTextboxNullableDateTime()
- //{
- // var target = Browser.Exists(By.Id("time-step-textbox-nullable-datetime"));
- // var boundValue = Browser.Exists(By.Id("time-step-textbox-nullable-datetime-value"));
- // var mirrorValue = Browser.Exists(By.Id("time-step-textbox-nullable-datetime-mirror"));
- // Assert.Equal(string.Empty, target.GetAttribute("value"));
- // Assert.Equal(string.Empty, boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // Browser.Equal("", () => boundValue.Text);
- // Assert.Equal("", mirrorValue.GetAttribute("value"));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // // We have to do it this way because the browser gets in the way when sending keys to the input
- // // element directly.
- // ApplyInputValue("#time-step-textbox-nullable-datetime", "05:06");
- // var expected = DateTime.Now.Date.Add(new TimeSpan(05, 06, 0));
- // Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
- // Assert.Equal(expected, DateTime.Parse(mirrorValue.GetAttribute("value"), CultureInfo.InvariantCulture));
-
- // // Modify target; verify value is updated and that textboxes linked to the same data are updated
- // target.Clear();
- // target.SendKeys("\t");
- // Browser.Equal(string.Empty, () => boundValue.Text);
- // Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
- //}
-
- //// Applies an input through javascript to datetime-local/month/time controls.
- //private void ApplyInputValue(string cssSelector, string value)
- //{
- // // It's very difficult to enter an invalid value into an , because
- // // most combinations of keystrokes get normalized to something valid. Additionally,
- // // using Selenium's SendKeys interacts unpredictably with this normalization logic,
- // // most likely based on timings. As a workaround, use JS to apply the values. This
- // // should only be used when strictly necessary, as it doesn't represent actual user
- // // interaction as authentically as SendKeys in other cases.
- // var javascript = (IJavaScriptExecutor)Browser;
- // javascript.ExecuteScript(
- // $"var elem = document.querySelector('{cssSelector}');"
- // + $"elem.value = '{value}';"
- // + "elem.dispatchEvent(new KeyboardEvent('change'));");
- //}
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Tests/DownloadAnchorTest.cs b/src/Components/test/E2ETestMigration/Tests/DownloadAnchorTest.cs
deleted file mode 100644
index 38d7faaeb6ed..000000000000
--- a/src/Components/test/E2ETestMigration/Tests/DownloadAnchorTest.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Threading.Tasks;
-using BasicTestApp;
-using BasicTestApp.RouterTest;
-using Microsoft.AspNetCore.BrowserTesting;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
-using Microsoft.AspNetCore.Testing;
-using Moq;
-using PlaywrightSharp;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Tests
-{
- public class DownloadAnchorTest
- : ServerTestBase>
- {
- public DownloadAnchorTest(
- ToggleExecutionModeServerFixture serverFixture,
- ITestOutputHelper output)
- : base(serverFixture, output)
- {
- }
-
- protected override Type TestComponent { get; } = typeof(TestRouter);
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task DownloadFileFromAnchor(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- // Arrange
- var initialUrl = TestPage.Url;
- var downloadTask = TestPage.WaitForEventAsync(PageEvent.Download);
-
- // Act
- await Task.WhenAll(
- downloadTask,
- TestPage.ClickAsync("a[download]"));
-
- // Assert URL should still be same as before click
- Assert.Equal(initialUrl, TestPage.Url);
-
- // Assert that the resource was downloaded
- var download = downloadTask.Result.Download;
- Assert.Equal($"{_serverFixture.RootUri}subdir/images/blazor_logo_1000x.png", download.Url);
- Assert.Equal("blazor_logo_1000x.png", download.SuggestedFilename);
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/Tests/InputFileTest.cs b/src/Components/test/E2ETestMigration/Tests/InputFileTest.cs
deleted file mode 100644
index a06047fc0a68..000000000000
--- a/src/Components/test/E2ETestMigration/Tests/InputFileTest.cs
+++ /dev/null
@@ -1,302 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.IO;
-using System.Linq;
-using System.Text;
-using BasicTestApp;
-using BasicTestApp.FormsTest;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
-using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
-using Microsoft.AspNetCore.Testing;
-using Xunit;
-using Xunit.Abstractions;
-using System.Threading.Tasks;
-using PlaywrightSharp;
-using Microsoft.AspNetCore.BrowserTesting;
-
-namespace Microsoft.AspNetCore.Components.E2ETest.Tests
-{
- public class InputFileTest : ServerTestBase>
- {
- private string _tempDirectory;
-
- public InputFileTest(
- ToggleExecutionModeServerFixture serverFixture,
- ITestOutputHelper output)
- : base(serverFixture, output)
- {
- }
-
- protected override Type TestComponent { get; } = typeof(InputFileComponent);
-
- protected override async Task InitializeCoreAsync(TestContext context)
- {
- await base.InitializeCoreAsync(context);
-
- _tempDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
- Directory.CreateDirectory(_tempDirectory);
- }
-
- private async Task VerifyFile(TempFile file)
- {
- // Upload the file
- await TestPage.SetInputFilesAsync("#input-file", file.Path);
-
- var fileContainer = await TestPage.WaitForSelectorAsync($"#file-{file.Name}");
- Assert.NotNull(fileContainer);
- var fileNameElement = await fileContainer.QuerySelectorAsync("#file-name");
- Assert.NotNull(fileNameElement);
- var fileLastModifiedElement = await fileContainer.QuerySelectorAsync("#file-last-modified");
- Assert.NotNull(fileLastModifiedElement);
- var fileSizeElement = await fileContainer.QuerySelectorAsync("#file-size");
- Assert.NotNull(fileSizeElement);
- var fileContentTypeElement = await fileContainer.QuerySelectorAsync("#file-content-type");
- Assert.NotNull(fileContentTypeElement);
- var fileContentElement = await fileContainer.QuerySelectorAsync("#file-content");
- Assert.NotNull(fileContentElement);
-
- // Validate that the file was uploaded correctly and all fields are present
- Assert.False(string.IsNullOrWhiteSpace(await fileNameElement.GetTextContentAsync()));
- Assert.NotEqual(default, DateTimeOffset.Parse(await fileLastModifiedElement.GetTextContentAsync(), CultureInfo.InvariantCulture));
- Assert.Equal(file.Contents.Length.ToString(CultureInfo.InvariantCulture), await fileSizeElement.GetTextContentAsync());
- Assert.Equal("application/octet-stream", await fileContentTypeElement.GetTextContentAsync());
- Assert.Equal(file.Text, await fileContentElement.GetTextContentAsync());
- }
-
- private async Task VerifyFiles(IEnumerable files)
- {
- // Upload the files
- var filePaths = files
- .Select(i => i.Path)
- .ToArray();
-
- await TestPage.SetInputFilesAsync("#input-file", filePaths);
-
- foreach (var file in files)
- {
- var fileContainer = await TestPage.WaitForSelectorAsync($"#file-{file.Name}");
- Assert.NotNull(fileContainer);
- var fileNameElement = await fileContainer.QuerySelectorAsync("#file-name");
- Assert.NotNull(fileNameElement);
- var fileLastModifiedElement = await fileContainer.QuerySelectorAsync("#file-last-modified");
- Assert.NotNull(fileLastModifiedElement);
- var fileSizeElement = await fileContainer.QuerySelectorAsync("#file-size");
- Assert.NotNull(fileSizeElement);
- var fileContentTypeElement = await fileContainer.QuerySelectorAsync("#file-content-type");
- Assert.NotNull(fileContentTypeElement);
- var fileContentElement = await fileContainer.QuerySelectorAsync("#file-content");
- Assert.NotNull(fileContentElement);
-
- // Validate that the file was uploaded correctly and all fields are present
- Assert.False(string.IsNullOrWhiteSpace(await fileNameElement.GetTextContentAsync()));
- Assert.NotEqual(default, DateTimeOffset.Parse(await fileLastModifiedElement.GetTextContentAsync(), CultureInfo.InvariantCulture));
- Assert.Equal(file.Contents.Length.ToString(CultureInfo.InvariantCulture), await fileSizeElement.GetTextContentAsync());
- Assert.Equal("application/octet-stream", await fileContentTypeElement.GetTextContentAsync());
- Assert.Equal(file.Text, await fileContentElement.GetTextContentAsync());
- }
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task CanUploadSingleSmallFile(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- // Create a temporary text file
- var file = TempFile.Create(_tempDirectory, "txt", "This file was uploaded to the browser and read from .NET.");
- await VerifyFile(file);
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task CanUploadSingleLargeFile(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- // Create a large text file
- var fileContentSizeInBytes = 1024 * 1024;
- var contentBuilder = new StringBuilder();
-
- for (int i = 0; i < fileContentSizeInBytes; i++)
- {
- contentBuilder.Append((i % 10).ToString(CultureInfo.InvariantCulture));
- }
-
- var file = TempFile.Create(_tempDirectory, "txt", contentBuilder.ToString());
-
- await VerifyFile(file);
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task CanUploadMultipleFiles(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- // Create multiple small text files
- var files = Enumerable.Range(1, 3)
- .Select(i => TempFile.Create(_tempDirectory, "txt", $"Contents of file {i}."))
- .ToList();
-
- await VerifyFiles(files);
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task CanUploadAndConvertImageFile(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- var sourceImageId = "image-source";
-
- // Get the source image base64
- var base64 = await TestPage.EvaluateAsync($@"
- const canvas = document.createElement('canvas');
- const context = canvas.getContext('2d');
- const image = document.getElementById('{sourceImageId}');
-
- canvas.width = image.naturalWidth;
- canvas.height = image.naturalHeight;
- context.drawImage(image, 0, 0, image.naturalWidth, image.naturalHeight);
-
- canvas.toDataURL().split(',').pop();");
-
- // Save the image file locally
- var file = TempFile.Create(_tempDirectory, "png", Convert.FromBase64String(base64));
-
- // Re-upload the image file (it will be converted to a JPEG and scaled to fix 640x480)
- var inputFile = await TestPage.QuerySelectorAsync("#input-image");
- await inputFile.SetInputFilesAsync(file.Path);
-
- // Validate that the image was converted without error and is the correct size
- var uploadedImage = await TestPage.WaitForSelectorAsync("#image-uploaded");
- Assert.NotNull(uploadedImage);
- var box = await uploadedImage.GetBoundingBoxAsync();
- Assert.Equal(480, Math.Round(box.Height));
- Assert.Equal(480, Math.Round(box.Width));
- }
-
- protected async Task ClearAndType(string selector, string value)
- {
- await TestPage.EvalOnSelectorAsync(selector, "e => e.value = ''");
- var element = await TestPage.QuerySelectorAsync(selector);
- await element.TypeAsync(value);
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task ThrowsWhenTooManyFilesAreSelected(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- await ClearAndType("#max-allowed-files", "1\n");
-
- // Save two files locally
- var file1 = TempFile.Create(_tempDirectory, "txt", "This is file 1.");
- var file2 = TempFile.Create(_tempDirectory, "txt", "This is file 2.");
-
- // Select both files
- await TestPage.SetInputFilesAsync("#input-file", new string[] { file1.Path, file2.Path });
-
- // Validate that the proper exception is thrown
- var exceptionMessage = await TestPage.QuerySelectorAsync("#exception-message");
- Assert.Equal("The maximum number of files accepted is 1, but 2 were supplied.", await exceptionMessage.GetTextContentAsync());
- }
-
- [QuarantinedTest("New experimental test that need bake time.")]
- [ConditionalTheory]
- [InlineData(BrowserKind.Chromium)]
- [InlineData(BrowserKind.Firefox)]
- // NOTE: BrowserKind argument must be first
- public async Task ThrowsWhenOversizedFileIsSelected(BrowserKind browserKind)
- {
- if (ShouldSkip(browserKind))
- {
- return;
- }
-
- await ClearAndType("#max-file-size", "10\n");
-
- // Save a file that exceeds the specified file size limit
- var file = TempFile.Create(_tempDirectory, "txt", "This file is over 10 bytes long.");
-
- // Select the file
- await TestPage.SetInputFilesAsync("#input-file", file.Path);
-
- // Validate that the proper exception is thrown
- var exceptionMessage = await TestPage.QuerySelectorAsync("#exception-message");
- Assert.Equal("Supplied file with size 32 bytes exceeds the maximum of 10 bytes.", await exceptionMessage.GetTextContentAsync());
- }
-
- public override void Dispose()
- {
- base.Dispose();
- if (!String.IsNullOrEmpty(_tempDirectory))
- {
- Directory.Delete(_tempDirectory, recursive: true);
- }
- }
-
- private struct TempFile
- {
- public string Name { get; }
- public string Path { get; }
- public byte[] Contents { get; }
-
- public string Text => Encoding.ASCII.GetString(Contents);
-
- private TempFile(string tempDirectory, string extension, byte[] contents)
- {
- Name = $"{Guid.NewGuid():N}-{extension}";
- Path = System.IO.Path.Combine(tempDirectory, Name);
- Contents = contents;
- }
-
- public static TempFile Create(string tempDirectory, string extension, byte[] contents)
- {
- var file = new TempFile(tempDirectory, extension, contents);
-
- File.WriteAllBytes(file.Path, contents);
-
- return file;
- }
-
- public static TempFile Create(string tempDirectory, string extension, string text)
- => Create(tempDirectory, extension, Encoding.ASCII.GetBytes(text));
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.ci.json b/src/Components/test/E2ETestMigration/playwrightSettings.ci.json
deleted file mode 100644
index ad285bd810d6..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.ci.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "TimeoutInMilliseconds": 120000,
- "TimeoutAfterFirstFailureInMilliseconds": 20000,
- "GlobalBrowserOptions": {
- "Headless": true
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.ci.linux.json b/src/Components/test/E2ETestMigration/playwrightSettings.ci.linux.json
deleted file mode 100644
index 5e2a2e7c629b..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.ci.linux.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "BrowserOptions": {
- "Chromium": {
- "IsEnabled": false
- },
- "Firefox": {
- "IsEnabled": false
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.ci.osx.json b/src/Components/test/E2ETestMigration/playwrightSettings.ci.osx.json
deleted file mode 100644
index 137e7e958118..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.ci.osx.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "BrowserOptions": {
- "Chromium": {
- "IsEnabled": false
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.ci.win.json b/src/Components/test/E2ETestMigration/playwrightSettings.ci.win.json
deleted file mode 100644
index 2c63c0851048..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.ci.win.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.debug.json b/src/Components/test/E2ETestMigration/playwrightSettings.debug.json
deleted file mode 100644
index 6899a11ae8f8..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.debug.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "TimeoutInMilliseconds": 120000000,
- "TimeoutAfterFirstFailureInMilliseconds": 20000000,
- "GlobalBrowserOptions": {
- "Headless": false
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.json b/src/Components/test/E2ETestMigration/playwrightSettings.json
deleted file mode 100644
index d5e34b4795f4..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "TimeoutInMilliseconds": 30000,
- "TimeoutAfterFirstFailureInMilliseconds": 10000,
- "BaseArtifactsFolder": ".",
- "GlobalBrowserOptions": {
- "ChromiumSandbox": true,
- "DumpIO": true,
- "IgnoreHTTPSErrors": true,
- "Headless": true,
- "Timeout": 30000
- },
- "GlobalContextOptions": {
- "RecordVideo": {
- "Dir": "videos"
- },
- "RecordHar": {
- "Path": "har"
- },
- "IgnoreHTTPSErrors": true
- },
- "BrowserOptions": {
- "Chromium": {
- "BrowserKind": "Chromium",
- "IsEnabled": true,
- "Args": {
- "--ignore-certificate-errors": true
- }
- },
- "Firefox": {
- "BrowserKind": "Firefox",
- "IsEnabled": true
- },
- "Webkit": {
- "BrowserKind": "Webkit",
- "IsEnabled": true
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.linux.json b/src/Components/test/E2ETestMigration/playwrightSettings.linux.json
deleted file mode 100644
index 98c2893fe01e..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.linux.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "BrowserOptions": {
- "Firefox": {
- "BrowserKind": "Firefox",
- "IsEnabled": false
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.osx.json b/src/Components/test/E2ETestMigration/playwrightSettings.osx.json
deleted file mode 100644
index 2c63c0851048..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.osx.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{
-}
diff --git a/src/Components/test/E2ETestMigration/playwrightSettings.win.json b/src/Components/test/E2ETestMigration/playwrightSettings.win.json
deleted file mode 100644
index 8ea04ee84c8d..000000000000
--- a/src/Components/test/E2ETestMigration/playwrightSettings.win.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "BrowserOptions": {
- "Webkit": {
- "BrowserKind": "Webkit",
- "IsEnabled": false
- }
- }
-}
diff --git a/src/Components/test/E2ETestMigration/xunit.runner.json b/src/Components/test/E2ETestMigration/xunit.runner.json
deleted file mode 100644
index baa05fb93d2a..000000000000
--- a/src/Components/test/E2ETestMigration/xunit.runner.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- // This is set to -1 to allow the usage of an
- // unlimited ammount of threads.
- "maxParallelThreads": -1,
- "diagnosticMessages": true,
- "longRunningTestSeconds": 30
-}
diff --git a/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/open-iconic/README.md b/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/open-iconic/README.md
index 6b810e479660..5ac0c17025da 100644
--- a/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/open-iconic/README.md
+++ b/src/Components/test/testassets/ComponentsApp.Server/wwwroot/css/open-iconic/README.md
@@ -1,7 +1,7 @@
-[Open Iconic v1.1.1](http://useiconic.com/open)
+[Open Iconic v1.1.1](https://github.com/iconic/open-iconic)
===========
-### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons)
+### Open Iconic is the open source sibling of [Iconic](https://github.com/iconic/open-iconic). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](https://github.com/iconic/open-iconic)
@@ -17,7 +17,7 @@
## Getting Started
-#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections.
+#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](https://github.com/iconic/open-iconic) and [Reference](https://github.com/iconic/open-iconic) sections.
### General Usage
diff --git a/src/Components/test/testassets/TestServer/Pages/DeferredComponentContentLayout.cshtml b/src/Components/test/testassets/TestServer/Pages/DeferredComponentContentLayout.cshtml
index 67487f9d7059..9010dd3cc8b7 100644
--- a/src/Components/test/testassets/TestServer/Pages/DeferredComponentContentLayout.cshtml
+++ b/src/Components/test/testassets/TestServer/Pages/DeferredComponentContentLayout.cshtml
@@ -34,5 +34,11 @@
});
}
+
+