diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 05dc6cfa94..d5f3a86132 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,82 +1,76 @@ name: Feature Request -description: Suggest an idea for this project +description: Suggest a new feature or improvement title: 'feat: ' labels: ['triage'] body: - type: markdown attributes: value: | - ## Important Notes - ### Before submitting - - Please check the **open AND closed** [Issues](https://github.com/open-webui/open-webui/issues) AND [Discussions](https://github.com/open-webui/open-webui/discussions) to see if a similar request has been posted. - It's likely we're already tracking it! If you’re unsure, start a discussion post first. + ## Before Submitting - #### Scope + Please check **open AND closed** [Issues](https://github.com/open-webui/open-webui/issues) and [Discussions](https://github.com/open-webui/open-webui/discussions) for similar requests. If you find one, add your input there instead. - If your feature request is likely to take more than a quick coding session to implement, test and verify, then open it in the **Ideas** section of the [Discussions](https://github.com/open-webui/open-webui/discussions) instead. - **We will close and force move your feature request to the Ideas section, if we believe your feature request is not trivial/quick to implement.** - This is to ensure the issues tab is used only for issues, quickly addressable feature requests and tracking tickets by the maintainers. - Other feature requests belong in the **Ideas** section of the [Discussions](https://github.com/open-webui/open-webui/discussions). - - If your feature request might impact others in the community, definitely open a discussion instead and evaluate whether and how to implement it. - - This will help us efficiently focus on improving the project. - - ### Collaborate respectfully - We value a **constructive attitude**, so please be mindful of your communication. If negativity is part of your approach, our capacity to engage may be limited. We're here to help if you're **open to learning** and **communicating positively**. + ### Scope Guidelines - Remember: - - Open WebUI is a **volunteer-driven project** - - It's managed by a **single maintainer** - - It's supported by contributors who also have **full-time jobs** + Feature requests that require significant implementation effort should be posted in the **Ideas** section of [Discussions](https://github.com/open-webui/open-webui/discussions) instead. We will move oversized feature requests to Discussions to keep the Issues tab focused on actionable items. - We appreciate your time and ask that you **respect ours**. + If your request might impact the broader community, please open a Discussion first so others can weigh in on the design. + + ### Be Respectful + + Open WebUI is a volunteer-driven project maintained by a small team. We value constructive, positive communication. Please be mindful of maintainers' time and energy. ### Contributing - If you encounter an issue, we highly encourage you to submit a pull request or fork the project. We actively work to prevent contributor burnout to maintain the quality and continuity of Open WebUI. - ### Bug reproducibility - If a bug cannot be reproduced with a `:main` or `:dev` Docker setup, or a `pip install` with Python 3.11, it may require additional help from the community. In such cases, we will move it to the "[issues](https://github.com/open-webui/open-webui/discussions/categories/issues)" Discussions section due to our limited resources. We encourage the community to assist with these issues. Remember, it’s not that the issue doesn’t exist; we need your help! + If you encounter an issue, we encourage you to submit a pull request or fork the project. We actively work to prevent contributor burnout and maintain project quality. + + ### Reproducibility + + If a bug cannot be reproduced with a `:main` or `:dev` Docker setup, or a `pip install` with Python 3.11, it may be moved to the "Issues" section in Discussions for community assistance. - type: checkboxes id: existing-issue attributes: label: Check Existing Issues - description: Please confirm that you've checked for existing similar requests + description: Confirm you have searched for similar requests. options: - - label: I have searched for all existing **open AND closed** issues and discussions for similar requests. I have found none that is comparable to my request. + - label: I have searched all existing **open AND closed** issues and discussions and found none comparable to my request. required: true + - type: checkboxes id: feature-scope attributes: label: Verify Feature Scope - description: Please confirm the feature's scope is within the described scope + description: Confirm this request belongs in Issues rather than Discussions. options: - - label: I have read through and understood the scope definition for feature requests in the Issues section. I believe my feature request meets the definition and belongs in the Issues section instead of the Discussions. + - label: I believe this feature request is appropriately scoped for the Issues section as described above. required: true + - type: textarea id: problem-description attributes: label: Problem Description - description: Is your feature request related to a problem? Please provide a clear and concise description of what the problem is. - placeholder: "Ex. I'm always frustrated when... / Not related to a problem" + description: Is this related to a problem? Describe the pain point clearly. + placeholder: "e.g., I'm frustrated when..." validations: required: true + - type: textarea id: solution-description attributes: - label: Desired Solution you'd like - description: Clearly describe what you want to happen. + label: Proposed Solution + description: Describe what you would like to happen. validations: required: true + - type: textarea id: alternatives-considered attributes: label: Alternatives Considered - description: A clear and concise description of any alternative solutions or features you've considered. + description: Describe any alternative solutions or workarounds you have considered. + - type: textarea id: additional-context attributes: label: Additional Context - description: Add any other context or screenshots about the feature request here. + description: Add any other context, mockups, or screenshots about the feature request. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1c83fd305b..5998b3dc96 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,17 +4,22 @@ updates: directory: '/' schedule: interval: monthly - target-branch: 'dev' + target-branch: dev - package-ecosystem: pip directory: '/backend' schedule: interval: monthly - target-branch: 'dev' + target-branch: dev - - package-ecosystem: 'github-actions' + - package-ecosystem: github-actions directory: '/' schedule: - # Check for updates to GitHub Actions every week interval: monthly - target-branch: 'dev' + target-branch: dev + + - package-ecosystem: npm + directory: '/' + schedule: + interval: monthly + target-branch: dev diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ad311a371a..957f5a3768 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -18,75 +18,75 @@ The most impactful way to contribute to Open WebUI is through well-written bug r **Before submitting, make sure you've checked the following:** -- [ ] **Target branch:** Verify that the pull request targets the `dev` branch. **PRs targeting `main` will be immediately closed.** -- [ ] **Description:** Provide a concise description of the changes made in this pull request down below. -- [ ] **Changelog:** Ensure a changelog entry following the format of [Keep a Changelog](https://keepachangelog.com/) is added at the bottom of the PR description. -- [ ] **Documentation:** Add docs in [Open WebUI Docs Repository](https://github.com/open-webui/docs). Document user-facing behavior, environment variables, public APIs/interfaces, or deployment steps. -- [ ] **Dependencies:** Are there any new or upgraded dependencies? If so, explain why, update the changelog/docs, and include any compatibility notes. Actually run the code/function that uses updated library to ensure it doesn't crash. -- [ ] **Testing:** Perform manual tests to **verify the implemented fix/feature works as intended AND does not break any other functionality**. Include reproducible steps to demonstrate the issue before the fix. Test edge cases (URL encoding, HTML entities, types). Take this as an opportunity to **make screenshots of the feature/fix and include them in the PR description**. -- [ ] **Agentic AI Code:** Confirm this Pull Request is **not written by any AI Agent** or has at least **gone through additional human review AND manual testing**. If any AI Agent is the co-author of this PR, it may lead to immediate closure of the PR. -- [ ] **Code review:** Have you performed a self-review of your code, addressing any coding standard issues and ensuring adherence to the project's coding standards? -- [ ] **Design & Architecture:** Prefer smart defaults over adding new settings; use local state for ephemeral UI logic. Open a Discussion for major architectural or UX changes. -- [ ] **Git Hygiene:** Keep PRs atomic (one logical change). Clean up commits and rebase on `dev` to ensure no unrelated commits (e.g. from `main`) are included. Push updates to the existing PR branch instead of closing and reopening. -- [ ] **Title Prefix:** To clearly categorize this pull request, prefix the pull request title using one of the following: - - **BREAKING CHANGE**: Significant changes that may affect compatibility - - **build**: Changes that affect the build system or external dependencies - - **ci**: Changes to our continuous integration processes or workflows - - **chore**: Refactor, cleanup, or other non-functional code changes - - **docs**: Documentation update or addition - - **feat**: Introduces a new feature or enhancement to the codebase - - **fix**: Bug fix or error correction +- [ ] **Linked Issue/Discussion:** This PR references an existing [Issue](https://github.com/open-webui/open-webui/issues) or [Discussion](https://github.com/open-webui/open-webui/discussions) — `Closes #___` / `Relates to #___`. If one does not exist, create one first. PRs without a linked issue or discussion may be closed without review. +- [ ] **Target branch:** The pull request targets the `dev` branch. **PRs targeting `main` will be immediately closed.** +- [ ] **Description:** A concise description of the changes is provided below. +- [ ] **Changelog:** A changelog entry following [Keep a Changelog](https://keepachangelog.com/) format is included at the bottom. +- [ ] **Documentation:** Relevant documentation has been added or updated in the [Open WebUI Docs Repository](https://github.com/open-webui/docs). +- [ ] **Dependencies:** Any new or updated dependencies are explained, tested, and documented. +- [ ] **Testing:** Manual tests have been performed to verify the fix/feature works correctly and does not introduce regressions. Screenshots or recordings are included where applicable. +- [ ] **No Unchecked AI Code:** This PR is either human-written or has undergone thorough human review AND manual testing. Unreviewed AI-generated PRs may be closed immediately. +- [ ] **Self-Review:** A self-review of the code has been performed, ensuring adherence to project coding standards. +- [ ] **Architecture:** Smart defaults are preferred over new settings. Local state is used for ephemeral UI logic. Major architectural or UX changes have been discussed first. +- [ ] **Git Hygiene:** The PR is atomic (one logical change), rebased on `dev`, and contains no unrelated commits. +- [ ] **Title Prefix:** The PR title uses one of the following prefixes: + - **BREAKING CHANGE**: Changes affecting backward compatibility + - **build**: Build system or dependency changes + - **ci**: CI/CD workflow changes + - **chore**: Refactoring, cleanup, or non-functional changes + - **docs**: Documentation additions or updates + - **feat**: New features or enhancements + - **fix**: Bug fixes or corrections - **i18n**: Internationalization or localization changes - - **perf**: Performance improvement - - **refactor**: Code restructuring for better maintainability, readability, or scalability - - **style**: Changes that do not affect the meaning of the code (white space, formatting, missing semi-colons, etc.) - - **test**: Adding missing tests or correcting existing tests - - **WIP**: Work in progress, a temporary label for incomplete or ongoing work + - **perf**: Performance improvements + - **refactor**: Code restructuring + - **style**: Formatting changes (whitespace, semicolons, etc.) + - **test**: Test additions or corrections + - **WIP**: Work in progress # Changelog Entry ### Description -- [Concisely describe the changes made in this pull request, including any relevant motivation and impact (e.g., fixing a bug, adding a feature, or improving performance)] +- [Describe the changes, including motivation and impact] ### Added -- [List any new features, functionalities, or additions] +- [New features, functionalities, or additions] ### Changed -- [List any changes, updates, refactorings, or optimizations] +- [Changes, updates, refactorings, or optimizations] ### Deprecated -- [List any deprecated functionality or features that have been removed] +- [Deprecated functionality or features] ### Removed -- [List any removed features, files, or functionalities] +- [Removed features, files, or functionalities] ### Fixed -- [List any fixes, corrections, or bug fixes] +- [Bug fixes or corrections] ### Security -- [List any new or updated security-related changes, including vulnerability fixes] +- [Security-related changes or vulnerability fixes] ### Breaking Changes -- **BREAKING CHANGE**: [List any breaking changes affecting compatibility or functionality] +- **BREAKING CHANGE**: [Changes affecting compatibility or functionality] --- ### Additional Information -- [Insert any additional context, notes, or explanations for the changes] - - [Reference any related issues, commits, or other relevant information] +- [Any additional context, notes, or references to related issues/commits] ### Screenshots or Videos -- [Attach any relevant screenshots or videos demonstrating the changes] +- [Attach relevant screenshots or videos demonstrating the changes] ### Contributor License Agreement diff --git a/.github/workflows/backend.yaml b/.github/workflows/backend.yaml new file mode 100644 index 0000000000..877a6b0ecc --- /dev/null +++ b/.github/workflows/backend.yaml @@ -0,0 +1,40 @@ +# ───────────────────────────────────────────────────────────────────────────── +# Backend CI — Python formatting checks via Ruff +# Runs on pushes and PRs to main/dev when backend files change +# ───────────────────────────────────────────────────────────────────────────── +name: Python CI + +on: + push: + branches: [main, dev] + paths: ['backend/**', 'pyproject.toml', 'uv.lock'] + pull_request: + branches: [main, dev] + paths: ['backend/**', 'pyproject.toml', 'uv.lock'] + +concurrency: + group: backend-${{ github.ref }} + cancel-in-progress: true + +jobs: + # ── Ruff format check across supported Python versions ─────────────────── + format-check: + name: Ruff Format (${{ matrix.python-version }}) + runs-on: ubuntu-latest + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + python-version: ['3.11', '3.12'] + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + + - name: Install formatter + run: pip install "ruff>=0.15.5" + + - name: Verify formatting + run: ruff format --check . --exclude .venv --exclude venv diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml deleted file mode 100644 index 2ecb013e0b..0000000000 --- a/.github/workflows/build-release.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Release - -on: - push: - branches: - - main # or whatever branch you want to use - -jobs: - release: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Check for changes in package.json - run: | - git diff --cached --diff-filter=d package.json || { - echo "No changes to package.json" - exit 1 - } - - - name: Get version number from package.json - id: get_version - run: | - VERSION=$(jq -r '.version' package.json) - echo "::set-output name=version::$VERSION" - - - name: Extract latest CHANGELOG entry - run: | - VERSION="${{ steps.get_version.outputs.version }}" - awk "/^## \[${VERSION}\]/{found=1; next} /^## \[/{if(found) exit} found{print}" CHANGELOG.md > /tmp/release-notes.md - - - name: Create GitHub release - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | - gh release create "v${{ steps.get_version.outputs.version }}" \ - --title "v${{ steps.get_version.outputs.version }}" \ - --notes-file /tmp/release-notes.md - - - name: Upload package to GitHub release - uses: actions/upload-artifact@v4 - with: - name: package - path: | - . - !.git - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Trigger Docker build workflow - uses: actions/github-script@v8 - with: - script: | - github.rest.actions.createWorkflowDispatch({ - owner: context.repo.owner, - repo: context.repo.repo, - workflow_id: 'docker-build.yaml', - ref: 'v${{ steps.get_version.outputs.version }}', - }) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml deleted file mode 100644 index 0307593476..0000000000 --- a/.github/workflows/docker-build.yaml +++ /dev/null @@ -1,917 +0,0 @@ -name: Create and publish Docker images with specific build args - -on: - workflow_dispatch: - push: - branches: - - main - - dev - tags: - - v* - -env: - REGISTRY: ghcr.io - -jobs: - build-main-image: - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (default latest tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - - - name: Extract metadata for Docker cache - id: cache-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} - flavor: | - prefix=cache-${{ matrix.platform }}- - latest=false - - - name: Build Docker image (latest) - uses: docker/build-push-action@v5 - id: build - with: - context: . - push: true - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true - cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} - cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max - sbom: true - build-args: | - BUILD_HASH=${{ github.sha }} - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-main-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - build-cuda-image: - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Delete huge unnecessary tools folder - run: rm -rf /opt/hostedtoolcache - - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (cuda tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=cuda - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-cuda,onlatest=true - - - name: Extract metadata for Docker cache - id: cache-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} - flavor: | - prefix=cache-cuda-${{ matrix.platform }}- - latest=false - - - name: Build Docker image (cuda) - uses: docker/build-push-action@v5 - id: build - with: - context: . - push: true - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true - cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} - cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max - sbom: true - build-args: | - BUILD_HASH=${{ github.sha }} - USE_CUDA=true - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-cuda-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - build-cuda126-image: - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Delete huge unnecessary tools folder - run: rm -rf /opt/hostedtoolcache - - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (cuda126 tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=cuda126 - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-cuda126,onlatest=true - - - name: Extract metadata for Docker cache - id: cache-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} - flavor: | - prefix=cache-cuda126-${{ matrix.platform }}- - latest=false - - - name: Build Docker image (cuda126) - uses: docker/build-push-action@v5 - id: build - with: - context: . - push: true - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true - cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} - cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max - sbom: true - build-args: | - BUILD_HASH=${{ github.sha }} - USE_CUDA=true - USE_CUDA_VER=cu126 - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-cuda126-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - build-ollama-image: - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (ollama tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=ollama - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-ollama,onlatest=true - - - name: Extract metadata for Docker cache - id: cache-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} - flavor: | - prefix=cache-ollama-${{ matrix.platform }}- - latest=false - - - name: Build Docker image (ollama) - uses: docker/build-push-action@v5 - id: build - with: - context: . - push: true - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true - cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} - cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max - sbom: true - build-args: | - BUILD_HASH=${{ github.sha }} - USE_OLLAMA=true - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-ollama-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - build-slim-image: - runs-on: ${{ matrix.runner }} - permissions: - contents: read - packages: write - strategy: - fail-fast: false - matrix: - include: - - platform: linux/amd64 - runner: ubuntu-latest - - platform: linux/arm64 - runner: ubuntu-24.04-arm - - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Prepare - run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - - name: Checkout repository - uses: actions/checkout@v5 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (slim tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=slim - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-slim,onlatest=true - - - name: Extract metadata for Docker cache - id: cache-meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} - flavor: | - prefix=cache-slim-${{ matrix.platform }}- - latest=false - - - name: Build Docker image (slim) - uses: docker/build-push-action@v5 - id: build - with: - context: . - push: true - platforms: ${{ matrix.platform }} - labels: ${{ steps.meta.outputs.labels }} - outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true - cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} - cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max - sbom: true - build-args: | - BUILD_HASH=${{ github.sha }} - USE_SLIM=true - - - name: Export digest - run: | - mkdir -p /tmp/digests - digest="${{ steps.build.outputs.digest }}" - touch "/tmp/digests/${digest#sha256:}" - - - name: Upload digest - uses: actions/upload-artifact@v4 - with: - name: digests-slim-${{ env.PLATFORM_PAIR }} - path: /tmp/digests/* - if-no-files-found: error - retention-days: 1 - - merge-main-images: - runs-on: ubuntu-latest - needs: [build-main-image] - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Download digests - uses: actions/download-artifact@v5 - with: - pattern: digests-main-* - path: /tmp/digests - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (default latest tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.FULL_IMAGE_NAME }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.FULL_IMAGE_NAME }}:${{ steps.meta.outputs.version }} - - merge-cuda-images: - runs-on: ubuntu-latest - needs: [build-cuda-image] - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Download digests - uses: actions/download-artifact@v5 - with: - pattern: digests-cuda-* - path: /tmp/digests - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (default latest tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=cuda - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-cuda,onlatest=true - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.FULL_IMAGE_NAME }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.FULL_IMAGE_NAME }}:${{ steps.meta.outputs.version }} - - merge-cuda126-images: - runs-on: ubuntu-latest - needs: [build-cuda126-image] - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Download digests - uses: actions/download-artifact@v5 - with: - pattern: digests-cuda126-* - path: /tmp/digests - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (default latest tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=cuda126 - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-cuda126,onlatest=true - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.FULL_IMAGE_NAME }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.FULL_IMAGE_NAME }}:${{ steps.meta.outputs.version }} - - merge-ollama-images: - runs-on: ubuntu-latest - needs: [build-ollama-image] - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Download digests - uses: actions/download-artifact@v5 - with: - pattern: digests-ollama-* - path: /tmp/digests - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (default ollama tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=ollama - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-ollama,onlatest=true - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.FULL_IMAGE_NAME }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.FULL_IMAGE_NAME }}:${{ steps.meta.outputs.version }} - - merge-slim-images: - runs-on: ubuntu-latest - needs: [build-slim-image] - steps: - # GitHub Packages requires the entire repository name to be in lowercase - # although the repository owner has a lowercase username, this prevents some people from running actions after forking - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Download digests - uses: actions/download-artifact@v5 - with: - pattern: digests-slim-* - path: /tmp/digests - merge-multiple: true - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Extract metadata for Docker images (default slim tag) - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.FULL_IMAGE_NAME }} - tags: | - type=ref,event=branch - type=ref,event=tag - type=sha,prefix=git- - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - type=raw,enable=${{ github.ref == 'refs/heads/main' }},prefix=,suffix=,value=slim - flavor: | - latest=${{ github.ref == 'refs/heads/main' }} - suffix=-slim,onlatest=true - - - name: Create manifest list and push - working-directory: /tmp/digests - run: | - docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ - $(printf '${{ env.FULL_IMAGE_NAME }}@sha256:%s ' *) - - - name: Inspect image - run: | - docker buildx imagetools inspect ${{ env.FULL_IMAGE_NAME }}:${{ steps.meta.outputs.version }} - - # Copy images from GHCR to Docker Hub (best-effort, won't block GHCR) - copy-to-dockerhub: - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') - needs: [merge-main-images, merge-cuda-images, merge-cuda126-images, merge-ollama-images, merge-slim-images] - continue-on-error: true - strategy: - fail-fast: false - matrix: - include: - - variant: main - suffix: "" - - variant: cuda - suffix: "-cuda" - - variant: cuda126 - suffix: "-cuda126" - - variant: ollama - suffix: "-ollama" - - variant: slim - suffix: "-slim" - steps: - - name: Set repository and image name to lowercase - run: | - echo "IMAGE_NAME=${IMAGE_NAME,,}" >>${GITHUB_ENV} - echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME,,}" >>${GITHUB_ENV} - env: - IMAGE_NAME: '${{ github.repository }}' - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Log in to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Determine source and destination tags - id: tags - run: | - DOCKERHUB_IMAGE="openwebui/open-webui" - SUFFIX="${{ matrix.suffix }}" - - if [[ "${{ github.ref }}" == refs/tags/v* ]]; then - # For version tags: copy version tag and major.minor tag - VERSION="${{ github.ref_name }}" - VERSION="${VERSION#v}" - MAJOR_MINOR="${VERSION%.*}" - - echo "tags<> $GITHUB_OUTPUT - echo "${VERSION}${SUFFIX}" >> $GITHUB_OUTPUT - echo "${MAJOR_MINOR}${SUFFIX}" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - else - # For main branch - if [ -z "$SUFFIX" ]; then - echo "tags=latest" >> $GITHUB_OUTPUT - else - # e.g. latest-cuda -> also tag as just "cuda" - VARIANT_NAME="${SUFFIX#-}" - echo "tags<> $GITHUB_OUTPUT - echo "latest${SUFFIX}" >> $GITHUB_OUTPUT - echo "${VARIANT_NAME}" >> $GITHUB_OUTPUT - echo "EOF" >> $GITHUB_OUTPUT - fi - fi - - echo "dockerhub_image=${DOCKERHUB_IMAGE}" >> $GITHUB_OUTPUT - - - name: Copy images from GHCR to Docker Hub - run: | - DOCKERHUB_IMAGE="${{ steps.tags.outputs.dockerhub_image }}" - SUFFIX="${{ matrix.suffix }}" - - # Determine the source tag on GHCR - if [[ "${{ github.ref }}" == refs/tags/v* ]]; then - VERSION="${{ github.ref_name }}" - VERSION="${VERSION#v}" - SOURCE_TAG="${VERSION}${SUFFIX}" - else - if [ -z "$SUFFIX" ]; then - SOURCE_TAG="latest" - else - SOURCE_TAG="latest${SUFFIX}" - fi - fi - - SOURCE="${{ env.FULL_IMAGE_NAME }}:${SOURCE_TAG}" - - echo "Copying from ${SOURCE} to Docker Hub..." - - # Copy each destination tag - while IFS= read -r TAG; do - [ -z "$TAG" ] && continue - DEST="${DOCKERHUB_IMAGE}:${TAG}" - echo " -> ${DEST}" - docker buildx imagetools create -t "${DEST}" "${SOURCE}" - done <<< "${{ steps.tags.outputs.tags }}" diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml new file mode 100644 index 0000000000..bd46f65d54 --- /dev/null +++ b/.github/workflows/docker.yaml @@ -0,0 +1,311 @@ +name: Create and publish Docker images with specific build args + +on: + workflow_dispatch: + push: + branches: + - main + - dev + tags: + - v* + +concurrency: + group: docker-${{ github.ref }} + cancel-in-progress: true + +env: + REGISTRY: ghcr.io + +jobs: + build: + runs-on: ${{ matrix.platform.runner }} + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + platform: + - arch: linux/amd64 + runner: ubuntu-latest + - arch: linux/arm64 + runner: ubuntu-24.04-arm + variant: + - name: main + suffix: "" + build_args: "" + free_disk: false + - name: cuda + suffix: "-cuda" + build_args: "USE_CUDA=true" + free_disk: true + - name: cuda126 + suffix: "-cuda126" + build_args: | + USE_CUDA=true + USE_CUDA_VER=cu126 + free_disk: true + - name: ollama + suffix: "-ollama" + build_args: "USE_OLLAMA=true" + free_disk: false + - name: slim + suffix: "-slim" + build_args: "USE_SLIM=true" + free_disk: false + + steps: + - name: Prepare environment + run: | + echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + echo "FULL_IMAGE_NAME=${REGISTRY}/${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + platform=${{ matrix.platform.arch }} + echo "PLATFORM_PAIR=${platform//\//-}" >> ${GITHUB_ENV} + + - name: Free disk space + if: matrix.variant.free_disk + run: rm -rf /opt/hostedtoolcache + + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker images + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.FULL_IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=tag + type=sha,prefix=git- + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + ${{ matrix.variant.suffix != '' && format('type=raw,enable={0},prefix=,suffix=,value={1}', github.ref == 'refs/heads/main', matrix.variant.name) || '' }} + flavor: | + latest=${{ github.ref == 'refs/heads/main' }} + ${{ matrix.variant.suffix != '' && format('suffix={0},onlatest=true', matrix.variant.suffix) || '' }} + + - name: Extract metadata for Docker cache + id: cache-meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.FULL_IMAGE_NAME }} + tags: | + type=ref,event=branch + ${{ github.ref_type == 'tag' && 'type=raw,value=main' || '' }} + flavor: | + prefix=cache-${{ matrix.variant.name }}-${{ matrix.platform.arch }}- + latest=false + + - name: Build Docker image + uses: docker/build-push-action@v5 + id: build + with: + context: . + push: true + platforms: ${{ matrix.platform.arch }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true + cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} + cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max + sbom: true + build-args: | + BUILD_HASH=${{ github.sha }} + ${{ matrix.variant.build_args }} + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ matrix.variant.name }}-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: [build] + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + variant: + - name: main + suffix: "" + - name: cuda + suffix: "-cuda" + - name: cuda126 + suffix: "-cuda126" + - name: ollama + suffix: "-ollama" + - name: slim + suffix: "-slim" + + steps: + - name: Prepare environment + run: | + echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + echo "FULL_IMAGE_NAME=${REGISTRY}/${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + + - name: Download digests + uses: actions/download-artifact@v5 + with: + pattern: digests-${{ matrix.variant.name }}-* + path: /tmp/digests + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker images + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.FULL_IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=tag + type=sha,prefix=git- + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + ${{ matrix.variant.suffix != '' && format('type=raw,enable={0},prefix=,suffix=,value={1}', github.ref == 'refs/heads/main', matrix.variant.name) || '' }} + flavor: | + latest=${{ github.ref == 'refs/heads/main' }} + ${{ matrix.variant.suffix != '' && format('suffix={0},onlatest=true', matrix.variant.suffix) || '' }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create \ + $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.FULL_IMAGE_NAME }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.FULL_IMAGE_NAME }}:${{ steps.meta.outputs.version }} + + copy-to-dockerhub: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') + needs: [merge] + continue-on-error: true + strategy: + fail-fast: false + matrix: + include: + - variant: main + suffix: "" + - variant: cuda + suffix: "-cuda" + - variant: cuda126 + suffix: "-cuda126" + - variant: ollama + suffix: "-ollama" + - variant: slim + suffix: "-slim" + + steps: + - name: Prepare environment + run: | + echo "IMAGE_NAME=${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + echo "FULL_IMAGE_NAME=${REGISTRY}/${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Determine source and destination tags + id: tags + run: | + DOCKERHUB_IMAGE="openwebui/open-webui" + SUFFIX="${{ matrix.suffix }}" + + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + MAJOR_MINOR="${VERSION%.*}" + + echo "tags<> $GITHUB_OUTPUT + echo "${VERSION}${SUFFIX}" >> $GITHUB_OUTPUT + echo "${MAJOR_MINOR}${SUFFIX}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + else + if [ -z "$SUFFIX" ]; then + echo "tags=latest" >> $GITHUB_OUTPUT + else + VARIANT_NAME="${SUFFIX#-}" + echo "tags<> $GITHUB_OUTPUT + echo "latest${SUFFIX}" >> $GITHUB_OUTPUT + echo "${VARIANT_NAME}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + fi + fi + + echo "dockerhub_image=${DOCKERHUB_IMAGE}" >> $GITHUB_OUTPUT + + - name: Copy images from GHCR to Docker Hub + run: | + DOCKERHUB_IMAGE="${{ steps.tags.outputs.dockerhub_image }}" + SUFFIX="${{ matrix.suffix }}" + + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + SOURCE_TAG="${VERSION}${SUFFIX}" + else + if [ -z "$SUFFIX" ]; then + SOURCE_TAG="latest" + else + SOURCE_TAG="latest${SUFFIX}" + fi + fi + + SOURCE="${{ env.FULL_IMAGE_NAME }}:${SOURCE_TAG}" + + echo "Copying from ${SOURCE} to Docker Hub..." + + while IFS= read -r TAG; do + [ -z "$TAG" ] && continue + DEST="${DOCKERHUB_IMAGE}:${TAG}" + echo " -> ${DEST}" + docker buildx imagetools create -t "${DEST}" "${SOURCE}" + done <<< "${{ steps.tags.outputs.tags }}" diff --git a/.github/workflows/format-backend.yaml b/.github/workflows/format-backend.yaml deleted file mode 100644 index ee2d689d89..0000000000 --- a/.github/workflows/format-backend.yaml +++ /dev/null @@ -1,46 +0,0 @@ -name: Python CI - -on: - push: - branches: - - main - - dev - paths: - - 'backend/**' - - 'pyproject.toml' - - 'uv.lock' - pull_request: - branches: - - main - - dev - paths: - - 'backend/**' - - 'pyproject.toml' - - 'uv.lock' - -jobs: - build: - name: 'Format Backend' - runs-on: ubuntu-latest - - strategy: - matrix: - python-version: - - 3.11.x - - 3.12.x - - steps: - - uses: actions/checkout@v5 - - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '${{ matrix.python-version }}' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install "ruff>=0.15.5" - - - name: Ruff format check - run: ruff format --check . --exclude .venv --exclude venv diff --git a/.github/workflows/format-build-frontend.yaml b/.github/workflows/format-build-frontend.yaml deleted file mode 100644 index eaa1072fbc..0000000000 --- a/.github/workflows/format-build-frontend.yaml +++ /dev/null @@ -1,65 +0,0 @@ -name: Frontend Build - -on: - push: - branches: - - main - - dev - paths-ignore: - - 'backend/**' - - 'pyproject.toml' - - 'uv.lock' - pull_request: - branches: - - main - - dev - paths-ignore: - - 'backend/**' - - 'pyproject.toml' - - 'uv.lock' - -jobs: - build: - name: 'Format & Build Frontend' - runs-on: ubuntu-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v5 - - - name: Setup Node.js - uses: actions/setup-node@v5 - with: - node-version: '22' - - - name: Install Dependencies - run: npm install --force - - - name: Format Frontend - run: npm run format - - - name: Run i18next - run: npm run i18n:parse - - - name: Check for Changes After Format - run: git diff --exit-code - - - name: Build Frontend - run: npm run build - - test-frontend: - name: 'Frontend Unit Tests' - runs-on: ubuntu-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v5 - - - name: Setup Node.js - uses: actions/setup-node@v5 - with: - node-version: '22' - - - name: Install Dependencies - run: npm ci --force - - - name: Run vitest - run: npm run test:frontend diff --git a/.github/workflows/frontend.yaml b/.github/workflows/frontend.yaml new file mode 100644 index 0000000000..9b5f2a099f --- /dev/null +++ b/.github/workflows/frontend.yaml @@ -0,0 +1,63 @@ +# ───────────────────────────────────────────────────────────────────────────── +# Frontend CI — Lint, format check, build, and unit tests +# Runs on pushes and PRs to main/dev, skipping backend-only changes +# ───────────────────────────────────────────────────────────────────────────── +name: Frontend Build + +on: + push: + branches: [main, dev] + paths-ignore: ['backend/**', 'pyproject.toml', 'uv.lock'] + pull_request: + branches: [main, dev] + paths-ignore: ['backend/**', 'pyproject.toml', 'uv.lock'] + +concurrency: + group: frontend-${{ github.ref }} + cancel-in-progress: true + +jobs: + # ── Format, i18n, and production build ──────────────────────────────────── + format-and-build: + name: Format & Build + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-node@v5 + with: + node-version: '22' + + - name: Install dependencies + run: npm install --force + + - name: Verify code formatting + run: npm run format + + - name: Verify i18n strings + run: npm run i18n:parse + + - name: Ensure working tree is clean + run: git diff --exit-code + + - name: Production build + run: npm run build + + # ── Vitest unit tests ──────────────────────────────────────────────────── + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-node@v5 + with: + node-version: '22' + + - name: Install dependencies (frozen lockfile) + run: npm ci --force + + - name: Execute test suite + run: npm run test:frontend diff --git a/.github/workflows/integration-test.disabled b/.github/workflows/integration-test.disabled deleted file mode 100644 index b248df4b5d..0000000000 --- a/.github/workflows/integration-test.disabled +++ /dev/null @@ -1,255 +0,0 @@ -name: Integration Test - -on: - push: - branches: - - main - - dev - pull_request: - branches: - - main - - dev - -jobs: - cypress-run: - name: Run Cypress Integration Tests - runs-on: ubuntu-latest - steps: - - name: Maximize build space - uses: AdityaGarg8/remove-unwanted-software@v4.1 - with: - remove-android: 'true' - remove-haskell: 'true' - remove-codeql: 'true' - - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Build and run Compose Stack - run: | - docker compose \ - --file docker-compose.yaml \ - --file docker-compose.api.yaml \ - --file docker-compose.a1111-test.yaml \ - up --detach --build - - - name: Delete Docker build cache - run: | - docker builder prune --all --force - - - name: Wait for Ollama to be up - timeout-minutes: 5 - run: | - until curl --output /dev/null --silent --fail http://localhost:11434; do - printf '.' - sleep 1 - done - echo "Service is up!" - - - name: Preload Ollama model - run: | - docker exec ollama ollama pull qwen:0.5b-chat-v1.5-q2_K - - - name: Cypress run - uses: cypress-io/github-action@v6 - env: - LIBGL_ALWAYS_SOFTWARE: 1 - with: - browser: chrome - wait-on: 'http://localhost:3000' - config: baseUrl=http://localhost:3000 - - - uses: actions/upload-artifact@v4 - if: always() - name: Upload Cypress videos - with: - name: cypress-videos - path: cypress/videos - if-no-files-found: ignore - - - name: Extract Compose logs - if: always() - run: | - docker compose logs > compose-logs.txt - - - uses: actions/upload-artifact@v4 - if: always() - name: Upload Compose logs - with: - name: compose-logs - path: compose-logs.txt - if-no-files-found: ignore - - # pytest: - # name: Run Backend Tests - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - - # - name: Set up Python - # uses: actions/setup-python@v5 - # with: - # python-version: ${{ matrix.python-version }} - - # - name: Install dependencies - # run: | - # python -m pip install --upgrade pip - # pip install -r backend/requirements.txt - - # - name: pytest run - # run: | - # ls -al - # cd backend - # PYTHONPATH=. pytest . -o log_cli=true -o log_cli_level=INFO - - migration_test: - name: Run Migration Tests - runs-on: ubuntu-latest - services: - postgres: - image: postgres - env: - POSTGRES_PASSWORD: postgres - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - - 5432:5432 - # mysql: - # image: mysql - # env: - # MYSQL_ROOT_PASSWORD: mysql - # MYSQL_DATABASE: mysql - # options: >- - # --health-cmd "mysqladmin ping -h localhost" - # --health-interval 10s - # --health-timeout 5s - # --health-retries 5 - # ports: - # - 3306:3306 - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - - name: Set up uv - uses: yezz123/setup-uv@v4 - with: - uv-venv: venv - - - name: Activate virtualenv - run: | - . venv/bin/activate - echo PATH=$PATH >> $GITHUB_ENV - - - name: Install dependencies - run: | - uv pip install -r backend/requirements.txt - - - name: Test backend with SQLite - id: sqlite - env: - WEBUI_SECRET_KEY: secret-key - GLOBAL_LOG_LEVEL: debug - run: | - cd backend - uvicorn open_webui.main:app --port "8080" --forwarded-allow-ips '*' & - UVICORN_PID=$! - # Wait up to 40 seconds for the server to start - for i in {1..40}; do - curl -s http://localhost:8080/api/config > /dev/null && break - sleep 1 - if [ $i -eq 40 ]; then - echo "Server failed to start" - kill -9 $UVICORN_PID - exit 1 - fi - done - # Check that the server is still running after 5 seconds - sleep 5 - if ! kill -0 $UVICORN_PID; then - echo "Server has stopped" - exit 1 - fi - - - name: Test backend with Postgres - if: success() || steps.sqlite.conclusion == 'failure' - env: - WEBUI_SECRET_KEY: secret-key - GLOBAL_LOG_LEVEL: debug - DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres - DATABASE_POOL_SIZE: 10 - DATABASE_POOL_MAX_OVERFLOW: 10 - DATABASE_POOL_TIMEOUT: 30 - run: | - cd backend - uvicorn open_webui.main:app --port "8081" --forwarded-allow-ips '*' & - UVICORN_PID=$! - # Wait up to 20 seconds for the server to start - for i in {1..20}; do - curl -s http://localhost:8081/api/config > /dev/null && break - sleep 1 - if [ $i -eq 20 ]; then - echo "Server failed to start" - kill -9 $UVICORN_PID - exit 1 - fi - done - # Check that the server is still running after 5 seconds - sleep 5 - if ! kill -0 $UVICORN_PID; then - echo "Server has stopped" - exit 1 - fi - - # Check that service will reconnect to postgres when connection will be closed - status_code=$(curl --write-out %{http_code} -s --output /dev/null http://localhost:8081/health/db) - if [[ "$status_code" -ne 200 ]] ; then - echo "Server has failed before postgres reconnect check" - exit 1 - fi - - echo "Terminating all connections to postgres..." - python -c "import os, psycopg2 as pg2; \ - conn = pg2.connect(dsn=os.environ['DATABASE_URL'].replace('+pool', '')); \ - cur = conn.cursor(); \ - cur.execute('SELECT pg_terminate_backend(psa.pid) FROM pg_stat_activity psa WHERE datname = current_database() AND pid <> pg_backend_pid();')" - - status_code=$(curl --write-out %{http_code} -s --output /dev/null http://localhost:8081/health/db) - if [[ "$status_code" -ne 200 ]] ; then - echo "Server has not reconnected to postgres after connection was closed: returned status $status_code" - exit 1 - fi - -# - name: Test backend with MySQL -# if: success() || steps.sqlite.conclusion == 'failure' || steps.postgres.conclusion == 'failure' -# env: -# WEBUI_SECRET_KEY: secret-key -# GLOBAL_LOG_LEVEL: debug -# DATABASE_URL: mysql://root:mysql@localhost:3306/mysql -# run: | -# cd backend -# uvicorn open_webui.main:app --port "8083" --forwarded-allow-ips '*' & -# UVICORN_PID=$! -# # Wait up to 20 seconds for the server to start -# for i in {1..20}; do -# curl -s http://localhost:8083/api/config > /dev/null && break -# sleep 1 -# if [ $i -eq 20 ]; then -# echo "Server failed to start" -# kill -9 $UVICORN_PID -# exit 1 -# fi -# done -# # Check that the server is still running after 5 seconds -# sleep 5 -# if ! kill -0 $UVICORN_PID; then -# echo "Server has stopped" -# exit 1 -# fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..8654c2f7db --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,69 @@ +# ───────────────────────────────────────────────────────────────────────────── +# Release — Create GitHub release from CHANGELOG, trigger Docker builds +# Runs on pushes to main when package.json version changes +# ───────────────────────────────────────────────────────────────────────────── +name: Release + +on: + push: + branches: [main] + +concurrency: + group: release-${{ github.ref }} + cancel-in-progress: false + +jobs: + # ── Create release and trigger downstream workflows ────────────────────── + publish: + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: write + steps: + - uses: actions/checkout@v5 + + - name: Abort if package.json unchanged + run: | + git diff --cached --diff-filter=d package.json || { + echo "package.json not modified — skipping release" + exit 1 + } + + - name: Read version + id: pkg + run: echo "version=$(jq -r '.version' package.json)" >> $GITHUB_OUTPUT + + - name: Extract release notes from CHANGELOG + run: | + VER="${{ steps.pkg.outputs.version }}" + awk "/^## \[${VER}\]/{found=1; next} /^## \[/{if(found) exit} found{print}" \ + CHANGELOG.md > /tmp/release-notes.md + + - name: Publish GitHub release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create "v${{ steps.pkg.outputs.version }}" \ + --title "v${{ steps.pkg.outputs.version }}" \ + --notes-file /tmp/release-notes.md + + - name: Archive source + uses: actions/upload-artifact@v4 + with: + name: release-archive + path: | + . + !.git + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Dispatch Docker build + uses: actions/github-script@v8 + with: + script: | + github.rest.actions.createWorkflowDispatch({ + owner: context.repo.owner, + repo: context.repo.repo, + workflow_id: 'docker.yaml', + ref: 'v${{ steps.pkg.outputs.version }}', + }) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b7755d7f3..95d97dcea0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,146 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.9.5] - 2026-05-09 + +### Added + +- 🛡️ **Redirect-based SSRF protection.** All outbound HTTP requests now block 3xx redirects by default via a new `AIOHTTP_CLIENT_ALLOW_REDIRECTS` environment variable, preventing redirect-based SSRF where a public URL silently redirects to internal addresses (RFC 1918, loopback, cloud-metadata endpoints). Affected call sites include web fetch, image loading, OAuth discovery, tool server execution, and code interpreter login. [#24491](https://github.com/open-webui/open-webui/pull/24491) +- 🛡️ **Iframe content security policy.** Administrators can now configure a Content-Security-Policy for all srcdoc iframes (Artifacts, tool embeds, file previews, citation modals) via the `IFRAME_CSP` environment variable, restricting what LLM-generated or user-uploaded HTML can load and execute inside previews. [Commit](https://github.com/open-webui/open-webui/commit/3bba1c227059a44c7eeefa97b8c69a63bf4f3454) +- 🎛️ **Granular markdown rendering controls.** Users can now independently disable Markdown rendering for user messages and assistant responses from Interface settings, preventing unintended formatting when pasting text that contains Markdown-sensitive characters. [Commit](https://github.com/open-webui/open-webui/commit/4a1064cefd6f48a8b3b02cd31f77838c8802b635) +- 🔧 **Terminal proxy response headers.** Administrators can now inject custom response headers into terminal proxy responses via the `TERMINAL_PROXY_HEADERS` environment variable (JSON object), enabling deployment-specific security headers like sandbox policies for proxied content. [Commit](https://github.com/open-webui/open-webui/commit/8d3133fe2835122bffaa4f2ce584730bc9c78981) +- 🔌 **Channel streaming and tool support.** Mentioning a model in a Channel now streams responses in real time and supports the full chat completion pipeline, including native and default function calling, built-in tools (web search, image generation), user tools, MCP tools, filters, and RAG knowledge injection — the same capabilities available in standard chats. + +### Fixed + +- 📝 **Notes create and open reliability.** Creating new notes and opening existing notes no longer fails with a TypeError caused by `is_pinned` being passed to the SQLAlchemy model on create, and passed twice to `NoteResponse` on read. [#24484](https://github.com/open-webui/open-webui/issues/24484), [#24486](https://github.com/open-webui/open-webui/pull/24486) +- 🔐 **Skill public sharing permission enforcement.** Creating or updating skills now filters access grants through the `sharing.public_skills` permission, preventing non-admin users from making skills publicly accessible without the required permission. [#24494](https://github.com/open-webui/open-webui/pull/24494) +- 🔐 **Calendar public sharing permission enforcement.** Creating or updating calendars now filters access grants through a new `sharing.public_calendars` permission, preventing users from making calendars publicly readable or writable without explicit admin-granted sharing permission. [#24493](https://github.com/open-webui/open-webui/pull/24493) +- 🔐 **Feedback user attribution spoofing.** Submitting evaluation feedback can no longer forge the `user_id` field through mass-assignment, preventing authenticated users from attributing ratings to other users and corrupting Elo leaderboard rankings and admin feedback exports. [#24508](https://github.com/open-webui/open-webui/pull/24508) +- 🛡️ **Image URL redirect-based SSRF.** Chat messages containing image URLs no longer follow 3xx redirects to internal addresses during base64 conversion, closing the most reachable redirect-based SSRF variant that required no special permissions or feature flags. [#24524](https://github.com/open-webui/open-webui/pull/24524) +- 🛡️ **Collection write access on file processing.** The `process_file` and `process_files_batch` retrieval endpoints now enforce collection write-access checks before embedding content, preventing authenticated users from injecting file content into another user's knowledge-base collection. [#24524](https://github.com/open-webui/open-webui/pull/24524) +- 🔐 **Tool source code update authorization.** Updating a tool's Python source code now requires `workspace.tools` or `workspace.tools_import` permission, preventing users with only a write-access grant from overwriting executable tool code while still allowing metadata edits. [#24513](https://github.com/open-webui/open-webui/pull/24513) +- 🔐 **Channel message ownership enforcement.** Updating or deleting messages in group and DM channels now requires message ownership, preventing channel members from tampering with or silently removing other members' messages. [#24506](https://github.com/open-webui/open-webui/pull/24506) +- 🔐 **Channel pin write permission.** Pinning and unpinning messages on standard channels now requires write permission instead of read permission, preventing read-only users from modifying pinned content. [#24521](https://github.com/open-webui/open-webui/pull/24521) +- 🛡️ **Image generation URL validation.** Generated image URLs are now validated through `validate_url()` before fetching, aligning the defense-in-depth posture with sibling image-loading paths. [#24518](https://github.com/open-webui/open-webui/pull/24518) +- 🔐 **Model params exposure for read-only users.** The per-model API endpoint now strips the `params` dict (including system prompts) from responses to callers without write access, preventing read-only users from viewing admin-curated model configuration. [#24525](https://github.com/open-webui/open-webui/pull/24525) +- 🛡️ **URL parser SSRF bypass.** URL validation now rejects backslash, tab, CR, and LF characters that cause urllib and requests/aiohttp to disagree on the target host, closing a parser-confusion SSRF bypass. [#24534](https://github.com/open-webui/open-webui/pull/24534) +- 🛡️ **Profile image MIME-type allowlist.** Serving profile images from data URIs now enforces a strict MIME-type allowlist (PNG, JPEG, GIF, WEBP by default, configurable via `PROFILE_IMAGE_ALLOWED_MIME_TYPES`) and sets `X-Content-Type-Options: nosniff`, preventing stored-XSS through SVG or other executable content types. [Commit](https://github.com/open-webui/open-webui/commit/15e696691cad98692c329de62ed8a5bdb3a26d4e) +- 🔐 **File ownership in folder and knowledge attachments.** Attaching files to folders or knowledge bases now verifies per-file read access, and folder file lists in chat middleware are filtered to entries the caller can read, preventing unauthorized file content from being injected into RAG context. [Commit](https://github.com/open-webui/open-webui/commit/2dbf7b6764a7922458d3b0139687ad6dcd7596d9) +- 🔐 **Shared chat access for owners and admins.** Chat owners can now view and clone their own shared chats without requiring an explicit access grant, and administrators can manage shared chat access controls on any chat. [Commit](https://github.com/open-webui/open-webui/commit/3a21b334cce30226750c5c537345dc51bb8bef17), [Commit](https://github.com/open-webui/open-webui/commit/315566064aedeff071854b023d09e5f1ea0eb950) +- 🧵 **Legacy chat history self-healing.** Loading legacy conversations now automatically detects broken parent-link graphs in migrated message records, merges missing messages from the embedded JSON history, and backfills them to the normalized table so future loads use the fast path without data loss. [Commit](https://github.com/open-webui/open-webui/commit/1388f4568b8f508c26542673dd01f1fa049e798a) +- 🎛️ **Filter selector reactivity.** Model filter checkboxes now derive state reactively from the current filter list and selected IDs instead of capturing a one-time snapshot at mount, so checkboxes update correctly when model contexts or filter configurations change at runtime. [Commit](https://github.com/open-webui/open-webui/commit/d1ef5382377f590f97a6dbaee88f369e6d7c5f6f) +- 🌐 **Portuguese (Brazil) translation updates.** Translations for newly added UI items were added along with a consistency pass across existing entries. [#24503](https://github.com/open-webui/open-webui/pull/24503) + +### Changed + +- 🧹 **Removed unauthenticated retrieval status endpoint.** The unauthenticated `GET /api/v1/retrieval/` status endpoint has been removed as dead code — retrieval configuration is already available through authenticated admin endpoints. [#24497](https://github.com/open-webui/open-webui/pull/24497) +- 📋 **PR template issue requirement.** Pull requests now require a linked Issue or Discussion reference, ensuring better traceability for all contributions. PRs without a linked issue or discussion may be closed without review. + +## [0.9.4] - 2026-05-09 + +### Fixed + +- 📜 **Chat scroll position on load.** Opening a chat conversation now reliably scrolls to the bottom of the message history, fixing a regression caused by `content-visibility: auto` where estimated element sizes prevented the initial scroll from reaching the true bottom. + +## [0.9.3] - 2026-05-09 + +### Added + +- 🔇 **Voice Mode mute control.** Voice Mode now includes a dedicated mute toggle with an "M" shortcut and auto-unmute after assistant playback, so you can prevent accidental interruptions from background noise without leaving the call overlay. [Commit](https://github.com/open-webui/open-webui/commit/072d2000f35a9f7b96342fa9bb28f925a92e7b4c), [#23832](https://github.com/open-webui/open-webui/issues/23832) +- 🚀 **Faster prompt list loading.** Prompt and prompt-tag pages now load much faster for non-admin users, even with large prompt libraries, because accessible prompts are filtered efficiently in a single database query. [#24288](https://github.com/open-webui/open-webui/pull/24288), [#24258](https://github.com/open-webui/open-webui/discussions/24258) +- ⚡ **Faster chat history loading.** Chat history maps now load from normalized message records when available, reducing overhead for large conversations while preserving fallback behavior for legacy chats. [Commit](https://github.com/open-webui/open-webui/commit/485d689cfd1ef8b9e7f77cd7b535b8b8747dff1f), [#23159](https://github.com/open-webui/open-webui/pull/23159) +- 🗑️ **Delete from conversation menu.** You can now delete the current conversation directly from the chat menu with a confirmation step, so cleanup is faster without searching through the full chat list. [Commit](https://github.com/open-webui/open-webui/commit/ef6d4f2d6c4b79c7e12e864a4fcb6a57ee84e5d4), [#24329](https://github.com/open-webui/open-webui/issues/24329) +- ⬆️ **Scroll to Top shortcut.** Long conversations now include a Scroll to Top action in the chat menu when you are away from the top, making it much faster to jump back to the beginning of a chat. [Commit](https://github.com/open-webui/open-webui/commit/cdfcbc4af6e9aec835b88dc1806a2a46711e6947), [#24133](https://github.com/open-webui/open-webui/issues/24133) +- 📅 **Calendar creation flow.** Users can now create calendars from a dedicated modal and a quick-add action in the calendar sidebar, making calendar setup faster from the calendar workspace. [Commit](https://github.com/open-webui/open-webui/commit/34146ab60f5dc1a2f8bdda8e61ce02797233a25d), [Commit](https://github.com/open-webui/open-webui/commit/1baf73bdd56f4e5ded12a4bd3c168f4d2a70b840) +- 🧭 **Unified model unload controls.** Administrators can now unload running models from the model selector across supported providers, with loaded-state indicators shown for Ollama and llama.cpp models. [Commit](https://github.com/open-webui/open-webui/commit/4fe2de78643c2213652190d2820f4e8d9f4f89cc) +- ⚡ **Health check responsiveness.** Health and readiness probes now avoid blocking database calls and skip sync session commit handling on probe paths, improving responsiveness and reducing false unready transitions during database pressure. [#24380](https://github.com/open-webui/open-webui/pull/24380), [#24384](https://github.com/open-webui/open-webui/pull/24384) +- 🎛️ **Playground controls panel.** The Playground now includes a dedicated Controls toggle so you can adjust parameters like temperature and related settings per chat run without changing model-level defaults. [Commit](https://github.com/open-webui/open-webui/commit/c6763521c00f042a28829e33fb6f1b7355054046), [#24103](https://github.com/open-webui/open-webui/issues/24103) +- 🎙️ **STT file extension controls.** Administrators can now configure which audio file extensions are accepted for speech-to-text uploads, helping enforce safer and more predictable upload policies. [Commit](https://github.com/open-webui/open-webui/commit/4754ece4a2de5bba85a1d53af2dc8d24fdfb58be) +- 📷 **Remembered call camera selection.** Voice call overlay now remembers your last selected camera and restores it automatically when available, so you do not need to reselect it every time you start voice mode. [Commit](https://github.com/open-webui/open-webui/commit/5c3edc2539ac4d92c4cc2d37079549995203238a), [#24416](https://github.com/open-webui/open-webui/issues/24416) +- 👥 **User group prompt variable.** System and template prompts now support the "{{USER_GROUPS}}" variable, which expands to the user’s group memberships so prompts can adapt to role- or access-based context automatically. [Commit](https://github.com/open-webui/open-webui/commit/c1202a23277abb8e7080271a929dcc9d29b67e66), [#24462](https://github.com/open-webui/open-webui/issues/24462) +- 🔐 **Public chat sharing permission control.** Administrators can now control whether users are allowed to create publicly shareable chats through a dedicated permission setting. [Commit](https://github.com/open-webui/open-webui/commit/ef6d4f2d6c4b79c7e12e864a4fcb6a57ee84e5d4) +- 🔐 **Profile image forwarding control.** Administrators can now disable external profile image URL forwarding with the "ENABLE_PROFILE_IMAGE_URL_FORWARDING" setting to prevent browser metadata leaks to third-party servers. [#24420](https://github.com/open-webui/open-webui/pull/24420) +- 🏷️ **Dynamic header template variables.** Administrators can now use chat, message, and user template variables in custom connection and tool server headers so each request can carry per-conversation context automatically. [Commit](https://github.com/open-webui/open-webui/commit/9907c0a25ae830d134af70022238715f834d20c6), [#24164](https://github.com/open-webui/open-webui/pull/24164) +- 🛂 **MCP OAuth server URL setting.** Static OAuth tool server setups can now define a separate OAuth server URL, making discovery and client registration work when authentication endpoints are hosted separately from the tool server URL. [Commit](https://github.com/open-webui/open-webui/commit/9907c0a25ae830d134af70022238715f834d20c6), [#24164](https://github.com/open-webui/open-webui/pull/24164), [#24216](https://github.com/open-webui/open-webui/issues/24216) +- ⚡ **Faster memory query performance.** Per-user memory lookups and deletions now run much faster at scale because the memory user filter is indexed for existing and new installations. [Commit](https://github.com/open-webui/open-webui/commit/38a382ef888685650135d61dcc8ec0e29eb65573), [#23836](https://github.com/open-webui/open-webui/pull/23836) +- 🚀 **Smarter function dependency installs.** Function dependencies are now skipped when they were already preinstalled and unchanged, reducing first-load delays and repeated package installation churn after startup. [Commit](https://github.com/open-webui/open-webui/commit/ae43562b869b24699408e5ab107261a0a8bdb4bc), [#24166](https://github.com/open-webui/open-webui/pull/24166) +- 🔎 **Brave LLM Context web search.** Administrators can now choose Brave LLM Context as a web search provider to retrieve richer grounded passages with a configurable context token budget. [Commit](https://github.com/open-webui/open-webui/commit/6700f7bb72d14a3f8dbb72dfa064cae3b3dc29ac), [#24120](https://github.com/open-webui/open-webui/issues/24120) +- 🗂️ **Open Terminal date sorting.** Open Terminal now includes sort controls for name and date, with directory-first ordering and modified-time visibility to make file browsing faster. [Commit](https://github.com/open-webui/open-webui/commit/6bdc2ffa79d72daf78981209c9c5292c697cbfe5), [#24425](https://github.com/open-webui/open-webui/issues/24425) +- 🎤 **Voice mode prompt toggle.** Administrators can now explicitly enable or disable the Voice Mode custom prompt behavior from Interface settings, giving finer control over how voice replies are guided. [Commit](https://github.com/open-webui/open-webui/commit/17893038869e3a763a8b34457f723b9666804e27) +- 🧮 **LaTeX copy shortcut.** You can now click rendered LaTeX expressions to copy the raw formula to your clipboard, making it easier to reuse equations outside chat. [Commit](https://github.com/open-webui/open-webui/commit/064fdecb675c176a04b024c16ce179f4dda45236), [#24244](https://github.com/open-webui/open-webui/pull/24244) +- ✨ **Smoother rich text editing.** The message composer now defers formatting toolbar refresh work to the next animation frame, reducing typing jank while formatting controls stay accurate. [Commit](https://github.com/open-webui/open-webui/commit/794b97025d4c56f91d49c9d1ec4775d2ea07b53a), [#24013](https://github.com/open-webui/open-webui/pull/24013) +- 🖼️ **Arena model profile images.** Arena models can now reliably display configured profile images instead of falling back to the default icon. [Commit](https://github.com/open-webui/open-webui/commit/1dee67b64d0b34e70bac949682b216c0aaec8152), [#24412](https://github.com/open-webui/open-webui/issues/24412) +- 🔄 **Replaceable tool embed updates.** Pipes and Tools can now overwrite previously emitted rich-UI embeds in-place by passing a `replace` flag on the `embeds` event, enabling live dashboards and progress panels that update without stacking duplicate entries. +- ✏️ **Assistant response editing and continuation.** You can now edit and restructure assistant output items — including reasoning blocks, tool calls, and text content — from a dedicated editor view, and continue generating from the edited state so the model receives full prior context. +- 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security. +- 🌐 **Translation updates.** Translations for Chinese, Catalan, Filipino, and Korean were enhanced and expanded. + +### Fixed + +- 🧵 **Background code execution reliability.** Code execution no longer hangs indefinitely when you switch conversations or browser tabs during a run, and disconnected or inactive sessions now fail with a clear timeout error instead of endless processing. [Commit](https://github.com/open-webui/open-webui/commit/552bbcecfae5ae273ab98e2ce3e540d0771aa964), [#24089](https://github.com/open-webui/open-webui/issues/24089) +- 🎙️ **Voice recording MIME fallback support.** Voice recording now tries a broader set of browser-supported audio formats and resets halted audio playback cleanly, improving microphone capture reliability in browsers where recording previously failed to start. [Commit](https://github.com/open-webui/open-webui/commit/8ffc3d746f20007e9eb4e3ae4f152f383bc371e1), [#24162](https://github.com/open-webui/open-webui/issues/24162) +- 🧠 **Direct-connection task generation reliability.** Title, tags, follow-up, emoji, query, and related task-generation endpoints now work correctly when chats use direct-connection models instead of failing with model-not-found errors. [Commit](https://github.com/open-webui/open-webui/commit/1b4cd705d0b9a51a5e3a7851ec012fb3141eb0a9), [Commit](https://github.com/open-webui/open-webui/commit/005df577fec16733a64edbec8a1b46f42f4e9a43), [#24092](https://github.com/open-webui/open-webui/issues/24092) +- 🔧 **Parameterized URL tool readiness.** New chats now wait for model defaults to finish applying before auto-submit, preventing early requests that can miss configured external tools. [Commit](https://github.com/open-webui/open-webui/commit/212bb68a66435dc1803a6d67cb4ea584d3455fb7), [#24176](https://github.com/open-webui/open-webui/issues/24176) +- 🚦 **MCP cleanup response reliability.** Successful native MCP tool calls no longer get replaced by a 500 "No response returned" error during cleanup, so valid chat responses are now returned consistently. [#24105](https://github.com/open-webui/open-webui/pull/24105) +- 🧵 **Active task state recovery.** Chat input no longer stays blocked by unrelated background tasks after a response is already complete, and interrupted assistant replies are now marked done more reliably. [Commit](https://github.com/open-webui/open-webui/commit/04bd0425ead28185bcd124e77892e31209a6e15b), [#23264](https://github.com/open-webui/open-webui/pull/23264) +- 📌 **Per-user note pinning behavior.** Pinned notes are now tracked per user instead of with a shared note-level flag, so one person’s pin changes no longer affect everyone else. [Commit](https://github.com/open-webui/open-webui/commit/33e588cf09b294f0abe08b9566efa8545a7dbf92) +- 🧱 **Custom header value coercion.** Custom header values are now converted to text before requests are sent, preventing request failures when non-text values are configured. [Commit](https://github.com/open-webui/open-webui/commit/9907c0a25ae830d134af70022238715f834d20c6), [#24164](https://github.com/open-webui/open-webui/pull/24164) +- 🔗 **HTTP share link copy fallback.** Copy Link now works reliably on HTTP deployments by using a selection-based fallback when secure clipboard APIs are unavailable. [Commit](https://github.com/open-webui/open-webui/commit/f70b0da1563ffa0a8daecbe71cbc30fd8cf834c4), [#24135](https://github.com/open-webui/open-webui/issues/24135) +- 🧵 **Regeneration loading lock recovery.** Chats no longer get stuck in a permanent loading state after failed regenerations because invalid message-tree references are repaired before rendering. [Commit](https://github.com/open-webui/open-webui/commit/ee3b82926b37843f2771c6a8d432781a557ea96a), [#24424](https://github.com/open-webui/open-webui/issues/24424) +- 📸 **Complete chat image capture.** Downloaded chat snapshots now include all messages more reliably through visibility overrides and layout timing improvements during capture. [Commit](https://github.com/open-webui/open-webui/commit/34146ab60f5dc1a2f8bdda8e61ce02797233a25d), [Commit](https://github.com/open-webui/open-webui/commit/1baf73bdd56f4e5ded12a4bd3c168f4d2a70b840), [#24088](https://github.com/open-webui/open-webui/issues/24088) +- 🗓️ **Calendar deletion lock handling.** Calendar deletion now avoids SQLite write-lock contention by revoking calendar access grants in a separate transaction after calendar and event removal. [Commit](https://github.com/open-webui/open-webui/commit/1d892ce2c513c4d933c902de5e5d76c317a06dd2) +- 🧩 **Filter and internal tool coexistence.** Internal tools now remain available when filters add provider-native tools, so filter-added tools no longer replace the built-in tool set during request processing. [Commit](https://github.com/open-webui/open-webui/commit/02f9fe78907c2ecf6f1d93646cbfa2173409bbe8), [#24237](https://github.com/open-webui/open-webui/issues/24237) +- 🛠️ **OpenAPI tool spec compatibility.** OpenAPI tool integrations now handle null or non-operation path entries more safely and parse path-level parameters consistently, preventing crashes and improving tool execution reliability across imperfect OpenAPI specs. [Commit](https://github.com/open-webui/open-webui/commit/2ba6b423aa0c9c800bd96cb638c6ade867cac0f6), [Commit](https://github.com/open-webui/open-webui/commit/5b80932e5951786bb348b91589e8d87753f18905), [#24376](https://github.com/open-webui/open-webui/pull/24376) +- 🧰 **OpenAPI tool schema parsing.** OpenAPI tool imports now ignore non-method path item fields and correctly resolve nested composition schemas, preventing invalid tool parsing for compatible specs. [Commit](https://github.com/open-webui/open-webui/commit/85c7373f68ac3e39a9cd37e63b6926b13fb8b8cc), [#23254](https://github.com/open-webui/open-webui/pull/23254) +- 🌍 **Web search proxy compatibility.** DuckDuckGo search now respects configured proxy environments more reliably, and trust-env behavior defaults to enabled so proxied web loading does not fail unexpectedly. [Commit](https://github.com/open-webui/open-webui/commit/bb0e6cb1085aa3c3da66a5f5ea1cecff7e9b5297), [#23810](https://github.com/open-webui/open-webui/pull/23810) +- 🧾 **Final markdown render flush.** Streaming markdown now forces an immediate final parse when generation completes, preventing stale or partially rendered final output. [Commit](https://github.com/open-webui/open-webui/commit/29f6c72e879d67f23021938e24a21914cc9fb120), [#24088](https://github.com/open-webui/open-webui/issues/24088) +- 🛡️ **Webhook avatar URL validation.** Channel webhook profile image URLs are now validated before saving, preventing invalid or unsafe avatar URLs from being accepted. [#24370](https://github.com/open-webui/open-webui/pull/24370) +- 📝 **System prompt editor scroll stability.** Editing large system prompts no longer jumps the page back to the top, so you can continue editing long model prompts without losing your place. [Commit](https://github.com/open-webui/open-webui/commit/c978a788c8315e37357c93c1b605a2831fc77485), [#23999](https://github.com/open-webui/open-webui/issues/23999) +- 🔎 **Knowledge content search matching.** Knowledge file search now matches both file titles and file content, so relevant files are easier to find even when the keyword is not in the filename. [Commit](https://github.com/open-webui/open-webui/commit/11e076817ae5db34621ce03136353248f7377d97), [#24297](https://github.com/open-webui/open-webui/pull/24297) +- ⚡ **Faster prompt tag loading.** Prompt tag filters now load much faster for non-admin users by fetching only accessible tags directly, avoiding per-prompt permission checks and unnecessary prompt data loading. [#24287](https://github.com/open-webui/open-webui/pull/24287), [#24258](https://github.com/open-webui/open-webui/discussions/24258) +- 🧾 **Citation overflow badge readability.** Citation overflow badges now keep multi-digit counts readable in a single compact bubble, preventing wrapped or cramped display when many sources are attached. [Commit](https://github.com/open-webui/open-webui/commit/23ff9943a9fc8c314100fa074157853fbece1a55), [#24391](https://github.com/open-webui/open-webui/pull/24391) +- 🌐 **Yandex result parsing guard.** Yandex web search no longer fails when some XML fields are missing in individual results, so valid search responses continue to return usable sources instead of dropping to no results. [Commit](https://github.com/open-webui/open-webui/commit/9386fc83a3eff3e55cc157ac8c15c337e3d822c1), [#24243](https://github.com/open-webui/open-webui/issues/24243) +- 🎧 **Safer voice transcription uploads.** Empty or failed voice conversions are now rejected with a clear error instead of continuing as malformed audio, reducing failed transcription attempts from corrupted or near-empty recordings. [Commit](https://github.com/open-webui/open-webui/commit/072d2000f35a9f7b96342fa9bb28f925a92e7b4c) +- 🎚️ **Safer chunked STT processing.** Chunked transcription now limits worker concurrency when no external STT engine is configured, reducing failed transcription behavior caused by overly parallel local processing. [Commit](https://github.com/open-webui/open-webui/commit/55e7c7854bba5182803239c903a0ac2d14426a4c) +- 📈 **Imported chat analytics coverage.** Imported ChatGPT conversations now carry proper model and timestamp metadata and reliably write imported messages into analytics-backed storage, so imported chats are reflected correctly in Admin Analytics totals and model usage views. [Commit](https://github.com/open-webui/open-webui/commit/4d766a3edfa116abcefe7168f1d1284683b860b2), [#24263](https://github.com/open-webui/open-webui/issues/24263) +- 📎 **Knowledge collection persistence.** Knowledge collections selected with the chat input selector now remain attached after reloads and chat switches, so attached context no longer disappears between sessions. [Commit](https://github.com/open-webui/open-webui/commit/7c398a625a8d51f79d80217f6d329fc30c72b782), [#24142](https://github.com/open-webui/open-webui/issues/24142) +- 🧹 **Embedding model name trimming.** Embedding model names entered in Documents settings now automatically trim surrounding whitespace, preventing silent embedding failures caused by accidental trailing spaces. [Commit](https://github.com/open-webui/open-webui/commit/6082e1adaebc8aa3e7f55265c8dc2dbe130c0446), [#24090](https://github.com/open-webui/open-webui/issues/24090) +- 🔊 **PCM TTS playback compatibility.** Text-to-speech audio returned as PCM is now converted to MP3 before delivery, so speech playback works correctly with providers that return raw PCM audio. [Commit](https://github.com/open-webui/open-webui/commit/ff791b4814fc1453df2235ea78016d7015aa6806), [#24143](https://github.com/open-webui/open-webui/issues/24143) +- 🪟 **Windows PostgreSQL startup compatibility.** Windows pip installs using PostgreSQL now start reliably with psycopg async by using a compatible event loop policy instead of the default Proactor loop. [Commit](https://github.com/open-webui/open-webui/commit/7eaecbad5a0913ed04ca3bc10c930bb051dd2bd9), [#24152](https://github.com/open-webui/open-webui/issues/24152) +- ⏱️ **MCP OAuth timeout control.** OAuth token exchanges for MCP tool server connections now respect the configurable client timeout setting, reducing callback failures with slower providers. [Commit](https://github.com/open-webui/open-webui/commit/cde72dab71671645e119564ca9747ce25dd590ad), [#24138](https://github.com/open-webui/open-webui/issues/24138) +- 📄 **PDF text search restoration.** PDF previews now include a proper text layer so browser text selection and find-in-page search work again instead of rendering only image-like pages. [Commit](https://github.com/open-webui/open-webui/commit/bc4d6eef33dcb92719b07483cdb1d63ebf250721), [#24149](https://github.com/open-webui/open-webui/issues/24149) +- 🔑 **Android password autofill support.** Password inputs now expose the expected field name metadata, improving password manager autofill reliability on Android login pages. [Commit](https://github.com/open-webui/open-webui/commit/60ea4214aa42f1ad22142f1a43535007a2293d16), [#24137](https://github.com/open-webui/open-webui/issues/24137) +- 🎤 **Non-blocking STT processing.** Speech-to-text transcription no longer blocks the server event loop during both live transcription and uploaded audio file processing, so other users can continue using chats and live connections under concurrent load. [#24338](https://github.com/open-webui/open-webui/pull/24338), [#24379](https://github.com/open-webui/open-webui/pull/24379), [#24169](https://github.com/open-webui/open-webui/issues/24169) +- 🌐 **SearXNG language parameter handling.** Web searches now send clean multi-language values without trailing separators, so SearXNG requests no longer fail when multiple languages are selected. [Commit](https://github.com/open-webui/open-webui/commit/6dff85b9d205cfc4bc2845dac40909b8d859910c), [#24198](https://github.com/open-webui/open-webui/issues/24198) +- 📂 **File modal open-link behavior.** Clicking a file name in the file details modal now opens the correct file content in a new tab for uploaded file items instead of failing to open. [#24125](https://github.com/open-webui/open-webui/pull/24125) +- 📎 **Chat attachment display recovery.** Files attached by chat tools now appear reliably in assistant responses, including non-image file attachments that were previously hidden. [Commit](https://github.com/open-webui/open-webui/commit/7eeff2fdf945024585a01b72071a61971afc844d), [#24332](https://github.com/open-webui/open-webui/pull/24332) +- 🧱 **Channel embed rendering guard.** Channel message embeds now appear only for model-generated messages and are suppressed in reply previews, preventing unintended embed expansion in regular user posts. [Commit](https://github.com/open-webui/open-webui/commit/e1dce9914745de9b4d2c67b1deddde3472ce4dfa) +- 🛡️ **Safer image URL handling.** Untrusted external image URLs are now blocked in profile and rich-text image rendering paths, preventing unintended client-side requests to attacker-controlled domains. [#24420](https://github.com/open-webui/open-webui/pull/24420) +- 🛡️ **Sanitized spreadsheet HTML previews.** Spreadsheet previews now sanitize generated HTML before rendering, reducing the risk of unsafe content being executed when opening office files in chat and file modals. [#24468](https://github.com/open-webui/open-webui/pull/24468) +- 🧰 **Multi-worker tool update consistency.** Updated tool code now refreshes correctly across workers without requiring a full service restart, so chats no longer run stale tool versions after edits. [Commit](https://github.com/open-webui/open-webui/commit/3309f5d9f11f521c0ee97b64c59a83e3cf390bde), [#24400](https://github.com/open-webui/open-webui/issues/24400), [#24433](https://github.com/open-webui/open-webui/pull/24433) +- 🧩 **Default model metadata env parsing.** The "DEFAULT_MODEL_METADATA" environment setting is now parsed and applied correctly, including when persistent config is disabled, so configured model capability defaults are no longer ignored at startup. [Commit](https://github.com/open-webui/open-webui/commit/0103d7e82cccbd5c4b1c8daabcb3e5160fa74a97), [#24319](https://github.com/open-webui/open-webui/issues/24319) +- 🔄 **Config import and Redis consistency.** Imported settings now remain effective after import because configuration values are immediately synchronized to Redis, preventing stale cached values from overriding imported permissions and settings. [Commit](https://github.com/open-webui/open-webui/commit/55a572cd398c9b4e6118728f8f129941437aa225), [Commit](https://github.com/open-webui/open-webui/commit/1c1c8b18e5cc90ca3c6961a4c193a4363febbc83), [#24346](https://github.com/open-webui/open-webui/issues/24346) +- 🔔 **LDAP signup webhook parity.** New accounts created through LDAP now trigger the same signup webhook notifications as password and OAuth signups, so downstream provisioning and audit automations receive consistent events. [Commit](https://github.com/open-webui/open-webui/commit/fd3368c0bff168417e3c49ffd73491c344702339), [#24377](https://github.com/open-webui/open-webui/issues/24377) +- 🦆 **DDGS auto-backend compatibility.** Web search now handles DDGS automatic backend selection correctly and safely falls back on empty or rate-limited responses, preventing search failures in newer DDGS versions. [Commit](https://github.com/open-webui/open-webui/commit/9adc0c442a57eaa88a5f30c2b2cb393623154e20), [#24188](https://github.com/open-webui/open-webui/issues/24188) +- 🤖 **Automation update tool reliability.** Updating existing automations in chat now works correctly instead of failing with a missing method error. [Commit](https://github.com/open-webui/open-webui/commit/f39f4a86aedc2769d8268670a020b1f3c16776dd), [#24405](https://github.com/open-webui/open-webui/issues/24405#issuecomment-4408011166) +- 📅 **Calendar event permission checks.** Calendar event update and delete actions now handle ownership and access checks more reliably, returning clean access-denied results when appropriate. [Commit](https://github.com/open-webui/open-webui/commit/2977910ffd9d2369dfa504aa6ab12745b3dbd19a) +- 🛡️ **Safer cached file delivery.** Cached files that are not recognized as image, audio, or video now download as attachments instead of rendering inline, reducing the risk of unsafe browser content handling. [Commit](https://github.com/open-webui/open-webui/commit/4754ece4a2de5bba85a1d53af2dc8d24fdfb58be) +- 📊 **Streaming token analytics accuracy.** Admin Analytics now records and aggregates token usage correctly for streaming chats across Responses API and OpenAI-compatible providers, including fallback handling for provider usage formats that use prompt and completion token keys. [Commit](https://github.com/open-webui/open-webui/commit/989d5fd4e2ce285edf4475a1e13f0981a78d3821), [Commit](https://github.com/open-webui/open-webui/commit/a32d26e61d24d9f63650faed5cb8909ed90af661), [#24217](https://github.com/open-webui/open-webui/issues/24217), [#24294](https://github.com/open-webui/open-webui/issues/24294), [#24241](https://github.com/open-webui/open-webui/issues/24241) +- 🔗 **Admin shared chat links.** Admin users can now open and clone shared chat links reliably without 401 errors because shared links are now resolved by share ID first, with safe fallback behavior for direct chat ID access. [Commit](https://github.com/open-webui/open-webui/commit/cde21b9f6dc11575a668484f42440824ec5a4fae), [#24311](https://github.com/open-webui/open-webui/issues/24311), [#24096](https://github.com/open-webui/open-webui/issues/24096) +- 💾 **Chat settings persistence.** System prompts and other chat-level settings now persist correctly after creating a new chat and reloading, preventing prompt loss in affected conversations. [Commit](https://github.com/open-webui/open-webui/commit/86df8bf27e1b84abbe2eeedcc8650df59c7d23d6), [#24193](https://github.com/open-webui/open-webui/issues/24193), [#24270](https://github.com/open-webui/open-webui/issues/24270) +- 💾 **Chat control autosave persistence.** Changes to chat controls like system prompt, parameters, and attached files are now autosaved on existing chats, so edits are no longer lost when you refresh or navigate away before sending a message. [Commit](https://github.com/open-webui/open-webui/commit/a938c8ae2e45a00d2f06151fdaeaee94e54a8095), [#23897](https://github.com/open-webui/open-webui/pull/23897) +- ☁️ **OneDrive option visibility.** OneDrive personal and business upload options now appear only when their respective client IDs are configured, preventing unavailable options from showing in attachment menus. [Commit](https://github.com/open-webui/open-webui/commit/b72019db393a658ca0ceecdcc59b70f6cc5dcd40), [#24411](https://github.com/open-webui/open-webui/issues/24411) +- 🧠 **Reasoning content leakage prevention.** Tool-call round-trip messages no longer wrap reasoning text in `` tags inside the content field, preventing raw markup from leaking into chat output for models whose templates don't strip think tags (e.g. Gemma 4). [#23844](https://github.com/open-webui/open-webui/issues/23844) +- 🖥️ **Terminal sidebar auto-open guard.** The terminal sidebar no longer auto-opens on chat load when OpenTerminal is disabled, because stale terminal IDs saved on models or in localStorage are now validated against available terminal servers before use. +- 🔁 **Single-confirmation connection deletion.** Deleting OpenAI, Ollama, tool server, and terminal server connections now shows exactly one confirmation dialog instead of two, because redundant outer confirmation wrappers were removed from all connection components. +- 🧵 **Reliable background task cleanup.** The chat task lifecycle now deregisters completed tasks before checking for remaining siblings, eliminating the off-by-one timing issue that could leave the stop button stuck or dismiss the sidebar activity spinner too early. + +### Changed + +- ⚠️ **Database Migrations**: This release includes database schema changes; we strongly recommend backing up your database and all associated data before upgrading in production environments. If you are running a multi-worker, multi-server, or load-balanced deployment, all instances must be updated simultaneously, rolling updates are not supported and will cause application failures due to schema incompatibility. +- 🚪 **Signout request method.** The signout endpoint now requires POST instead of GET, so custom clients and integrations must update logout calls accordingly. [#24420](https://github.com/open-webui/open-webui/pull/24420) + ## [0.9.2] - 2026-04-24 ### Added diff --git a/Dockerfile b/Dockerfile index 88ffd09752..36e29e7069 100644 --- a/Dockerfile +++ b/Dockerfile @@ -43,7 +43,7 @@ ENV APP_BUILD_HASH=${BUILD_HASH} RUN npm run build ######## WebUI backend ######## -FROM python:3.11.14-slim-bookworm AS base +FROM python:3.11-slim-bookworm AS base # Use args ARG USE_CUDA diff --git a/backend/open_webui/__init__.py b/backend/open_webui/__init__.py index be25227d36..92cadefe7c 100644 --- a/backend/open_webui/__init__.py +++ b/backend/open_webui/__init__.py @@ -1,6 +1,7 @@ import base64 import os import random +import sys from pathlib import Path from typing import Annotated @@ -68,12 +69,18 @@ def serve( import open_webui.main # noqa: F401 from open_webui.env import UVICORN_WORKERS # Import the workers setting + # On Windows, uvicorn's default loop factory hardcodes ProactorEventLoop, + # which is incompatible with psycopg v3 async. Setting loop='none' lets + # asyncio.run() respect the WindowsSelectorEventLoopPolicy set in db.py. + loop = 'none' if sys.platform == 'win32' else 'auto' + uvicorn.run( 'open_webui.main:app', host=host, port=port, forwarded_allow_ips='*', workers=UVICORN_WORKERS, + loop=loop, ) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index ce0485c495..3574af10ba 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1,43 +1,103 @@ -import asyncio +from __future__ import annotations + +import base64 import json import logging import os import shutil import socket -import base64 from concurrent.futures import ThreadPoolExecutor -import redis - from datetime import datetime from pathlib import Path -from typing import Generic, Union, Optional, TypeVar +from typing import Optional, Union from urllib.parse import urlparse +import redis import requests -from pydantic import BaseModel -from sqlalchemy import JSON, Column, DateTime, Integer, func from authlib.integrations.starlette_client import OAuth - +from pydantic import BaseModel from open_webui.env import ( DATA_DIR, DATABASE_URL, ENABLE_DB_MIGRATIONS, ENV, - REDIS_URL, - REDIS_KEY_PREFIX, - REDIS_SENTINEL_HOSTS, - REDIS_SENTINEL_PORT, FRONTEND_BUILD_DIR, OFFLINE_MODE, OPEN_WEBUI_DIR, + REDIS_KEY_PREFIX, + REDIS_SENTINEL_HOSTS, + REDIS_SENTINEL_PORT, + REDIS_URL, WEBUI_AUTH, WEBUI_FAVICON_URL, WEBUI_NAME, log, ) -from open_webui.internal.db import Base, get_db, get_async_db -from open_webui.utils.redis import get_redis_connection +from open_webui.internal.config import ( + STATE as _state, +) +from open_webui.internal.config import ( + AppConfig, + ConfigVar, +) + +# ── Persistent configuration layer ────────────────────────────────────────── +from open_webui.internal.config import ( # noqa: F401 + ConfigTable as Config, +) +from open_webui.internal.config import ( + _all_configs as PERSISTENT_CONFIG_REGISTRY, +) +from open_webui.internal.config import ( + initialize as _initialize_config, +) + + +def get_config(): + return _state.snapshot + + +def save_to_db(data): + _state.persist(data) + + +async def async_save_to_db(data): + await _state.persist_async(data) + + +def save_config(config): + try: + _state.persist(config) + for s in PERSISTENT_CONFIG_REGISTRY: + s.refresh() + except Exception: + log.exception('Failed to save config') + return False + return True + + +async def async_save_config(config): + try: + await _state.persist_async(config) + for s in PERSISTENT_CONFIG_REGISTRY: + s.refresh() + except Exception: + log.exception('Failed to save config') + return False + return True + + +def reset_config(): + _state.clear() + + +async def async_reset_config(): + await _state.clear_async() + + +def get_config_value(config_path: str): + return _state.read(config_path) class EndpointFilter(logging.Filter): @@ -45,24 +105,21 @@ class EndpointFilter(logging.Filter): return record.getMessage().find('/health') == -1 -# Filter out /endpoint logging.getLogger('uvicorn.access').addFilter(EndpointFilter()) #################################### -# Config helpers +# Initialization #################################### -# Function to run the alembic migrations def run_migrations(): log.info('Running migrations') try: from alembic import command - from alembic.config import Config + from alembic.config import Config as AlembicConfig - alembic_cfg = Config(OPEN_WEBUI_DIR / 'alembic.ini') + alembic_cfg = AlembicConfig(OPEN_WEBUI_DIR / 'alembic.ini') - # Set the script location dynamically migrations_path = OPEN_WEBUI_DIR / 'migrations' alembic_cfg.set_main_option('script_location', str(migrations_path)) @@ -75,310 +132,3292 @@ if ENABLE_DB_MIGRATIONS: run_migrations() -class Config(Base): - __tablename__ = 'config' - - id = Column(Integer, primary_key=True) - data = Column(JSON, nullable=False) - version = Column(Integer, nullable=False, default=0) - created_at = Column(DateTime, nullable=False, server_default=func.now()) - updated_at = Column(DateTime, nullable=True, onupdate=func.now()) - - -def load_json_config(): - with open(f'{DATA_DIR}/config.json', 'r') as file: - return json.load(file) - - -def save_to_db(data): - """Sync save — used ONLY at startup/import time.""" - with get_db() as db: - existing_config = db.query(Config).first() - if not existing_config: - new_config = Config(data=data, version=0) - db.add(new_config) - else: - existing_config.data = data - existing_config.updated_at = datetime.now() - db.add(existing_config) - db.commit() - - -async def async_save_to_db(data): - """Async save — used for ALL runtime config persistence.""" - from sqlalchemy import select - - async with get_async_db() as db: - result = await db.execute(select(Config).limit(1)) - existing_config = result.scalars().first() - if not existing_config: - new_config = Config(data=data, version=0) - db.add(new_config) - else: - existing_config.data = data - existing_config.updated_at = datetime.now() - db.add(existing_config) - await db.commit() - - -def reset_config(): - """Sync reset — used ONLY at startup.""" - with get_db() as db: - db.query(Config).delete() - db.commit() - - -async def async_reset_config(): - """Async reset — used at runtime.""" - from sqlalchemy import delete as sa_delete - - async with get_async_db() as db: - await db.execute(sa_delete(Config)) - await db.commit() - - -# When initializing, check if config.json exists and migrate it to the database +# Migrate legacy config.json → database on first run if os.path.exists(f'{DATA_DIR}/config.json'): - data = load_json_config() - save_to_db(data) + with open(f'{DATA_DIR}/config.json', 'r') as _f: + save_to_db(json.load(_f)) os.rename(f'{DATA_DIR}/config.json', f'{DATA_DIR}/old_config.json') -DEFAULT_CONFIG = { - 'version': 0, - 'ui': {}, -} +ENABLE_PERSISTENT_CONFIG = os.getenv('ENABLE_PERSISTENT_CONFIG', 'True').lower() == 'true' +ENABLE_OAUTH_PERSISTENT_CONFIG = os.getenv('ENABLE_OAUTH_PERSISTENT_CONFIG', 'False').lower() == 'true' -def get_config(): - with get_db() as db: - config_entry = db.query(Config).order_by(Config.id.desc()).first() - return config_entry.data if config_entry else DEFAULT_CONFIG - - -CONFIG_DATA = get_config() - - -def get_config_value(config_path: str): - path_parts = config_path.split('.') - cur_config = CONFIG_DATA - for key in path_parts: - if key in cur_config: - cur_config = cur_config[key] - else: - return None - return cur_config - - -PERSISTENT_CONFIG_REGISTRY = [] - - -def save_config(config): - """Sync save — used ONLY at startup/import time.""" - global CONFIG_DATA - global PERSISTENT_CONFIG_REGISTRY - try: - save_to_db(config) - CONFIG_DATA = config - - # Trigger updates on all registered PersistentConfig entries - for config_item in PERSISTENT_CONFIG_REGISTRY: - config_item.update() - except Exception as e: - log.exception(e) - return False - return True - - -async def async_save_config(config): - """Async save — used for ALL runtime config persistence.""" - global CONFIG_DATA - global PERSISTENT_CONFIG_REGISTRY - try: - await async_save_to_db(config) - CONFIG_DATA = config - - # Trigger updates on all registered PersistentConfig entries - for config_item in PERSISTENT_CONFIG_REGISTRY: - config_item.update() - except Exception as e: - log.exception(e) - return False - return True - - -T = TypeVar('T') - -ENABLE_PERSISTENT_CONFIG = os.environ.get('ENABLE_PERSISTENT_CONFIG', 'True').lower() == 'true' - - -class PersistentConfig(Generic[T]): - def __init__(self, env_name: str, config_path: str, env_value: T): - self.env_name = env_name - self.config_path = config_path - self.env_value = env_value - self.config_value = get_config_value(config_path) - - if self.config_value is not None and ENABLE_PERSISTENT_CONFIG: - if self.config_path.startswith('oauth.') and not ENABLE_OAUTH_PERSISTENT_CONFIG: - log.info(f"Skipping loading of '{env_name}' as OAuth persistent config is disabled") - self.value = env_value - else: - log.info(f"'{env_name}' loaded from the latest database entry") - self.value = self.config_value - else: - self.value = env_value - - PERSISTENT_CONFIG_REGISTRY.append(self) - - def __str__(self): - return str(self.value) - - @property - def __dict__(self): - raise TypeError('PersistentConfig object cannot be converted to dict, use config_get or .value instead.') - - def __getattribute__(self, item): - if item == '__dict__': - raise TypeError('PersistentConfig object cannot be converted to dict, use config_get or .value instead.') - return super().__getattribute__(item) - - def update(self): - new_value = get_config_value(self.config_path) - if new_value is not None: - self.value = new_value - log.info(f'Updated {self.env_name} to new value {self.value}') - - def save(self): - """Sync save — used ONLY at startup/import time.""" - log.info(f"Saving '{self.env_name}' to the database") - path_parts = self.config_path.split('.') - sub_config = CONFIG_DATA - for key in path_parts[:-1]: - if key not in sub_config: - sub_config[key] = {} - sub_config = sub_config[key] - sub_config[path_parts[-1]] = self.value - save_to_db(CONFIG_DATA) - self.config_value = self.value - - async def async_save(self): - """Async save — used for ALL runtime config persistence.""" - log.info(f"Saving '{self.env_name}' to the database") - path_parts = self.config_path.split('.') - sub_config = CONFIG_DATA - for key in path_parts[:-1]: - if key not in sub_config: - sub_config[key] = {} - sub_config = sub_config[key] - sub_config[path_parts[-1]] = self.value - await async_save_to_db(CONFIG_DATA) - self.config_value = self.value - - -class AppConfig: - _redis: Union[redis.Redis, redis.cluster.RedisCluster] = None - _redis_key_prefix: str - - _state: dict[str, PersistentConfig] - - def __init__( - self, - redis_url: Optional[str] = None, - redis_sentinels: Optional[list] = [], - redis_cluster: Optional[bool] = False, - redis_key_prefix: str = 'open-webui', - ): - if redis_url: - super().__setattr__('_redis_key_prefix', redis_key_prefix) - super().__setattr__( - '_redis', - get_redis_connection( - redis_url, - redis_sentinels, - redis_cluster, - decode_responses=True, - ), - ) - - super().__setattr__('_state', {}) - - def __setattr__(self, key, value): - if isinstance(value, PersistentConfig): - self._state[key] = value - else: - self._state[key].value = value - - # At runtime (inside the event loop) persist via the async engine - # to avoid blocking the loop and contending with the async DB pool. - # At startup/import time, fall back to sync. - try: - loop = asyncio.get_running_loop() - loop.create_task(self._async_persist(key)) - except RuntimeError: - self._state[key].save() - - if self._redis and ENABLE_PERSISTENT_CONFIG: - redis_key = f'{self._redis_key_prefix}:config:{key}' - self._redis.set(redis_key, json.dumps(self._state[key].value)) - - async def _async_persist(self, key): - """Persist a single config key via the async engine.""" - try: - await self._state[key].async_save() - except Exception as e: - log.error(f'Failed to async-persist config key {key}: {e}') - - def __getattr__(self, key): - if key not in self._state: - raise AttributeError(f"Config key '{key}' not found") - - # If Redis is available and persistent config is enabled, check for an updated value - if self._redis and ENABLE_PERSISTENT_CONFIG: - redis_key = f'{self._redis_key_prefix}:config:{key}' - redis_value = self._redis.get(redis_key) - - if redis_value is not None: - try: - decoded_value = json.loads(redis_value) - - # Update the in-memory value if different - if self._state[key].value != decoded_value: - self._state[key].value = decoded_value - log.info(f'Updated {key} from Redis: {decoded_value}') - - except json.JSONDecodeError: - log.error(f'Invalid JSON format in Redis for {key}: {redis_value}') - - return self._state[key].value - - -#################################### -# WEBUI_AUTH (Required for security) -#################################### - -ENABLE_API_KEYS = PersistentConfig( - 'ENABLE_API_KEYS', - 'auth.enable_api_keys', - os.environ.get('ENABLE_API_KEYS', 'False').lower() == 'true', +# Bootstrap the persistent config subsystem +CONFIG_DATA = _initialize_config( + enable_persistent=ENABLE_PERSISTENT_CONFIG, + enable_oauth_persistent=ENABLE_OAUTH_PERSISTENT_CONFIG, ) -ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS = PersistentConfig( +#################################### +# Static DIR +#################################### + +STATIC_DIR = Path(os.getenv('STATIC_DIR', OPEN_WEBUI_DIR / 'static')).resolve() + +try: + if STATIC_DIR.exists(): + for item in STATIC_DIR.iterdir(): + if item.is_file() or item.is_symlink(): + try: + item.unlink() + except Exception as e: + pass +except Exception as e: + pass + +for file_path in (FRONTEND_BUILD_DIR / 'static').glob('**/*'): + if file_path.is_file(): + target_path = STATIC_DIR / file_path.relative_to((FRONTEND_BUILD_DIR / 'static')) + target_path.parent.mkdir(parents=True, exist_ok=True) + try: + shutil.copyfile(file_path, target_path) + except Exception as e: + logging.error(f'An error occurred: {e}') + +frontend_favicon = FRONTEND_BUILD_DIR / 'static' / 'favicon.png' + +if frontend_favicon.exists(): + try: + shutil.copyfile(frontend_favicon, STATIC_DIR / 'favicon.png') + except Exception as e: + logging.error(f'An error occurred: {e}') + +frontend_splash = FRONTEND_BUILD_DIR / 'static' / 'splash.png' + +if frontend_splash.exists(): + try: + shutil.copyfile(frontend_splash, STATIC_DIR / 'splash.png') + except Exception as e: + logging.error(f'An error occurred: {e}') + +frontend_loader = FRONTEND_BUILD_DIR / 'static' / 'loader.js' + +if frontend_loader.exists(): + try: + shutil.copyfile(frontend_loader, STATIC_DIR / 'loader.js') + except Exception as e: + logging.error(f'An error occurred: {e}') + + +#################################### +# STORAGE PROVIDER +#################################### + +STORAGE_PROVIDER = os.getenv('STORAGE_PROVIDER', 'local') # defaults to local, s3 +STORAGE_LOCAL_CACHE = os.getenv('STORAGE_LOCAL_CACHE', 'true').lower() == 'true' + +S3_ACCESS_KEY_ID = os.getenv('S3_ACCESS_KEY_ID', None) +S3_SECRET_ACCESS_KEY = os.getenv('S3_SECRET_ACCESS_KEY', None) +S3_REGION_NAME = os.getenv('S3_REGION_NAME', None) +S3_BUCKET_NAME = os.getenv('S3_BUCKET_NAME', None) +S3_KEY_PREFIX = os.getenv('S3_KEY_PREFIX', None) +S3_ENDPOINT_URL = os.getenv('S3_ENDPOINT_URL', None) +S3_USE_ACCELERATE_ENDPOINT = os.getenv('S3_USE_ACCELERATE_ENDPOINT', 'false').lower() == 'true' +S3_ADDRESSING_STYLE = os.getenv('S3_ADDRESSING_STYLE', None) +S3_ENABLE_TAGGING = os.getenv('S3_ENABLE_TAGGING', 'false').lower() == 'true' + +GCS_BUCKET_NAME = os.getenv('GCS_BUCKET_NAME', None) +GOOGLE_APPLICATION_CREDENTIALS_JSON = os.getenv('GOOGLE_APPLICATION_CREDENTIALS_JSON', None) + +AZURE_STORAGE_ENDPOINT = os.getenv('AZURE_STORAGE_ENDPOINT', None) +AZURE_STORAGE_CONTAINER_NAME = os.getenv('AZURE_STORAGE_CONTAINER_NAME', None) +AZURE_STORAGE_KEY = os.getenv('AZURE_STORAGE_KEY', None) + +#################################### +# File Upload DIR +#################################### + +UPLOAD_DIR = DATA_DIR / 'uploads' +UPLOAD_DIR.mkdir(parents=True, exist_ok=True) + + +#################################### +# Cache DIR +#################################### + +CACHE_DIR = DATA_DIR / 'cache' +CACHE_DIR.mkdir(parents=True, exist_ok=True) + + +#################################### +# CUSTOM_NAME (Legacy) +#################################### + +CUSTOM_NAME = os.getenv('CUSTOM_NAME', '') + +if CUSTOM_NAME: + try: + r = requests.get(f'https://api.openwebui.com/api/v1/custom/{CUSTOM_NAME}') + data = r.json() + if r.ok: + if 'logo' in data: + WEBUI_FAVICON_URL = url = ( + f'https://api.openwebui.com{data["logo"]}' if data['logo'][0] == '/' else data['logo'] + ) + + r = requests.get(url, stream=True) + if r.status_code == 200: + with open(f'{STATIC_DIR}/favicon.png', 'wb') as f: + r.raw.decode_content = True + shutil.copyfileobj(r.raw, f) + + if 'splash' in data: + url = f'https://api.openwebui.com{data["splash"]}' if data['splash'][0] == '/' else data['splash'] + + r = requests.get(url, stream=True) + if r.status_code == 200: + with open(f'{STATIC_DIR}/splash.png', 'wb') as f: + r.raw.decode_content = True + shutil.copyfileobj(r.raw, f) + + WEBUI_NAME = data['name'] + except Exception as e: + log.exception(e) + pass + + +#################################### +# DIRECT CONNECTIONS +#################################### + +ENABLE_DIRECT_CONNECTIONS = ConfigVar( + 'ENABLE_DIRECT_CONNECTIONS', + 'direct.enable', + os.getenv('ENABLE_DIRECT_CONNECTIONS', 'False').lower() == 'true', +) + +#################################### +# OLLAMA_BASE_URL +#################################### + +ENABLE_OLLAMA_API = ConfigVar( + 'ENABLE_OLLAMA_API', + 'ollama.enable', + os.getenv('ENABLE_OLLAMA_API', 'True').lower() == 'true', +) + +OLLAMA_API_BASE_URL = os.getenv('OLLAMA_API_BASE_URL', 'http://localhost:11434/api') + +OLLAMA_BASE_URL = os.getenv('OLLAMA_BASE_URL', '') +if OLLAMA_BASE_URL: + # Remove trailing slash + OLLAMA_BASE_URL = OLLAMA_BASE_URL[:-1] if OLLAMA_BASE_URL.endswith('/') else OLLAMA_BASE_URL + + +K8S_FLAG = os.getenv('K8S_FLAG', '') +USE_OLLAMA_DOCKER = os.getenv('USE_OLLAMA_DOCKER', 'false') + +if OLLAMA_BASE_URL == '' and OLLAMA_API_BASE_URL != '': + OLLAMA_BASE_URL = OLLAMA_API_BASE_URL[:-4] if OLLAMA_API_BASE_URL.endswith('/api') else OLLAMA_API_BASE_URL + +if ENV == 'prod': + if OLLAMA_BASE_URL == '/ollama' and not K8S_FLAG: + if USE_OLLAMA_DOCKER.lower() == 'true': + # if you use all-in-one docker container (Open WebUI + Ollama) + # with the docker build arg USE_OLLAMA=true (--build-arg="USE_OLLAMA=true") this only works with http://localhost:11434 + OLLAMA_BASE_URL = 'http://localhost:11434' + else: + OLLAMA_BASE_URL = 'http://host.docker.internal:11434' + elif K8S_FLAG: + OLLAMA_BASE_URL = 'http://ollama-service.open-webui.svc.cluster.local:11434' + + +def _resolve_ollama_base_url(url: str) -> str: + """If the default Ollama port (11434) is unreachable, try the fallback port (12434).""" + + def reachable(host: str, port: int) -> bool: + try: + with socket.create_connection((host, port), timeout=1.0): + return True + except (OSError, TimeoutError): + return False + + host = urlparse(url).hostname or 'localhost' + + with ThreadPoolExecutor(max_workers=2) as pool: + default = pool.submit(reachable, host, 11434) + fallback = pool.submit(reachable, host, 12434) + + if not default.result() and fallback.result(): + url = url.replace(':11434', ':12434') + log.info(f'Ollama port 11434 unreachable on {host}, falling back to 12434') + elif not default.result(): + log.info(f'Ollama ports 11434 and 12434 both unreachable on {host}') + + return url + + +# Auto-resolve Ollama port when no explicit URL was provided by the user. +# The Dockerfile default is "/ollama" which the block above rewrites to :11434. +if os.getenv('OLLAMA_BASE_URL', '') in ('', '/ollama') and not os.getenv('OLLAMA_BASE_URLS', ''): + OLLAMA_BASE_URL = _resolve_ollama_base_url(OLLAMA_BASE_URL) + + +OLLAMA_BASE_URLS = os.getenv('OLLAMA_BASE_URLS', '') +OLLAMA_BASE_URLS = OLLAMA_BASE_URLS if OLLAMA_BASE_URLS != '' else OLLAMA_BASE_URL + +OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(';')] +OLLAMA_BASE_URLS = ConfigVar('OLLAMA_BASE_URLS', 'ollama.base_urls', OLLAMA_BASE_URLS) + +OLLAMA_API_CONFIGS = ConfigVar( + 'OLLAMA_API_CONFIGS', + 'ollama.api_configs', + {}, +) + +#################################### +# OPENAI_API +#################################### + + +ENABLE_OPENAI_API = ConfigVar( + 'ENABLE_OPENAI_API', + 'openai.enable', + os.getenv('ENABLE_OPENAI_API', 'True').lower() == 'true', +) + + +OPENAI_API_KEY = os.getenv('OPENAI_API_KEY', '') +OPENAI_API_BASE_URL = os.getenv('OPENAI_API_BASE_URL', '') + +GEMINI_API_KEY = os.getenv('GEMINI_API_KEY', '') +GEMINI_API_BASE_URL = os.getenv('GEMINI_API_BASE_URL', '') + + +if OPENAI_API_BASE_URL == '': + OPENAI_API_BASE_URL = 'https://api.openai.com/v1' +else: + if OPENAI_API_BASE_URL.endswith('/'): + OPENAI_API_BASE_URL = OPENAI_API_BASE_URL[:-1] + +OPENAI_API_KEYS = os.getenv('OPENAI_API_KEYS', '') +OPENAI_API_KEYS = OPENAI_API_KEYS if OPENAI_API_KEYS != '' else OPENAI_API_KEY + +OPENAI_API_KEYS = [url.strip() for url in OPENAI_API_KEYS.split(';')] +OPENAI_API_KEYS = ConfigVar('OPENAI_API_KEYS', 'openai.api_keys', OPENAI_API_KEYS) + +OPENAI_API_BASE_URLS = os.getenv('OPENAI_API_BASE_URLS', '') +OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS if OPENAI_API_BASE_URLS != '' else OPENAI_API_BASE_URL + +OPENAI_API_BASE_URLS = [ + url.strip() if url != '' else 'https://api.openai.com/v1' for url in OPENAI_API_BASE_URLS.split(';') +] +OPENAI_API_BASE_URLS = ConfigVar('OPENAI_API_BASE_URLS', 'openai.api_base_urls', OPENAI_API_BASE_URLS) + +OPENAI_API_CONFIGS = ConfigVar( + 'OPENAI_API_CONFIGS', + 'openai.api_configs', + {}, +) + +# Get the actual OpenAI API key based on the base URL +OPENAI_API_KEY = '' +try: + OPENAI_API_KEY = OPENAI_API_KEYS.value[OPENAI_API_BASE_URLS.value.index('https://api.openai.com/v1')] +except Exception: + pass +OPENAI_API_BASE_URL = 'https://api.openai.com/v1' + + +#################################### +# MODELS +#################################### + +ENABLE_BASE_MODELS_CACHE = ConfigVar( + 'ENABLE_BASE_MODELS_CACHE', + 'models.base_models_cache', + os.getenv('ENABLE_BASE_MODELS_CACHE', 'False').lower() == 'true', +) + + +#################################### +# TOOL_SERVERS +#################################### + +try: + tool_server_connections = json.loads(os.getenv('TOOL_SERVER_CONNECTIONS', '[]')) +except Exception as e: + log.exception(f'Error loading TOOL_SERVER_CONNECTIONS: {e}') + tool_server_connections = [] + + +TOOL_SERVER_CONNECTIONS = ConfigVar( + 'TOOL_SERVER_CONNECTIONS', + 'tool_server.connections', + tool_server_connections, +) + +OAUTH_CLIENT_TIMEOUT = ConfigVar( + 'OAUTH_CLIENT_TIMEOUT', + 'oauth.client.timeout', + os.getenv('OAUTH_CLIENT_TIMEOUT', ''), +) + +#################################### +# TERMINAL_SERVER +#################################### + +terminal_server_connections = json.loads(os.getenv('TERMINAL_SERVER_CONNECTIONS', '[]')) + +TERMINAL_SERVER_CONNECTIONS = ConfigVar( + 'TERMINAL_SERVER_CONNECTIONS', + 'terminal_server.connections', + terminal_server_connections, +) + +try: + TERMINAL_PROXY_HEADERS = json.loads(os.getenv('TERMINAL_PROXY_HEADERS', '{}')) +except Exception: + TERMINAL_PROXY_HEADERS = {} + +#################################### +# Code Interpreter +#################################### + +ENABLE_CODE_EXECUTION = ConfigVar( + 'ENABLE_CODE_EXECUTION', + 'code_execution.enable', + os.getenv('ENABLE_CODE_EXECUTION', 'True').lower() == 'true', +) + +CODE_EXECUTION_ENGINE = ConfigVar( + 'CODE_EXECUTION_ENGINE', + 'code_execution.engine', + os.getenv('CODE_EXECUTION_ENGINE', 'pyodide'), +) + +CODE_EXECUTION_JUPYTER_URL = ConfigVar( + 'CODE_EXECUTION_JUPYTER_URL', + 'code_execution.jupyter.url', + os.getenv('CODE_EXECUTION_JUPYTER_URL', ''), +) + +CODE_EXECUTION_JUPYTER_AUTH = ConfigVar( + 'CODE_EXECUTION_JUPYTER_AUTH', + 'code_execution.jupyter.auth', + os.getenv('CODE_EXECUTION_JUPYTER_AUTH', ''), +) + +CODE_EXECUTION_JUPYTER_AUTH_TOKEN = ConfigVar( + 'CODE_EXECUTION_JUPYTER_AUTH_TOKEN', + 'code_execution.jupyter.auth_token', + os.getenv('CODE_EXECUTION_JUPYTER_AUTH_TOKEN', ''), +) + + +CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = ConfigVar( + 'CODE_EXECUTION_JUPYTER_AUTH_PASSWORD', + 'code_execution.jupyter.auth_password', + os.getenv('CODE_EXECUTION_JUPYTER_AUTH_PASSWORD', ''), +) + +CODE_EXECUTION_JUPYTER_TIMEOUT = ConfigVar( + 'CODE_EXECUTION_JUPYTER_TIMEOUT', + 'code_execution.jupyter.timeout', + int(os.getenv('CODE_EXECUTION_JUPYTER_TIMEOUT', '60')), +) + +ENABLE_CODE_INTERPRETER = ConfigVar( + 'ENABLE_CODE_INTERPRETER', + 'code_interpreter.enable', + os.getenv('ENABLE_CODE_INTERPRETER', 'True').lower() == 'true', +) + +ENABLE_MEMORIES = ConfigVar( + 'ENABLE_MEMORIES', + 'memories.enable', + os.getenv('ENABLE_MEMORIES', 'True').lower() == 'true', +) + +CODE_INTERPRETER_ENGINE = ConfigVar( + 'CODE_INTERPRETER_ENGINE', + 'code_interpreter.engine', + os.getenv('CODE_INTERPRETER_ENGINE', 'pyodide'), +) + +CODE_INTERPRETER_PROMPT_TEMPLATE = ConfigVar( + 'CODE_INTERPRETER_PROMPT_TEMPLATE', + 'code_interpreter.prompt_template', + os.getenv('CODE_INTERPRETER_PROMPT_TEMPLATE', ''), +) + +CODE_INTERPRETER_JUPYTER_URL = ConfigVar( + 'CODE_INTERPRETER_JUPYTER_URL', + 'code_interpreter.jupyter.url', + os.getenv('CODE_INTERPRETER_JUPYTER_URL', os.getenv('CODE_EXECUTION_JUPYTER_URL', '')), +) + +CODE_INTERPRETER_JUPYTER_AUTH = ConfigVar( + 'CODE_INTERPRETER_JUPYTER_AUTH', + 'code_interpreter.jupyter.auth', + os.getenv( + 'CODE_INTERPRETER_JUPYTER_AUTH', + os.getenv('CODE_EXECUTION_JUPYTER_AUTH', ''), + ), +) + +CODE_INTERPRETER_JUPYTER_AUTH_TOKEN = ConfigVar( + 'CODE_INTERPRETER_JUPYTER_AUTH_TOKEN', + 'code_interpreter.jupyter.auth_token', + os.getenv( + 'CODE_INTERPRETER_JUPYTER_AUTH_TOKEN', + os.getenv('CODE_EXECUTION_JUPYTER_AUTH_TOKEN', ''), + ), +) + + +CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = ConfigVar( + 'CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD', + 'code_interpreter.jupyter.auth_password', + os.getenv( + 'CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD', + os.getenv('CODE_EXECUTION_JUPYTER_AUTH_PASSWORD', ''), + ), +) + +CODE_INTERPRETER_JUPYTER_TIMEOUT = ConfigVar( + 'CODE_INTERPRETER_JUPYTER_TIMEOUT', + 'code_interpreter.jupyter.timeout', + int( + os.getenv( + 'CODE_INTERPRETER_JUPYTER_TIMEOUT', + os.getenv('CODE_EXECUTION_JUPYTER_TIMEOUT', '60'), + ) + ), +) + +CODE_INTERPRETER_BLOCKED_MODULES = [ + library.strip() for library in os.getenv('CODE_INTERPRETER_BLOCKED_MODULES', '').split(',') if library.strip() +] + +DEFAULT_CODE_INTERPRETER_PROMPT = """ +#### Code Interpreter + +You have access to a Python code interpreter via: `` + +- The Python shell runs directly in the user's browser for fast execution of analysis, calculations, or problem-solving. Use it in this response. +- You can use a wide array of libraries for data manipulation, visualization, API calls, or any computational task. Think outside the box and harness Python's full potential. +- **You must enclose your code within `` XML tags** and stop right away. If you don't, the code won't execute. +- Do NOT use triple backticks (```py ... ```) inside the XML tags — that is markdown formatting, not executable Python code. +- **Always print meaningful outputs** (results, tables, summaries, visuals). Avoid implicit outputs; use explicit print statements. +- After obtaining output, **provide a concise analysis, interpretation, or next steps** to help the user understand the findings. +- If results are unclear or unexpected, refine the code and re-execute. Iterate until you deliver meaningful insights. +- **If a link to an image, audio, or any file appears in the output, display it exactly as-is** in your response so the user can access it. Do not modify the link. +- Respond in the chat's primary language. Default to English if multilingual. + +Ensure the code interpreter is effectively utilized to achieve the highest-quality analysis for the user.""" + +# Appended to the code interpreter prompt only when engine is pyodide (not jupyter) +CODE_INTERPRETER_PYODIDE_PROMPT = """ + +##### Pyodide Environment + +- This Python environment runs via Pyodide in the browser. **Do not install packages** — `pip install`, `subprocess`, and `micropip.install()` are not available. +- If a required library is unavailable, use an alternative approach with available modules. Do not attempt to install anything. + +##### Persistent File System + +- User-uploaded files are available at `/mnt/uploads/`. When the user asks you to work with their files, read from this directory. +- You can also write output files to `/mnt/uploads/` so the user can access and download them from the file browser. +- The file system persists across code executions within the same session. +- Use `import os; os.listdir('/mnt/uploads')` to discover available files.""" + + +#################################### +# Vector Database +#################################### + +VECTOR_DB = os.getenv('VECTOR_DB', 'chroma') + +# Chroma +CHROMA_DATA_PATH = f'{DATA_DIR}/vector_db' + +if VECTOR_DB == 'chroma': + import chromadb + + CHROMA_TENANT = os.getenv('CHROMA_TENANT', chromadb.DEFAULT_TENANT) + CHROMA_DATABASE = os.getenv('CHROMA_DATABASE', chromadb.DEFAULT_DATABASE) + CHROMA_HTTP_HOST = os.getenv('CHROMA_HTTP_HOST', '') + CHROMA_HTTP_PORT = int(os.getenv('CHROMA_HTTP_PORT', '8000')) + CHROMA_CLIENT_AUTH_PROVIDER = os.getenv('CHROMA_CLIENT_AUTH_PROVIDER', '') + CHROMA_CLIENT_AUTH_CREDENTIALS = os.getenv('CHROMA_CLIENT_AUTH_CREDENTIALS', '') + # Comma-separated list of header=value pairs + CHROMA_HTTP_HEADERS = os.getenv('CHROMA_HTTP_HEADERS', '') + if CHROMA_HTTP_HEADERS: + CHROMA_HTTP_HEADERS = dict([pair.split('=') for pair in CHROMA_HTTP_HEADERS.split(',')]) + else: + CHROMA_HTTP_HEADERS = None + CHROMA_HTTP_SSL = os.getenv('CHROMA_HTTP_SSL', 'false').lower() == 'true' +# this uses the model defined in the Dockerfile ENV variable. If you dont use docker or docker based deployments such as k8s, the default embedding model will be used (sentence-transformers/all-MiniLM-L6-v2) + + +# MariaDB Vector (mariadb-vector) +MARIADB_VECTOR_DB_URL = os.getenv('MARIADB_VECTOR_DB_URL', '').strip() + +MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int( + os.getenv('MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH', '1536').strip() or '1536' +) + +# Distance strategy: +# - cosine => vec_distance_cosine(...) +# - euclidean => vec_distance_euclidean(...) +MARIADB_VECTOR_DISTANCE_STRATEGY = os.getenv('MARIADB_VECTOR_DISTANCE_STRATEGY', 'cosine').strip().lower() + +# HNSW M parameter (MariaDB VECTOR INDEX ... M=) +MARIADB_VECTOR_INDEX_M = int(os.getenv('MARIADB_VECTOR_INDEX_M', '8').strip() or '8') + +# Pooling (MariaDB-Vector) +MARIADB_VECTOR_POOL_SIZE = os.getenv('MARIADB_VECTOR_POOL_SIZE', None) + +if MARIADB_VECTOR_POOL_SIZE != None: + try: + MARIADB_VECTOR_POOL_SIZE = int(MARIADB_VECTOR_POOL_SIZE) + except Exception: + MARIADB_VECTOR_POOL_SIZE = None + +MARIADB_VECTOR_POOL_MAX_OVERFLOW = os.getenv('MARIADB_VECTOR_POOL_MAX_OVERFLOW', 0) + +if MARIADB_VECTOR_POOL_MAX_OVERFLOW == '': + MARIADB_VECTOR_POOL_MAX_OVERFLOW = 0 +else: + try: + MARIADB_VECTOR_POOL_MAX_OVERFLOW = int(MARIADB_VECTOR_POOL_MAX_OVERFLOW) + except Exception: + MARIADB_VECTOR_POOL_MAX_OVERFLOW = 0 + +MARIADB_VECTOR_POOL_TIMEOUT = os.getenv('MARIADB_VECTOR_POOL_TIMEOUT', 30) + +if MARIADB_VECTOR_POOL_TIMEOUT == '': + MARIADB_VECTOR_POOL_TIMEOUT = 30 +else: + try: + MARIADB_VECTOR_POOL_TIMEOUT = int(MARIADB_VECTOR_POOL_TIMEOUT) + except Exception: + MARIADB_VECTOR_POOL_TIMEOUT = 30 + +MARIADB_VECTOR_POOL_RECYCLE = os.getenv('MARIADB_VECTOR_POOL_RECYCLE', 3600) + +if MARIADB_VECTOR_POOL_RECYCLE == '': + MARIADB_VECTOR_POOL_RECYCLE = 3600 +else: + try: + MARIADB_VECTOR_POOL_RECYCLE = int(MARIADB_VECTOR_POOL_RECYCLE) + except Exception: + MARIADB_VECTOR_POOL_RECYCLE = 3600 + +ENABLE_MARIADB_VECTOR = True +if VECTOR_DB == 'mariadb-vector': + if not MARIADB_VECTOR_DB_URL: + ENABLE_MARIADB_VECTOR = False + else: + try: + parsed = urlparse(MARIADB_VECTOR_DB_URL) + scheme = (parsed.scheme or '').lower() + # Require official driver so VECTOR binds as float32 bytes correctly + if scheme != 'mariadb+mariadbconnector': + ENABLE_MARIADB_VECTOR = False + except Exception: + ENABLE_MARIADB_VECTOR = False + + +# Milvus +MILVUS_URI = os.getenv('MILVUS_URI', f'{DATA_DIR}/vector_db/milvus.db') +MILVUS_DB = os.getenv('MILVUS_DB', 'default') +MILVUS_TOKEN = os.getenv('MILVUS_TOKEN', None) +MILVUS_INDEX_TYPE = os.getenv('MILVUS_INDEX_TYPE', 'HNSW') +MILVUS_METRIC_TYPE = os.getenv('MILVUS_METRIC_TYPE', 'COSINE') +MILVUS_HNSW_M = int(os.getenv('MILVUS_HNSW_M', '16')) +MILVUS_HNSW_EFCONSTRUCTION = int(os.getenv('MILVUS_HNSW_EFCONSTRUCTION', '100')) +MILVUS_IVF_FLAT_NLIST = int(os.getenv('MILVUS_IVF_FLAT_NLIST', '128')) +MILVUS_DISKANN_MAX_DEGREE = int(os.getenv('MILVUS_DISKANN_MAX_DEGREE', '56')) +MILVUS_DISKANN_SEARCH_LIST_SIZE = int(os.getenv('MILVUS_DISKANN_SEARCH_LIST_SIZE', '100')) +ENABLE_MILVUS_MULTITENANCY_MODE = os.getenv('ENABLE_MILVUS_MULTITENANCY_MODE', 'false').lower() == 'true' +# Hyphens not allowed, need to use underscores in collection names +MILVUS_COLLECTION_PREFIX = os.getenv('MILVUS_COLLECTION_PREFIX', 'open_webui') + +# Qdrant +QDRANT_URI = os.getenv('QDRANT_URI', None) +QDRANT_API_KEY = os.getenv('QDRANT_API_KEY', None) +QDRANT_ON_DISK = os.getenv('QDRANT_ON_DISK', 'false').lower() == 'true' +QDRANT_PREFER_GRPC = os.getenv('QDRANT_PREFER_GRPC', 'false').lower() == 'true' +QDRANT_GRPC_PORT = int(os.getenv('QDRANT_GRPC_PORT', '6334')) +QDRANT_TIMEOUT = int(os.getenv('QDRANT_TIMEOUT', '5')) +QDRANT_HNSW_M = int(os.getenv('QDRANT_HNSW_M', '16')) +ENABLE_QDRANT_MULTITENANCY_MODE = os.getenv('ENABLE_QDRANT_MULTITENANCY_MODE', 'true').lower() == 'true' +QDRANT_COLLECTION_PREFIX = os.getenv('QDRANT_COLLECTION_PREFIX', 'open-webui') + +WEAVIATE_HTTP_HOST = os.getenv('WEAVIATE_HTTP_HOST', '') +WEAVIATE_GRPC_HOST = os.getenv('WEAVIATE_GRPC_HOST', '') +WEAVIATE_HTTP_PORT = int(os.getenv('WEAVIATE_HTTP_PORT', '8080')) +WEAVIATE_GRPC_PORT = int(os.getenv('WEAVIATE_GRPC_PORT', '50051')) +WEAVIATE_API_KEY = os.getenv('WEAVIATE_API_KEY') +WEAVIATE_HTTP_SECURE = os.getenv('WEAVIATE_HTTP_SECURE', 'false').lower() == 'true' +WEAVIATE_GRPC_SECURE = os.getenv('WEAVIATE_GRPC_SECURE', 'false').lower() == 'true' +WEAVIATE_SKIP_INIT_CHECKS = os.getenv('WEAVIATE_SKIP_INIT_CHECKS', 'false').lower() == 'true' + +# OpenSearch +OPENSEARCH_URI = os.getenv('OPENSEARCH_URI', 'https://localhost:9200') +OPENSEARCH_SSL = os.getenv('OPENSEARCH_SSL', 'true').lower() == 'true' +OPENSEARCH_CERT_VERIFY = os.getenv('OPENSEARCH_CERT_VERIFY', 'false').lower() == 'true' +OPENSEARCH_USERNAME = os.getenv('OPENSEARCH_USERNAME', None) +OPENSEARCH_PASSWORD = os.getenv('OPENSEARCH_PASSWORD', None) + +# ElasticSearch +ELASTICSEARCH_URL = os.getenv('ELASTICSEARCH_URL', 'https://localhost:9200') +ELASTICSEARCH_CA_CERTS = os.getenv('ELASTICSEARCH_CA_CERTS', None) +ELASTICSEARCH_API_KEY = os.getenv('ELASTICSEARCH_API_KEY', None) +ELASTICSEARCH_USERNAME = os.getenv('ELASTICSEARCH_USERNAME', None) +ELASTICSEARCH_PASSWORD = os.getenv('ELASTICSEARCH_PASSWORD', None) +ELASTICSEARCH_CLOUD_ID = os.getenv('ELASTICSEARCH_CLOUD_ID', None) +SSL_ASSERT_FINGERPRINT = os.getenv('SSL_ASSERT_FINGERPRINT', None) +ELASTICSEARCH_INDEX_PREFIX = os.getenv('ELASTICSEARCH_INDEX_PREFIX', 'open_webui_collections') +# Pgvector +PGVECTOR_DB_URL = os.getenv('PGVECTOR_DB_URL', DATABASE_URL) +if VECTOR_DB == 'pgvector' and not PGVECTOR_DB_URL.startswith('postgres'): + raise ValueError( + 'Pgvector requires setting PGVECTOR_DB_URL or using Postgres with vector extension as the primary database.' + ) +PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int(os.getenv('PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH', '1536')) + +PGVECTOR_USE_HALFVEC = os.getenv('PGVECTOR_USE_HALFVEC', 'false').lower() == 'true' + +if PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH > 2000 and not PGVECTOR_USE_HALFVEC: + raise ValueError( + 'PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH is set to ' + f'{PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH}, which exceeds the 2000 dimension limit of the ' + "'vector' type. Set PGVECTOR_USE_HALFVEC=true to enable the 'halfvec' " + 'type required for high-dimensional embeddings.' + ) + +PGVECTOR_CREATE_EXTENSION = os.getenv('PGVECTOR_CREATE_EXTENSION', 'true').lower() == 'true' +PGVECTOR_PGCRYPTO = os.getenv('PGVECTOR_PGCRYPTO', 'false').lower() == 'true' +PGVECTOR_PGCRYPTO_KEY = os.getenv('PGVECTOR_PGCRYPTO_KEY', None) +if PGVECTOR_PGCRYPTO and not PGVECTOR_PGCRYPTO_KEY: + raise ValueError('PGVECTOR_PGCRYPTO is enabled but PGVECTOR_PGCRYPTO_KEY is not set. Please provide a valid key.') + + +PGVECTOR_POOL_SIZE = os.getenv('PGVECTOR_POOL_SIZE', None) + +if PGVECTOR_POOL_SIZE != None: + try: + PGVECTOR_POOL_SIZE = int(PGVECTOR_POOL_SIZE) + except Exception: + PGVECTOR_POOL_SIZE = None + +PGVECTOR_POOL_MAX_OVERFLOW = os.getenv('PGVECTOR_POOL_MAX_OVERFLOW', 0) + +if PGVECTOR_POOL_MAX_OVERFLOW == '': + PGVECTOR_POOL_MAX_OVERFLOW = 0 +else: + try: + PGVECTOR_POOL_MAX_OVERFLOW = int(PGVECTOR_POOL_MAX_OVERFLOW) + except Exception: + PGVECTOR_POOL_MAX_OVERFLOW = 0 + +PGVECTOR_POOL_TIMEOUT = os.getenv('PGVECTOR_POOL_TIMEOUT', 30) + +if PGVECTOR_POOL_TIMEOUT == '': + PGVECTOR_POOL_TIMEOUT = 30 +else: + try: + PGVECTOR_POOL_TIMEOUT = int(PGVECTOR_POOL_TIMEOUT) + except Exception: + PGVECTOR_POOL_TIMEOUT = 30 + +PGVECTOR_POOL_RECYCLE = os.getenv('PGVECTOR_POOL_RECYCLE', 3600) + +if PGVECTOR_POOL_RECYCLE == '': + PGVECTOR_POOL_RECYCLE = 3600 +else: + try: + PGVECTOR_POOL_RECYCLE = int(PGVECTOR_POOL_RECYCLE) + except Exception: + PGVECTOR_POOL_RECYCLE = 3600 + +PGVECTOR_INDEX_METHOD = os.getenv('PGVECTOR_INDEX_METHOD', '').strip().lower() +if PGVECTOR_INDEX_METHOD not in ('ivfflat', 'hnsw', ''): + PGVECTOR_INDEX_METHOD = '' + +PGVECTOR_HNSW_M = os.getenv('PGVECTOR_HNSW_M', 16) + +if PGVECTOR_HNSW_M == '': + PGVECTOR_HNSW_M = 16 +else: + try: + PGVECTOR_HNSW_M = int(PGVECTOR_HNSW_M) + except Exception: + PGVECTOR_HNSW_M = 16 + +PGVECTOR_HNSW_EF_CONSTRUCTION = os.getenv('PGVECTOR_HNSW_EF_CONSTRUCTION', 64) + +if PGVECTOR_HNSW_EF_CONSTRUCTION == '': + PGVECTOR_HNSW_EF_CONSTRUCTION = 64 +else: + try: + PGVECTOR_HNSW_EF_CONSTRUCTION = int(PGVECTOR_HNSW_EF_CONSTRUCTION) + except Exception: + PGVECTOR_HNSW_EF_CONSTRUCTION = 64 + +PGVECTOR_IVFFLAT_LISTS = os.getenv('PGVECTOR_IVFFLAT_LISTS', 100) + +if PGVECTOR_IVFFLAT_LISTS == '': + PGVECTOR_IVFFLAT_LISTS = 100 +else: + try: + PGVECTOR_IVFFLAT_LISTS = int(PGVECTOR_IVFFLAT_LISTS) + except Exception: + PGVECTOR_IVFFLAT_LISTS = 100 + +# openGauss +OPENGAUSS_DB_URL = os.getenv('OPENGAUSS_DB_URL', DATABASE_URL) + +OPENGAUSS_INITIALIZE_MAX_VECTOR_LENGTH = int(os.getenv('OPENGAUSS_INITIALIZE_MAX_VECTOR_LENGTH', '1536')) + +OPENGAUSS_POOL_SIZE = os.getenv('OPENGAUSS_POOL_SIZE', None) + +if OPENGAUSS_POOL_SIZE != None: + try: + OPENGAUSS_POOL_SIZE = int(OPENGAUSS_POOL_SIZE) + except Exception: + OPENGAUSS_POOL_SIZE = None + +OPENGAUSS_POOL_MAX_OVERFLOW = os.getenv('OPENGAUSS_POOL_MAX_OVERFLOW', 0) + +if OPENGAUSS_POOL_MAX_OVERFLOW == '': + OPENGAUSS_POOL_MAX_OVERFLOW = 0 +else: + try: + OPENGAUSS_POOL_MAX_OVERFLOW = int(OPENGAUSS_POOL_MAX_OVERFLOW) + except Exception: + OPENGAUSS_POOL_MAX_OVERFLOW = 0 + +OPENGAUSS_POOL_TIMEOUT = os.getenv('OPENGAUSS_POOL_TIMEOUT', 30) + +if OPENGAUSS_POOL_TIMEOUT == '': + OPENGAUSS_POOL_TIMEOUT = 30 +else: + try: + OPENGAUSS_POOL_TIMEOUT = int(OPENGAUSS_POOL_TIMEOUT) + except Exception: + OPENGAUSS_POOL_TIMEOUT = 30 + +OPENGAUSS_POOL_RECYCLE = os.getenv('OPENGAUSS_POOL_RECYCLE', 3600) + +if OPENGAUSS_POOL_RECYCLE == '': + OPENGAUSS_POOL_RECYCLE = 3600 +else: + try: + OPENGAUSS_POOL_RECYCLE = int(OPENGAUSS_POOL_RECYCLE) + except Exception: + OPENGAUSS_POOL_RECYCLE = 3600 + +# Pinecone +PINECONE_API_KEY = os.getenv('PINECONE_API_KEY', None) +PINECONE_ENVIRONMENT = os.getenv('PINECONE_ENVIRONMENT', None) +PINECONE_INDEX_NAME = os.getenv('PINECONE_INDEX_NAME', 'open-webui-index') +PINECONE_DIMENSION = int(os.getenv('PINECONE_DIMENSION', 1536)) # or 3072, 1024, 768 +PINECONE_METRIC = os.getenv('PINECONE_METRIC', 'cosine') +PINECONE_CLOUD = os.getenv('PINECONE_CLOUD', 'aws') # or "gcp" or "azure" + +# ORACLE23AI (Oracle23ai Vector Search) + +ORACLE_DB_USE_WALLET = os.getenv('ORACLE_DB_USE_WALLET', 'false').lower() == 'true' +ORACLE_DB_USER = os.getenv('ORACLE_DB_USER', None) # +ORACLE_DB_PASSWORD = os.getenv('ORACLE_DB_PASSWORD', None) # +ORACLE_DB_DSN = os.getenv('ORACLE_DB_DSN', None) # +ORACLE_WALLET_DIR = os.getenv('ORACLE_WALLET_DIR', None) +ORACLE_WALLET_PASSWORD = os.getenv('ORACLE_WALLET_PASSWORD', None) +ORACLE_VECTOR_LENGTH = os.getenv('ORACLE_VECTOR_LENGTH', 768) + +ORACLE_DB_POOL_MIN = int(os.getenv('ORACLE_DB_POOL_MIN', 2)) +ORACLE_DB_POOL_MAX = int(os.getenv('ORACLE_DB_POOL_MAX', 10)) +ORACLE_DB_POOL_INCREMENT = int(os.getenv('ORACLE_DB_POOL_INCREMENT', 1)) + + +if VECTOR_DB == 'oracle23ai': + if not ORACLE_DB_USER or not ORACLE_DB_PASSWORD or not ORACLE_DB_DSN: + raise ValueError('Oracle23ai requires setting ORACLE_DB_USER, ORACLE_DB_PASSWORD, and ORACLE_DB_DSN.') + if ORACLE_DB_USE_WALLET and (not ORACLE_WALLET_DIR or not ORACLE_WALLET_PASSWORD): + raise ValueError( + 'Oracle23ai requires setting ORACLE_WALLET_DIR and ORACLE_WALLET_PASSWORD when using wallet authentication.' + ) + +log.info(f'VECTOR_DB: {VECTOR_DB}') + +# S3 Vector +S3_VECTOR_BUCKET_NAME = os.getenv('S3_VECTOR_BUCKET_NAME', None) +S3_VECTOR_REGION = os.getenv('S3_VECTOR_REGION', None) + +#################################### +# Information Retrieval (RAG) +#################################### + + +# If configured, Google Drive will be available as an upload option. +ENABLE_GOOGLE_DRIVE_INTEGRATION = ConfigVar( + 'ENABLE_GOOGLE_DRIVE_INTEGRATION', + 'google_drive.enable', + os.getenv('ENABLE_GOOGLE_DRIVE_INTEGRATION', 'False').lower() == 'true', +) + +GOOGLE_DRIVE_CLIENT_ID = ConfigVar( + 'GOOGLE_DRIVE_CLIENT_ID', + 'google_drive.client_id', + os.getenv('GOOGLE_DRIVE_CLIENT_ID', ''), +) + +GOOGLE_DRIVE_API_KEY = ConfigVar( + 'GOOGLE_DRIVE_API_KEY', + 'google_drive.api_key', + os.getenv('GOOGLE_DRIVE_API_KEY', ''), +) + +ENABLE_ONEDRIVE_INTEGRATION = ConfigVar( + 'ENABLE_ONEDRIVE_INTEGRATION', + 'onedrive.enable', + os.getenv('ENABLE_ONEDRIVE_INTEGRATION', 'False').lower() == 'true', +) + + +ONEDRIVE_CLIENT_ID = os.getenv('ONEDRIVE_CLIENT_ID', '') +ONEDRIVE_CLIENT_ID_PERSONAL = os.getenv('ONEDRIVE_CLIENT_ID_PERSONAL', ONEDRIVE_CLIENT_ID) +ONEDRIVE_CLIENT_ID_BUSINESS = os.getenv('ONEDRIVE_CLIENT_ID_BUSINESS', ONEDRIVE_CLIENT_ID) + +ENABLE_ONEDRIVE_PERSONAL = os.getenv('ENABLE_ONEDRIVE_PERSONAL', 'True').lower() == 'true' and bool( + ONEDRIVE_CLIENT_ID_PERSONAL +) +ENABLE_ONEDRIVE_BUSINESS = os.getenv('ENABLE_ONEDRIVE_BUSINESS', 'True').lower() == 'true' and bool( + ONEDRIVE_CLIENT_ID_BUSINESS +) + +ONEDRIVE_SHAREPOINT_URL = ConfigVar( + 'ONEDRIVE_SHAREPOINT_URL', + 'onedrive.sharepoint_url', + os.getenv('ONEDRIVE_SHAREPOINT_URL', ''), +) + +ONEDRIVE_SHAREPOINT_TENANT_ID = ConfigVar( + 'ONEDRIVE_SHAREPOINT_TENANT_ID', + 'onedrive.sharepoint_tenant_id', + os.getenv('ONEDRIVE_SHAREPOINT_TENANT_ID', ''), +) + +# RAG Content Extraction +CONTENT_EXTRACTION_ENGINE = ConfigVar( + 'CONTENT_EXTRACTION_ENGINE', + 'rag.CONTENT_EXTRACTION_ENGINE', + os.getenv('CONTENT_EXTRACTION_ENGINE', '').lower(), +) + +DATALAB_MARKER_API_KEY = ConfigVar( + 'DATALAB_MARKER_API_KEY', + 'rag.datalab_marker_api_key', + os.getenv('DATALAB_MARKER_API_KEY', ''), +) + +DATALAB_MARKER_API_BASE_URL = ConfigVar( + 'DATALAB_MARKER_API_BASE_URL', + 'rag.datalab_marker_api_base_url', + os.getenv('DATALAB_MARKER_API_BASE_URL', ''), +) + +DATALAB_MARKER_ADDITIONAL_CONFIG = ConfigVar( + 'DATALAB_MARKER_ADDITIONAL_CONFIG', + 'rag.datalab_marker_additional_config', + os.getenv('DATALAB_MARKER_ADDITIONAL_CONFIG', ''), +) + +DATALAB_MARKER_USE_LLM = ConfigVar( + 'DATALAB_MARKER_USE_LLM', + 'rag.DATALAB_MARKER_USE_LLM', + os.getenv('DATALAB_MARKER_USE_LLM', 'false').lower() == 'true', +) + +DATALAB_MARKER_SKIP_CACHE = ConfigVar( + 'DATALAB_MARKER_SKIP_CACHE', + 'rag.datalab_marker_skip_cache', + os.getenv('DATALAB_MARKER_SKIP_CACHE', 'false').lower() == 'true', +) + +DATALAB_MARKER_FORCE_OCR = ConfigVar( + 'DATALAB_MARKER_FORCE_OCR', + 'rag.datalab_marker_force_ocr', + os.getenv('DATALAB_MARKER_FORCE_OCR', 'false').lower() == 'true', +) + +DATALAB_MARKER_PAGINATE = ConfigVar( + 'DATALAB_MARKER_PAGINATE', + 'rag.datalab_marker_paginate', + os.getenv('DATALAB_MARKER_PAGINATE', 'false').lower() == 'true', +) + +DATALAB_MARKER_STRIP_EXISTING_OCR = ConfigVar( + 'DATALAB_MARKER_STRIP_EXISTING_OCR', + 'rag.datalab_marker_strip_existing_ocr', + os.getenv('DATALAB_MARKER_STRIP_EXISTING_OCR', 'false').lower() == 'true', +) + +DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION = ConfigVar( + 'DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION', + 'rag.datalab_marker_disable_image_extraction', + os.getenv('DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION', 'false').lower() == 'true', +) + +DATALAB_MARKER_FORMAT_LINES = ConfigVar( + 'DATALAB_MARKER_FORMAT_LINES', + 'rag.datalab_marker_format_lines', + os.getenv('DATALAB_MARKER_FORMAT_LINES', 'false').lower() == 'true', +) + +DATALAB_MARKER_OUTPUT_FORMAT = ConfigVar( + 'DATALAB_MARKER_OUTPUT_FORMAT', + 'rag.datalab_marker_output_format', + os.getenv('DATALAB_MARKER_OUTPUT_FORMAT', 'markdown'), +) + +MINERU_API_MODE = ConfigVar( + 'MINERU_API_MODE', + 'rag.mineru_api_mode', + os.getenv('MINERU_API_MODE', 'local'), # "local" or "cloud" +) + +MINERU_API_URL = ConfigVar( + 'MINERU_API_URL', + 'rag.mineru_api_url', + os.getenv('MINERU_API_URL', 'http://localhost:8000'), +) + +MINERU_API_TIMEOUT = ConfigVar( + 'MINERU_API_TIMEOUT', + 'rag.mineru_api_timeout', + os.getenv('MINERU_API_TIMEOUT', '300'), +) + +MINERU_API_KEY = ConfigVar( + 'MINERU_API_KEY', + 'rag.mineru_api_key', + os.getenv('MINERU_API_KEY', ''), +) + +mineru_params = os.getenv('MINERU_PARAMS', '') +try: + mineru_params = json.loads(mineru_params) +except json.JSONDecodeError: + mineru_params = {} + +MINERU_PARAMS = ConfigVar( + 'MINERU_PARAMS', + 'rag.mineru_params', + mineru_params, +) + +EXTERNAL_DOCUMENT_LOADER_URL = ConfigVar( + 'EXTERNAL_DOCUMENT_LOADER_URL', + 'rag.external_document_loader_url', + os.getenv('EXTERNAL_DOCUMENT_LOADER_URL', ''), +) + +EXTERNAL_DOCUMENT_LOADER_API_KEY = ConfigVar( + 'EXTERNAL_DOCUMENT_LOADER_API_KEY', + 'rag.external_document_loader_api_key', + os.getenv('EXTERNAL_DOCUMENT_LOADER_API_KEY', ''), +) + +TIKA_SERVER_URL = ConfigVar( + 'TIKA_SERVER_URL', + 'rag.tika_server_url', + os.getenv('TIKA_SERVER_URL', 'http://tika:9998'), # Default for sidecar deployment +) + +DOCLING_SERVER_URL = ConfigVar( + 'DOCLING_SERVER_URL', + 'rag.docling_server_url', + os.getenv('DOCLING_SERVER_URL', 'http://docling:5001'), +) + +DOCLING_API_KEY = ConfigVar( + 'DOCLING_API_KEY', + 'rag.docling_api_key', + os.getenv('DOCLING_API_KEY', ''), +) + +docling_params = os.getenv('DOCLING_PARAMS', '') +try: + docling_params = json.loads(docling_params) +except json.JSONDecodeError: + docling_params = {} + +DOCLING_PARAMS = ConfigVar( + 'DOCLING_PARAMS', + 'rag.docling_params', + docling_params, +) + +DOCUMENT_INTELLIGENCE_ENDPOINT = ConfigVar( + 'DOCUMENT_INTELLIGENCE_ENDPOINT', + 'rag.document_intelligence_endpoint', + os.getenv('DOCUMENT_INTELLIGENCE_ENDPOINT', ''), +) + +DOCUMENT_INTELLIGENCE_KEY = ConfigVar( + 'DOCUMENT_INTELLIGENCE_KEY', + 'rag.document_intelligence_key', + os.getenv('DOCUMENT_INTELLIGENCE_KEY', ''), +) + +DOCUMENT_INTELLIGENCE_MODEL = ConfigVar( + 'DOCUMENT_INTELLIGENCE_MODEL', + 'rag.document_intelligence_model', + os.getenv('DOCUMENT_INTELLIGENCE_MODEL', 'prebuilt-layout'), +) + +MISTRAL_OCR_API_BASE_URL = ConfigVar( + 'MISTRAL_OCR_API_BASE_URL', + 'rag.MISTRAL_OCR_API_BASE_URL', + os.getenv('MISTRAL_OCR_API_BASE_URL', 'https://api.mistral.ai/v1'), +) + +MISTRAL_OCR_API_KEY = ConfigVar( + 'MISTRAL_OCR_API_KEY', + 'rag.mistral_ocr_api_key', + os.getenv('MISTRAL_OCR_API_KEY', ''), +) + +PADDLEOCR_VL_BASE_URL = ConfigVar( + 'PADDLEOCR_VL_BASE_URL', + 'rag.paddleocr_vl_base_url', + os.getenv('PADDLEOCR_VL_BASE_URL', 'http://localhost:8080'), +) + +PADDLEOCR_VL_TOKEN = ConfigVar( + 'PADDLEOCR_VL_TOKEN', + 'rag.paddleocr_vl_token', + os.getenv('PADDLEOCR_VL_TOKEN', ''), +) + +BYPASS_EMBEDDING_AND_RETRIEVAL = ConfigVar( + 'BYPASS_EMBEDDING_AND_RETRIEVAL', + 'rag.bypass_embedding_and_retrieval', + os.getenv('BYPASS_EMBEDDING_AND_RETRIEVAL', 'False').lower() == 'true', +) + + +RAG_TOP_K = ConfigVar('RAG_TOP_K', 'rag.top_k', int(os.getenv('RAG_TOP_K', '3'))) +RAG_TOP_K_RERANKER = ConfigVar( + 'RAG_TOP_K_RERANKER', + 'rag.top_k_reranker', + int(os.getenv('RAG_TOP_K_RERANKER', '3')), +) +RAG_RELEVANCE_THRESHOLD = ConfigVar( + 'RAG_RELEVANCE_THRESHOLD', + 'rag.relevance_threshold', + float(os.getenv('RAG_RELEVANCE_THRESHOLD', '0.0')), +) +RAG_HYBRID_BM25_WEIGHT = ConfigVar( + 'RAG_HYBRID_BM25_WEIGHT', + 'rag.hybrid_bm25_weight', + float(os.getenv('RAG_HYBRID_BM25_WEIGHT', '0.5')), +) + +ENABLE_RAG_HYBRID_SEARCH = ConfigVar( + 'ENABLE_RAG_HYBRID_SEARCH', + 'rag.enable_hybrid_search', + os.getenv('ENABLE_RAG_HYBRID_SEARCH', '').lower() == 'true', +) + +ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS = ConfigVar( + 'ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS', + 'rag.enable_hybrid_search_enriched_texts', + os.getenv('ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS', 'False').lower() == 'true', +) + +RAG_FULL_CONTEXT = ConfigVar( + 'RAG_FULL_CONTEXT', + 'rag.full_context', + os.getenv('RAG_FULL_CONTEXT', 'False').lower() == 'true', +) + +RAG_FILE_MAX_COUNT = ConfigVar( + 'RAG_FILE_MAX_COUNT', + 'rag.file.max_count', + (int(os.getenv('RAG_FILE_MAX_COUNT')) if os.getenv('RAG_FILE_MAX_COUNT') else None), +) + +RAG_FILE_MAX_SIZE = ConfigVar( + 'RAG_FILE_MAX_SIZE', + 'rag.file.max_size', + (int(os.getenv('RAG_FILE_MAX_SIZE')) if os.getenv('RAG_FILE_MAX_SIZE') else None), +) + +FILE_IMAGE_COMPRESSION_WIDTH = ConfigVar( + 'FILE_IMAGE_COMPRESSION_WIDTH', + 'file.image_compression_width', + (int(os.getenv('FILE_IMAGE_COMPRESSION_WIDTH')) if os.getenv('FILE_IMAGE_COMPRESSION_WIDTH') else None), +) + +FILE_IMAGE_COMPRESSION_HEIGHT = ConfigVar( + 'FILE_IMAGE_COMPRESSION_HEIGHT', + 'file.image_compression_height', + (int(os.getenv('FILE_IMAGE_COMPRESSION_HEIGHT')) if os.getenv('FILE_IMAGE_COMPRESSION_HEIGHT') else None), +) + + +RAG_ALLOWED_FILE_EXTENSIONS = ConfigVar( + 'RAG_ALLOWED_FILE_EXTENSIONS', + 'rag.file.allowed_extensions', + [ext.strip() for ext in os.getenv('RAG_ALLOWED_FILE_EXTENSIONS', '').split(',') if ext.strip()], +) + +RAG_EMBEDDING_ENGINE = ConfigVar( + 'RAG_EMBEDDING_ENGINE', + 'rag.embedding_engine', + os.getenv('RAG_EMBEDDING_ENGINE', ''), +) + +PDF_EXTRACT_IMAGES = ConfigVar( + 'PDF_EXTRACT_IMAGES', + 'rag.pdf_extract_images', + os.getenv('PDF_EXTRACT_IMAGES', 'False').lower() == 'true', +) + +PDF_LOADER_MODE = ConfigVar( + 'PDF_LOADER_MODE', + 'rag.pdf_loader_mode', + os.getenv('PDF_LOADER_MODE', 'page'), +) + +RAG_EMBEDDING_MODEL = ConfigVar( + 'RAG_EMBEDDING_MODEL', + 'rag.embedding_model', + os.getenv('RAG_EMBEDDING_MODEL', 'sentence-transformers/all-MiniLM-L6-v2'), +) +log.info(f'Embedding model set: {RAG_EMBEDDING_MODEL.value}') + +RAG_EMBEDDING_MODEL_AUTO_UPDATE = ( + not OFFLINE_MODE and os.getenv('RAG_EMBEDDING_MODEL_AUTO_UPDATE', 'True').lower() == 'true' +) + +RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE = os.getenv('RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE', 'True').lower() == 'true' + +RAG_EMBEDDING_BATCH_SIZE = ConfigVar( + 'RAG_EMBEDDING_BATCH_SIZE', + 'rag.embedding_batch_size', + int(os.getenv('RAG_EMBEDDING_BATCH_SIZE') or os.getenv('RAG_EMBEDDING_OPENAI_BATCH_SIZE', '1')), +) + +ENABLE_ASYNC_EMBEDDING = ConfigVar( + 'ENABLE_ASYNC_EMBEDDING', + 'rag.enable_async_embedding', + os.getenv('ENABLE_ASYNC_EMBEDDING', 'True').lower() == 'true', +) + +RAG_EMBEDDING_CONCURRENT_REQUESTS = ConfigVar( + 'RAG_EMBEDDING_CONCURRENT_REQUESTS', + 'rag.embedding_concurrent_requests', + int(os.getenv('RAG_EMBEDDING_CONCURRENT_REQUESTS', '0')), +) + +RAG_EMBEDDING_QUERY_PREFIX = os.getenv('RAG_EMBEDDING_QUERY_PREFIX', None) + +RAG_EMBEDDING_CONTENT_PREFIX = os.getenv('RAG_EMBEDDING_CONTENT_PREFIX', None) + +RAG_EMBEDDING_PREFIX_FIELD_NAME = os.getenv('RAG_EMBEDDING_PREFIX_FIELD_NAME', None) + +RAG_RERANKING_ENGINE = ConfigVar( + 'RAG_RERANKING_ENGINE', + 'rag.reranking_engine', + os.getenv('RAG_RERANKING_ENGINE', ''), +) + +RAG_RERANKING_MODEL = ConfigVar( + 'RAG_RERANKING_MODEL', + 'rag.reranking_model', + os.getenv('RAG_RERANKING_MODEL', ''), +) +if RAG_RERANKING_MODEL.value != '': + log.info(f'Reranking model set: {RAG_RERANKING_MODEL.value}') + + +RAG_RERANKING_MODEL_AUTO_UPDATE = ( + not OFFLINE_MODE and os.getenv('RAG_RERANKING_MODEL_AUTO_UPDATE', 'True').lower() == 'true' +) + +RAG_RERANKING_MODEL_TRUST_REMOTE_CODE = os.getenv('RAG_RERANKING_MODEL_TRUST_REMOTE_CODE', 'True').lower() == 'true' + +RAG_RERANKING_BATCH_SIZE = ConfigVar( + 'RAG_RERANKING_BATCH_SIZE', + 'rag.reranking_batch_size', + int(os.getenv('RAG_RERANKING_BATCH_SIZE', '32')), +) + +RAG_EXTERNAL_RERANKER_URL = ConfigVar( + 'RAG_EXTERNAL_RERANKER_URL', + 'rag.external_reranker_url', + os.getenv('RAG_EXTERNAL_RERANKER_URL', ''), +) + +RAG_EXTERNAL_RERANKER_API_KEY = ConfigVar( + 'RAG_EXTERNAL_RERANKER_API_KEY', + 'rag.external_reranker_api_key', + os.getenv('RAG_EXTERNAL_RERANKER_API_KEY', ''), +) + +RAG_EXTERNAL_RERANKER_TIMEOUT = ConfigVar( + 'RAG_EXTERNAL_RERANKER_TIMEOUT', + 'rag.external_reranker_timeout', + os.getenv('RAG_EXTERNAL_RERANKER_TIMEOUT', ''), +) + + +RAG_TEXT_SPLITTER = ConfigVar( + 'RAG_TEXT_SPLITTER', + 'rag.text_splitter', + os.getenv('RAG_TEXT_SPLITTER', ''), +) + +ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER = ConfigVar( + 'ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER', + 'rag.enable_markdown_header_text_splitter', + os.getenv('ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER', 'True').lower() == 'true', +) + + +TIKTOKEN_CACHE_DIR = os.getenv('TIKTOKEN_CACHE_DIR', f'{CACHE_DIR}/tiktoken') +TIKTOKEN_ENCODING_NAME = ConfigVar( + 'TIKTOKEN_ENCODING_NAME', + 'rag.tiktoken_encoding_name', + os.getenv('TIKTOKEN_ENCODING_NAME', 'cl100k_base'), +) + + +CHUNK_SIZE = ConfigVar('CHUNK_SIZE', 'rag.chunk_size', int(os.getenv('CHUNK_SIZE', '1000'))) + +CHUNK_MIN_SIZE_TARGET = ConfigVar( + 'CHUNK_MIN_SIZE_TARGET', + 'rag.chunk_min_size_target', + int(os.getenv('CHUNK_MIN_SIZE_TARGET', '0')), +) + +CHUNK_OVERLAP = ConfigVar( + 'CHUNK_OVERLAP', + 'rag.chunk_overlap', + int(os.getenv('CHUNK_OVERLAP', '100')), +) + +DEFAULT_RAG_TEMPLATE = """### Task: +Respond to the user query using the provided context, incorporating inline citations in the format [id] **only when the tag includes an explicit id attribute** (e.g., ). + +### Guidelines: +- If you don't know the answer, clearly state that. +- If uncertain, ask the user for clarification. +- Respond in the same language as the user's query. +- If the context is unreadable or of poor quality, inform the user and provide the best possible answer. +- If the answer isn't present in the context but you possess the knowledge, explain this to the user and provide the answer using your own understanding. +- **Only include inline citations using [id] (e.g., [1], [2]) when the tag includes an id attribute.** +- Do not cite if the tag does not contain an id attribute. +- Do not use XML tags in your response. +- Ensure citations are concise and directly related to the information provided. + +### Example of Citation: +If the user asks about a specific topic and the information is found in a source with a provided id attribute, the response should include the citation like in the following example: +* "According to the study, the proposed method increases efficiency by 20% [1]." + +### Output: +Provide a clear and direct response to the user's query, including inline citations in the format [id] only when the tag with id attribute is present in the context. + + +{{CONTEXT}} + +""" + +RAG_TEMPLATE = ConfigVar( + 'RAG_TEMPLATE', + 'rag.template', + os.getenv('RAG_TEMPLATE', DEFAULT_RAG_TEMPLATE), +) + +RAG_OPENAI_API_BASE_URL = ConfigVar( + 'RAG_OPENAI_API_BASE_URL', + 'rag.openai_api_base_url', + os.getenv('RAG_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), +) +RAG_OPENAI_API_KEY = ConfigVar( + 'RAG_OPENAI_API_KEY', + 'rag.openai_api_key', + os.getenv('RAG_OPENAI_API_KEY', OPENAI_API_KEY), +) + +RAG_AZURE_OPENAI_BASE_URL = ConfigVar( + 'RAG_AZURE_OPENAI_BASE_URL', + 'rag.azure_openai.base_url', + os.getenv('RAG_AZURE_OPENAI_BASE_URL', ''), +) +RAG_AZURE_OPENAI_API_KEY = ConfigVar( + 'RAG_AZURE_OPENAI_API_KEY', + 'rag.azure_openai.api_key', + os.getenv('RAG_AZURE_OPENAI_API_KEY', ''), +) +RAG_AZURE_OPENAI_API_VERSION = ConfigVar( + 'RAG_AZURE_OPENAI_API_VERSION', + 'rag.azure_openai.api_version', + os.getenv('RAG_AZURE_OPENAI_API_VERSION', ''), +) + +RAG_OLLAMA_BASE_URL = ConfigVar( + 'RAG_OLLAMA_BASE_URL', + 'rag.ollama.url', + os.getenv('RAG_OLLAMA_BASE_URL', OLLAMA_BASE_URL), +) + +RAG_OLLAMA_API_KEY = ConfigVar( + 'RAG_OLLAMA_API_KEY', + 'rag.ollama.key', + os.getenv('RAG_OLLAMA_API_KEY', ''), +) + + +ENABLE_RAG_LOCAL_WEB_FETCH = os.getenv('ENABLE_RAG_LOCAL_WEB_FETCH', 'False').lower() == 'true' + + +DEFAULT_WEB_FETCH_FILTER_LIST = [ + '!169.254.169.254', + '!fd00:ec2::254', + '!metadata.google.internal', + '!metadata.azure.com', + '!100.100.100.200', +] + +web_fetch_filter_list = os.getenv('WEB_FETCH_FILTER_LIST', '') +if web_fetch_filter_list == '': + web_fetch_filter_list = [] +else: + web_fetch_filter_list = [item.strip() for item in web_fetch_filter_list.split(',') if item.strip()] + +WEB_FETCH_FILTER_LIST = list(set(DEFAULT_WEB_FETCH_FILTER_LIST + web_fetch_filter_list)) + + +YOUTUBE_LOADER_LANGUAGE = ConfigVar( + 'YOUTUBE_LOADER_LANGUAGE', + 'rag.youtube_loader_language', + os.getenv('YOUTUBE_LOADER_LANGUAGE', 'en').split(','), +) + +YOUTUBE_LOADER_PROXY_URL = ConfigVar( + 'YOUTUBE_LOADER_PROXY_URL', + 'rag.youtube_loader_proxy_url', + os.getenv('YOUTUBE_LOADER_PROXY_URL', ''), +) + + +#################################### +# Web Search (RAG) +#################################### + +ENABLE_WEB_SEARCH = ConfigVar( + 'ENABLE_WEB_SEARCH', + 'rag.web.search.enable', + os.getenv('ENABLE_WEB_SEARCH', 'False').lower() == 'true', +) + +WEB_SEARCH_ENGINE = ConfigVar( + 'WEB_SEARCH_ENGINE', + 'rag.web.search.engine', + os.getenv('WEB_SEARCH_ENGINE', ''), +) + +BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ConfigVar( + 'BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL', + 'rag.web.search.bypass_embedding_and_retrieval', + os.getenv('BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL', 'False').lower() == 'true', +) + + +BYPASS_WEB_SEARCH_WEB_LOADER = ConfigVar( + 'BYPASS_WEB_SEARCH_WEB_LOADER', + 'rag.web.search.bypass_web_loader', + os.getenv('BYPASS_WEB_SEARCH_WEB_LOADER', 'False').lower() == 'true', +) + +WEB_SEARCH_RESULT_COUNT = ConfigVar( + 'WEB_SEARCH_RESULT_COUNT', + 'rag.web.search.result_count', + int(os.getenv('WEB_SEARCH_RESULT_COUNT', '3')), +) + + +try: + web_search_domain_filter_list = json.loads(os.getenv('WEB_SEARCH_DOMAIN_FILTER_LIST', '[]')) +except Exception as e: + web_search_domain_filter_list = [ + # "wikipedia.com", + # "wikimedia.org", + # "wikidata.org", + # "!stackoverflow.com", + ] + +# You can provide a list of your own websites to filter after performing a web search. +# This ensures the highest level of safety and reliability of the information sources. +WEB_SEARCH_DOMAIN_FILTER_LIST = ConfigVar( + 'WEB_SEARCH_DOMAIN_FILTER_LIST', + 'rag.web.search.domain.filter_list', + web_search_domain_filter_list, +) + +WEB_SEARCH_CONCURRENT_REQUESTS = ConfigVar( + 'WEB_SEARCH_CONCURRENT_REQUESTS', + 'rag.web.search.concurrent_requests', + int(os.getenv('WEB_SEARCH_CONCURRENT_REQUESTS', '0')), +) + +WEB_FETCH_MAX_CONTENT_LENGTH = ConfigVar( + 'WEB_FETCH_MAX_CONTENT_LENGTH', + 'rag.web.fetch.max_content_length', + (int(os.getenv('WEB_FETCH_MAX_CONTENT_LENGTH')) if os.getenv('WEB_FETCH_MAX_CONTENT_LENGTH') else None), +) + +WEB_LOADER_ENGINE = ConfigVar( + 'WEB_LOADER_ENGINE', + 'rag.web.loader.engine', + os.getenv('WEB_LOADER_ENGINE', ''), +) + + +WEB_LOADER_CONCURRENT_REQUESTS = ConfigVar( + 'WEB_LOADER_CONCURRENT_REQUESTS', + 'rag.web.loader.concurrent_requests', + int(os.getenv('WEB_LOADER_CONCURRENT_REQUESTS', '10')), +) + +WEB_LOADER_TIMEOUT = ConfigVar( + 'WEB_LOADER_TIMEOUT', + 'rag.web.loader.timeout', + os.getenv('WEB_LOADER_TIMEOUT', ''), +) + + +ENABLE_WEB_LOADER_SSL_VERIFICATION = ConfigVar( + 'ENABLE_WEB_LOADER_SSL_VERIFICATION', + 'rag.web.loader.ssl_verification', + os.getenv('ENABLE_WEB_LOADER_SSL_VERIFICATION', 'True').lower() == 'true', +) + +WEB_SEARCH_TRUST_ENV = ConfigVar( + 'WEB_SEARCH_TRUST_ENV', + 'rag.web.search.trust_env', + os.getenv('WEB_SEARCH_TRUST_ENV', 'True').lower() == 'true', +) + + +OLLAMA_CLOUD_WEB_SEARCH_API_KEY = ConfigVar( + 'OLLAMA_CLOUD_WEB_SEARCH_API_KEY', + 'rag.web.search.ollama_cloud_api_key', + os.getenv('OLLAMA_CLOUD_API_KEY', ''), +) + +SEARXNG_QUERY_URL = ConfigVar( + 'SEARXNG_QUERY_URL', + 'rag.web.search.searxng_query_url', + os.getenv('SEARXNG_QUERY_URL', ''), +) + +SEARXNG_LANGUAGE = ConfigVar( + 'SEARXNG_LANGUAGE', + 'rag.web.search.searxng_language', + os.getenv('SEARXNG_LANGUAGE', 'all'), +) + +YACY_QUERY_URL = ConfigVar( + 'YACY_QUERY_URL', + 'rag.web.search.yacy_query_url', + os.getenv('YACY_QUERY_URL', ''), +) + +YACY_USERNAME = ConfigVar( + 'YACY_USERNAME', + 'rag.web.search.yacy_username', + os.getenv('YACY_USERNAME', ''), +) + +YACY_PASSWORD = ConfigVar( + 'YACY_PASSWORD', + 'rag.web.search.yacy_password', + os.getenv('YACY_PASSWORD', ''), +) + +GOOGLE_PSE_API_KEY = ConfigVar( + 'GOOGLE_PSE_API_KEY', + 'rag.web.search.google_pse_api_key', + os.getenv('GOOGLE_PSE_API_KEY', ''), +) + +GOOGLE_PSE_ENGINE_ID = ConfigVar( + 'GOOGLE_PSE_ENGINE_ID', + 'rag.web.search.google_pse_engine_id', + os.getenv('GOOGLE_PSE_ENGINE_ID', ''), +) + +BRAVE_SEARCH_API_KEY = ConfigVar( + 'BRAVE_SEARCH_API_KEY', + 'rag.web.search.brave_search_api_key', + os.getenv('BRAVE_SEARCH_API_KEY', ''), +) + +BRAVE_SEARCH_CONTEXT_TOKENS = ConfigVar( + 'BRAVE_SEARCH_CONTEXT_TOKENS', + 'rag.web.search.brave_search_context_tokens', + int(os.getenv('BRAVE_SEARCH_CONTEXT_TOKENS', '8192')), +) + +KAGI_SEARCH_API_KEY = ConfigVar( + 'KAGI_SEARCH_API_KEY', + 'rag.web.search.kagi_search_api_key', + os.getenv('KAGI_SEARCH_API_KEY', ''), +) + +MOJEEK_SEARCH_API_KEY = ConfigVar( + 'MOJEEK_SEARCH_API_KEY', + 'rag.web.search.mojeek_search_api_key', + os.getenv('MOJEEK_SEARCH_API_KEY', ''), +) + +BOCHA_SEARCH_API_KEY = ConfigVar( + 'BOCHA_SEARCH_API_KEY', + 'rag.web.search.bocha_search_api_key', + os.getenv('BOCHA_SEARCH_API_KEY', ''), +) + +SERPSTACK_API_KEY = ConfigVar( + 'SERPSTACK_API_KEY', + 'rag.web.search.serpstack_api_key', + os.getenv('SERPSTACK_API_KEY', ''), +) + +SERPSTACK_HTTPS = ConfigVar( + 'SERPSTACK_HTTPS', + 'rag.web.search.serpstack_https', + os.getenv('SERPSTACK_HTTPS', 'True').lower() == 'true', +) + +SERPER_API_KEY = ConfigVar( + 'SERPER_API_KEY', + 'rag.web.search.serper_api_key', + os.getenv('SERPER_API_KEY', ''), +) + +SERPLY_API_KEY = ConfigVar( + 'SERPLY_API_KEY', + 'rag.web.search.serply_api_key', + os.getenv('SERPLY_API_KEY', ''), +) + +DDGS_BACKEND = ConfigVar( + 'DDGS_BACKEND', + 'rag.web.search.ddgs_backend', + os.getenv('DDGS_BACKEND', 'auto'), +) + +JINA_API_KEY = ConfigVar( + 'JINA_API_KEY', + 'rag.web.search.jina_api_key', + os.getenv('JINA_API_KEY', ''), +) + +JINA_API_BASE_URL = ConfigVar( + 'JINA_API_BASE_URL', + 'rag.web.search.jina_api_base_url', + os.getenv('JINA_API_BASE_URL', ''), +) + +SEARCHAPI_API_KEY = ConfigVar( + 'SEARCHAPI_API_KEY', + 'rag.web.search.searchapi_api_key', + os.getenv('SEARCHAPI_API_KEY', ''), +) + +SEARCHAPI_ENGINE = ConfigVar( + 'SEARCHAPI_ENGINE', + 'rag.web.search.searchapi_engine', + os.getenv('SEARCHAPI_ENGINE', ''), +) + +SERPAPI_API_KEY = ConfigVar( + 'SERPAPI_API_KEY', + 'rag.web.search.serpapi_api_key', + os.getenv('SERPAPI_API_KEY', ''), +) + +SERPAPI_ENGINE = ConfigVar( + 'SERPAPI_ENGINE', + 'rag.web.search.serpapi_engine', + os.getenv('SERPAPI_ENGINE', ''), +) + +BING_SEARCH_V7_ENDPOINT = ConfigVar( + 'BING_SEARCH_V7_ENDPOINT', + 'rag.web.search.bing_search_v7_endpoint', + os.getenv('BING_SEARCH_V7_ENDPOINT', 'https://api.bing.microsoft.com/v7.0/search'), +) + +BING_SEARCH_V7_SUBSCRIPTION_KEY = ConfigVar( + 'BING_SEARCH_V7_SUBSCRIPTION_KEY', + 'rag.web.search.bing_search_v7_subscription_key', + os.getenv('BING_SEARCH_V7_SUBSCRIPTION_KEY', ''), +) + +AZURE_AI_SEARCH_API_KEY = ConfigVar( + 'AZURE_AI_SEARCH_API_KEY', + 'rag.web.search.azure_ai_search_api_key', + os.getenv('AZURE_AI_SEARCH_API_KEY', ''), +) + +AZURE_AI_SEARCH_ENDPOINT = ConfigVar( + 'AZURE_AI_SEARCH_ENDPOINT', + 'rag.web.search.azure_ai_search_endpoint', + os.getenv('AZURE_AI_SEARCH_ENDPOINT', ''), +) + +AZURE_AI_SEARCH_INDEX_NAME = ConfigVar( + 'AZURE_AI_SEARCH_INDEX_NAME', + 'rag.web.search.azure_ai_search_index_name', + os.getenv('AZURE_AI_SEARCH_INDEX_NAME', ''), +) + +EXA_API_KEY = ConfigVar( + 'EXA_API_KEY', + 'rag.web.search.exa_api_key', + os.getenv('EXA_API_KEY', ''), +) + +PERPLEXITY_API_KEY = ConfigVar( + 'PERPLEXITY_API_KEY', + 'rag.web.search.perplexity_api_key', + os.getenv('PERPLEXITY_API_KEY', ''), +) + +PERPLEXITY_MODEL = ConfigVar( + 'PERPLEXITY_MODEL', + 'rag.web.search.perplexity_model', + os.getenv('PERPLEXITY_MODEL', 'sonar'), +) + +PERPLEXITY_SEARCH_CONTEXT_USAGE = ConfigVar( + 'PERPLEXITY_SEARCH_CONTEXT_USAGE', + 'rag.web.search.perplexity_search_context_usage', + os.getenv('PERPLEXITY_SEARCH_CONTEXT_USAGE', 'medium'), +) + +PERPLEXITY_SEARCH_API_URL = ConfigVar( + 'PERPLEXITY_SEARCH_API_URL', + 'rag.web.search.perplexity_search_api_url', + os.getenv('PERPLEXITY_SEARCH_API_URL', 'https://api.perplexity.ai/search'), +) + +SOUGOU_API_SID = ConfigVar( + 'SOUGOU_API_SID', + 'rag.web.search.sougou_api_sid', + os.getenv('SOUGOU_API_SID', ''), +) + +SOUGOU_API_SK = ConfigVar( + 'SOUGOU_API_SK', + 'rag.web.search.sougou_api_sk', + os.getenv('SOUGOU_API_SK', ''), +) + +TAVILY_API_KEY = ConfigVar( + 'TAVILY_API_KEY', + 'rag.web.search.tavily_api_key', + os.getenv('TAVILY_API_KEY', ''), +) + +TAVILY_EXTRACT_DEPTH = ConfigVar( + 'TAVILY_EXTRACT_DEPTH', + 'rag.web.search.tavily_extract_depth', + os.getenv('TAVILY_EXTRACT_DEPTH', 'basic'), +) + +PLAYWRIGHT_WS_URL = ConfigVar( + 'PLAYWRIGHT_WS_URL', + 'rag.web.loader.playwright_ws_url', + os.getenv('PLAYWRIGHT_WS_URL', ''), +) + +PLAYWRIGHT_TIMEOUT = ConfigVar( + 'PLAYWRIGHT_TIMEOUT', + 'rag.web.loader.playwright_timeout', + int(os.getenv('PLAYWRIGHT_TIMEOUT', '10000')), +) + +FIRECRAWL_API_KEY = ConfigVar( + 'FIRECRAWL_API_KEY', + 'rag.web.loader.firecrawl_api_key', + os.getenv('FIRECRAWL_API_KEY', ''), +) + +FIRECRAWL_API_BASE_URL = ConfigVar( + 'FIRECRAWL_API_BASE_URL', + 'rag.web.loader.firecrawl_api_url', + os.getenv('FIRECRAWL_API_BASE_URL', 'https://api.firecrawl.dev'), +) + +FIRECRAWL_TIMEOUT = ConfigVar( + 'FIRECRAWL_TIMEOUT', + 'rag.web.loader.firecrawl_timeout', + os.getenv('FIRECRAWL_TIMEOUT', ''), +) + +EXTERNAL_WEB_SEARCH_URL = ConfigVar( + 'EXTERNAL_WEB_SEARCH_URL', + 'rag.web.search.external_web_search_url', + os.getenv('EXTERNAL_WEB_SEARCH_URL', ''), +) + +EXTERNAL_WEB_SEARCH_API_KEY = ConfigVar( + 'EXTERNAL_WEB_SEARCH_API_KEY', + 'rag.web.search.external_web_search_api_key', + os.getenv('EXTERNAL_WEB_SEARCH_API_KEY', ''), +) + +EXTERNAL_WEB_LOADER_URL = ConfigVar( + 'EXTERNAL_WEB_LOADER_URL', + 'rag.web.loader.external_web_loader_url', + os.getenv('EXTERNAL_WEB_LOADER_URL', ''), +) + +EXTERNAL_WEB_LOADER_API_KEY = ConfigVar( + 'EXTERNAL_WEB_LOADER_API_KEY', + 'rag.web.loader.external_web_loader_api_key', + os.getenv('EXTERNAL_WEB_LOADER_API_KEY', ''), +) + +YANDEX_WEB_SEARCH_URL = ConfigVar( + 'YANDEX_WEB_SEARCH_URL', + 'rag.web.search.yandex_web_search_url', + os.getenv('YANDEX_WEB_SEARCH_URL', ''), +) + +YANDEX_WEB_SEARCH_API_KEY = ConfigVar( + 'YANDEX_WEB_SEARCH_API_KEY', + 'rag.web.search.yandex_web_search_api_key', + os.getenv('YANDEX_WEB_SEARCH_API_KEY', ''), +) + +YANDEX_WEB_SEARCH_CONFIG = ConfigVar( + 'YANDEX_WEB_SEARCH_CONFIG', + 'rag.web.search.yandex_web_search_config', + os.getenv('YANDEX_WEB_SEARCH_CONFIG', ''), +) + +YOUCOM_API_KEY = ConfigVar( + 'YOUCOM_API_KEY', + 'rag.web.search.youcom_api_key', + os.getenv('YOUCOM_API_KEY', ''), +) + +#################################### +# Images +#################################### + +ENABLE_IMAGE_GENERATION = ConfigVar( + 'ENABLE_IMAGE_GENERATION', + 'image_generation.enable', + os.getenv('ENABLE_IMAGE_GENERATION', '').lower() == 'true', +) + +IMAGE_GENERATION_ENGINE = ConfigVar( + 'IMAGE_GENERATION_ENGINE', + 'image_generation.engine', + os.getenv('IMAGE_GENERATION_ENGINE', 'openai'), +) + +IMAGE_GENERATION_MODEL = ConfigVar( + 'IMAGE_GENERATION_MODEL', + 'image_generation.model', + os.getenv('IMAGE_GENERATION_MODEL', ''), +) + +# Regex pattern for models that support IMAGE_SIZE = "auto". +IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN = os.getenv('IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN', '^gpt-image') + +# Regex pattern for models that return URLs instead of base64 data. +IMAGE_URL_RESPONSE_MODELS_REGEX_PATTERN = os.getenv('IMAGE_URL_RESPONSE_MODELS_REGEX_PATTERN', '^gpt-image') + +IMAGE_SIZE = ConfigVar('IMAGE_SIZE', 'image_generation.size', os.getenv('IMAGE_SIZE', '512x512')) + +IMAGE_STEPS = ConfigVar('IMAGE_STEPS', 'image_generation.steps', int(os.getenv('IMAGE_STEPS', 50))) + +ENABLE_IMAGE_PROMPT_GENERATION = ConfigVar( + 'ENABLE_IMAGE_PROMPT_GENERATION', + 'image_generation.prompt.enable', + os.getenv('ENABLE_IMAGE_PROMPT_GENERATION', 'true').lower() == 'true', +) + +AUTOMATIC1111_BASE_URL = ConfigVar( + 'AUTOMATIC1111_BASE_URL', + 'image_generation.automatic1111.base_url', + os.getenv('AUTOMATIC1111_BASE_URL', ''), +) +AUTOMATIC1111_API_AUTH = ConfigVar( + 'AUTOMATIC1111_API_AUTH', + 'image_generation.automatic1111.api_auth', + os.getenv('AUTOMATIC1111_API_AUTH', ''), +) + +automatic1111_params = os.getenv('AUTOMATIC1111_PARAMS', '') +try: + automatic1111_params = json.loads(automatic1111_params) +except json.JSONDecodeError: + automatic1111_params = {} + +AUTOMATIC1111_PARAMS = ConfigVar( + 'AUTOMATIC1111_PARAMS', + 'image_generation.automatic1111.api_params', + automatic1111_params, +) + +COMFYUI_BASE_URL = ConfigVar( + 'COMFYUI_BASE_URL', + 'image_generation.comfyui.base_url', + os.getenv('COMFYUI_BASE_URL', ''), +) + +COMFYUI_API_KEY = ConfigVar( + 'COMFYUI_API_KEY', + 'image_generation.comfyui.api_key', + os.getenv('COMFYUI_API_KEY', ''), +) + +COMFYUI_DEFAULT_WORKFLOW = """ +{ + "3": { + "inputs": { + "seed": 0, + "steps": 20, + "cfg": 8, + "sampler_name": "euler", + "scheduler": "normal", + "denoise": 1, + "model": [ + "4", + 0 + ], + "positive": [ + "6", + 0 + ], + "negative": [ + "7", + 0 + ], + "latent_image": [ + "5", + 0 + ] + }, + "class_type": "KSampler", + "_meta": { + "title": "KSampler" + } + }, + "4": { + "inputs": { + "ckpt_name": "model.safetensors" + }, + "class_type": "CheckpointLoaderSimple", + "_meta": { + "title": "Load Checkpoint" + } + }, + "5": { + "inputs": { + "width": 512, + "height": 512, + "batch_size": 1 + }, + "class_type": "EmptyLatentImage", + "_meta": { + "title": "Empty Latent Image" + } + }, + "6": { + "inputs": { + "text": "Prompt", + "clip": [ + "4", + 1 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "7": { + "inputs": { + "text": "", + "clip": [ + "4", + 1 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "8": { + "inputs": { + "samples": [ + "3", + 0 + ], + "vae": [ + "4", + 2 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "9": { + "inputs": { + "filename_prefix": "ComfyUI", + "images": [ + "8", + 0 + ] + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + } +} +""" + + +COMFYUI_WORKFLOW = ConfigVar( + 'COMFYUI_WORKFLOW', + 'image_generation.comfyui.workflow', + os.getenv('COMFYUI_WORKFLOW', COMFYUI_DEFAULT_WORKFLOW), +) + +comfyui_workflow_nodes = os.getenv('COMFYUI_WORKFLOW_NODES', '') +try: + comfyui_workflow_nodes = json.loads(comfyui_workflow_nodes) +except json.JSONDecodeError: + comfyui_workflow_nodes = [] + +COMFYUI_WORKFLOW_NODES = ConfigVar( + 'COMFYUI_WORKFLOW_NODES', + 'image_generation.comfyui.nodes', + comfyui_workflow_nodes, +) + +IMAGES_OPENAI_API_BASE_URL = ConfigVar( + 'IMAGES_OPENAI_API_BASE_URL', + 'image_generation.openai.api_base_url', + os.getenv('IMAGES_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), +) +IMAGES_OPENAI_API_VERSION = ConfigVar( + 'IMAGES_OPENAI_API_VERSION', + 'image_generation.openai.api_version', + os.getenv('IMAGES_OPENAI_API_VERSION', ''), +) + +IMAGES_OPENAI_API_KEY = ConfigVar( + 'IMAGES_OPENAI_API_KEY', + 'image_generation.openai.api_key', + os.getenv('IMAGES_OPENAI_API_KEY', OPENAI_API_KEY), +) + +images_openai_params = os.getenv('IMAGES_OPENAI_PARAMS', '') +try: + images_openai_params = json.loads(images_openai_params) +except json.JSONDecodeError: + images_openai_params = {} + + +IMAGES_OPENAI_API_PARAMS = ConfigVar('IMAGES_OPENAI_API_PARAMS', 'image_generation.openai.params', images_openai_params) + + +IMAGES_GEMINI_API_BASE_URL = ConfigVar( + 'IMAGES_GEMINI_API_BASE_URL', + 'image_generation.gemini.api_base_url', + os.getenv('IMAGES_GEMINI_API_BASE_URL', GEMINI_API_BASE_URL), +) +IMAGES_GEMINI_API_KEY = ConfigVar( + 'IMAGES_GEMINI_API_KEY', + 'image_generation.gemini.api_key', + os.getenv('IMAGES_GEMINI_API_KEY', GEMINI_API_KEY), +) + +IMAGES_GEMINI_ENDPOINT_METHOD = ConfigVar( + 'IMAGES_GEMINI_ENDPOINT_METHOD', + 'image_generation.gemini.endpoint_method', + os.getenv('IMAGES_GEMINI_ENDPOINT_METHOD', ''), +) + +ENABLE_IMAGE_EDIT = ConfigVar( + 'ENABLE_IMAGE_EDIT', + 'images.edit.enable', + os.getenv('ENABLE_IMAGE_EDIT', '').lower() == 'true', +) + +IMAGE_EDIT_ENGINE = ConfigVar( + 'IMAGE_EDIT_ENGINE', + 'images.edit.engine', + os.getenv('IMAGE_EDIT_ENGINE', 'openai'), +) + +IMAGE_EDIT_MODEL = ConfigVar( + 'IMAGE_EDIT_MODEL', + 'images.edit.model', + os.getenv('IMAGE_EDIT_MODEL', ''), +) + +IMAGE_EDIT_SIZE = ConfigVar('IMAGE_EDIT_SIZE', 'images.edit.size', os.getenv('IMAGE_EDIT_SIZE', '')) + +IMAGES_EDIT_OPENAI_API_BASE_URL = ConfigVar( + 'IMAGES_EDIT_OPENAI_API_BASE_URL', + 'images.edit.openai.api_base_url', + os.getenv('IMAGES_EDIT_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), +) +IMAGES_EDIT_OPENAI_API_VERSION = ConfigVar( + 'IMAGES_EDIT_OPENAI_API_VERSION', + 'images.edit.openai.api_version', + os.getenv('IMAGES_EDIT_OPENAI_API_VERSION', ''), +) + +IMAGES_EDIT_OPENAI_API_KEY = ConfigVar( + 'IMAGES_EDIT_OPENAI_API_KEY', + 'images.edit.openai.api_key', + os.getenv('IMAGES_EDIT_OPENAI_API_KEY', OPENAI_API_KEY), +) + +IMAGES_EDIT_GEMINI_API_BASE_URL = ConfigVar( + 'IMAGES_EDIT_GEMINI_API_BASE_URL', + 'images.edit.gemini.api_base_url', + os.getenv('IMAGES_EDIT_GEMINI_API_BASE_URL', GEMINI_API_BASE_URL), +) +IMAGES_EDIT_GEMINI_API_KEY = ConfigVar( + 'IMAGES_EDIT_GEMINI_API_KEY', + 'images.edit.gemini.api_key', + os.getenv('IMAGES_EDIT_GEMINI_API_KEY', GEMINI_API_KEY), +) + + +IMAGES_EDIT_COMFYUI_BASE_URL = ConfigVar( + 'IMAGES_EDIT_COMFYUI_BASE_URL', + 'images.edit.comfyui.base_url', + os.getenv('IMAGES_EDIT_COMFYUI_BASE_URL', ''), +) +IMAGES_EDIT_COMFYUI_API_KEY = ConfigVar( + 'IMAGES_EDIT_COMFYUI_API_KEY', + 'images.edit.comfyui.api_key', + os.getenv('IMAGES_EDIT_COMFYUI_API_KEY', ''), +) + +IMAGES_EDIT_COMFYUI_WORKFLOW = ConfigVar( + 'IMAGES_EDIT_COMFYUI_WORKFLOW', + 'images.edit.comfyui.workflow', + os.getenv('IMAGES_EDIT_COMFYUI_WORKFLOW', ''), +) + +images_edit_comfyui_workflow_nodes = os.getenv('IMAGES_EDIT_COMFYUI_WORKFLOW_NODES', '') +try: + images_edit_comfyui_workflow_nodes = json.loads(images_edit_comfyui_workflow_nodes) +except json.JSONDecodeError: + images_edit_comfyui_workflow_nodes = [] + +IMAGES_EDIT_COMFYUI_WORKFLOW_NODES = ConfigVar( + 'IMAGES_EDIT_COMFYUI_WORKFLOW_NODES', + 'images.edit.comfyui.nodes', + images_edit_comfyui_workflow_nodes, +) + +#################################### +# Audio +#################################### + +# Transcription +WHISPER_MODEL = ConfigVar( + 'WHISPER_MODEL', + 'audio.stt.whisper_model', + os.getenv('WHISPER_MODEL', 'base'), +) + +WHISPER_COMPUTE_TYPE = os.getenv('WHISPER_COMPUTE_TYPE', 'int8') +WHISPER_MODEL_DIR = os.getenv('WHISPER_MODEL_DIR', f'{CACHE_DIR}/whisper/models') +WHISPER_MODEL_AUTO_UPDATE = not OFFLINE_MODE and os.getenv('WHISPER_MODEL_AUTO_UPDATE', '').lower() == 'true' + +WHISPER_VAD_FILTER = os.getenv('WHISPER_VAD_FILTER', 'False').lower() == 'true' + +WHISPER_MULTILINGUAL = os.getenv('WHISPER_MULTILINGUAL', 'False').lower() == 'true' + +WHISPER_LANGUAGE = os.getenv('WHISPER_LANGUAGE', '').lower() or None + +# Add Deepgram configuration +DEEPGRAM_API_KEY = ConfigVar( + 'DEEPGRAM_API_KEY', + 'audio.stt.deepgram.api_key', + os.getenv('DEEPGRAM_API_KEY', ''), +) + +# ElevenLabs configuration +ELEVENLABS_API_BASE_URL = os.getenv('ELEVENLABS_API_BASE_URL', 'https://api.elevenlabs.io') + +AUDIO_STT_OPENAI_API_BASE_URL = ConfigVar( + 'AUDIO_STT_OPENAI_API_BASE_URL', + 'audio.stt.openai.api_base_url', + os.getenv('AUDIO_STT_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), +) + +AUDIO_STT_OPENAI_API_KEY = ConfigVar( + 'AUDIO_STT_OPENAI_API_KEY', + 'audio.stt.openai.api_key', + os.getenv('AUDIO_STT_OPENAI_API_KEY', OPENAI_API_KEY), +) + +AUDIO_STT_ENGINE = ConfigVar( + 'AUDIO_STT_ENGINE', + 'audio.stt.engine', + os.getenv('AUDIO_STT_ENGINE', ''), +) + +AUDIO_STT_MODEL = ConfigVar( + 'AUDIO_STT_MODEL', + 'audio.stt.model', + os.getenv('AUDIO_STT_MODEL', ''), +) + +AUDIO_STT_SUPPORTED_CONTENT_TYPES = ConfigVar( + 'AUDIO_STT_SUPPORTED_CONTENT_TYPES', + 'audio.stt.supported_content_types', + [ + content_type.strip() + for content_type in os.getenv('AUDIO_STT_SUPPORTED_CONTENT_TYPES', '').split(',') + if content_type.strip() + ], +) + +AUDIO_STT_ALLOWED_EXTENSIONS = ConfigVar( + 'AUDIO_STT_ALLOWED_EXTENSIONS', + 'audio.stt.allowed_extensions', + [ + ext.strip() + for ext in os.getenv( + 'AUDIO_STT_ALLOWED_EXTENSIONS', + 'mp3,wav,m4a,webm,ogg,flac,mp4,mpga,mpeg', + ).split(',') + if ext.strip() + ], +) + +AUDIO_STT_AZURE_API_KEY = ConfigVar( + 'AUDIO_STT_AZURE_API_KEY', + 'audio.stt.azure.api_key', + os.getenv('AUDIO_STT_AZURE_API_KEY', ''), +) + +AUDIO_STT_AZURE_REGION = ConfigVar( + 'AUDIO_STT_AZURE_REGION', + 'audio.stt.azure.region', + os.getenv('AUDIO_STT_AZURE_REGION', ''), +) + +AUDIO_STT_AZURE_LOCALES = ConfigVar( + 'AUDIO_STT_AZURE_LOCALES', + 'audio.stt.azure.locales', + os.getenv('AUDIO_STT_AZURE_LOCALES', ''), +) + +AUDIO_STT_AZURE_BASE_URL = ConfigVar( + 'AUDIO_STT_AZURE_BASE_URL', + 'audio.stt.azure.base_url', + os.getenv('AUDIO_STT_AZURE_BASE_URL', ''), +) + +AUDIO_STT_AZURE_MAX_SPEAKERS = ConfigVar( + 'AUDIO_STT_AZURE_MAX_SPEAKERS', + 'audio.stt.azure.max_speakers', + os.getenv('AUDIO_STT_AZURE_MAX_SPEAKERS', ''), +) + +AUDIO_STT_MISTRAL_API_KEY = ConfigVar( + 'AUDIO_STT_MISTRAL_API_KEY', + 'audio.stt.mistral.api_key', + os.getenv('AUDIO_STT_MISTRAL_API_KEY', ''), +) + +AUDIO_STT_MISTRAL_API_BASE_URL = ConfigVar( + 'AUDIO_STT_MISTRAL_API_BASE_URL', + 'audio.stt.mistral.api_base_url', + os.getenv('AUDIO_STT_MISTRAL_API_BASE_URL', 'https://api.mistral.ai/v1'), +) + +AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS = ConfigVar( + 'AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS', + 'audio.stt.mistral.use_chat_completions', + os.getenv('AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS', 'false').lower() == 'true', +) + +AUDIO_TTS_OPENAI_API_BASE_URL = ConfigVar( + 'AUDIO_TTS_OPENAI_API_BASE_URL', + 'audio.tts.openai.api_base_url', + os.getenv('AUDIO_TTS_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), +) +AUDIO_TTS_OPENAI_API_KEY = ConfigVar( + 'AUDIO_TTS_OPENAI_API_KEY', + 'audio.tts.openai.api_key', + os.getenv('AUDIO_TTS_OPENAI_API_KEY', OPENAI_API_KEY), +) + +audio_tts_openai_params = os.getenv('AUDIO_TTS_OPENAI_PARAMS', '') +try: + audio_tts_openai_params = json.loads(audio_tts_openai_params) +except json.JSONDecodeError: + audio_tts_openai_params = {} + +AUDIO_TTS_OPENAI_PARAMS = ConfigVar( + 'AUDIO_TTS_OPENAI_PARAMS', + 'audio.tts.openai.params', + audio_tts_openai_params, +) + + +AUDIO_TTS_API_KEY = ConfigVar( + 'AUDIO_TTS_API_KEY', + 'audio.tts.api_key', + os.getenv('AUDIO_TTS_API_KEY', ''), +) + +AUDIO_TTS_ENGINE = ConfigVar( + 'AUDIO_TTS_ENGINE', + 'audio.tts.engine', + os.getenv('AUDIO_TTS_ENGINE', ''), +) + + +AUDIO_TTS_MODEL = ConfigVar( + 'AUDIO_TTS_MODEL', + 'audio.tts.model', + os.getenv('AUDIO_TTS_MODEL', 'tts-1'), # OpenAI default model +) + +AUDIO_TTS_VOICE = ConfigVar( + 'AUDIO_TTS_VOICE', + 'audio.tts.voice', + os.getenv('AUDIO_TTS_VOICE', 'alloy'), # OpenAI default voice +) + +AUDIO_TTS_SPLIT_ON = ConfigVar( + 'AUDIO_TTS_SPLIT_ON', + 'audio.tts.split_on', + os.getenv('AUDIO_TTS_SPLIT_ON', 'punctuation'), +) + +AUDIO_TTS_AZURE_SPEECH_REGION = ConfigVar( + 'AUDIO_TTS_AZURE_SPEECH_REGION', + 'audio.tts.azure.speech_region', + os.getenv('AUDIO_TTS_AZURE_SPEECH_REGION', ''), +) + +AUDIO_TTS_AZURE_SPEECH_BASE_URL = ConfigVar( + 'AUDIO_TTS_AZURE_SPEECH_BASE_URL', + 'audio.tts.azure.speech_base_url', + os.getenv('AUDIO_TTS_AZURE_SPEECH_BASE_URL', ''), +) + +AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT = ConfigVar( + 'AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT', + 'audio.tts.azure.speech_output_format', + os.getenv('AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT', 'audio-24khz-160kbitrate-mono-mp3'), +) + +AUDIO_TTS_MISTRAL_API_KEY = ConfigVar( + 'AUDIO_TTS_MISTRAL_API_KEY', + 'audio.tts.mistral.api_key', + os.getenv('AUDIO_TTS_MISTRAL_API_KEY', ''), +) + +AUDIO_TTS_MISTRAL_API_BASE_URL = ConfigVar( + 'AUDIO_TTS_MISTRAL_API_BASE_URL', + 'audio.tts.mistral.api_base_url', + os.getenv('AUDIO_TTS_MISTRAL_API_BASE_URL', 'https://api.mistral.ai/v1'), +) + +#################################### +# WEBUI +#################################### + + +WEBUI_URL = ConfigVar('WEBUI_URL', 'webui.url', os.getenv('WEBUI_URL', '')) + + +ENABLE_SIGNUP = ConfigVar( + 'ENABLE_SIGNUP', + 'ui.enable_signup', + (False if not WEBUI_AUTH else os.getenv('ENABLE_SIGNUP', 'True').lower() == 'true'), +) + +ENABLE_LOGIN_FORM = ConfigVar( + 'ENABLE_LOGIN_FORM', + 'ui.enable_login_form', + os.getenv('ENABLE_LOGIN_FORM', 'True').lower() == 'true', +) + +ENABLE_PASSWORD_CHANGE_FORM = ConfigVar( + 'ENABLE_PASSWORD_CHANGE_FORM', + 'ui.enable_password_change_form', + os.getenv('ENABLE_PASSWORD_CHANGE_FORM', 'True').lower() == 'true', +) + +ENABLE_PASSWORD_AUTH = os.getenv('ENABLE_PASSWORD_AUTH', 'True').lower() == 'true' + +DEFAULT_LOCALE = ConfigVar( + 'DEFAULT_LOCALE', + 'ui.default_locale', + os.getenv('DEFAULT_LOCALE', ''), +) + +DEFAULT_MODELS = ConfigVar('DEFAULT_MODELS', 'ui.default_models', os.getenv('DEFAULT_MODELS', None)) + +DEFAULT_PINNED_MODELS = ConfigVar( + 'DEFAULT_PINNED_MODELS', + 'ui.default_pinned_models', + os.getenv('DEFAULT_PINNED_MODELS', None), +) + +try: + default_prompt_suggestions = json.loads(os.getenv('DEFAULT_PROMPT_SUGGESTIONS', '[]')) +except Exception as e: + log.exception(f'Error loading DEFAULT_PROMPT_SUGGESTIONS: {e}') + default_prompt_suggestions = [] +if default_prompt_suggestions == []: + default_prompt_suggestions = [ + { + 'title': ['Help me study', 'vocabulary for a college entrance exam'], + 'content': "Help me study vocabulary: write a sentence for me to fill in the blank, and I'll try to pick the correct option.", + }, + { + 'title': ['Give me ideas', "for what to do with my kids' art"], + 'content': "What are 5 creative things I could do with my kids' art? I don't want to throw them away, but it's also so much clutter.", + }, + { + 'title': ['Tell me a fun fact', 'about the Roman Empire'], + 'content': 'Tell me a random fun fact about the Roman Empire', + }, + { + 'title': ['Show me a code snippet', "of a website's sticky header"], + 'content': "Show me a code snippet of a website's sticky header in CSS and JavaScript.", + }, + { + 'title': [ + 'Explain options trading', + "if I'm familiar with buying and selling stocks", + ], + 'content': "Explain options trading in simple terms if I'm familiar with buying and selling stocks.", + }, + { + 'title': ['Overcome procrastination', 'give me tips'], + 'content': 'Could you start by asking me about instances when I procrastinate the most and then give me some suggestions to overcome it?', + }, + ] + +DEFAULT_PROMPT_SUGGESTIONS = ConfigVar( + 'DEFAULT_PROMPT_SUGGESTIONS', + 'ui.prompt_suggestions', + default_prompt_suggestions, +) + +MODEL_ORDER_LIST = ConfigVar( + 'MODEL_ORDER_LIST', + 'ui.model_order_list', + [], +) + +try: + default_model_metadata = json.loads(os.getenv('DEFAULT_MODEL_METADATA', '{}')) +except Exception as e: + log.exception(f'Error loading DEFAULT_MODEL_METADATA: {e}') + default_model_metadata = {} + +DEFAULT_MODEL_METADATA = ConfigVar( + 'DEFAULT_MODEL_METADATA', + 'models.default_metadata', + default_model_metadata, +) + +try: + default_model_params = json.loads(os.getenv('DEFAULT_MODEL_PARAMS', '{}')) +except Exception as e: + log.exception(f'Error loading DEFAULT_MODEL_PARAMS: {e}') + default_model_params = {} + +DEFAULT_MODEL_PARAMS = ConfigVar( + 'DEFAULT_MODEL_PARAMS', + 'models.default_params', + default_model_params, +) + +DEFAULT_USER_ROLE = ConfigVar( + 'DEFAULT_USER_ROLE', + 'ui.default_user_role', + os.getenv('DEFAULT_USER_ROLE', 'pending'), +) + +DEFAULT_GROUP_ID = ConfigVar( + 'DEFAULT_GROUP_ID', + 'ui.default_group_id', + os.getenv('DEFAULT_GROUP_ID', ''), +) + +PENDING_USER_OVERLAY_TITLE = ConfigVar( + 'PENDING_USER_OVERLAY_TITLE', + 'ui.pending_user_overlay_title', + os.getenv('PENDING_USER_OVERLAY_TITLE', ''), +) + +PENDING_USER_OVERLAY_CONTENT = ConfigVar( + 'PENDING_USER_OVERLAY_CONTENT', + 'ui.pending_user_overlay_content', + os.getenv('PENDING_USER_OVERLAY_CONTENT', ''), +) + + +RESPONSE_WATERMARK = ConfigVar( + 'RESPONSE_WATERMARK', + 'ui.watermark', + os.getenv('RESPONSE_WATERMARK', ''), +) + +IFRAME_CSP = os.getenv('IFRAME_CSP', '') + +USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT', 'False').lower() == 'true' +) + + +USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + + +USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + + +USER_PERMISSIONS_NOTES_ALLOW_SHARING = os.getenv('USER_PERMISSIONS_NOTES_ALLOW_SHARING', 'False').lower() == 'true' + + +MISTRAL_OCR_USE_BASE64 = PersistentConfig( + "MISTRAL_OCR_USE_BASE64", + "rag.mistral_ocr_use_base64", + os.environ.get("MISTRAL_OCR_USE_BASE64", "False").lower() == "true", +) + +MISTRAL_OCR_MODEL = PersistentConfig( + "MISTRAL_OCR_MODEL", + "rag.mistral_ocr_model", + os.getenv("MISTRAL_OCR_MODEL", "mistral-ocr-latest"), +) + +PADDLEOCR_VL_BASE_URL = PersistentConfig( + 'PADDLEOCR_VL_BASE_URL', + 'rag.paddleocr_vl_base_url', + os.getenv('PADDLEOCR_VL_BASE_URL', 'http://localhost:8080'), + +USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_CALENDAR_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_CALENDAR_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_ACCESS_GRANTS_ALLOW_USERS = ( + os.getenv('USER_PERMISSIONS_ACCESS_GRANTS_ALLOW_USERS', 'True').lower() == 'true' +) + + +USER_PERMISSIONS_CHAT_CONTROLS = os.getenv('USER_PERMISSIONS_CHAT_CONTROLS', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_VALVES = os.getenv('USER_PERMISSIONS_CHAT_VALVES', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_SYSTEM_PROMPT = os.getenv('USER_PERMISSIONS_CHAT_SYSTEM_PROMPT', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_PARAMS = os.getenv('USER_PERMISSIONS_CHAT_PARAMS', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_FILE_UPLOAD = os.getenv('USER_PERMISSIONS_CHAT_FILE_UPLOAD', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_WEB_UPLOAD = os.getenv('USER_PERMISSIONS_CHAT_WEB_UPLOAD', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_DELETE = os.getenv('USER_PERMISSIONS_CHAT_DELETE', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_DELETE_MESSAGE = os.getenv('USER_PERMISSIONS_CHAT_DELETE_MESSAGE', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE = os.getenv('USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE = ( + os.getenv('USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE', 'True').lower() == 'true' +) + +USER_PERMISSIONS_CHAT_RATE_RESPONSE = os.getenv('USER_PERMISSIONS_CHAT_RATE_RESPONSE', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_EDIT = os.getenv('USER_PERMISSIONS_CHAT_EDIT', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_SHARE = os.getenv('USER_PERMISSIONS_CHAT_SHARE', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_ALLOW_PUBLIC_SHARING = ( + os.getenv('USER_PERMISSIONS_CHAT_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' +) + +USER_PERMISSIONS_CHAT_EXPORT = os.getenv('USER_PERMISSIONS_CHAT_EXPORT', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_STT = os.getenv('USER_PERMISSIONS_CHAT_STT', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_TTS = os.getenv('USER_PERMISSIONS_CHAT_TTS', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_CALL = os.getenv('USER_PERMISSIONS_CHAT_CALL', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_MULTIPLE_MODELS = os.getenv('USER_PERMISSIONS_CHAT_MULTIPLE_MODELS', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_TEMPORARY = os.getenv('USER_PERMISSIONS_CHAT_TEMPORARY', 'True').lower() == 'true' + +USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED = ( + os.getenv('USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED', 'False').lower() == 'true' +) + + +USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS = ( + os.getenv('USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS', 'False').lower() == 'true' +) + +USER_PERMISSIONS_FEATURES_WEB_SEARCH = os.getenv('USER_PERMISSIONS_FEATURES_WEB_SEARCH', 'True').lower() == 'true' + +USER_PERMISSIONS_FEATURES_IMAGE_GENERATION = ( + os.getenv('USER_PERMISSIONS_FEATURES_IMAGE_GENERATION', 'True').lower() == 'true' +) + +USER_PERMISSIONS_FEATURES_CODE_INTERPRETER = ( + os.getenv('USER_PERMISSIONS_FEATURES_CODE_INTERPRETER', 'True').lower() == 'true' +) + +USER_PERMISSIONS_FEATURES_FOLDERS = os.getenv('USER_PERMISSIONS_FEATURES_FOLDERS', 'True').lower() == 'true' + +USER_PERMISSIONS_FEATURES_NOTES = os.getenv('USER_PERMISSIONS_FEATURES_NOTES', 'True').lower() == 'true' + +USER_PERMISSIONS_FEATURES_CHANNELS = os.getenv('USER_PERMISSIONS_FEATURES_CHANNELS', 'True').lower() == 'true' + +USER_PERMISSIONS_FEATURES_API_KEYS = os.getenv('USER_PERMISSIONS_FEATURES_API_KEYS', 'False').lower() == 'true' + +USER_PERMISSIONS_FEATURES_MEMORIES = os.getenv('USER_PERMISSIONS_FEATURES_MEMORIES', 'True').lower() == 'true' + +USER_PERMISSIONS_FEATURES_AUTOMATIONS = os.getenv('USER_PERMISSIONS_FEATURES_AUTOMATIONS', 'False').lower() == 'true' + +USER_PERMISSIONS_FEATURES_CALENDAR = os.getenv('USER_PERMISSIONS_FEATURES_CALENDAR', 'True').lower() == 'true' + + +USER_PERMISSIONS_SETTINGS_INTERFACE = os.getenv('USER_PERMISSIONS_SETTINGS_INTERFACE', 'True').lower() == 'true' + + +DEFAULT_USER_PERMISSIONS = { + 'workspace': { + 'models': USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS, + 'knowledge': USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS, + 'prompts': USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS, + 'tools': USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS, + 'skills': USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS, + 'models_import': USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT, + 'models_export': USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT, + 'prompts_import': USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT, + 'prompts_export': USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT, + 'tools_import': USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT, + 'tools_export': USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT, + }, + 'sharing': { + 'models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING, + 'public_models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING, + 'knowledge': USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING, + 'public_knowledge': USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING, + 'prompts': USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING, + 'public_prompts': USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING, + 'tools': USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING, + 'public_tools': USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING, + 'skills': USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_SHARING, + 'public_skills': USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_PUBLIC_SHARING, + 'notes': USER_PERMISSIONS_NOTES_ALLOW_SHARING, + 'public_notes': USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING, + 'public_chats': USER_PERMISSIONS_CHAT_ALLOW_PUBLIC_SHARING, + 'public_calendars': USER_PERMISSIONS_CALENDAR_ALLOW_PUBLIC_SHARING, + }, + 'access_grants': { + 'allow_users': USER_PERMISSIONS_ACCESS_GRANTS_ALLOW_USERS, + }, + 'chat': { + 'controls': USER_PERMISSIONS_CHAT_CONTROLS, + 'valves': USER_PERMISSIONS_CHAT_VALVES, + 'system_prompt': USER_PERMISSIONS_CHAT_SYSTEM_PROMPT, + 'params': USER_PERMISSIONS_CHAT_PARAMS, + 'file_upload': USER_PERMISSIONS_CHAT_FILE_UPLOAD, + 'web_upload': USER_PERMISSIONS_CHAT_WEB_UPLOAD, + 'delete': USER_PERMISSIONS_CHAT_DELETE, + 'delete_message': USER_PERMISSIONS_CHAT_DELETE_MESSAGE, + 'continue_response': USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE, + 'regenerate_response': USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE, + 'rate_response': USER_PERMISSIONS_CHAT_RATE_RESPONSE, + 'edit': USER_PERMISSIONS_CHAT_EDIT, + 'share': USER_PERMISSIONS_CHAT_SHARE, + 'export': USER_PERMISSIONS_CHAT_EXPORT, + 'stt': USER_PERMISSIONS_CHAT_STT, + 'tts': USER_PERMISSIONS_CHAT_TTS, + 'call': USER_PERMISSIONS_CHAT_CALL, + 'multiple_models': USER_PERMISSIONS_CHAT_MULTIPLE_MODELS, + 'temporary': USER_PERMISSIONS_CHAT_TEMPORARY, + 'temporary_enforced': USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED, + }, + 'features': { + # General features + 'api_keys': USER_PERMISSIONS_FEATURES_API_KEYS, + 'notes': USER_PERMISSIONS_FEATURES_NOTES, + 'folders': USER_PERMISSIONS_FEATURES_FOLDERS, + 'channels': USER_PERMISSIONS_FEATURES_CHANNELS, + 'direct_tool_servers': USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS, + # Chat features + 'web_search': USER_PERMISSIONS_FEATURES_WEB_SEARCH, + 'image_generation': USER_PERMISSIONS_FEATURES_IMAGE_GENERATION, + 'code_interpreter': USER_PERMISSIONS_FEATURES_CODE_INTERPRETER, + 'memories': USER_PERMISSIONS_FEATURES_MEMORIES, + 'automations': USER_PERMISSIONS_FEATURES_AUTOMATIONS, + 'calendar': USER_PERMISSIONS_FEATURES_CALENDAR, + }, + 'settings': { + 'interface': USER_PERMISSIONS_SETTINGS_INTERFACE, + }, +} + +USER_PERMISSIONS = ConfigVar( + 'USER_PERMISSIONS', + 'user.permissions', + DEFAULT_USER_PERMISSIONS, +) + +ENABLE_FOLDERS = ConfigVar( + 'ENABLE_FOLDERS', + 'folders.enable', + os.getenv('ENABLE_FOLDERS', 'True').lower() == 'true', +) + +FOLDER_MAX_FILE_COUNT = ConfigVar( + 'FOLDER_MAX_FILE_COUNT', + 'folders.max_file_count', + os.getenv('FOLDER_MAX_FILE_COUNT', ''), +) + +ENABLE_CHANNELS = ConfigVar( + 'ENABLE_CHANNELS', + 'channels.enable', + os.getenv('ENABLE_CHANNELS', 'False').lower() == 'true', +) + +ENABLE_CALENDAR = ConfigVar( + 'ENABLE_CALENDAR', + 'calendar.enable', + os.getenv('ENABLE_CALENDAR', 'True').lower() == 'true', +) + +ENABLE_AUTOMATIONS = ConfigVar( + 'ENABLE_AUTOMATIONS', + 'automations.enable', + os.getenv('ENABLE_AUTOMATIONS', 'True').lower() == 'true', +) + +AUTOMATION_MAX_COUNT = ConfigVar( + 'AUTOMATION_MAX_COUNT', + 'automations.max_count', + os.getenv('AUTOMATION_MAX_COUNT', ''), +) + +AUTOMATION_MIN_INTERVAL = ConfigVar( + 'AUTOMATION_MIN_INTERVAL', + 'automations.min_interval', + os.getenv('AUTOMATION_MIN_INTERVAL', ''), +) + +ENABLE_NOTES = ConfigVar( + 'ENABLE_NOTES', + 'notes.enable', + os.getenv('ENABLE_NOTES', 'True').lower() == 'true', +) + +ENABLE_USER_STATUS = ConfigVar( + 'ENABLE_USER_STATUS', + 'users.enable_status', + os.getenv('ENABLE_USER_STATUS', 'True').lower() == 'true', +) + +ENABLE_EVALUATION_ARENA_MODELS = ConfigVar( + 'ENABLE_EVALUATION_ARENA_MODELS', + 'evaluation.arena.enable', + os.getenv('ENABLE_EVALUATION_ARENA_MODELS', 'True').lower() == 'true', +) +EVALUATION_ARENA_MODELS = ConfigVar( + 'EVALUATION_ARENA_MODELS', + 'evaluation.arena.models', + [], +) + +DEFAULT_ARENA_MODEL = { + 'id': 'arena-model', + 'name': 'Arena Model', + 'meta': { + 'profile_image_url': '/favicon.png', + 'description': 'Submit your questions to anonymous AI chatbots and vote on the best response.', + 'model_ids': None, + }, +} + +WEBHOOK_URL = ConfigVar('WEBHOOK_URL', 'webhook_url', os.getenv('WEBHOOK_URL', '')) + +ENABLE_ADMIN_EXPORT = os.getenv('ENABLE_ADMIN_EXPORT', 'True').lower() == 'true' + +ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS = os.getenv('ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS', 'True').lower() == 'true' + +BYPASS_ADMIN_ACCESS_CONTROL = ( + os.getenv( + 'BYPASS_ADMIN_ACCESS_CONTROL', + os.getenv('ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS', 'True'), + ).lower() + == 'true' +) + +ENABLE_ADMIN_CHAT_ACCESS = os.getenv('ENABLE_ADMIN_CHAT_ACCESS', 'True').lower() == 'true' + +ENABLE_ADMIN_ANALYTICS = os.getenv('ENABLE_ADMIN_ANALYTICS', 'True').lower() == 'true' + +ENABLE_COMMUNITY_SHARING = ConfigVar( + 'ENABLE_COMMUNITY_SHARING', + 'ui.enable_community_sharing', + os.getenv('ENABLE_COMMUNITY_SHARING', 'True').lower() == 'true', +) + +ENABLE_MESSAGE_RATING = ConfigVar( + 'ENABLE_MESSAGE_RATING', + 'ui.enable_message_rating', + os.getenv('ENABLE_MESSAGE_RATING', 'True').lower() == 'true', +) + +ENABLE_USER_WEBHOOKS = ConfigVar( + 'ENABLE_USER_WEBHOOKS', + 'ui.enable_user_webhooks', + os.getenv('ENABLE_USER_WEBHOOKS', 'False').lower() == 'true', +) + +# FastAPI / AnyIO settings +THREAD_POOL_SIZE = os.getenv('THREAD_POOL_SIZE', None) + +if THREAD_POOL_SIZE is not None and isinstance(THREAD_POOL_SIZE, str): + try: + THREAD_POOL_SIZE = int(THREAD_POOL_SIZE) + except ValueError: + log.warning(f'THREAD_POOL_SIZE is not a valid integer: {THREAD_POOL_SIZE}. Defaulting to None.') + THREAD_POOL_SIZE = None + + +def validate_cors_origin(origin): + parsed_url = urlparse(origin) + + # Check if the scheme is either http or https, or a custom scheme + schemes = ['http', 'https'] + CORS_ALLOW_CUSTOM_SCHEME + if parsed_url.scheme not in schemes: + raise ValueError( + f"Invalid scheme in CORS_ALLOW_ORIGIN: '{origin}'. Only 'http' and 'https' and CORS_ALLOW_CUSTOM_SCHEME are allowed." + ) + + # Ensure that the netloc (domain + port) is present, indicating it's a valid URL + if not parsed_url.netloc: + raise ValueError(f"Invalid URL structure in CORS_ALLOW_ORIGIN: '{origin}'.") + + +# For production, you should only need one host as +# fastapi serves the svelte-kit built frontend and backend from the same host and port. +# To test CORS_ALLOW_ORIGIN locally, you can set something like +# CORS_ALLOW_ORIGIN=http://localhost:5173;http://localhost:8080 +# in your .env file depending on your frontend port, 5173 in this case. +CORS_ALLOW_ORIGIN = os.getenv('CORS_ALLOW_ORIGIN', '*').split(';') + +# Allows custom URL schemes (e.g., app://) to be used as origins for CORS. +# Useful for local development or desktop clients with schemes like app:// or other custom protocols. +# Provide a semicolon-separated list of allowed schemes in the environment variable CORS_ALLOW_CUSTOM_SCHEMES. +CORS_ALLOW_CUSTOM_SCHEME = os.getenv('CORS_ALLOW_CUSTOM_SCHEME', '').split(';') + +if CORS_ALLOW_ORIGIN == ['*']: + log.warning("\n\nWARNING: CORS_ALLOW_ORIGIN IS SET TO '*' - NOT RECOMMENDED FOR PRODUCTION DEPLOYMENTS.\n") +else: + # You have to pick between a single wildcard or a list of origins. + # Doing both will result in CORS errors in the browser. + for origin in CORS_ALLOW_ORIGIN: + validate_cors_origin(origin) + + +class BannerModel(BaseModel): + id: str + type: str + title: str | None = None + content: str + dismissible: bool + timestamp: int + + +try: + banners = json.loads(os.getenv('WEBUI_BANNERS', '[]')) + banners = [BannerModel(**banner) for banner in banners] +except Exception as e: + log.exception(f'Error loading WEBUI_BANNERS: {e}') + banners = [] + +WEBUI_BANNERS = ConfigVar('WEBUI_BANNERS', 'ui.banners', banners) + + +SHOW_ADMIN_DETAILS = ConfigVar( + 'SHOW_ADMIN_DETAILS', + 'auth.admin.show', + os.getenv('SHOW_ADMIN_DETAILS', 'true').lower() == 'true', +) + +ADMIN_EMAIL = ConfigVar( + 'ADMIN_EMAIL', + 'auth.admin.email', + os.getenv('ADMIN_EMAIL', None), +) + + +#################################### +# TASKS +#################################### + + +TASK_MODEL = ConfigVar( + 'TASK_MODEL', + 'task.model.default', + os.getenv('TASK_MODEL', ''), +) + +TASK_MODEL_EXTERNAL = ConfigVar( + 'TASK_MODEL_EXTERNAL', + 'task.model.external', + os.getenv('TASK_MODEL_EXTERNAL', ''), +) + +TITLE_GENERATION_PROMPT_TEMPLATE = ConfigVar( + 'TITLE_GENERATION_PROMPT_TEMPLATE', + 'task.title.prompt_template', + os.getenv('TITLE_GENERATION_PROMPT_TEMPLATE', ''), +) + +DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """### Task: +Generate a concise, 3-5 word title with an emoji summarizing the chat history. +### Guidelines: +- The title should clearly represent the main theme or subject of the conversation. +- Use emojis that enhance understanding of the topic, but avoid quotation marks or special formatting. +- Write the title in the chat's primary language; default to English if multilingual. +- Prioritize accuracy over excessive creativity; keep it clear and simple. +- Your entire response must consist solely of the JSON object, without any introductory or concluding text. +- The output must be a single, raw JSON object, without any markdown code fences or other encapsulating text. +- Ensure no conversational text, affirmations, or explanations precede or follow the raw JSON output, as this will cause direct parsing failure. +### Output: +JSON format: { "title": "your concise title here" } +### Examples: +- { "title": "📉 Stock Market Trends" }, +- { "title": "🍪 Perfect Chocolate Chip Recipe" }, +- { "title": "Evolution of Music Streaming" }, +- { "title": "Remote Work Productivity Tips" }, +- { "title": "Artificial Intelligence in Healthcare" }, +- { "title": "🎮 Video Game Development Insights" } +### Chat History: + +{{MESSAGES:END:2}} +""" + +TAGS_GENERATION_PROMPT_TEMPLATE = ConfigVar( + 'TAGS_GENERATION_PROMPT_TEMPLATE', + 'task.tags.prompt_template', + os.getenv('TAGS_GENERATION_PROMPT_TEMPLATE', ''), +) + +DEFAULT_TAGS_GENERATION_PROMPT_TEMPLATE = """### Task: +Generate 1-3 broad tags categorizing the main themes of the chat history, along with 1-3 more specific subtopic tags. + +### Guidelines: +- Start with high-level domains (e.g. Science, Technology, Philosophy, Arts, Politics, Business, Health, Sports, Entertainment, Education) +- Consider including relevant subfields/subdomains if they are strongly represented throughout the conversation +- If content is too short (less than 3 messages) or too diverse, use only ["General"] +- Use the chat's primary language; default to English if multilingual +- Prioritize accuracy over specificity + +### Output: +JSON format: { "tags": ["tag1", "tag2", "tag3"] } + +### Chat History: + +{{MESSAGES:END:6}} +""" + +IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = ConfigVar( + 'IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE', + 'task.image.prompt_template', + os.getenv('IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE', ''), +) + +DEFAULT_IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = """### Task: +Generate a detailed prompt for am image generation task based on the given language and context. Describe the image as if you were explaining it to someone who cannot see it. Include relevant details, colors, shapes, and any other important elements. + +### Guidelines: +- Be descriptive and detailed, focusing on the most important aspects of the image. +- Avoid making assumptions or adding information not present in the image. +- Use the chat's primary language; default to English if multilingual. +- If the image is too complex, focus on the most prominent elements. + +### Output: +Strictly return in JSON format: +{ + "prompt": "Your detailed description here." +} + +### Chat History: + +{{MESSAGES:END:6}} +""" + + +FOLLOW_UP_GENERATION_PROMPT_TEMPLATE = ConfigVar( + 'FOLLOW_UP_GENERATION_PROMPT_TEMPLATE', + 'task.follow_up.prompt_template', + os.getenv('FOLLOW_UP_GENERATION_PROMPT_TEMPLATE', ''), +) + +DEFAULT_FOLLOW_UP_GENERATION_PROMPT_TEMPLATE = """### Task: +Suggest 3-5 relevant follow-up questions or prompts that the user might naturally ask next in this conversation as a **user**, based on the chat history, to help continue or deepen the discussion. +### Guidelines: +- Write all follow-up questions from the user’s point of view, directed to the assistant. +- Make questions concise, clear, and directly related to the discussed topic(s). +- Only suggest follow-ups that make sense given the chat content and do not repeat what was already covered. +- If the conversation is very short or not specific, suggest more general (but relevant) follow-ups the user might ask. +- Use the conversation's primary language; default to English if multilingual. +- Response must be a JSON object with a "follow_ups" key containing an array of strings, no extra text or formatting. +### Output: +JSON format: { "follow_ups": ["Question 1?", "Question 2?", "Question 3?"] } +### Chat History: + +{{MESSAGES:END:6}} +""" + +ENABLE_FOLLOW_UP_GENERATION = ConfigVar( + 'ENABLE_FOLLOW_UP_GENERATION', + 'task.follow_up.enable', + os.getenv('ENABLE_FOLLOW_UP_GENERATION', 'True').lower() == 'true', +) + +ENABLE_TAGS_GENERATION = ConfigVar( + 'ENABLE_TAGS_GENERATION', + 'task.tags.enable', + os.getenv('ENABLE_TAGS_GENERATION', 'True').lower() == 'true', +) + +ENABLE_TITLE_GENERATION = ConfigVar( + 'ENABLE_TITLE_GENERATION', + 'task.title.enable', + os.getenv('ENABLE_TITLE_GENERATION', 'True').lower() == 'true', +) + + +ENABLE_SEARCH_QUERY_GENERATION = ConfigVar( + 'ENABLE_SEARCH_QUERY_GENERATION', + 'task.query.search.enable', + os.getenv('ENABLE_SEARCH_QUERY_GENERATION', 'True').lower() == 'true', +) + +ENABLE_RETRIEVAL_QUERY_GENERATION = ConfigVar( + 'ENABLE_RETRIEVAL_QUERY_GENERATION', + 'task.query.retrieval.enable', + os.getenv('ENABLE_RETRIEVAL_QUERY_GENERATION', 'True').lower() == 'true', +) + + +QUERY_GENERATION_PROMPT_TEMPLATE = ConfigVar( + 'QUERY_GENERATION_PROMPT_TEMPLATE', + 'task.query.prompt_template', + os.getenv('QUERY_GENERATION_PROMPT_TEMPLATE', ''), +) + +DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE = """### Task: +Analyze the chat history to determine the necessity of generating search queries, in the given language. By default, **prioritize generating 1-3 broad and relevant search queries** unless it is absolutely certain that no additional information is required. The aim is to retrieve comprehensive, updated, and valuable information even with minimal uncertainty. If no search is unequivocally needed, return an empty list. + +### Guidelines: +- Respond **EXCLUSIVELY** with a JSON object. Any form of extra commentary, explanation, or additional text is strictly prohibited. +- When generating search queries, respond in the format: { "queries": ["query1", "query2"] }, ensuring each query is distinct, concise, and relevant to the topic. +- If and only if it is entirely certain that no useful results can be retrieved by a search, return: { "queries": [] }. +- Err on the side of suggesting search queries if there is **any chance** they might provide useful or updated information. +- Be concise and focused on composing high-quality search queries, avoiding unnecessary elaboration, commentary, or assumptions. +- Today's date is: {{CURRENT_DATE}}. +- Always prioritize providing actionable and broad queries that maximize informational coverage. + +### Output: +Strictly return in JSON format: +{ + "queries": ["query1", "query2"] +} + +### Chat History: + +{{MESSAGES:END:6}} + +""" + +ENABLE_AUTOCOMPLETE_GENERATION = ConfigVar( + 'ENABLE_AUTOCOMPLETE_GENERATION', + 'task.autocomplete.enable', + os.getenv('ENABLE_AUTOCOMPLETE_GENERATION', 'False').lower() == 'true', +) + +AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = ConfigVar( + 'AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH', + 'task.autocomplete.input_max_length', + int(os.getenv('AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH', '-1')), +) + +AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = ConfigVar( + 'AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE', + 'task.autocomplete.prompt_template', + os.getenv('AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE', ''), +) + + +DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = """### Task: +You are an autocompletion system. Continue the text in `` based on the **completion type** in `` and the given language. + +### **Instructions**: +1. Analyze `` for context and meaning. +2. Use `` to guide your output: + - **General**: Provide a natural, concise continuation. + - **Search Query**: Complete as if generating a realistic search query. +3. Start as if you are directly continuing ``. Do **not** repeat, paraphrase, or respond as a model. Simply complete the text. +4. Ensure the continuation: + - Flows naturally from ``. + - Avoids repetition, overexplaining, or unrelated ideas. +5. If unsure, return: `{ "text": "" }`. + +### **Output Rules**: +- Respond only in JSON format: `{ "text": "" }`. + +### **Examples**: +#### Example 1: +Input: +General +The sun was setting over the horizon, painting the sky +Output: +{ "text": "with vibrant shades of orange and pink." } + +#### Example 2: +Input: +Search Query +Top-rated restaurants in +Output: +{ "text": "New York City for Italian cuisine." } + +--- +### Context: + +{{MESSAGES:END:6}} + +{{TYPE}} +{{PROMPT}} +#### Output: +""" + + +VOICE_MODE_PROMPT_TEMPLATE = ConfigVar( + 'VOICE_MODE_PROMPT_TEMPLATE', + 'task.voice.prompt_template', + os.getenv('VOICE_MODE_PROMPT_TEMPLATE', ''), +) + +ENABLE_VOICE_MODE_PROMPT = ConfigVar( + 'ENABLE_VOICE_MODE_PROMPT', + 'task.voice.prompt.enable', + os.getenv('ENABLE_VOICE_MODE_PROMPT', 'True').lower() == 'true', +) + +DEFAULT_VOICE_MODE_PROMPT_TEMPLATE = """You are a friendly, concise voice assistant. + +Everything you say will be spoken aloud. +Keep responses short, clear, and natural. + +STYLE: +- Use simple words and short sentences. +- Sound warm and conversational. +- Avoid long explanations, lists, or complex phrasing. + +BEHAVIOR: +- Give the quickest helpful answer first. +- Offer extra detail only if needed. +- Ask for clarification only when necessary. + +VOICE OPTIMIZATION: +- Break information into small, easy-to-hear chunks. +- Avoid dense wording or anything that sounds like reading text. + +ERROR HANDLING: +- If unsure, say so briefly and offer options. +- If something is unsafe or impossible, decline kindly and suggest a safe alternative. + +Stay consistent, helpful, and easy to listen to.""" + +TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = ConfigVar( + 'TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE', + 'task.tools.prompt_template', + os.getenv('TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE', ''), +) + + +DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = """Available Tools: {{TOOLS}} + +Your task is to choose and return the correct tool(s) from the list of available tools based on the query. Follow these guidelines: + +- Return only the JSON object, without any additional text or explanation. + +- If no tools match the query, return an empty array: + { + "tool_calls": [] + } + +- If one or more tools match the query, construct a JSON response containing a "tool_calls" array with objects that include: + - "name": The tool's name. + - "parameters": A dictionary of required parameters and their corresponding values. + +The format for the JSON response is strictly: +{ + "tool_calls": [ + {"name": "toolName1", "parameters": {"key1": "value1"}}, + {"name": "toolName2", "parameters": {"key2": "value2"}} + ] +}""" + + +DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE = """Your task is to reflect the speaker's likely facial expression through a fitting emoji. Interpret emotions from the message and reflect their facial expression using fitting, diverse emojis (e.g., 😊, 😢, 😡, 😱). + +Message: ```{{prompt}}```""" + +DEFAULT_MOA_GENERATION_PROMPT_TEMPLATE = """You have been provided with a set of responses from various models to the latest user query: "{{prompt}}" + +Your task is to synthesize these responses into a single, high-quality response. It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability. + +Responses from models: {{responses}}""" + + +#################################### +# Auth +#################################### + +ENABLE_API_KEYS = ConfigVar( + 'ENABLE_API_KEYS', + 'auth.enable_api_keys', + os.getenv('ENABLE_API_KEYS', 'False').lower() == 'true', +) + +ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS = ConfigVar( 'ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS', 'auth.api_key.endpoint_restrictions', - os.environ.get( + os.getenv( 'ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS', - os.environ.get('ENABLE_API_KEY_ENDPOINT_RESTRICTIONS', 'False'), + os.getenv('ENABLE_API_KEY_ENDPOINT_RESTRICTIONS', 'False'), ).lower() == 'true', ) -API_KEYS_ALLOWED_ENDPOINTS = PersistentConfig( +API_KEYS_ALLOWED_ENDPOINTS = ConfigVar( 'API_KEYS_ALLOWED_ENDPOINTS', 'auth.api_key.allowed_endpoints', - os.environ.get('API_KEYS_ALLOWED_ENDPOINTS', os.environ.get('API_KEY_ALLOWED_ENDPOINTS', '')), + os.getenv('API_KEYS_ALLOWED_ENDPOINTS', os.getenv('API_KEY_ALLOWED_ENDPOINTS', '')), ) -JWT_EXPIRES_IN = PersistentConfig('JWT_EXPIRES_IN', 'auth.jwt_expiry', os.environ.get('JWT_EXPIRES_IN', '4w')) +JWT_EXPIRES_IN = ConfigVar('JWT_EXPIRES_IN', 'auth.jwt_expiry', os.getenv('JWT_EXPIRES_IN', '4w')) if JWT_EXPIRES_IN.value == '-1': log.warning( @@ -390,56 +3429,54 @@ if JWT_EXPIRES_IN.value == '-1': # OAuth config #################################### -ENABLE_OAUTH_PERSISTENT_CONFIG = os.environ.get('ENABLE_OAUTH_PERSISTENT_CONFIG', 'False').lower() == 'true' - -ENABLE_OAUTH_SIGNUP = PersistentConfig( +ENABLE_OAUTH_SIGNUP = ConfigVar( 'ENABLE_OAUTH_SIGNUP', 'oauth.enable_signup', - os.environ.get('ENABLE_OAUTH_SIGNUP', 'False').lower() == 'true', + os.getenv('ENABLE_OAUTH_SIGNUP', 'False').lower() == 'true', ) -OAUTH_REFRESH_TOKEN_INCLUDE_SCOPE = PersistentConfig( +OAUTH_REFRESH_TOKEN_INCLUDE_SCOPE = ConfigVar( 'OAUTH_REFRESH_TOKEN_INCLUDE_SCOPE', 'oauth.refresh_token_include_scope', - os.environ.get('OAUTH_REFRESH_TOKEN_INCLUDE_SCOPE', 'False').lower() == 'true', + os.getenv('OAUTH_REFRESH_TOKEN_INCLUDE_SCOPE', 'False').lower() == 'true', ) -OAUTH_MERGE_ACCOUNTS_BY_EMAIL = PersistentConfig( +OAUTH_MERGE_ACCOUNTS_BY_EMAIL = ConfigVar( 'OAUTH_MERGE_ACCOUNTS_BY_EMAIL', 'oauth.merge_accounts_by_email', - os.environ.get('OAUTH_MERGE_ACCOUNTS_BY_EMAIL', 'False').lower() == 'true', + os.getenv('OAUTH_MERGE_ACCOUNTS_BY_EMAIL', 'False').lower() == 'true', ) OAUTH_PROVIDERS = {} -GOOGLE_CLIENT_ID = PersistentConfig( +GOOGLE_CLIENT_ID = ConfigVar( 'GOOGLE_CLIENT_ID', 'oauth.google.client_id', - os.environ.get('GOOGLE_CLIENT_ID', ''), + os.getenv('GOOGLE_CLIENT_ID', ''), ) -GOOGLE_CLIENT_SECRET = PersistentConfig( +GOOGLE_CLIENT_SECRET = ConfigVar( 'GOOGLE_CLIENT_SECRET', 'oauth.google.client_secret', - os.environ.get('GOOGLE_CLIENT_SECRET', ''), + os.getenv('GOOGLE_CLIENT_SECRET', ''), ) -GOOGLE_OAUTH_SCOPE = PersistentConfig( +GOOGLE_OAUTH_SCOPE = ConfigVar( 'GOOGLE_OAUTH_SCOPE', 'oauth.google.scope', - os.environ.get('GOOGLE_OAUTH_SCOPE', 'openid email profile'), + os.getenv('GOOGLE_OAUTH_SCOPE', 'openid email profile'), ) -GOOGLE_REDIRECT_URI = PersistentConfig( +GOOGLE_REDIRECT_URI = ConfigVar( 'GOOGLE_REDIRECT_URI', 'oauth.google.redirect_uri', - os.environ.get('GOOGLE_REDIRECT_URI', ''), + os.getenv('GOOGLE_REDIRECT_URI', ''), ) GOOGLE_OAUTH_AUTHORIZE_PARAMS = {} -_google_oauth_authorize_params = os.environ.get('GOOGLE_OAUTH_AUTHORIZE_PARAMS', '') +_google_oauth_authorize_params = os.getenv('GOOGLE_OAUTH_AUTHORIZE_PARAMS', '') if _google_oauth_authorize_params: try: _parsed = json.loads(_google_oauth_authorize_params) @@ -450,288 +3487,286 @@ if _google_oauth_authorize_params: except (json.JSONDecodeError, TypeError): log.warning('GOOGLE_OAUTH_AUTHORIZE_PARAMS is not valid JSON, ignoring') -MICROSOFT_CLIENT_ID = PersistentConfig( +MICROSOFT_CLIENT_ID = ConfigVar( 'MICROSOFT_CLIENT_ID', 'oauth.microsoft.client_id', - os.environ.get('MICROSOFT_CLIENT_ID', ''), + os.getenv('MICROSOFT_CLIENT_ID', ''), ) -MICROSOFT_CLIENT_SECRET = PersistentConfig( +MICROSOFT_CLIENT_SECRET = ConfigVar( 'MICROSOFT_CLIENT_SECRET', 'oauth.microsoft.client_secret', - os.environ.get('MICROSOFT_CLIENT_SECRET', ''), + os.getenv('MICROSOFT_CLIENT_SECRET', ''), ) -MICROSOFT_CLIENT_TENANT_ID = PersistentConfig( +MICROSOFT_CLIENT_TENANT_ID = ConfigVar( 'MICROSOFT_CLIENT_TENANT_ID', 'oauth.microsoft.tenant_id', - os.environ.get('MICROSOFT_CLIENT_TENANT_ID', ''), + os.getenv('MICROSOFT_CLIENT_TENANT_ID', ''), ) -MICROSOFT_CLIENT_LOGIN_BASE_URL = PersistentConfig( +MICROSOFT_CLIENT_LOGIN_BASE_URL = ConfigVar( 'MICROSOFT_CLIENT_LOGIN_BASE_URL', 'oauth.microsoft.login_base_url', - os.environ.get('MICROSOFT_CLIENT_LOGIN_BASE_URL', 'https://login.microsoftonline.com'), + os.getenv('MICROSOFT_CLIENT_LOGIN_BASE_URL', 'https://login.microsoftonline.com'), ) -MICROSOFT_CLIENT_PICTURE_URL = PersistentConfig( +MICROSOFT_CLIENT_PICTURE_URL = ConfigVar( 'MICROSOFT_CLIENT_PICTURE_URL', 'oauth.microsoft.picture_url', - os.environ.get( + os.getenv( 'MICROSOFT_CLIENT_PICTURE_URL', 'https://graph.microsoft.com/v1.0/me/photo/$value', ), ) -MICROSOFT_OAUTH_SCOPE = PersistentConfig( +MICROSOFT_OAUTH_SCOPE = ConfigVar( 'MICROSOFT_OAUTH_SCOPE', 'oauth.microsoft.scope', - os.environ.get('MICROSOFT_OAUTH_SCOPE', 'openid email profile'), + os.getenv('MICROSOFT_OAUTH_SCOPE', 'openid email profile'), ) -MICROSOFT_REDIRECT_URI = PersistentConfig( +MICROSOFT_REDIRECT_URI = ConfigVar( 'MICROSOFT_REDIRECT_URI', 'oauth.microsoft.redirect_uri', - os.environ.get('MICROSOFT_REDIRECT_URI', ''), + os.getenv('MICROSOFT_REDIRECT_URI', ''), ) -GITHUB_CLIENT_ID = PersistentConfig( +GITHUB_CLIENT_ID = ConfigVar( 'GITHUB_CLIENT_ID', 'oauth.github.client_id', - os.environ.get('GITHUB_CLIENT_ID', ''), + os.getenv('GITHUB_CLIENT_ID', ''), ) -GITHUB_CLIENT_SECRET = PersistentConfig( +GITHUB_CLIENT_SECRET = ConfigVar( 'GITHUB_CLIENT_SECRET', 'oauth.github.client_secret', - os.environ.get('GITHUB_CLIENT_SECRET', ''), + os.getenv('GITHUB_CLIENT_SECRET', ''), ) -GITHUB_CLIENT_SCOPE = PersistentConfig( +GITHUB_CLIENT_SCOPE = ConfigVar( 'GITHUB_CLIENT_SCOPE', 'oauth.github.scope', - os.environ.get('GITHUB_CLIENT_SCOPE', 'user:email'), + os.getenv('GITHUB_CLIENT_SCOPE', 'user:email'), ) -GITHUB_CLIENT_REDIRECT_URI = PersistentConfig( +GITHUB_CLIENT_REDIRECT_URI = ConfigVar( 'GITHUB_CLIENT_REDIRECT_URI', 'oauth.github.redirect_uri', - os.environ.get('GITHUB_CLIENT_REDIRECT_URI', ''), + os.getenv('GITHUB_CLIENT_REDIRECT_URI', ''), ) -OAUTH_CLIENT_ID = PersistentConfig( +OAUTH_CLIENT_ID = ConfigVar( 'OAUTH_CLIENT_ID', 'oauth.oidc.client_id', - os.environ.get('OAUTH_CLIENT_ID', ''), + os.getenv('OAUTH_CLIENT_ID', ''), ) -OAUTH_CLIENT_SECRET = PersistentConfig( +OAUTH_CLIENT_SECRET = ConfigVar( 'OAUTH_CLIENT_SECRET', 'oauth.oidc.client_secret', - os.environ.get('OAUTH_CLIENT_SECRET', ''), + os.getenv('OAUTH_CLIENT_SECRET', ''), ) -OPENID_PROVIDER_URL = PersistentConfig( +OPENID_PROVIDER_URL = ConfigVar( 'OPENID_PROVIDER_URL', 'oauth.oidc.provider_url', - os.environ.get('OPENID_PROVIDER_URL', ''), + os.getenv('OPENID_PROVIDER_URL', ''), ) -OPENID_END_SESSION_ENDPOINT = PersistentConfig( +OPENID_END_SESSION_ENDPOINT = ConfigVar( 'OPENID_END_SESSION_ENDPOINT', 'oauth.oidc.end_session_endpoint', - os.environ.get('OPENID_END_SESSION_ENDPOINT', ''), + os.getenv('OPENID_END_SESSION_ENDPOINT', ''), ) -OPENID_REDIRECT_URI = PersistentConfig( +OPENID_REDIRECT_URI = ConfigVar( 'OPENID_REDIRECT_URI', 'oauth.oidc.redirect_uri', - os.environ.get('OPENID_REDIRECT_URI', ''), + os.getenv('OPENID_REDIRECT_URI', ''), ) -OAUTH_SCOPES = PersistentConfig( +OAUTH_SCOPES = ConfigVar( 'OAUTH_SCOPES', 'oauth.oidc.scopes', - os.environ.get('OAUTH_SCOPES', 'openid email profile'), + os.getenv('OAUTH_SCOPES', 'openid email profile'), ) -OAUTH_TIMEOUT = PersistentConfig( +OAUTH_TIMEOUT = ConfigVar( 'OAUTH_TIMEOUT', 'oauth.oidc.oauth_timeout', - os.environ.get('OAUTH_TIMEOUT', ''), + os.getenv('OAUTH_TIMEOUT', ''), ) -OAUTH_TOKEN_ENDPOINT_AUTH_METHOD = PersistentConfig( +OAUTH_TOKEN_ENDPOINT_AUTH_METHOD = ConfigVar( 'OAUTH_TOKEN_ENDPOINT_AUTH_METHOD', 'oauth.oidc.token_endpoint_auth_method', - os.environ.get('OAUTH_TOKEN_ENDPOINT_AUTH_METHOD', None), + os.getenv('OAUTH_TOKEN_ENDPOINT_AUTH_METHOD', None), ) -OAUTH_CODE_CHALLENGE_METHOD = PersistentConfig( +OAUTH_CODE_CHALLENGE_METHOD = ConfigVar( 'OAUTH_CODE_CHALLENGE_METHOD', 'oauth.oidc.code_challenge_method', - os.environ.get('OAUTH_CODE_CHALLENGE_METHOD', None), + os.getenv('OAUTH_CODE_CHALLENGE_METHOD', None), ) -OAUTH_PROVIDER_NAME = PersistentConfig( +OAUTH_PROVIDER_NAME = ConfigVar( 'OAUTH_PROVIDER_NAME', 'oauth.oidc.provider_name', - os.environ.get('OAUTH_PROVIDER_NAME', 'SSO'), + os.getenv('OAUTH_PROVIDER_NAME', 'SSO'), ) -OAUTH_SUB_CLAIM = PersistentConfig( +OAUTH_SUB_CLAIM = ConfigVar( 'OAUTH_SUB_CLAIM', 'oauth.oidc.sub_claim', - os.environ.get('OAUTH_SUB_CLAIM', None), + os.getenv('OAUTH_SUB_CLAIM', None), ) -OAUTH_USERNAME_CLAIM = PersistentConfig( +OAUTH_USERNAME_CLAIM = ConfigVar( 'OAUTH_USERNAME_CLAIM', 'oauth.oidc.username_claim', - os.environ.get('OAUTH_USERNAME_CLAIM', 'name'), + os.getenv('OAUTH_USERNAME_CLAIM', 'name'), ) -OAUTH_PICTURE_CLAIM = PersistentConfig( +OAUTH_PICTURE_CLAIM = ConfigVar( 'OAUTH_PICTURE_CLAIM', 'oauth.oidc.avatar_claim', - os.environ.get('OAUTH_PICTURE_CLAIM', 'picture'), + os.getenv('OAUTH_PICTURE_CLAIM', 'picture'), ) -OAUTH_EMAIL_CLAIM = PersistentConfig( +OAUTH_EMAIL_CLAIM = ConfigVar( 'OAUTH_EMAIL_CLAIM', 'oauth.oidc.email_claim', - os.environ.get('OAUTH_EMAIL_CLAIM', 'email'), + os.getenv('OAUTH_EMAIL_CLAIM', 'email'), ) -OAUTH_GROUPS_CLAIM = PersistentConfig( +OAUTH_GROUPS_CLAIM = ConfigVar( 'OAUTH_GROUPS_CLAIM', 'oauth.oidc.group_claim', - os.environ.get('OAUTH_GROUPS_CLAIM', os.environ.get('OAUTH_GROUP_CLAIM', 'groups')), + os.getenv('OAUTH_GROUPS_CLAIM', os.getenv('OAUTH_GROUP_CLAIM', 'groups')), ) -FEISHU_CLIENT_ID = PersistentConfig( +FEISHU_CLIENT_ID = ConfigVar( 'FEISHU_CLIENT_ID', 'oauth.feishu.client_id', - os.environ.get('FEISHU_CLIENT_ID', ''), + os.getenv('FEISHU_CLIENT_ID', ''), ) -FEISHU_CLIENT_SECRET = PersistentConfig( +FEISHU_CLIENT_SECRET = ConfigVar( 'FEISHU_CLIENT_SECRET', 'oauth.feishu.client_secret', - os.environ.get('FEISHU_CLIENT_SECRET', ''), + os.getenv('FEISHU_CLIENT_SECRET', ''), ) -FEISHU_OAUTH_SCOPE = PersistentConfig( +FEISHU_OAUTH_SCOPE = ConfigVar( 'FEISHU_OAUTH_SCOPE', 'oauth.feishu.scope', - os.environ.get('FEISHU_OAUTH_SCOPE', 'contact:user.base:readonly'), + os.getenv('FEISHU_OAUTH_SCOPE', 'contact:user.base:readonly'), ) -FEISHU_REDIRECT_URI = PersistentConfig( +FEISHU_REDIRECT_URI = ConfigVar( 'FEISHU_REDIRECT_URI', 'oauth.feishu.redirect_uri', - os.environ.get('FEISHU_REDIRECT_URI', ''), + os.getenv('FEISHU_REDIRECT_URI', ''), ) -ENABLE_OAUTH_ROLE_MANAGEMENT = PersistentConfig( +ENABLE_OAUTH_ROLE_MANAGEMENT = ConfigVar( 'ENABLE_OAUTH_ROLE_MANAGEMENT', 'oauth.enable_role_mapping', - os.environ.get('ENABLE_OAUTH_ROLE_MANAGEMENT', 'False').lower() == 'true', + os.getenv('ENABLE_OAUTH_ROLE_MANAGEMENT', 'False').lower() == 'true', ) -ENABLE_OAUTH_GROUP_MANAGEMENT = PersistentConfig( +ENABLE_OAUTH_GROUP_MANAGEMENT = ConfigVar( 'ENABLE_OAUTH_GROUP_MANAGEMENT', 'oauth.enable_group_mapping', - os.environ.get('ENABLE_OAUTH_GROUP_MANAGEMENT', 'False').lower() == 'true', + os.getenv('ENABLE_OAUTH_GROUP_MANAGEMENT', 'False').lower() == 'true', ) -ENABLE_OAUTH_GROUP_CREATION = PersistentConfig( +ENABLE_OAUTH_GROUP_CREATION = ConfigVar( 'ENABLE_OAUTH_GROUP_CREATION', 'oauth.enable_group_creation', - os.environ.get('ENABLE_OAUTH_GROUP_CREATION', 'False').lower() == 'true', + os.getenv('ENABLE_OAUTH_GROUP_CREATION', 'False').lower() == 'true', ) -oauth_group_default_share = os.environ.get('OAUTH_GROUP_DEFAULT_SHARE', 'true').strip().lower() -OAUTH_GROUP_DEFAULT_SHARE = PersistentConfig( +oauth_group_default_share = os.getenv('OAUTH_GROUP_DEFAULT_SHARE', 'true').strip().lower() +OAUTH_GROUP_DEFAULT_SHARE = ConfigVar( 'OAUTH_GROUP_DEFAULT_SHARE', 'oauth.group_default_share', ('members' if oauth_group_default_share == 'members' else oauth_group_default_share == 'true'), ) -OAUTH_BLOCKED_GROUPS = PersistentConfig( +OAUTH_BLOCKED_GROUPS = ConfigVar( 'OAUTH_BLOCKED_GROUPS', 'oauth.blocked_groups', - os.environ.get('OAUTH_BLOCKED_GROUPS', '[]'), + os.getenv('OAUTH_BLOCKED_GROUPS', '[]'), ) -OAUTH_GROUPS_SEPARATOR = os.environ.get('OAUTH_GROUPS_SEPARATOR', ';') +OAUTH_GROUPS_SEPARATOR = os.getenv('OAUTH_GROUPS_SEPARATOR', ';') -OAUTH_ROLES_CLAIM = PersistentConfig( +OAUTH_ROLES_CLAIM = ConfigVar( 'OAUTH_ROLES_CLAIM', 'oauth.roles_claim', - os.environ.get('OAUTH_ROLES_CLAIM', 'roles'), + os.getenv('OAUTH_ROLES_CLAIM', 'roles'), ) -OAUTH_ROLES_SEPARATOR = os.environ.get('OAUTH_ROLES_SEPARATOR', ',') +OAUTH_ROLES_SEPARATOR = os.getenv('OAUTH_ROLES_SEPARATOR', ',') -OAUTH_ALLOWED_ROLES = PersistentConfig( +OAUTH_ALLOWED_ROLES = ConfigVar( 'OAUTH_ALLOWED_ROLES', 'oauth.allowed_roles', [ role.strip() - for role in os.environ.get('OAUTH_ALLOWED_ROLES', f'user{OAUTH_ROLES_SEPARATOR}admin').split( - OAUTH_ROLES_SEPARATOR - ) + for role in os.getenv('OAUTH_ALLOWED_ROLES', f'user{OAUTH_ROLES_SEPARATOR}admin').split(OAUTH_ROLES_SEPARATOR) if role ], ) -OAUTH_ADMIN_ROLES = PersistentConfig( +OAUTH_ADMIN_ROLES = ConfigVar( 'OAUTH_ADMIN_ROLES', 'oauth.admin_roles', - [role.strip() for role in os.environ.get('OAUTH_ADMIN_ROLES', 'admin').split(OAUTH_ROLES_SEPARATOR) if role], + [role.strip() for role in os.getenv('OAUTH_ADMIN_ROLES', 'admin').split(OAUTH_ROLES_SEPARATOR) if role], ) -OAUTH_ALLOWED_DOMAINS = PersistentConfig( +OAUTH_ALLOWED_DOMAINS = ConfigVar( 'OAUTH_ALLOWED_DOMAINS', 'oauth.allowed_domains', - [domain.strip() for domain in os.environ.get('OAUTH_ALLOWED_DOMAINS', '*').split(',')], + [domain.strip() for domain in os.getenv('OAUTH_ALLOWED_DOMAINS', '*').split(',')], ) -OAUTH_UPDATE_PICTURE_ON_LOGIN = PersistentConfig( +OAUTH_UPDATE_PICTURE_ON_LOGIN = ConfigVar( 'OAUTH_UPDATE_PICTURE_ON_LOGIN', 'oauth.update_picture_on_login', - os.environ.get('OAUTH_UPDATE_PICTURE_ON_LOGIN', 'False').lower() == 'true', + os.getenv('OAUTH_UPDATE_PICTURE_ON_LOGIN', 'False').lower() == 'true', ) -OAUTH_UPDATE_NAME_ON_LOGIN = PersistentConfig( +OAUTH_UPDATE_NAME_ON_LOGIN = ConfigVar( 'OAUTH_UPDATE_NAME_ON_LOGIN', 'oauth.update_name_on_login', - os.environ.get('OAUTH_UPDATE_NAME_ON_LOGIN', 'False').lower() == 'true', + os.getenv('OAUTH_UPDATE_NAME_ON_LOGIN', 'False').lower() == 'true', ) -OAUTH_UPDATE_EMAIL_ON_LOGIN = PersistentConfig( +OAUTH_UPDATE_EMAIL_ON_LOGIN = ConfigVar( 'OAUTH_UPDATE_EMAIL_ON_LOGIN', 'oauth.update_email_on_login', - os.environ.get('OAUTH_UPDATE_EMAIL_ON_LOGIN', 'False').lower() == 'true', + os.getenv('OAUTH_UPDATE_EMAIL_ON_LOGIN', 'False').lower() == 'true', ) OAUTH_ACCESS_TOKEN_REQUEST_INCLUDE_CLIENT_ID = ( - os.environ.get('OAUTH_ACCESS_TOKEN_REQUEST_INCLUDE_CLIENT_ID', 'False').lower() == 'true' + os.getenv('OAUTH_ACCESS_TOKEN_REQUEST_INCLUDE_CLIENT_ID', 'False').lower() == 'true' ) -OAUTH_AUDIENCE = PersistentConfig( +OAUTH_AUDIENCE = ConfigVar( 'OAUTH_AUDIENCE', 'oauth.audience', - os.environ.get('OAUTH_AUDIENCE', ''), + os.getenv('OAUTH_AUDIENCE', ''), ) OAUTH_AUTHORIZE_PARAMS = {} -_oauth_authorize_params = os.environ.get('OAUTH_AUTHORIZE_PARAMS', '') +_oauth_authorize_params = os.getenv('OAUTH_AUTHORIZE_PARAMS', '') if _oauth_authorize_params: try: _parsed = json.loads(_oauth_authorize_params) @@ -898,3292 +3933,96 @@ def load_oauth_providers(): load_oauth_providers() -#################################### -# Static DIR -#################################### - -STATIC_DIR = Path(os.getenv('STATIC_DIR', OPEN_WEBUI_DIR / 'static')).resolve() - -try: - if STATIC_DIR.exists(): - for item in STATIC_DIR.iterdir(): - if item.is_file() or item.is_symlink(): - try: - item.unlink() - except Exception as e: - pass -except Exception as e: - pass - -for file_path in (FRONTEND_BUILD_DIR / 'static').glob('**/*'): - if file_path.is_file(): - target_path = STATIC_DIR / file_path.relative_to((FRONTEND_BUILD_DIR / 'static')) - target_path.parent.mkdir(parents=True, exist_ok=True) - try: - shutil.copyfile(file_path, target_path) - except Exception as e: - logging.error(f'An error occurred: {e}') - -frontend_favicon = FRONTEND_BUILD_DIR / 'static' / 'favicon.png' - -if frontend_favicon.exists(): - try: - shutil.copyfile(frontend_favicon, STATIC_DIR / 'favicon.png') - except Exception as e: - logging.error(f'An error occurred: {e}') - -frontend_splash = FRONTEND_BUILD_DIR / 'static' / 'splash.png' - -if frontend_splash.exists(): - try: - shutil.copyfile(frontend_splash, STATIC_DIR / 'splash.png') - except Exception as e: - logging.error(f'An error occurred: {e}') - -frontend_loader = FRONTEND_BUILD_DIR / 'static' / 'loader.js' - -if frontend_loader.exists(): - try: - shutil.copyfile(frontend_loader, STATIC_DIR / 'loader.js') - except Exception as e: - logging.error(f'An error occurred: {e}') - - -#################################### -# CUSTOM_NAME (Legacy) -#################################### - -CUSTOM_NAME = os.environ.get('CUSTOM_NAME', '') - -if CUSTOM_NAME: - try: - r = requests.get(f'https://api.openwebui.com/api/v1/custom/{CUSTOM_NAME}') - data = r.json() - if r.ok: - if 'logo' in data: - WEBUI_FAVICON_URL = url = ( - f'https://api.openwebui.com{data["logo"]}' if data['logo'][0] == '/' else data['logo'] - ) - - r = requests.get(url, stream=True) - if r.status_code == 200: - with open(f'{STATIC_DIR}/favicon.png', 'wb') as f: - r.raw.decode_content = True - shutil.copyfileobj(r.raw, f) - - if 'splash' in data: - url = f'https://api.openwebui.com{data["splash"]}' if data['splash'][0] == '/' else data['splash'] - - r = requests.get(url, stream=True) - if r.status_code == 200: - with open(f'{STATIC_DIR}/splash.png', 'wb') as f: - r.raw.decode_content = True - shutil.copyfileobj(r.raw, f) - - WEBUI_NAME = data['name'] - except Exception as e: - log.exception(e) - pass - - -#################################### -# STORAGE PROVIDER -#################################### - -STORAGE_PROVIDER = os.environ.get('STORAGE_PROVIDER', 'local') # defaults to local, s3 -STORAGE_LOCAL_CACHE = os.environ.get('STORAGE_LOCAL_CACHE', 'true').lower() == 'true' - -S3_ACCESS_KEY_ID = os.environ.get('S3_ACCESS_KEY_ID', None) -S3_SECRET_ACCESS_KEY = os.environ.get('S3_SECRET_ACCESS_KEY', None) -S3_REGION_NAME = os.environ.get('S3_REGION_NAME', None) -S3_BUCKET_NAME = os.environ.get('S3_BUCKET_NAME', None) -S3_KEY_PREFIX = os.environ.get('S3_KEY_PREFIX', None) -S3_ENDPOINT_URL = os.environ.get('S3_ENDPOINT_URL', None) -S3_USE_ACCELERATE_ENDPOINT = os.environ.get('S3_USE_ACCELERATE_ENDPOINT', 'false').lower() == 'true' -S3_ADDRESSING_STYLE = os.environ.get('S3_ADDRESSING_STYLE', None) -S3_ENABLE_TAGGING = os.getenv('S3_ENABLE_TAGGING', 'false').lower() == 'true' - -GCS_BUCKET_NAME = os.environ.get('GCS_BUCKET_NAME', None) -GOOGLE_APPLICATION_CREDENTIALS_JSON = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS_JSON', None) - -AZURE_STORAGE_ENDPOINT = os.environ.get('AZURE_STORAGE_ENDPOINT', None) -AZURE_STORAGE_CONTAINER_NAME = os.environ.get('AZURE_STORAGE_CONTAINER_NAME', None) -AZURE_STORAGE_KEY = os.environ.get('AZURE_STORAGE_KEY', None) - -#################################### -# File Upload DIR -#################################### - -UPLOAD_DIR = DATA_DIR / 'uploads' -UPLOAD_DIR.mkdir(parents=True, exist_ok=True) - - -#################################### -# Cache DIR -#################################### - -CACHE_DIR = DATA_DIR / 'cache' -CACHE_DIR.mkdir(parents=True, exist_ok=True) - - -#################################### -# DIRECT CONNECTIONS -#################################### - -ENABLE_DIRECT_CONNECTIONS = PersistentConfig( - 'ENABLE_DIRECT_CONNECTIONS', - 'direct.enable', - os.environ.get('ENABLE_DIRECT_CONNECTIONS', 'False').lower() == 'true', -) - -#################################### -# OLLAMA_BASE_URL -#################################### - -ENABLE_OLLAMA_API = PersistentConfig( - 'ENABLE_OLLAMA_API', - 'ollama.enable', - os.environ.get('ENABLE_OLLAMA_API', 'True').lower() == 'true', -) - -OLLAMA_API_BASE_URL = os.environ.get('OLLAMA_API_BASE_URL', 'http://localhost:11434/api') - -OLLAMA_BASE_URL = os.environ.get('OLLAMA_BASE_URL', '') -if OLLAMA_BASE_URL: - # Remove trailing slash - OLLAMA_BASE_URL = OLLAMA_BASE_URL[:-1] if OLLAMA_BASE_URL.endswith('/') else OLLAMA_BASE_URL - - -K8S_FLAG = os.environ.get('K8S_FLAG', '') -USE_OLLAMA_DOCKER = os.environ.get('USE_OLLAMA_DOCKER', 'false') - -if OLLAMA_BASE_URL == '' and OLLAMA_API_BASE_URL != '': - OLLAMA_BASE_URL = OLLAMA_API_BASE_URL[:-4] if OLLAMA_API_BASE_URL.endswith('/api') else OLLAMA_API_BASE_URL - -if ENV == 'prod': - if OLLAMA_BASE_URL == '/ollama' and not K8S_FLAG: - if USE_OLLAMA_DOCKER.lower() == 'true': - # if you use all-in-one docker container (Open WebUI + Ollama) - # with the docker build arg USE_OLLAMA=true (--build-arg="USE_OLLAMA=true") this only works with http://localhost:11434 - OLLAMA_BASE_URL = 'http://localhost:11434' - else: - OLLAMA_BASE_URL = 'http://host.docker.internal:11434' - elif K8S_FLAG: - OLLAMA_BASE_URL = 'http://ollama-service.open-webui.svc.cluster.local:11434' - - -def _resolve_ollama_base_url(url: str) -> str: - """If the default Ollama port (11434) is unreachable, try the fallback port (12434).""" - - def reachable(host: str, port: int) -> bool: - try: - with socket.create_connection((host, port), timeout=1.0): - return True - except (OSError, TimeoutError): - return False - - host = urlparse(url).hostname or 'localhost' - - with ThreadPoolExecutor(max_workers=2) as pool: - default = pool.submit(reachable, host, 11434) - fallback = pool.submit(reachable, host, 12434) - - if not default.result() and fallback.result(): - url = url.replace(':11434', ':12434') - log.info(f'Ollama port 11434 unreachable on {host}, falling back to 12434') - elif not default.result(): - log.info(f'Ollama ports 11434 and 12434 both unreachable on {host}') - - return url - - -# Auto-resolve Ollama port when no explicit URL was provided by the user. -# The Dockerfile default is "/ollama" which the block above rewrites to :11434. -if os.environ.get('OLLAMA_BASE_URL', '') in ('', '/ollama') and not os.environ.get('OLLAMA_BASE_URLS', ''): - OLLAMA_BASE_URL = _resolve_ollama_base_url(OLLAMA_BASE_URL) - - -OLLAMA_BASE_URLS = os.environ.get('OLLAMA_BASE_URLS', '') -OLLAMA_BASE_URLS = OLLAMA_BASE_URLS if OLLAMA_BASE_URLS != '' else OLLAMA_BASE_URL - -OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(';')] -OLLAMA_BASE_URLS = PersistentConfig('OLLAMA_BASE_URLS', 'ollama.base_urls', OLLAMA_BASE_URLS) - -OLLAMA_API_CONFIGS = PersistentConfig( - 'OLLAMA_API_CONFIGS', - 'ollama.api_configs', - {}, -) - -#################################### -# OPENAI_API -#################################### - - -ENABLE_OPENAI_API = PersistentConfig( - 'ENABLE_OPENAI_API', - 'openai.enable', - os.environ.get('ENABLE_OPENAI_API', 'True').lower() == 'true', -) - - -OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY', '') -OPENAI_API_BASE_URL = os.environ.get('OPENAI_API_BASE_URL', '') - -GEMINI_API_KEY = os.environ.get('GEMINI_API_KEY', '') -GEMINI_API_BASE_URL = os.environ.get('GEMINI_API_BASE_URL', '') - - -if OPENAI_API_BASE_URL == '': - OPENAI_API_BASE_URL = 'https://api.openai.com/v1' -else: - if OPENAI_API_BASE_URL.endswith('/'): - OPENAI_API_BASE_URL = OPENAI_API_BASE_URL[:-1] - -OPENAI_API_KEYS = os.environ.get('OPENAI_API_KEYS', '') -OPENAI_API_KEYS = OPENAI_API_KEYS if OPENAI_API_KEYS != '' else OPENAI_API_KEY - -OPENAI_API_KEYS = [url.strip() for url in OPENAI_API_KEYS.split(';')] -OPENAI_API_KEYS = PersistentConfig('OPENAI_API_KEYS', 'openai.api_keys', OPENAI_API_KEYS) - -OPENAI_API_BASE_URLS = os.environ.get('OPENAI_API_BASE_URLS', '') -OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS if OPENAI_API_BASE_URLS != '' else OPENAI_API_BASE_URL - -OPENAI_API_BASE_URLS = [ - url.strip() if url != '' else 'https://api.openai.com/v1' for url in OPENAI_API_BASE_URLS.split(';') -] -OPENAI_API_BASE_URLS = PersistentConfig('OPENAI_API_BASE_URLS', 'openai.api_base_urls', OPENAI_API_BASE_URLS) - -OPENAI_API_CONFIGS = PersistentConfig( - 'OPENAI_API_CONFIGS', - 'openai.api_configs', - {}, -) - -# Get the actual OpenAI API key based on the base URL -OPENAI_API_KEY = '' -try: - OPENAI_API_KEY = OPENAI_API_KEYS.value[OPENAI_API_BASE_URLS.value.index('https://api.openai.com/v1')] -except Exception: - pass -OPENAI_API_BASE_URL = 'https://api.openai.com/v1' - - -#################################### -# MODELS -#################################### - -ENABLE_BASE_MODELS_CACHE = PersistentConfig( - 'ENABLE_BASE_MODELS_CACHE', - 'models.base_models_cache', - os.environ.get('ENABLE_BASE_MODELS_CACHE', 'False').lower() == 'true', -) - - -#################################### -# TOOL_SERVERS -#################################### - -try: - tool_server_connections = json.loads(os.environ.get('TOOL_SERVER_CONNECTIONS', '[]')) -except Exception as e: - log.exception(f'Error loading TOOL_SERVER_CONNECTIONS: {e}') - tool_server_connections = [] - - -TOOL_SERVER_CONNECTIONS = PersistentConfig( - 'TOOL_SERVER_CONNECTIONS', - 'tool_server.connections', - tool_server_connections, -) - -#################################### -# TERMINAL_SERVER -#################################### - -terminal_server_connections = json.loads(os.environ.get('TERMINAL_SERVER_CONNECTIONS', '[]')) - -TERMINAL_SERVER_CONNECTIONS = PersistentConfig( - 'TERMINAL_SERVER_CONNECTIONS', - 'terminal_server.connections', - terminal_server_connections, -) - -#################################### -# WEBUI -#################################### - - -WEBUI_URL = PersistentConfig('WEBUI_URL', 'webui.url', os.environ.get('WEBUI_URL', '')) - - -ENABLE_SIGNUP = PersistentConfig( - 'ENABLE_SIGNUP', - 'ui.enable_signup', - (False if not WEBUI_AUTH else os.environ.get('ENABLE_SIGNUP', 'True').lower() == 'true'), -) - -ENABLE_LOGIN_FORM = PersistentConfig( - 'ENABLE_LOGIN_FORM', - 'ui.enable_login_form', - os.environ.get('ENABLE_LOGIN_FORM', 'True').lower() == 'true', -) - -ENABLE_PASSWORD_CHANGE_FORM = PersistentConfig( - 'ENABLE_PASSWORD_CHANGE_FORM', - 'ui.enable_password_change_form', - os.environ.get('ENABLE_PASSWORD_CHANGE_FORM', 'True').lower() == 'true', -) - -ENABLE_PASSWORD_AUTH = os.environ.get('ENABLE_PASSWORD_AUTH', 'True').lower() == 'true' - -DEFAULT_LOCALE = PersistentConfig( - 'DEFAULT_LOCALE', - 'ui.default_locale', - os.environ.get('DEFAULT_LOCALE', ''), -) - -DEFAULT_MODELS = PersistentConfig('DEFAULT_MODELS', 'ui.default_models', os.environ.get('DEFAULT_MODELS', None)) - -DEFAULT_PINNED_MODELS = PersistentConfig( - 'DEFAULT_PINNED_MODELS', - 'ui.default_pinned_models', - os.environ.get('DEFAULT_PINNED_MODELS', None), -) - -try: - default_prompt_suggestions = json.loads(os.environ.get('DEFAULT_PROMPT_SUGGESTIONS', '[]')) -except Exception as e: - log.exception(f'Error loading DEFAULT_PROMPT_SUGGESTIONS: {e}') - default_prompt_suggestions = [] -if default_prompt_suggestions == []: - default_prompt_suggestions = [ - { - 'title': ['Help me study', 'vocabulary for a college entrance exam'], - 'content': "Help me study vocabulary: write a sentence for me to fill in the blank, and I'll try to pick the correct option.", - }, - { - 'title': ['Give me ideas', "for what to do with my kids' art"], - 'content': "What are 5 creative things I could do with my kids' art? I don't want to throw them away, but it's also so much clutter.", - }, - { - 'title': ['Tell me a fun fact', 'about the Roman Empire'], - 'content': 'Tell me a random fun fact about the Roman Empire', - }, - { - 'title': ['Show me a code snippet', "of a website's sticky header"], - 'content': "Show me a code snippet of a website's sticky header in CSS and JavaScript.", - }, - { - 'title': [ - 'Explain options trading', - "if I'm familiar with buying and selling stocks", - ], - 'content': "Explain options trading in simple terms if I'm familiar with buying and selling stocks.", - }, - { - 'title': ['Overcome procrastination', 'give me tips'], - 'content': 'Could you start by asking me about instances when I procrastinate the most and then give me some suggestions to overcome it?', - }, - ] - -DEFAULT_PROMPT_SUGGESTIONS = PersistentConfig( - 'DEFAULT_PROMPT_SUGGESTIONS', - 'ui.prompt_suggestions', - default_prompt_suggestions, -) - -MODEL_ORDER_LIST = PersistentConfig( - 'MODEL_ORDER_LIST', - 'ui.model_order_list', - [], -) - -DEFAULT_MODEL_METADATA = PersistentConfig( - 'DEFAULT_MODEL_METADATA', - 'models.default_metadata', - {}, -) - -try: - default_model_params = json.loads(os.environ.get('DEFAULT_MODEL_PARAMS', '{}')) -except Exception as e: - log.exception(f'Error loading DEFAULT_MODEL_PARAMS: {e}') - default_model_params = {} - -DEFAULT_MODEL_PARAMS = PersistentConfig( - 'DEFAULT_MODEL_PARAMS', - 'models.default_params', - default_model_params, -) - -DEFAULT_USER_ROLE = PersistentConfig( - 'DEFAULT_USER_ROLE', - 'ui.default_user_role', - os.getenv('DEFAULT_USER_ROLE', 'pending'), -) - -DEFAULT_GROUP_ID = PersistentConfig( - 'DEFAULT_GROUP_ID', - 'ui.default_group_id', - os.environ.get('DEFAULT_GROUP_ID', ''), -) - -PENDING_USER_OVERLAY_TITLE = PersistentConfig( - 'PENDING_USER_OVERLAY_TITLE', - 'ui.pending_user_overlay_title', - os.environ.get('PENDING_USER_OVERLAY_TITLE', ''), -) - -PENDING_USER_OVERLAY_CONTENT = PersistentConfig( - 'PENDING_USER_OVERLAY_CONTENT', - 'ui.pending_user_overlay_content', - os.environ.get('PENDING_USER_OVERLAY_CONTENT', ''), -) - - -RESPONSE_WATERMARK = PersistentConfig( - 'RESPONSE_WATERMARK', - 'ui.watermark', - os.environ.get('RESPONSE_WATERMARK', ''), -) - - -USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT', 'False').lower() == 'true' -) - - -USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' -) - - -USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_PUBLIC_SHARING = ( - os.environ.get('USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' -) - - -USER_PERMISSIONS_NOTES_ALLOW_SHARING = os.environ.get('USER_PERMISSIONS_NOTES_ALLOW_SHARING', 'False').lower() == 'true' - -USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING = ( - os.environ.get('USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING', 'False').lower() == 'true' -) - -USER_PERMISSIONS_ACCESS_GRANTS_ALLOW_USERS = ( - os.environ.get('USER_PERMISSIONS_ACCESS_GRANTS_ALLOW_USERS', 'True').lower() == 'true' -) - - -USER_PERMISSIONS_CHAT_CONTROLS = os.environ.get('USER_PERMISSIONS_CHAT_CONTROLS', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_VALVES = os.environ.get('USER_PERMISSIONS_CHAT_VALVES', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_SYSTEM_PROMPT = os.environ.get('USER_PERMISSIONS_CHAT_SYSTEM_PROMPT', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_PARAMS = os.environ.get('USER_PERMISSIONS_CHAT_PARAMS', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_FILE_UPLOAD = os.environ.get('USER_PERMISSIONS_CHAT_FILE_UPLOAD', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_WEB_UPLOAD = os.environ.get('USER_PERMISSIONS_CHAT_WEB_UPLOAD', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_DELETE = os.environ.get('USER_PERMISSIONS_CHAT_DELETE', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_DELETE_MESSAGE = os.environ.get('USER_PERMISSIONS_CHAT_DELETE_MESSAGE', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE = ( - os.environ.get('USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE', 'True').lower() == 'true' -) - -USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE = ( - os.environ.get('USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE', 'True').lower() == 'true' -) - -USER_PERMISSIONS_CHAT_RATE_RESPONSE = os.environ.get('USER_PERMISSIONS_CHAT_RATE_RESPONSE', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_EDIT = os.environ.get('USER_PERMISSIONS_CHAT_EDIT', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_SHARE = os.environ.get('USER_PERMISSIONS_CHAT_SHARE', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_EXPORT = os.environ.get('USER_PERMISSIONS_CHAT_EXPORT', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_STT = os.environ.get('USER_PERMISSIONS_CHAT_STT', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_TTS = os.environ.get('USER_PERMISSIONS_CHAT_TTS', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_CALL = os.environ.get('USER_PERMISSIONS_CHAT_CALL', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_MULTIPLE_MODELS = ( - os.environ.get('USER_PERMISSIONS_CHAT_MULTIPLE_MODELS', 'True').lower() == 'true' -) - -USER_PERMISSIONS_CHAT_TEMPORARY = os.environ.get('USER_PERMISSIONS_CHAT_TEMPORARY', 'True').lower() == 'true' - -USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED = ( - os.environ.get('USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED', 'False').lower() == 'true' -) - - -USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS = ( - os.environ.get('USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_FEATURES_WEB_SEARCH = os.environ.get('USER_PERMISSIONS_FEATURES_WEB_SEARCH', 'True').lower() == 'true' - -USER_PERMISSIONS_FEATURES_IMAGE_GENERATION = ( - os.environ.get('USER_PERMISSIONS_FEATURES_IMAGE_GENERATION', 'True').lower() == 'true' -) - -USER_PERMISSIONS_FEATURES_CODE_INTERPRETER = ( - os.environ.get('USER_PERMISSIONS_FEATURES_CODE_INTERPRETER', 'True').lower() == 'true' -) - -USER_PERMISSIONS_FEATURES_FOLDERS = os.environ.get('USER_PERMISSIONS_FEATURES_FOLDERS', 'True').lower() == 'true' - -USER_PERMISSIONS_FEATURES_NOTES = os.environ.get('USER_PERMISSIONS_FEATURES_NOTES', 'True').lower() == 'true' - -USER_PERMISSIONS_FEATURES_CHANNELS = os.environ.get('USER_PERMISSIONS_FEATURES_CHANNELS', 'True').lower() == 'true' - -USER_PERMISSIONS_FEATURES_API_KEYS = os.environ.get('USER_PERMISSIONS_FEATURES_API_KEYS', 'False').lower() == 'true' - -USER_PERMISSIONS_FEATURES_MEMORIES = os.environ.get('USER_PERMISSIONS_FEATURES_MEMORIES', 'True').lower() == 'true' - -USER_PERMISSIONS_FEATURES_AUTOMATIONS = ( - os.environ.get('USER_PERMISSIONS_FEATURES_AUTOMATIONS', 'False').lower() == 'true' -) - -USER_PERMISSIONS_FEATURES_CALENDAR = os.environ.get('USER_PERMISSIONS_FEATURES_CALENDAR', 'True').lower() == 'true' - - -USER_PERMISSIONS_SETTINGS_INTERFACE = os.environ.get('USER_PERMISSIONS_SETTINGS_INTERFACE', 'True').lower() == 'true' - - -DEFAULT_USER_PERMISSIONS = { - 'workspace': { - 'models': USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS, - 'knowledge': USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS, - 'prompts': USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS, - 'tools': USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS, - 'skills': USER_PERMISSIONS_WORKSPACE_SKILLS_ACCESS, - 'models_import': USER_PERMISSIONS_WORKSPACE_MODELS_IMPORT, - 'models_export': USER_PERMISSIONS_WORKSPACE_MODELS_EXPORT, - 'prompts_import': USER_PERMISSIONS_WORKSPACE_PROMPTS_IMPORT, - 'prompts_export': USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT, - 'tools_import': USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT, - 'tools_export': USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT, - }, - 'sharing': { - 'models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING, - 'public_models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING, - 'knowledge': USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_SHARING, - 'public_knowledge': USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING, - 'prompts': USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_SHARING, - 'public_prompts': USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING, - 'tools': USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_SHARING, - 'public_tools': USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING, - 'skills': USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_SHARING, - 'public_skills': USER_PERMISSIONS_WORKSPACE_SKILLS_ALLOW_PUBLIC_SHARING, - 'notes': USER_PERMISSIONS_NOTES_ALLOW_SHARING, - 'public_notes': USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING, - }, - 'access_grants': { - 'allow_users': USER_PERMISSIONS_ACCESS_GRANTS_ALLOW_USERS, - }, - 'chat': { - 'controls': USER_PERMISSIONS_CHAT_CONTROLS, - 'valves': USER_PERMISSIONS_CHAT_VALVES, - 'system_prompt': USER_PERMISSIONS_CHAT_SYSTEM_PROMPT, - 'params': USER_PERMISSIONS_CHAT_PARAMS, - 'file_upload': USER_PERMISSIONS_CHAT_FILE_UPLOAD, - 'web_upload': USER_PERMISSIONS_CHAT_WEB_UPLOAD, - 'delete': USER_PERMISSIONS_CHAT_DELETE, - 'delete_message': USER_PERMISSIONS_CHAT_DELETE_MESSAGE, - 'continue_response': USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE, - 'regenerate_response': USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE, - 'rate_response': USER_PERMISSIONS_CHAT_RATE_RESPONSE, - 'edit': USER_PERMISSIONS_CHAT_EDIT, - 'share': USER_PERMISSIONS_CHAT_SHARE, - 'export': USER_PERMISSIONS_CHAT_EXPORT, - 'stt': USER_PERMISSIONS_CHAT_STT, - 'tts': USER_PERMISSIONS_CHAT_TTS, - 'call': USER_PERMISSIONS_CHAT_CALL, - 'multiple_models': USER_PERMISSIONS_CHAT_MULTIPLE_MODELS, - 'temporary': USER_PERMISSIONS_CHAT_TEMPORARY, - 'temporary_enforced': USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED, - }, - 'features': { - # General features - 'api_keys': USER_PERMISSIONS_FEATURES_API_KEYS, - 'notes': USER_PERMISSIONS_FEATURES_NOTES, - 'folders': USER_PERMISSIONS_FEATURES_FOLDERS, - 'channels': USER_PERMISSIONS_FEATURES_CHANNELS, - 'direct_tool_servers': USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS, - # Chat features - 'web_search': USER_PERMISSIONS_FEATURES_WEB_SEARCH, - 'image_generation': USER_PERMISSIONS_FEATURES_IMAGE_GENERATION, - 'code_interpreter': USER_PERMISSIONS_FEATURES_CODE_INTERPRETER, - 'memories': USER_PERMISSIONS_FEATURES_MEMORIES, - 'automations': USER_PERMISSIONS_FEATURES_AUTOMATIONS, - 'calendar': USER_PERMISSIONS_FEATURES_CALENDAR, - }, - 'settings': { - 'interface': USER_PERMISSIONS_SETTINGS_INTERFACE, - }, -} - -USER_PERMISSIONS = PersistentConfig( - 'USER_PERMISSIONS', - 'user.permissions', - DEFAULT_USER_PERMISSIONS, -) - -ENABLE_FOLDERS = PersistentConfig( - 'ENABLE_FOLDERS', - 'folders.enable', - os.environ.get('ENABLE_FOLDERS', 'True').lower() == 'true', -) - -FOLDER_MAX_FILE_COUNT = PersistentConfig( - 'FOLDER_MAX_FILE_COUNT', - 'folders.max_file_count', - os.environ.get('FOLDER_MAX_FILE_COUNT', ''), -) - -ENABLE_CHANNELS = PersistentConfig( - 'ENABLE_CHANNELS', - 'channels.enable', - os.environ.get('ENABLE_CHANNELS', 'False').lower() == 'true', -) - -ENABLE_CALENDAR = PersistentConfig( - 'ENABLE_CALENDAR', - 'calendar.enable', - os.environ.get('ENABLE_CALENDAR', 'True').lower() == 'true', -) - -ENABLE_AUTOMATIONS = PersistentConfig( - 'ENABLE_AUTOMATIONS', - 'automations.enable', - os.environ.get('ENABLE_AUTOMATIONS', 'True').lower() == 'true', -) - -AUTOMATION_MAX_COUNT = PersistentConfig( - 'AUTOMATION_MAX_COUNT', - 'automations.max_count', - os.environ.get('AUTOMATION_MAX_COUNT', ''), -) - -AUTOMATION_MIN_INTERVAL = PersistentConfig( - 'AUTOMATION_MIN_INTERVAL', - 'automations.min_interval', - os.environ.get('AUTOMATION_MIN_INTERVAL', ''), -) - -ENABLE_NOTES = PersistentConfig( - 'ENABLE_NOTES', - 'notes.enable', - os.environ.get('ENABLE_NOTES', 'True').lower() == 'true', -) - -ENABLE_USER_STATUS = PersistentConfig( - 'ENABLE_USER_STATUS', - 'users.enable_status', - os.environ.get('ENABLE_USER_STATUS', 'True').lower() == 'true', -) - -ENABLE_EVALUATION_ARENA_MODELS = PersistentConfig( - 'ENABLE_EVALUATION_ARENA_MODELS', - 'evaluation.arena.enable', - os.environ.get('ENABLE_EVALUATION_ARENA_MODELS', 'True').lower() == 'true', -) -EVALUATION_ARENA_MODELS = PersistentConfig( - 'EVALUATION_ARENA_MODELS', - 'evaluation.arena.models', - [], -) - -DEFAULT_ARENA_MODEL = { - 'id': 'arena-model', - 'name': 'Arena Model', - 'meta': { - 'profile_image_url': '/favicon.png', - 'description': 'Submit your questions to anonymous AI chatbots and vote on the best response.', - 'model_ids': None, - }, -} - -WEBHOOK_URL = PersistentConfig('WEBHOOK_URL', 'webhook_url', os.environ.get('WEBHOOK_URL', '')) - -ENABLE_ADMIN_EXPORT = os.environ.get('ENABLE_ADMIN_EXPORT', 'True').lower() == 'true' - -ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS = ( - os.environ.get('ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS', 'True').lower() == 'true' -) - -BYPASS_ADMIN_ACCESS_CONTROL = ( - os.environ.get( - 'BYPASS_ADMIN_ACCESS_CONTROL', - os.environ.get('ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS', 'True'), - ).lower() - == 'true' -) - -ENABLE_ADMIN_CHAT_ACCESS = os.environ.get('ENABLE_ADMIN_CHAT_ACCESS', 'True').lower() == 'true' - -ENABLE_ADMIN_ANALYTICS = os.environ.get('ENABLE_ADMIN_ANALYTICS', 'True').lower() == 'true' - -ENABLE_COMMUNITY_SHARING = PersistentConfig( - 'ENABLE_COMMUNITY_SHARING', - 'ui.enable_community_sharing', - os.environ.get('ENABLE_COMMUNITY_SHARING', 'True').lower() == 'true', -) - -ENABLE_MESSAGE_RATING = PersistentConfig( - 'ENABLE_MESSAGE_RATING', - 'ui.enable_message_rating', - os.environ.get('ENABLE_MESSAGE_RATING', 'True').lower() == 'true', -) - -ENABLE_USER_WEBHOOKS = PersistentConfig( - 'ENABLE_USER_WEBHOOKS', - 'ui.enable_user_webhooks', - os.environ.get('ENABLE_USER_WEBHOOKS', 'False').lower() == 'true', -) - -# FastAPI / AnyIO settings -THREAD_POOL_SIZE = os.getenv('THREAD_POOL_SIZE', None) - -if THREAD_POOL_SIZE is not None and isinstance(THREAD_POOL_SIZE, str): - try: - THREAD_POOL_SIZE = int(THREAD_POOL_SIZE) - except ValueError: - log.warning(f'THREAD_POOL_SIZE is not a valid integer: {THREAD_POOL_SIZE}. Defaulting to None.') - THREAD_POOL_SIZE = None - - -def validate_cors_origin(origin): - parsed_url = urlparse(origin) - - # Check if the scheme is either http or https, or a custom scheme - schemes = ['http', 'https'] + CORS_ALLOW_CUSTOM_SCHEME - if parsed_url.scheme not in schemes: - raise ValueError( - f"Invalid scheme in CORS_ALLOW_ORIGIN: '{origin}'. Only 'http' and 'https' and CORS_ALLOW_CUSTOM_SCHEME are allowed." - ) - - # Ensure that the netloc (domain + port) is present, indicating it's a valid URL - if not parsed_url.netloc: - raise ValueError(f"Invalid URL structure in CORS_ALLOW_ORIGIN: '{origin}'.") - - -# For production, you should only need one host as -# fastapi serves the svelte-kit built frontend and backend from the same host and port. -# To test CORS_ALLOW_ORIGIN locally, you can set something like -# CORS_ALLOW_ORIGIN=http://localhost:5173;http://localhost:8080 -# in your .env file depending on your frontend port, 5173 in this case. -CORS_ALLOW_ORIGIN = os.environ.get('CORS_ALLOW_ORIGIN', '*').split(';') - -# Allows custom URL schemes (e.g., app://) to be used as origins for CORS. -# Useful for local development or desktop clients with schemes like app:// or other custom protocols. -# Provide a semicolon-separated list of allowed schemes in the environment variable CORS_ALLOW_CUSTOM_SCHEMES. -CORS_ALLOW_CUSTOM_SCHEME = os.environ.get('CORS_ALLOW_CUSTOM_SCHEME', '').split(';') - -if CORS_ALLOW_ORIGIN == ['*']: - log.warning("\n\nWARNING: CORS_ALLOW_ORIGIN IS SET TO '*' - NOT RECOMMENDED FOR PRODUCTION DEPLOYMENTS.\n") -else: - # You have to pick between a single wildcard or a list of origins. - # Doing both will result in CORS errors in the browser. - for origin in CORS_ALLOW_ORIGIN: - validate_cors_origin(origin) - - -class BannerModel(BaseModel): - id: str - type: str - title: Optional[str] = None - content: str - dismissible: bool - timestamp: int - - -try: - banners = json.loads(os.environ.get('WEBUI_BANNERS', '[]')) - banners = [BannerModel(**banner) for banner in banners] -except Exception as e: - log.exception(f'Error loading WEBUI_BANNERS: {e}') - banners = [] - -WEBUI_BANNERS = PersistentConfig('WEBUI_BANNERS', 'ui.banners', banners) - - -SHOW_ADMIN_DETAILS = PersistentConfig( - 'SHOW_ADMIN_DETAILS', - 'auth.admin.show', - os.environ.get('SHOW_ADMIN_DETAILS', 'true').lower() == 'true', -) - -ADMIN_EMAIL = PersistentConfig( - 'ADMIN_EMAIL', - 'auth.admin.email', - os.environ.get('ADMIN_EMAIL', None), -) - - -#################################### -# TASKS -#################################### - - -TASK_MODEL = PersistentConfig( - 'TASK_MODEL', - 'task.model.default', - os.environ.get('TASK_MODEL', ''), -) - -TASK_MODEL_EXTERNAL = PersistentConfig( - 'TASK_MODEL_EXTERNAL', - 'task.model.external', - os.environ.get('TASK_MODEL_EXTERNAL', ''), -) - -TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig( - 'TITLE_GENERATION_PROMPT_TEMPLATE', - 'task.title.prompt_template', - os.environ.get('TITLE_GENERATION_PROMPT_TEMPLATE', ''), -) - -DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """### Task: -Generate a concise, 3-5 word title with an emoji summarizing the chat history. -### Guidelines: -- The title should clearly represent the main theme or subject of the conversation. -- Use emojis that enhance understanding of the topic, but avoid quotation marks or special formatting. -- Write the title in the chat's primary language; default to English if multilingual. -- Prioritize accuracy over excessive creativity; keep it clear and simple. -- Your entire response must consist solely of the JSON object, without any introductory or concluding text. -- The output must be a single, raw JSON object, without any markdown code fences or other encapsulating text. -- Ensure no conversational text, affirmations, or explanations precede or follow the raw JSON output, as this will cause direct parsing failure. -### Output: -JSON format: { "title": "your concise title here" } -### Examples: -- { "title": "📉 Stock Market Trends" }, -- { "title": "🍪 Perfect Chocolate Chip Recipe" }, -- { "title": "Evolution of Music Streaming" }, -- { "title": "Remote Work Productivity Tips" }, -- { "title": "Artificial Intelligence in Healthcare" }, -- { "title": "🎮 Video Game Development Insights" } -### Chat History: - -{{MESSAGES:END:2}} -""" - -TAGS_GENERATION_PROMPT_TEMPLATE = PersistentConfig( - 'TAGS_GENERATION_PROMPT_TEMPLATE', - 'task.tags.prompt_template', - os.environ.get('TAGS_GENERATION_PROMPT_TEMPLATE', ''), -) - -DEFAULT_TAGS_GENERATION_PROMPT_TEMPLATE = """### Task: -Generate 1-3 broad tags categorizing the main themes of the chat history, along with 1-3 more specific subtopic tags. - -### Guidelines: -- Start with high-level domains (e.g. Science, Technology, Philosophy, Arts, Politics, Business, Health, Sports, Entertainment, Education) -- Consider including relevant subfields/subdomains if they are strongly represented throughout the conversation -- If content is too short (less than 3 messages) or too diverse, use only ["General"] -- Use the chat's primary language; default to English if multilingual -- Prioritize accuracy over specificity - -### Output: -JSON format: { "tags": ["tag1", "tag2", "tag3"] } - -### Chat History: - -{{MESSAGES:END:6}} -""" - -IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = PersistentConfig( - 'IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE', - 'task.image.prompt_template', - os.environ.get('IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE', ''), -) - -DEFAULT_IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = """### Task: -Generate a detailed prompt for am image generation task based on the given language and context. Describe the image as if you were explaining it to someone who cannot see it. Include relevant details, colors, shapes, and any other important elements. - -### Guidelines: -- Be descriptive and detailed, focusing on the most important aspects of the image. -- Avoid making assumptions or adding information not present in the image. -- Use the chat's primary language; default to English if multilingual. -- If the image is too complex, focus on the most prominent elements. - -### Output: -Strictly return in JSON format: -{ - "prompt": "Your detailed description here." -} - -### Chat History: - -{{MESSAGES:END:6}} -""" - - -FOLLOW_UP_GENERATION_PROMPT_TEMPLATE = PersistentConfig( - 'FOLLOW_UP_GENERATION_PROMPT_TEMPLATE', - 'task.follow_up.prompt_template', - os.environ.get('FOLLOW_UP_GENERATION_PROMPT_TEMPLATE', ''), -) - -DEFAULT_FOLLOW_UP_GENERATION_PROMPT_TEMPLATE = """### Task: -Suggest 3-5 relevant follow-up questions or prompts that the user might naturally ask next in this conversation as a **user**, based on the chat history, to help continue or deepen the discussion. -### Guidelines: -- Write all follow-up questions from the user’s point of view, directed to the assistant. -- Make questions concise, clear, and directly related to the discussed topic(s). -- Only suggest follow-ups that make sense given the chat content and do not repeat what was already covered. -- If the conversation is very short or not specific, suggest more general (but relevant) follow-ups the user might ask. -- Use the conversation's primary language; default to English if multilingual. -- Response must be a JSON object with a "follow_ups" key containing an array of strings, no extra text or formatting. -### Output: -JSON format: { "follow_ups": ["Question 1?", "Question 2?", "Question 3?"] } -### Chat History: - -{{MESSAGES:END:6}} -""" - -ENABLE_FOLLOW_UP_GENERATION = PersistentConfig( - 'ENABLE_FOLLOW_UP_GENERATION', - 'task.follow_up.enable', - os.environ.get('ENABLE_FOLLOW_UP_GENERATION', 'True').lower() == 'true', -) - -ENABLE_TAGS_GENERATION = PersistentConfig( - 'ENABLE_TAGS_GENERATION', - 'task.tags.enable', - os.environ.get('ENABLE_TAGS_GENERATION', 'True').lower() == 'true', -) - -ENABLE_TITLE_GENERATION = PersistentConfig( - 'ENABLE_TITLE_GENERATION', - 'task.title.enable', - os.environ.get('ENABLE_TITLE_GENERATION', 'True').lower() == 'true', -) - - -ENABLE_SEARCH_QUERY_GENERATION = PersistentConfig( - 'ENABLE_SEARCH_QUERY_GENERATION', - 'task.query.search.enable', - os.environ.get('ENABLE_SEARCH_QUERY_GENERATION', 'True').lower() == 'true', -) - -ENABLE_RETRIEVAL_QUERY_GENERATION = PersistentConfig( - 'ENABLE_RETRIEVAL_QUERY_GENERATION', - 'task.query.retrieval.enable', - os.environ.get('ENABLE_RETRIEVAL_QUERY_GENERATION', 'True').lower() == 'true', -) - - -QUERY_GENERATION_PROMPT_TEMPLATE = PersistentConfig( - 'QUERY_GENERATION_PROMPT_TEMPLATE', - 'task.query.prompt_template', - os.environ.get('QUERY_GENERATION_PROMPT_TEMPLATE', ''), -) - -DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE = """### Task: -Analyze the chat history to determine the necessity of generating search queries, in the given language. By default, **prioritize generating 1-3 broad and relevant search queries** unless it is absolutely certain that no additional information is required. The aim is to retrieve comprehensive, updated, and valuable information even with minimal uncertainty. If no search is unequivocally needed, return an empty list. - -### Guidelines: -- Respond **EXCLUSIVELY** with a JSON object. Any form of extra commentary, explanation, or additional text is strictly prohibited. -- When generating search queries, respond in the format: { "queries": ["query1", "query2"] }, ensuring each query is distinct, concise, and relevant to the topic. -- If and only if it is entirely certain that no useful results can be retrieved by a search, return: { "queries": [] }. -- Err on the side of suggesting search queries if there is **any chance** they might provide useful or updated information. -- Be concise and focused on composing high-quality search queries, avoiding unnecessary elaboration, commentary, or assumptions. -- Today's date is: {{CURRENT_DATE}}. -- Always prioritize providing actionable and broad queries that maximize informational coverage. - -### Output: -Strictly return in JSON format: -{ - "queries": ["query1", "query2"] -} - -### Chat History: - -{{MESSAGES:END:6}} - -""" - -ENABLE_AUTOCOMPLETE_GENERATION = PersistentConfig( - 'ENABLE_AUTOCOMPLETE_GENERATION', - 'task.autocomplete.enable', - os.environ.get('ENABLE_AUTOCOMPLETE_GENERATION', 'False').lower() == 'true', -) - -AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = PersistentConfig( - 'AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH', - 'task.autocomplete.input_max_length', - int(os.environ.get('AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH', '-1')), -) - -AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = PersistentConfig( - 'AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE', - 'task.autocomplete.prompt_template', - os.environ.get('AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE', ''), -) - - -DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = """### Task: -You are an autocompletion system. Continue the text in `` based on the **completion type** in `` and the given language. - -### **Instructions**: -1. Analyze `` for context and meaning. -2. Use `` to guide your output: - - **General**: Provide a natural, concise continuation. - - **Search Query**: Complete as if generating a realistic search query. -3. Start as if you are directly continuing ``. Do **not** repeat, paraphrase, or respond as a model. Simply complete the text. -4. Ensure the continuation: - - Flows naturally from ``. - - Avoids repetition, overexplaining, or unrelated ideas. -5. If unsure, return: `{ "text": "" }`. - -### **Output Rules**: -- Respond only in JSON format: `{ "text": "" }`. - -### **Examples**: -#### Example 1: -Input: -General -The sun was setting over the horizon, painting the sky -Output: -{ "text": "with vibrant shades of orange and pink." } - -#### Example 2: -Input: -Search Query -Top-rated restaurants in -Output: -{ "text": "New York City for Italian cuisine." } - ---- -### Context: - -{{MESSAGES:END:6}} - -{{TYPE}} -{{PROMPT}} -#### Output: -""" - - -VOICE_MODE_PROMPT_TEMPLATE = PersistentConfig( - 'VOICE_MODE_PROMPT_TEMPLATE', - 'task.voice.prompt_template', - os.environ.get('VOICE_MODE_PROMPT_TEMPLATE', ''), -) - -DEFAULT_VOICE_MODE_PROMPT_TEMPLATE = """You are a friendly, concise voice assistant. - -Everything you say will be spoken aloud. -Keep responses short, clear, and natural. - -STYLE: -- Use simple words and short sentences. -- Sound warm and conversational. -- Avoid long explanations, lists, or complex phrasing. - -BEHAVIOR: -- Give the quickest helpful answer first. -- Offer extra detail only if needed. -- Ask for clarification only when necessary. - -VOICE OPTIMIZATION: -- Break information into small, easy-to-hear chunks. -- Avoid dense wording or anything that sounds like reading text. - -ERROR HANDLING: -- If unsure, say so briefly and offer options. -- If something is unsafe or impossible, decline kindly and suggest a safe alternative. - -Stay consistent, helpful, and easy to listen to.""" - -TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig( - 'TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE', - 'task.tools.prompt_template', - os.environ.get('TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE', ''), -) - - -DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = """Available Tools: {{TOOLS}} - -Your task is to choose and return the correct tool(s) from the list of available tools based on the query. Follow these guidelines: - -- Return only the JSON object, without any additional text or explanation. - -- If no tools match the query, return an empty array: - { - "tool_calls": [] - } - -- If one or more tools match the query, construct a JSON response containing a "tool_calls" array with objects that include: - - "name": The tool's name. - - "parameters": A dictionary of required parameters and their corresponding values. - -The format for the JSON response is strictly: -{ - "tool_calls": [ - {"name": "toolName1", "parameters": {"key1": "value1"}}, - {"name": "toolName2", "parameters": {"key2": "value2"}} - ] -}""" - - -DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE = """Your task is to reflect the speaker's likely facial expression through a fitting emoji. Interpret emotions from the message and reflect their facial expression using fitting, diverse emojis (e.g., 😊, 😢, 😡, 😱). - -Message: ```{{prompt}}```""" - -DEFAULT_MOA_GENERATION_PROMPT_TEMPLATE = """You have been provided with a set of responses from various models to the latest user query: "{{prompt}}" - -Your task is to synthesize these responses into a single, high-quality response. It is crucial to critically evaluate the information provided in these responses, recognizing that some of it may be biased or incorrect. Your response should not simply replicate the given answers but should offer a refined, accurate, and comprehensive reply to the instruction. Ensure your response is well-structured, coherent, and adheres to the highest standards of accuracy and reliability. - -Responses from models: {{responses}}""" - - -#################################### -# Code Interpreter -#################################### - -ENABLE_CODE_EXECUTION = PersistentConfig( - 'ENABLE_CODE_EXECUTION', - 'code_execution.enable', - os.environ.get('ENABLE_CODE_EXECUTION', 'True').lower() == 'true', -) - -CODE_EXECUTION_ENGINE = PersistentConfig( - 'CODE_EXECUTION_ENGINE', - 'code_execution.engine', - os.environ.get('CODE_EXECUTION_ENGINE', 'pyodide'), -) - -CODE_EXECUTION_JUPYTER_URL = PersistentConfig( - 'CODE_EXECUTION_JUPYTER_URL', - 'code_execution.jupyter.url', - os.environ.get('CODE_EXECUTION_JUPYTER_URL', ''), -) - -CODE_EXECUTION_JUPYTER_AUTH = PersistentConfig( - 'CODE_EXECUTION_JUPYTER_AUTH', - 'code_execution.jupyter.auth', - os.environ.get('CODE_EXECUTION_JUPYTER_AUTH', ''), -) - -CODE_EXECUTION_JUPYTER_AUTH_TOKEN = PersistentConfig( - 'CODE_EXECUTION_JUPYTER_AUTH_TOKEN', - 'code_execution.jupyter.auth_token', - os.environ.get('CODE_EXECUTION_JUPYTER_AUTH_TOKEN', ''), -) - - -CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = PersistentConfig( - 'CODE_EXECUTION_JUPYTER_AUTH_PASSWORD', - 'code_execution.jupyter.auth_password', - os.environ.get('CODE_EXECUTION_JUPYTER_AUTH_PASSWORD', ''), -) - -CODE_EXECUTION_JUPYTER_TIMEOUT = PersistentConfig( - 'CODE_EXECUTION_JUPYTER_TIMEOUT', - 'code_execution.jupyter.timeout', - int(os.environ.get('CODE_EXECUTION_JUPYTER_TIMEOUT', '60')), -) - -ENABLE_CODE_INTERPRETER = PersistentConfig( - 'ENABLE_CODE_INTERPRETER', - 'code_interpreter.enable', - os.environ.get('ENABLE_CODE_INTERPRETER', 'True').lower() == 'true', -) - -ENABLE_MEMORIES = PersistentConfig( - 'ENABLE_MEMORIES', - 'memories.enable', - os.environ.get('ENABLE_MEMORIES', 'True').lower() == 'true', -) - -CODE_INTERPRETER_ENGINE = PersistentConfig( - 'CODE_INTERPRETER_ENGINE', - 'code_interpreter.engine', - os.environ.get('CODE_INTERPRETER_ENGINE', 'pyodide'), -) - -CODE_INTERPRETER_PROMPT_TEMPLATE = PersistentConfig( - 'CODE_INTERPRETER_PROMPT_TEMPLATE', - 'code_interpreter.prompt_template', - os.environ.get('CODE_INTERPRETER_PROMPT_TEMPLATE', ''), -) - -CODE_INTERPRETER_JUPYTER_URL = PersistentConfig( - 'CODE_INTERPRETER_JUPYTER_URL', - 'code_interpreter.jupyter.url', - os.environ.get('CODE_INTERPRETER_JUPYTER_URL', os.environ.get('CODE_EXECUTION_JUPYTER_URL', '')), -) - -CODE_INTERPRETER_JUPYTER_AUTH = PersistentConfig( - 'CODE_INTERPRETER_JUPYTER_AUTH', - 'code_interpreter.jupyter.auth', - os.environ.get( - 'CODE_INTERPRETER_JUPYTER_AUTH', - os.environ.get('CODE_EXECUTION_JUPYTER_AUTH', ''), - ), -) - -CODE_INTERPRETER_JUPYTER_AUTH_TOKEN = PersistentConfig( - 'CODE_INTERPRETER_JUPYTER_AUTH_TOKEN', - 'code_interpreter.jupyter.auth_token', - os.environ.get( - 'CODE_INTERPRETER_JUPYTER_AUTH_TOKEN', - os.environ.get('CODE_EXECUTION_JUPYTER_AUTH_TOKEN', ''), - ), -) - - -CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = PersistentConfig( - 'CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD', - 'code_interpreter.jupyter.auth_password', - os.environ.get( - 'CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD', - os.environ.get('CODE_EXECUTION_JUPYTER_AUTH_PASSWORD', ''), - ), -) - -CODE_INTERPRETER_JUPYTER_TIMEOUT = PersistentConfig( - 'CODE_INTERPRETER_JUPYTER_TIMEOUT', - 'code_interpreter.jupyter.timeout', - int( - os.environ.get( - 'CODE_INTERPRETER_JUPYTER_TIMEOUT', - os.environ.get('CODE_EXECUTION_JUPYTER_TIMEOUT', '60'), - ) - ), -) - -CODE_INTERPRETER_BLOCKED_MODULES = [ - library.strip() for library in os.environ.get('CODE_INTERPRETER_BLOCKED_MODULES', '').split(',') if library.strip() -] - -DEFAULT_CODE_INTERPRETER_PROMPT = """ -#### Code Interpreter - -You have access to a Python code interpreter via: `` - -- The Python shell runs directly in the user's browser for fast execution of analysis, calculations, or problem-solving. Use it in this response. -- You can use a wide array of libraries for data manipulation, visualization, API calls, or any computational task. Think outside the box and harness Python's full potential. -- **You must enclose your code within `` XML tags** and stop right away. If you don't, the code won't execute. -- Do NOT use triple backticks (```py ... ```) inside the XML tags — that is markdown formatting, not executable Python code. -- **Always print meaningful outputs** (results, tables, summaries, visuals). Avoid implicit outputs; use explicit print statements. -- After obtaining output, **provide a concise analysis, interpretation, or next steps** to help the user understand the findings. -- If results are unclear or unexpected, refine the code and re-execute. Iterate until you deliver meaningful insights. -- **If a link to an image, audio, or any file appears in the output, display it exactly as-is** in your response so the user can access it. Do not modify the link. -- Respond in the chat's primary language. Default to English if multilingual. - -Ensure the code interpreter is effectively utilized to achieve the highest-quality analysis for the user.""" - -# Appended to the code interpreter prompt only when engine is pyodide (not jupyter) -CODE_INTERPRETER_PYODIDE_PROMPT = """ - -##### Pyodide Environment - -- This Python environment runs via Pyodide in the browser. **Do not install packages** — `pip install`, `subprocess`, and `micropip.install()` are not available. -- If a required library is unavailable, use an alternative approach with available modules. Do not attempt to install anything. - -##### Persistent File System - -- User-uploaded files are available at `/mnt/uploads/`. When the user asks you to work with their files, read from this directory. -- You can also write output files to `/mnt/uploads/` so the user can access and download them from the file browser. -- The file system persists across code executions within the same session. -- Use `import os; os.listdir('/mnt/uploads')` to discover available files.""" - - -#################################### -# Vector Database -#################################### - -VECTOR_DB = os.environ.get('VECTOR_DB', 'chroma') - -# Chroma -CHROMA_DATA_PATH = f'{DATA_DIR}/vector_db' - -if VECTOR_DB == 'chroma': - import chromadb - - CHROMA_TENANT = os.environ.get('CHROMA_TENANT', chromadb.DEFAULT_TENANT) - CHROMA_DATABASE = os.environ.get('CHROMA_DATABASE', chromadb.DEFAULT_DATABASE) - CHROMA_HTTP_HOST = os.environ.get('CHROMA_HTTP_HOST', '') - CHROMA_HTTP_PORT = int(os.environ.get('CHROMA_HTTP_PORT', '8000')) - CHROMA_CLIENT_AUTH_PROVIDER = os.environ.get('CHROMA_CLIENT_AUTH_PROVIDER', '') - CHROMA_CLIENT_AUTH_CREDENTIALS = os.environ.get('CHROMA_CLIENT_AUTH_CREDENTIALS', '') - # Comma-separated list of header=value pairs - CHROMA_HTTP_HEADERS = os.environ.get('CHROMA_HTTP_HEADERS', '') - if CHROMA_HTTP_HEADERS: - CHROMA_HTTP_HEADERS = dict([pair.split('=') for pair in CHROMA_HTTP_HEADERS.split(',')]) - else: - CHROMA_HTTP_HEADERS = None - CHROMA_HTTP_SSL = os.environ.get('CHROMA_HTTP_SSL', 'false').lower() == 'true' -# this uses the model defined in the Dockerfile ENV variable. If you dont use docker or docker based deployments such as k8s, the default embedding model will be used (sentence-transformers/all-MiniLM-L6-v2) - - -# MariaDB Vector (mariadb-vector) -MARIADB_VECTOR_DB_URL = os.environ.get('MARIADB_VECTOR_DB_URL', '').strip() - -MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int( - os.environ.get('MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH', '1536').strip() or '1536' -) - -# Distance strategy: -# - cosine => vec_distance_cosine(...) -# - euclidean => vec_distance_euclidean(...) -MARIADB_VECTOR_DISTANCE_STRATEGY = os.environ.get('MARIADB_VECTOR_DISTANCE_STRATEGY', 'cosine').strip().lower() - -# HNSW M parameter (MariaDB VECTOR INDEX ... M=) -MARIADB_VECTOR_INDEX_M = int(os.environ.get('MARIADB_VECTOR_INDEX_M', '8').strip() or '8') - -# Pooling (MariaDB-Vector) -MARIADB_VECTOR_POOL_SIZE = os.environ.get('MARIADB_VECTOR_POOL_SIZE', None) - -if MARIADB_VECTOR_POOL_SIZE != None: - try: - MARIADB_VECTOR_POOL_SIZE = int(MARIADB_VECTOR_POOL_SIZE) - except Exception: - MARIADB_VECTOR_POOL_SIZE = None - -MARIADB_VECTOR_POOL_MAX_OVERFLOW = os.environ.get('MARIADB_VECTOR_POOL_MAX_OVERFLOW', 0) - -if MARIADB_VECTOR_POOL_MAX_OVERFLOW == '': - MARIADB_VECTOR_POOL_MAX_OVERFLOW = 0 -else: - try: - MARIADB_VECTOR_POOL_MAX_OVERFLOW = int(MARIADB_VECTOR_POOL_MAX_OVERFLOW) - except Exception: - MARIADB_VECTOR_POOL_MAX_OVERFLOW = 0 - -MARIADB_VECTOR_POOL_TIMEOUT = os.environ.get('MARIADB_VECTOR_POOL_TIMEOUT', 30) - -if MARIADB_VECTOR_POOL_TIMEOUT == '': - MARIADB_VECTOR_POOL_TIMEOUT = 30 -else: - try: - MARIADB_VECTOR_POOL_TIMEOUT = int(MARIADB_VECTOR_POOL_TIMEOUT) - except Exception: - MARIADB_VECTOR_POOL_TIMEOUT = 30 - -MARIADB_VECTOR_POOL_RECYCLE = os.environ.get('MARIADB_VECTOR_POOL_RECYCLE', 3600) - -if MARIADB_VECTOR_POOL_RECYCLE == '': - MARIADB_VECTOR_POOL_RECYCLE = 3600 -else: - try: - MARIADB_VECTOR_POOL_RECYCLE = int(MARIADB_VECTOR_POOL_RECYCLE) - except Exception: - MARIADB_VECTOR_POOL_RECYCLE = 3600 - -ENABLE_MARIADB_VECTOR = True -if VECTOR_DB == 'mariadb-vector': - if not MARIADB_VECTOR_DB_URL: - ENABLE_MARIADB_VECTOR = False - else: - try: - parsed = urlparse(MARIADB_VECTOR_DB_URL) - scheme = (parsed.scheme or '').lower() - # Require official driver so VECTOR binds as float32 bytes correctly - if scheme != 'mariadb+mariadbconnector': - ENABLE_MARIADB_VECTOR = False - except Exception: - ENABLE_MARIADB_VECTOR = False - - -# Milvus -MILVUS_URI = os.environ.get('MILVUS_URI', f'{DATA_DIR}/vector_db/milvus.db') -MILVUS_DB = os.environ.get('MILVUS_DB', 'default') -MILVUS_TOKEN = os.environ.get('MILVUS_TOKEN', None) -MILVUS_INDEX_TYPE = os.environ.get('MILVUS_INDEX_TYPE', 'HNSW') -MILVUS_METRIC_TYPE = os.environ.get('MILVUS_METRIC_TYPE', 'COSINE') -MILVUS_HNSW_M = int(os.environ.get('MILVUS_HNSW_M', '16')) -MILVUS_HNSW_EFCONSTRUCTION = int(os.environ.get('MILVUS_HNSW_EFCONSTRUCTION', '100')) -MILVUS_IVF_FLAT_NLIST = int(os.environ.get('MILVUS_IVF_FLAT_NLIST', '128')) -MILVUS_DISKANN_MAX_DEGREE = int(os.environ.get('MILVUS_DISKANN_MAX_DEGREE', '56')) -MILVUS_DISKANN_SEARCH_LIST_SIZE = int(os.environ.get('MILVUS_DISKANN_SEARCH_LIST_SIZE', '100')) -ENABLE_MILVUS_MULTITENANCY_MODE = os.environ.get('ENABLE_MILVUS_MULTITENANCY_MODE', 'false').lower() == 'true' -# Hyphens not allowed, need to use underscores in collection names -MILVUS_COLLECTION_PREFIX = os.environ.get('MILVUS_COLLECTION_PREFIX', 'open_webui') - -# Qdrant -QDRANT_URI = os.environ.get('QDRANT_URI', None) -QDRANT_API_KEY = os.environ.get('QDRANT_API_KEY', None) -QDRANT_ON_DISK = os.environ.get('QDRANT_ON_DISK', 'false').lower() == 'true' -QDRANT_PREFER_GRPC = os.environ.get('QDRANT_PREFER_GRPC', 'false').lower() == 'true' -QDRANT_GRPC_PORT = int(os.environ.get('QDRANT_GRPC_PORT', '6334')) -QDRANT_TIMEOUT = int(os.environ.get('QDRANT_TIMEOUT', '5')) -QDRANT_HNSW_M = int(os.environ.get('QDRANT_HNSW_M', '16')) -ENABLE_QDRANT_MULTITENANCY_MODE = os.environ.get('ENABLE_QDRANT_MULTITENANCY_MODE', 'true').lower() == 'true' -QDRANT_COLLECTION_PREFIX = os.environ.get('QDRANT_COLLECTION_PREFIX', 'open-webui') - -WEAVIATE_HTTP_HOST = os.environ.get('WEAVIATE_HTTP_HOST', '') -WEAVIATE_GRPC_HOST = os.environ.get('WEAVIATE_GRPC_HOST', '') -WEAVIATE_HTTP_PORT = int(os.environ.get('WEAVIATE_HTTP_PORT', '8080')) -WEAVIATE_GRPC_PORT = int(os.environ.get('WEAVIATE_GRPC_PORT', '50051')) -WEAVIATE_API_KEY = os.environ.get('WEAVIATE_API_KEY') -WEAVIATE_HTTP_SECURE = os.environ.get('WEAVIATE_HTTP_SECURE', 'false').lower() == 'true' -WEAVIATE_GRPC_SECURE = os.environ.get('WEAVIATE_GRPC_SECURE', 'false').lower() == 'true' -WEAVIATE_SKIP_INIT_CHECKS = os.environ.get('WEAVIATE_SKIP_INIT_CHECKS', 'false').lower() == 'true' - -# OpenSearch -OPENSEARCH_URI = os.environ.get('OPENSEARCH_URI', 'https://localhost:9200') -OPENSEARCH_SSL = os.environ.get('OPENSEARCH_SSL', 'true').lower() == 'true' -OPENSEARCH_CERT_VERIFY = os.environ.get('OPENSEARCH_CERT_VERIFY', 'false').lower() == 'true' -OPENSEARCH_USERNAME = os.environ.get('OPENSEARCH_USERNAME', None) -OPENSEARCH_PASSWORD = os.environ.get('OPENSEARCH_PASSWORD', None) - -# ElasticSearch -ELASTICSEARCH_URL = os.environ.get('ELASTICSEARCH_URL', 'https://localhost:9200') -ELASTICSEARCH_CA_CERTS = os.environ.get('ELASTICSEARCH_CA_CERTS', None) -ELASTICSEARCH_API_KEY = os.environ.get('ELASTICSEARCH_API_KEY', None) -ELASTICSEARCH_USERNAME = os.environ.get('ELASTICSEARCH_USERNAME', None) -ELASTICSEARCH_PASSWORD = os.environ.get('ELASTICSEARCH_PASSWORD', None) -ELASTICSEARCH_CLOUD_ID = os.environ.get('ELASTICSEARCH_CLOUD_ID', None) -SSL_ASSERT_FINGERPRINT = os.environ.get('SSL_ASSERT_FINGERPRINT', None) -ELASTICSEARCH_INDEX_PREFIX = os.environ.get('ELASTICSEARCH_INDEX_PREFIX', 'open_webui_collections') -# Pgvector -PGVECTOR_DB_URL = os.environ.get('PGVECTOR_DB_URL', DATABASE_URL) -if VECTOR_DB == 'pgvector' and not PGVECTOR_DB_URL.startswith('postgres'): - raise ValueError( - 'Pgvector requires setting PGVECTOR_DB_URL or using Postgres with vector extension as the primary database.' - ) -PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int(os.environ.get('PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH', '1536')) - -PGVECTOR_USE_HALFVEC = os.getenv('PGVECTOR_USE_HALFVEC', 'false').lower() == 'true' - -if PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH > 2000 and not PGVECTOR_USE_HALFVEC: - raise ValueError( - 'PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH is set to ' - f'{PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH}, which exceeds the 2000 dimension limit of the ' - "'vector' type. Set PGVECTOR_USE_HALFVEC=true to enable the 'halfvec' " - 'type required for high-dimensional embeddings.' - ) - -PGVECTOR_CREATE_EXTENSION = os.getenv('PGVECTOR_CREATE_EXTENSION', 'true').lower() == 'true' -PGVECTOR_PGCRYPTO = os.getenv('PGVECTOR_PGCRYPTO', 'false').lower() == 'true' -PGVECTOR_PGCRYPTO_KEY = os.getenv('PGVECTOR_PGCRYPTO_KEY', None) -if PGVECTOR_PGCRYPTO and not PGVECTOR_PGCRYPTO_KEY: - raise ValueError('PGVECTOR_PGCRYPTO is enabled but PGVECTOR_PGCRYPTO_KEY is not set. Please provide a valid key.') - - -PGVECTOR_POOL_SIZE = os.environ.get('PGVECTOR_POOL_SIZE', None) - -if PGVECTOR_POOL_SIZE != None: - try: - PGVECTOR_POOL_SIZE = int(PGVECTOR_POOL_SIZE) - except Exception: - PGVECTOR_POOL_SIZE = None - -PGVECTOR_POOL_MAX_OVERFLOW = os.environ.get('PGVECTOR_POOL_MAX_OVERFLOW', 0) - -if PGVECTOR_POOL_MAX_OVERFLOW == '': - PGVECTOR_POOL_MAX_OVERFLOW = 0 -else: - try: - PGVECTOR_POOL_MAX_OVERFLOW = int(PGVECTOR_POOL_MAX_OVERFLOW) - except Exception: - PGVECTOR_POOL_MAX_OVERFLOW = 0 - -PGVECTOR_POOL_TIMEOUT = os.environ.get('PGVECTOR_POOL_TIMEOUT', 30) - -if PGVECTOR_POOL_TIMEOUT == '': - PGVECTOR_POOL_TIMEOUT = 30 -else: - try: - PGVECTOR_POOL_TIMEOUT = int(PGVECTOR_POOL_TIMEOUT) - except Exception: - PGVECTOR_POOL_TIMEOUT = 30 - -PGVECTOR_POOL_RECYCLE = os.environ.get('PGVECTOR_POOL_RECYCLE', 3600) - -if PGVECTOR_POOL_RECYCLE == '': - PGVECTOR_POOL_RECYCLE = 3600 -else: - try: - PGVECTOR_POOL_RECYCLE = int(PGVECTOR_POOL_RECYCLE) - except Exception: - PGVECTOR_POOL_RECYCLE = 3600 - -PGVECTOR_INDEX_METHOD = os.getenv('PGVECTOR_INDEX_METHOD', '').strip().lower() -if PGVECTOR_INDEX_METHOD not in ('ivfflat', 'hnsw', ''): - PGVECTOR_INDEX_METHOD = '' - -PGVECTOR_HNSW_M = os.environ.get('PGVECTOR_HNSW_M', 16) - -if PGVECTOR_HNSW_M == '': - PGVECTOR_HNSW_M = 16 -else: - try: - PGVECTOR_HNSW_M = int(PGVECTOR_HNSW_M) - except Exception: - PGVECTOR_HNSW_M = 16 - -PGVECTOR_HNSW_EF_CONSTRUCTION = os.environ.get('PGVECTOR_HNSW_EF_CONSTRUCTION', 64) - -if PGVECTOR_HNSW_EF_CONSTRUCTION == '': - PGVECTOR_HNSW_EF_CONSTRUCTION = 64 -else: - try: - PGVECTOR_HNSW_EF_CONSTRUCTION = int(PGVECTOR_HNSW_EF_CONSTRUCTION) - except Exception: - PGVECTOR_HNSW_EF_CONSTRUCTION = 64 - -PGVECTOR_IVFFLAT_LISTS = os.environ.get('PGVECTOR_IVFFLAT_LISTS', 100) - -if PGVECTOR_IVFFLAT_LISTS == '': - PGVECTOR_IVFFLAT_LISTS = 100 -else: - try: - PGVECTOR_IVFFLAT_LISTS = int(PGVECTOR_IVFFLAT_LISTS) - except Exception: - PGVECTOR_IVFFLAT_LISTS = 100 - -# openGauss -OPENGAUSS_DB_URL = os.environ.get('OPENGAUSS_DB_URL', DATABASE_URL) - -OPENGAUSS_INITIALIZE_MAX_VECTOR_LENGTH = int(os.environ.get('OPENGAUSS_INITIALIZE_MAX_VECTOR_LENGTH', '1536')) - -OPENGAUSS_POOL_SIZE = os.environ.get('OPENGAUSS_POOL_SIZE', None) - -if OPENGAUSS_POOL_SIZE != None: - try: - OPENGAUSS_POOL_SIZE = int(OPENGAUSS_POOL_SIZE) - except Exception: - OPENGAUSS_POOL_SIZE = None - -OPENGAUSS_POOL_MAX_OVERFLOW = os.environ.get('OPENGAUSS_POOL_MAX_OVERFLOW', 0) - -if OPENGAUSS_POOL_MAX_OVERFLOW == '': - OPENGAUSS_POOL_MAX_OVERFLOW = 0 -else: - try: - OPENGAUSS_POOL_MAX_OVERFLOW = int(OPENGAUSS_POOL_MAX_OVERFLOW) - except Exception: - OPENGAUSS_POOL_MAX_OVERFLOW = 0 - -OPENGAUSS_POOL_TIMEOUT = os.environ.get('OPENGAUSS_POOL_TIMEOUT', 30) - -if OPENGAUSS_POOL_TIMEOUT == '': - OPENGAUSS_POOL_TIMEOUT = 30 -else: - try: - OPENGAUSS_POOL_TIMEOUT = int(OPENGAUSS_POOL_TIMEOUT) - except Exception: - OPENGAUSS_POOL_TIMEOUT = 30 - -OPENGAUSS_POOL_RECYCLE = os.environ.get('OPENGAUSS_POOL_RECYCLE', 3600) - -if OPENGAUSS_POOL_RECYCLE == '': - OPENGAUSS_POOL_RECYCLE = 3600 -else: - try: - OPENGAUSS_POOL_RECYCLE = int(OPENGAUSS_POOL_RECYCLE) - except Exception: - OPENGAUSS_POOL_RECYCLE = 3600 - -# Pinecone -PINECONE_API_KEY = os.environ.get('PINECONE_API_KEY', None) -PINECONE_ENVIRONMENT = os.environ.get('PINECONE_ENVIRONMENT', None) -PINECONE_INDEX_NAME = os.getenv('PINECONE_INDEX_NAME', 'open-webui-index') -PINECONE_DIMENSION = int(os.getenv('PINECONE_DIMENSION', 1536)) # or 3072, 1024, 768 -PINECONE_METRIC = os.getenv('PINECONE_METRIC', 'cosine') -PINECONE_CLOUD = os.getenv('PINECONE_CLOUD', 'aws') # or "gcp" or "azure" - -# ORACLE23AI (Oracle23ai Vector Search) - -ORACLE_DB_USE_WALLET = os.environ.get('ORACLE_DB_USE_WALLET', 'false').lower() == 'true' -ORACLE_DB_USER = os.environ.get('ORACLE_DB_USER', None) # -ORACLE_DB_PASSWORD = os.environ.get('ORACLE_DB_PASSWORD', None) # -ORACLE_DB_DSN = os.environ.get('ORACLE_DB_DSN', None) # -ORACLE_WALLET_DIR = os.environ.get('ORACLE_WALLET_DIR', None) -ORACLE_WALLET_PASSWORD = os.environ.get('ORACLE_WALLET_PASSWORD', None) -ORACLE_VECTOR_LENGTH = os.environ.get('ORACLE_VECTOR_LENGTH', 768) - -ORACLE_DB_POOL_MIN = int(os.environ.get('ORACLE_DB_POOL_MIN', 2)) -ORACLE_DB_POOL_MAX = int(os.environ.get('ORACLE_DB_POOL_MAX', 10)) -ORACLE_DB_POOL_INCREMENT = int(os.environ.get('ORACLE_DB_POOL_INCREMENT', 1)) - - -if VECTOR_DB == 'oracle23ai': - if not ORACLE_DB_USER or not ORACLE_DB_PASSWORD or not ORACLE_DB_DSN: - raise ValueError('Oracle23ai requires setting ORACLE_DB_USER, ORACLE_DB_PASSWORD, and ORACLE_DB_DSN.') - if ORACLE_DB_USE_WALLET and (not ORACLE_WALLET_DIR or not ORACLE_WALLET_PASSWORD): - raise ValueError( - 'Oracle23ai requires setting ORACLE_WALLET_DIR and ORACLE_WALLET_PASSWORD when using wallet authentication.' - ) - -log.info(f'VECTOR_DB: {VECTOR_DB}') - -# S3 Vector -S3_VECTOR_BUCKET_NAME = os.environ.get('S3_VECTOR_BUCKET_NAME', None) -S3_VECTOR_REGION = os.environ.get('S3_VECTOR_REGION', None) - -#################################### -# Information Retrieval (RAG) -#################################### - - -# If configured, Google Drive will be available as an upload option. -ENABLE_GOOGLE_DRIVE_INTEGRATION = PersistentConfig( - 'ENABLE_GOOGLE_DRIVE_INTEGRATION', - 'google_drive.enable', - os.getenv('ENABLE_GOOGLE_DRIVE_INTEGRATION', 'False').lower() == 'true', -) - -GOOGLE_DRIVE_CLIENT_ID = PersistentConfig( - 'GOOGLE_DRIVE_CLIENT_ID', - 'google_drive.client_id', - os.environ.get('GOOGLE_DRIVE_CLIENT_ID', ''), -) - -GOOGLE_DRIVE_API_KEY = PersistentConfig( - 'GOOGLE_DRIVE_API_KEY', - 'google_drive.api_key', - os.environ.get('GOOGLE_DRIVE_API_KEY', ''), -) - -ENABLE_ONEDRIVE_INTEGRATION = PersistentConfig( - 'ENABLE_ONEDRIVE_INTEGRATION', - 'onedrive.enable', - os.getenv('ENABLE_ONEDRIVE_INTEGRATION', 'False').lower() == 'true', -) - - -ENABLE_ONEDRIVE_PERSONAL = os.environ.get('ENABLE_ONEDRIVE_PERSONAL', 'True').lower() == 'true' -ENABLE_ONEDRIVE_BUSINESS = os.environ.get('ENABLE_ONEDRIVE_BUSINESS', 'True').lower() == 'true' - -ONEDRIVE_CLIENT_ID = os.environ.get('ONEDRIVE_CLIENT_ID', '') -ONEDRIVE_CLIENT_ID_PERSONAL = os.environ.get('ONEDRIVE_CLIENT_ID_PERSONAL', ONEDRIVE_CLIENT_ID) -ONEDRIVE_CLIENT_ID_BUSINESS = os.environ.get('ONEDRIVE_CLIENT_ID_BUSINESS', ONEDRIVE_CLIENT_ID) - -ONEDRIVE_SHAREPOINT_URL = PersistentConfig( - 'ONEDRIVE_SHAREPOINT_URL', - 'onedrive.sharepoint_url', - os.environ.get('ONEDRIVE_SHAREPOINT_URL', ''), -) - -ONEDRIVE_SHAREPOINT_TENANT_ID = PersistentConfig( - 'ONEDRIVE_SHAREPOINT_TENANT_ID', - 'onedrive.sharepoint_tenant_id', - os.environ.get('ONEDRIVE_SHAREPOINT_TENANT_ID', ''), -) - -# RAG Content Extraction -CONTENT_EXTRACTION_ENGINE = PersistentConfig( - 'CONTENT_EXTRACTION_ENGINE', - 'rag.CONTENT_EXTRACTION_ENGINE', - os.environ.get('CONTENT_EXTRACTION_ENGINE', '').lower(), -) - -DATALAB_MARKER_API_KEY = PersistentConfig( - 'DATALAB_MARKER_API_KEY', - 'rag.datalab_marker_api_key', - os.environ.get('DATALAB_MARKER_API_KEY', ''), -) - -DATALAB_MARKER_API_BASE_URL = PersistentConfig( - 'DATALAB_MARKER_API_BASE_URL', - 'rag.datalab_marker_api_base_url', - os.environ.get('DATALAB_MARKER_API_BASE_URL', ''), -) - -DATALAB_MARKER_ADDITIONAL_CONFIG = PersistentConfig( - 'DATALAB_MARKER_ADDITIONAL_CONFIG', - 'rag.datalab_marker_additional_config', - os.environ.get('DATALAB_MARKER_ADDITIONAL_CONFIG', ''), -) - -DATALAB_MARKER_USE_LLM = PersistentConfig( - 'DATALAB_MARKER_USE_LLM', - 'rag.DATALAB_MARKER_USE_LLM', - os.environ.get('DATALAB_MARKER_USE_LLM', 'false').lower() == 'true', -) - -DATALAB_MARKER_SKIP_CACHE = PersistentConfig( - 'DATALAB_MARKER_SKIP_CACHE', - 'rag.datalab_marker_skip_cache', - os.environ.get('DATALAB_MARKER_SKIP_CACHE', 'false').lower() == 'true', -) - -DATALAB_MARKER_FORCE_OCR = PersistentConfig( - 'DATALAB_MARKER_FORCE_OCR', - 'rag.datalab_marker_force_ocr', - os.environ.get('DATALAB_MARKER_FORCE_OCR', 'false').lower() == 'true', -) - -DATALAB_MARKER_PAGINATE = PersistentConfig( - 'DATALAB_MARKER_PAGINATE', - 'rag.datalab_marker_paginate', - os.environ.get('DATALAB_MARKER_PAGINATE', 'false').lower() == 'true', -) - -DATALAB_MARKER_STRIP_EXISTING_OCR = PersistentConfig( - 'DATALAB_MARKER_STRIP_EXISTING_OCR', - 'rag.datalab_marker_strip_existing_ocr', - os.environ.get('DATALAB_MARKER_STRIP_EXISTING_OCR', 'false').lower() == 'true', -) - -DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION = PersistentConfig( - 'DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION', - 'rag.datalab_marker_disable_image_extraction', - os.environ.get('DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION', 'false').lower() == 'true', -) - -DATALAB_MARKER_FORMAT_LINES = PersistentConfig( - 'DATALAB_MARKER_FORMAT_LINES', - 'rag.datalab_marker_format_lines', - os.environ.get('DATALAB_MARKER_FORMAT_LINES', 'false').lower() == 'true', -) - -DATALAB_MARKER_OUTPUT_FORMAT = PersistentConfig( - 'DATALAB_MARKER_OUTPUT_FORMAT', - 'rag.datalab_marker_output_format', - os.environ.get('DATALAB_MARKER_OUTPUT_FORMAT', 'markdown'), -) - -MINERU_API_MODE = PersistentConfig( - 'MINERU_API_MODE', - 'rag.mineru_api_mode', - os.environ.get('MINERU_API_MODE', 'local'), # "local" or "cloud" -) - -MINERU_API_URL = PersistentConfig( - 'MINERU_API_URL', - 'rag.mineru_api_url', - os.environ.get('MINERU_API_URL', 'http://localhost:8000'), -) - -MINERU_API_TIMEOUT = PersistentConfig( - 'MINERU_API_TIMEOUT', - 'rag.mineru_api_timeout', - os.environ.get('MINERU_API_TIMEOUT', '300'), -) - -MINERU_API_KEY = PersistentConfig( - 'MINERU_API_KEY', - 'rag.mineru_api_key', - os.environ.get('MINERU_API_KEY', ''), -) - -mineru_params = os.getenv('MINERU_PARAMS', '') -try: - mineru_params = json.loads(mineru_params) -except json.JSONDecodeError: - mineru_params = {} - -MINERU_PARAMS = PersistentConfig( - 'MINERU_PARAMS', - 'rag.mineru_params', - mineru_params, -) - -EXTERNAL_DOCUMENT_LOADER_URL = PersistentConfig( - 'EXTERNAL_DOCUMENT_LOADER_URL', - 'rag.external_document_loader_url', - os.environ.get('EXTERNAL_DOCUMENT_LOADER_URL', ''), -) - -EXTERNAL_DOCUMENT_LOADER_API_KEY = PersistentConfig( - 'EXTERNAL_DOCUMENT_LOADER_API_KEY', - 'rag.external_document_loader_api_key', - os.environ.get('EXTERNAL_DOCUMENT_LOADER_API_KEY', ''), -) - -TIKA_SERVER_URL = PersistentConfig( - 'TIKA_SERVER_URL', - 'rag.tika_server_url', - os.getenv('TIKA_SERVER_URL', 'http://tika:9998'), # Default for sidecar deployment -) - -DOCLING_SERVER_URL = PersistentConfig( - 'DOCLING_SERVER_URL', - 'rag.docling_server_url', - os.getenv('DOCLING_SERVER_URL', 'http://docling:5001'), -) - -DOCLING_API_KEY = PersistentConfig( - 'DOCLING_API_KEY', - 'rag.docling_api_key', - os.getenv('DOCLING_API_KEY', ''), -) - -docling_params = os.getenv('DOCLING_PARAMS', '') -try: - docling_params = json.loads(docling_params) -except json.JSONDecodeError: - docling_params = {} - -DOCLING_PARAMS = PersistentConfig( - 'DOCLING_PARAMS', - 'rag.docling_params', - docling_params, -) - -DOCUMENT_INTELLIGENCE_ENDPOINT = PersistentConfig( - 'DOCUMENT_INTELLIGENCE_ENDPOINT', - 'rag.document_intelligence_endpoint', - os.getenv('DOCUMENT_INTELLIGENCE_ENDPOINT', ''), -) - -DOCUMENT_INTELLIGENCE_KEY = PersistentConfig( - 'DOCUMENT_INTELLIGENCE_KEY', - 'rag.document_intelligence_key', - os.getenv('DOCUMENT_INTELLIGENCE_KEY', ''), -) - -DOCUMENT_INTELLIGENCE_MODEL = PersistentConfig( - 'DOCUMENT_INTELLIGENCE_MODEL', - 'rag.document_intelligence_model', - os.getenv('DOCUMENT_INTELLIGENCE_MODEL', 'prebuilt-layout'), -) - -MISTRAL_OCR_API_BASE_URL = PersistentConfig( - 'MISTRAL_OCR_API_BASE_URL', - 'rag.MISTRAL_OCR_API_BASE_URL', - os.getenv('MISTRAL_OCR_API_BASE_URL', 'https://api.mistral.ai/v1'), -) - -MISTRAL_OCR_API_KEY = PersistentConfig( - 'MISTRAL_OCR_API_KEY', - 'rag.mistral_ocr_api_key', - os.getenv('MISTRAL_OCR_API_KEY', ''), -) - -MISTRAL_OCR_USE_BASE64 = PersistentConfig( - "MISTRAL_OCR_USE_BASE64", - "rag.mistral_ocr_use_base64", - os.environ.get("MISTRAL_OCR_USE_BASE64", "False").lower() == "true", -) - -MISTRAL_OCR_MODEL = PersistentConfig( - "MISTRAL_OCR_MODEL", - "rag.mistral_ocr_model", - os.getenv("MISTRAL_OCR_MODEL", "mistral-ocr-latest"), -) - -PADDLEOCR_VL_BASE_URL = PersistentConfig( - 'PADDLEOCR_VL_BASE_URL', - 'rag.paddleocr_vl_base_url', - os.getenv('PADDLEOCR_VL_BASE_URL', 'http://localhost:8080'), -) - -PADDLEOCR_VL_TOKEN = PersistentConfig( - 'PADDLEOCR_VL_TOKEN', - 'rag.paddleocr_vl_token', - os.getenv('PADDLEOCR_VL_TOKEN', ''), -) - -BYPASS_EMBEDDING_AND_RETRIEVAL = PersistentConfig( - 'BYPASS_EMBEDDING_AND_RETRIEVAL', - 'rag.bypass_embedding_and_retrieval', - os.environ.get('BYPASS_EMBEDDING_AND_RETRIEVAL', 'False').lower() == 'true', -) - - -RAG_TOP_K = PersistentConfig('RAG_TOP_K', 'rag.top_k', int(os.environ.get('RAG_TOP_K', '3'))) -RAG_TOP_K_RERANKER = PersistentConfig( - 'RAG_TOP_K_RERANKER', - 'rag.top_k_reranker', - int(os.environ.get('RAG_TOP_K_RERANKER', '3')), -) -RAG_RELEVANCE_THRESHOLD = PersistentConfig( - 'RAG_RELEVANCE_THRESHOLD', - 'rag.relevance_threshold', - float(os.environ.get('RAG_RELEVANCE_THRESHOLD', '0.0')), -) -RAG_HYBRID_BM25_WEIGHT = PersistentConfig( - 'RAG_HYBRID_BM25_WEIGHT', - 'rag.hybrid_bm25_weight', - float(os.environ.get('RAG_HYBRID_BM25_WEIGHT', '0.5')), -) - -ENABLE_RAG_HYBRID_SEARCH = PersistentConfig( - 'ENABLE_RAG_HYBRID_SEARCH', - 'rag.enable_hybrid_search', - os.environ.get('ENABLE_RAG_HYBRID_SEARCH', '').lower() == 'true', -) - -ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS = PersistentConfig( - 'ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS', - 'rag.enable_hybrid_search_enriched_texts', - os.environ.get('ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS', 'False').lower() == 'true', -) - -RAG_FULL_CONTEXT = PersistentConfig( - 'RAG_FULL_CONTEXT', - 'rag.full_context', - os.getenv('RAG_FULL_CONTEXT', 'False').lower() == 'true', -) - -RAG_FILE_MAX_COUNT = PersistentConfig( - 'RAG_FILE_MAX_COUNT', - 'rag.file.max_count', - (int(os.environ.get('RAG_FILE_MAX_COUNT')) if os.environ.get('RAG_FILE_MAX_COUNT') else None), -) - -RAG_FILE_MAX_SIZE = PersistentConfig( - 'RAG_FILE_MAX_SIZE', - 'rag.file.max_size', - (int(os.environ.get('RAG_FILE_MAX_SIZE')) if os.environ.get('RAG_FILE_MAX_SIZE') else None), -) - -FILE_IMAGE_COMPRESSION_WIDTH = PersistentConfig( - 'FILE_IMAGE_COMPRESSION_WIDTH', - 'file.image_compression_width', - (int(os.environ.get('FILE_IMAGE_COMPRESSION_WIDTH')) if os.environ.get('FILE_IMAGE_COMPRESSION_WIDTH') else None), -) - -FILE_IMAGE_COMPRESSION_HEIGHT = PersistentConfig( - 'FILE_IMAGE_COMPRESSION_HEIGHT', - 'file.image_compression_height', - (int(os.environ.get('FILE_IMAGE_COMPRESSION_HEIGHT')) if os.environ.get('FILE_IMAGE_COMPRESSION_HEIGHT') else None), -) - - -RAG_ALLOWED_FILE_EXTENSIONS = PersistentConfig( - 'RAG_ALLOWED_FILE_EXTENSIONS', - 'rag.file.allowed_extensions', - [ext.strip() for ext in os.environ.get('RAG_ALLOWED_FILE_EXTENSIONS', '').split(',') if ext.strip()], -) - -RAG_EMBEDDING_ENGINE = PersistentConfig( - 'RAG_EMBEDDING_ENGINE', - 'rag.embedding_engine', - os.environ.get('RAG_EMBEDDING_ENGINE', ''), -) - -PDF_EXTRACT_IMAGES = PersistentConfig( - 'PDF_EXTRACT_IMAGES', - 'rag.pdf_extract_images', - os.environ.get('PDF_EXTRACT_IMAGES', 'False').lower() == 'true', -) - -PDF_LOADER_MODE = PersistentConfig( - 'PDF_LOADER_MODE', - 'rag.pdf_loader_mode', - os.environ.get('PDF_LOADER_MODE', 'page'), -) - -RAG_EMBEDDING_MODEL = PersistentConfig( - 'RAG_EMBEDDING_MODEL', - 'rag.embedding_model', - os.environ.get('RAG_EMBEDDING_MODEL', 'sentence-transformers/all-MiniLM-L6-v2'), -) -log.info(f'Embedding model set: {RAG_EMBEDDING_MODEL.value}') - -RAG_EMBEDDING_MODEL_AUTO_UPDATE = ( - not OFFLINE_MODE and os.environ.get('RAG_EMBEDDING_MODEL_AUTO_UPDATE', 'True').lower() == 'true' -) - -RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE = ( - os.environ.get('RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE', 'True').lower() == 'true' -) - -RAG_EMBEDDING_BATCH_SIZE = PersistentConfig( - 'RAG_EMBEDDING_BATCH_SIZE', - 'rag.embedding_batch_size', - int(os.environ.get('RAG_EMBEDDING_BATCH_SIZE') or os.environ.get('RAG_EMBEDDING_OPENAI_BATCH_SIZE', '1')), -) - -ENABLE_ASYNC_EMBEDDING = PersistentConfig( - 'ENABLE_ASYNC_EMBEDDING', - 'rag.enable_async_embedding', - os.environ.get('ENABLE_ASYNC_EMBEDDING', 'True').lower() == 'true', -) - -RAG_EMBEDDING_CONCURRENT_REQUESTS = PersistentConfig( - 'RAG_EMBEDDING_CONCURRENT_REQUESTS', - 'rag.embedding_concurrent_requests', - int(os.getenv('RAG_EMBEDDING_CONCURRENT_REQUESTS', '0')), -) - -RAG_EMBEDDING_QUERY_PREFIX = os.environ.get('RAG_EMBEDDING_QUERY_PREFIX', None) - -RAG_EMBEDDING_CONTENT_PREFIX = os.environ.get('RAG_EMBEDDING_CONTENT_PREFIX', None) - -RAG_EMBEDDING_PREFIX_FIELD_NAME = os.environ.get('RAG_EMBEDDING_PREFIX_FIELD_NAME', None) - -RAG_RERANKING_ENGINE = PersistentConfig( - 'RAG_RERANKING_ENGINE', - 'rag.reranking_engine', - os.environ.get('RAG_RERANKING_ENGINE', ''), -) - -RAG_RERANKING_MODEL = PersistentConfig( - 'RAG_RERANKING_MODEL', - 'rag.reranking_model', - os.environ.get('RAG_RERANKING_MODEL', ''), -) -if RAG_RERANKING_MODEL.value != '': - log.info(f'Reranking model set: {RAG_RERANKING_MODEL.value}') - - -RAG_RERANKING_MODEL_AUTO_UPDATE = ( - not OFFLINE_MODE and os.environ.get('RAG_RERANKING_MODEL_AUTO_UPDATE', 'True').lower() == 'true' -) - -RAG_RERANKING_MODEL_TRUST_REMOTE_CODE = ( - os.environ.get('RAG_RERANKING_MODEL_TRUST_REMOTE_CODE', 'True').lower() == 'true' -) - -RAG_RERANKING_BATCH_SIZE = PersistentConfig( - 'RAG_RERANKING_BATCH_SIZE', - 'rag.reranking_batch_size', - int(os.environ.get('RAG_RERANKING_BATCH_SIZE', '32')), -) - -RAG_EXTERNAL_RERANKER_URL = PersistentConfig( - 'RAG_EXTERNAL_RERANKER_URL', - 'rag.external_reranker_url', - os.environ.get('RAG_EXTERNAL_RERANKER_URL', ''), -) - -RAG_EXTERNAL_RERANKER_API_KEY = PersistentConfig( - 'RAG_EXTERNAL_RERANKER_API_KEY', - 'rag.external_reranker_api_key', - os.environ.get('RAG_EXTERNAL_RERANKER_API_KEY', ''), -) - -RAG_EXTERNAL_RERANKER_TIMEOUT = PersistentConfig( - 'RAG_EXTERNAL_RERANKER_TIMEOUT', - 'rag.external_reranker_timeout', - os.environ.get('RAG_EXTERNAL_RERANKER_TIMEOUT', ''), -) - - -RAG_TEXT_SPLITTER = PersistentConfig( - 'RAG_TEXT_SPLITTER', - 'rag.text_splitter', - os.environ.get('RAG_TEXT_SPLITTER', ''), -) - -ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER = PersistentConfig( - 'ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER', - 'rag.enable_markdown_header_text_splitter', - os.environ.get('ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER', 'True').lower() == 'true', -) - - -TIKTOKEN_CACHE_DIR = os.environ.get('TIKTOKEN_CACHE_DIR', f'{CACHE_DIR}/tiktoken') -TIKTOKEN_ENCODING_NAME = PersistentConfig( - 'TIKTOKEN_ENCODING_NAME', - 'rag.tiktoken_encoding_name', - os.environ.get('TIKTOKEN_ENCODING_NAME', 'cl100k_base'), -) - - -CHUNK_SIZE = PersistentConfig('CHUNK_SIZE', 'rag.chunk_size', int(os.environ.get('CHUNK_SIZE', '1000'))) - -CHUNK_MIN_SIZE_TARGET = PersistentConfig( - 'CHUNK_MIN_SIZE_TARGET', - 'rag.chunk_min_size_target', - int(os.environ.get('CHUNK_MIN_SIZE_TARGET', '0')), -) - -CHUNK_OVERLAP = PersistentConfig( - 'CHUNK_OVERLAP', - 'rag.chunk_overlap', - int(os.environ.get('CHUNK_OVERLAP', '100')), -) - -DEFAULT_RAG_TEMPLATE = """### Task: -Respond to the user query using the provided context, incorporating inline citations in the format [id] **only when the tag includes an explicit id attribute** (e.g., ). - -### Guidelines: -- If you don't know the answer, clearly state that. -- If uncertain, ask the user for clarification. -- Respond in the same language as the user's query. -- If the context is unreadable or of poor quality, inform the user and provide the best possible answer. -- If the answer isn't present in the context but you possess the knowledge, explain this to the user and provide the answer using your own understanding. -- **Only include inline citations using [id] (e.g., [1], [2]) when the tag includes an id attribute.** -- Do not cite if the tag does not contain an id attribute. -- Do not use XML tags in your response. -- Ensure citations are concise and directly related to the information provided. - -### Example of Citation: -If the user asks about a specific topic and the information is found in a source with a provided id attribute, the response should include the citation like in the following example: -* "According to the study, the proposed method increases efficiency by 20% [1]." - -### Output: -Provide a clear and direct response to the user's query, including inline citations in the format [id] only when the tag with id attribute is present in the context. - - -{{CONTEXT}} - -""" - -RAG_TEMPLATE = PersistentConfig( - 'RAG_TEMPLATE', - 'rag.template', - os.environ.get('RAG_TEMPLATE', DEFAULT_RAG_TEMPLATE), -) - -RAG_OPENAI_API_BASE_URL = PersistentConfig( - 'RAG_OPENAI_API_BASE_URL', - 'rag.openai_api_base_url', - os.getenv('RAG_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), -) -RAG_OPENAI_API_KEY = PersistentConfig( - 'RAG_OPENAI_API_KEY', - 'rag.openai_api_key', - os.getenv('RAG_OPENAI_API_KEY', OPENAI_API_KEY), -) - -RAG_AZURE_OPENAI_BASE_URL = PersistentConfig( - 'RAG_AZURE_OPENAI_BASE_URL', - 'rag.azure_openai.base_url', - os.getenv('RAG_AZURE_OPENAI_BASE_URL', ''), -) -RAG_AZURE_OPENAI_API_KEY = PersistentConfig( - 'RAG_AZURE_OPENAI_API_KEY', - 'rag.azure_openai.api_key', - os.getenv('RAG_AZURE_OPENAI_API_KEY', ''), -) -RAG_AZURE_OPENAI_API_VERSION = PersistentConfig( - 'RAG_AZURE_OPENAI_API_VERSION', - 'rag.azure_openai.api_version', - os.getenv('RAG_AZURE_OPENAI_API_VERSION', ''), -) - -RAG_OLLAMA_BASE_URL = PersistentConfig( - 'RAG_OLLAMA_BASE_URL', - 'rag.ollama.url', - os.getenv('RAG_OLLAMA_BASE_URL', OLLAMA_BASE_URL), -) - -RAG_OLLAMA_API_KEY = PersistentConfig( - 'RAG_OLLAMA_API_KEY', - 'rag.ollama.key', - os.getenv('RAG_OLLAMA_API_KEY', ''), -) - - -ENABLE_RAG_LOCAL_WEB_FETCH = os.getenv('ENABLE_RAG_LOCAL_WEB_FETCH', 'False').lower() == 'true' - - -DEFAULT_WEB_FETCH_FILTER_LIST = [ - '!169.254.169.254', - '!fd00:ec2::254', - '!metadata.google.internal', - '!metadata.azure.com', - '!100.100.100.200', -] - -web_fetch_filter_list = os.getenv('WEB_FETCH_FILTER_LIST', '') -if web_fetch_filter_list == '': - web_fetch_filter_list = [] -else: - web_fetch_filter_list = [item.strip() for item in web_fetch_filter_list.split(',') if item.strip()] - -WEB_FETCH_FILTER_LIST = list(set(DEFAULT_WEB_FETCH_FILTER_LIST + web_fetch_filter_list)) - - -YOUTUBE_LOADER_LANGUAGE = PersistentConfig( - 'YOUTUBE_LOADER_LANGUAGE', - 'rag.youtube_loader_language', - os.getenv('YOUTUBE_LOADER_LANGUAGE', 'en').split(','), -) - -YOUTUBE_LOADER_PROXY_URL = PersistentConfig( - 'YOUTUBE_LOADER_PROXY_URL', - 'rag.youtube_loader_proxy_url', - os.getenv('YOUTUBE_LOADER_PROXY_URL', ''), -) - - -#################################### -# Web Search (RAG) -#################################### - -ENABLE_WEB_SEARCH = PersistentConfig( - 'ENABLE_WEB_SEARCH', - 'rag.web.search.enable', - os.getenv('ENABLE_WEB_SEARCH', 'False').lower() == 'true', -) - -WEB_SEARCH_ENGINE = PersistentConfig( - 'WEB_SEARCH_ENGINE', - 'rag.web.search.engine', - os.getenv('WEB_SEARCH_ENGINE', ''), -) - -BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig( - 'BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL', - 'rag.web.search.bypass_embedding_and_retrieval', - os.getenv('BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL', 'False').lower() == 'true', -) - - -BYPASS_WEB_SEARCH_WEB_LOADER = PersistentConfig( - 'BYPASS_WEB_SEARCH_WEB_LOADER', - 'rag.web.search.bypass_web_loader', - os.getenv('BYPASS_WEB_SEARCH_WEB_LOADER', 'False').lower() == 'true', -) - -WEB_SEARCH_RESULT_COUNT = PersistentConfig( - 'WEB_SEARCH_RESULT_COUNT', - 'rag.web.search.result_count', - int(os.getenv('WEB_SEARCH_RESULT_COUNT', '3')), -) - - -try: - web_search_domain_filter_list = json.loads(os.getenv('WEB_SEARCH_DOMAIN_FILTER_LIST', '[]')) -except Exception as e: - web_search_domain_filter_list = [ - # "wikipedia.com", - # "wikimedia.org", - # "wikidata.org", - # "!stackoverflow.com", - ] - -# You can provide a list of your own websites to filter after performing a web search. -# This ensures the highest level of safety and reliability of the information sources. -WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig( - 'WEB_SEARCH_DOMAIN_FILTER_LIST', - 'rag.web.search.domain.filter_list', - web_search_domain_filter_list, -) - -WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig( - 'WEB_SEARCH_CONCURRENT_REQUESTS', - 'rag.web.search.concurrent_requests', - int(os.getenv('WEB_SEARCH_CONCURRENT_REQUESTS', '0')), -) - -WEB_FETCH_MAX_CONTENT_LENGTH = PersistentConfig( - 'WEB_FETCH_MAX_CONTENT_LENGTH', - 'rag.web.fetch.max_content_length', - (int(os.environ.get('WEB_FETCH_MAX_CONTENT_LENGTH')) if os.environ.get('WEB_FETCH_MAX_CONTENT_LENGTH') else None), -) - -WEB_LOADER_ENGINE = PersistentConfig( - 'WEB_LOADER_ENGINE', - 'rag.web.loader.engine', - os.environ.get('WEB_LOADER_ENGINE', ''), -) - - -WEB_LOADER_CONCURRENT_REQUESTS = PersistentConfig( - 'WEB_LOADER_CONCURRENT_REQUESTS', - 'rag.web.loader.concurrent_requests', - int(os.getenv('WEB_LOADER_CONCURRENT_REQUESTS', '10')), -) - -WEB_LOADER_TIMEOUT = PersistentConfig( - 'WEB_LOADER_TIMEOUT', - 'rag.web.loader.timeout', - os.getenv('WEB_LOADER_TIMEOUT', ''), -) - - -ENABLE_WEB_LOADER_SSL_VERIFICATION = PersistentConfig( - 'ENABLE_WEB_LOADER_SSL_VERIFICATION', - 'rag.web.loader.ssl_verification', - os.environ.get('ENABLE_WEB_LOADER_SSL_VERIFICATION', 'True').lower() == 'true', -) - -WEB_SEARCH_TRUST_ENV = PersistentConfig( - 'WEB_SEARCH_TRUST_ENV', - 'rag.web.search.trust_env', - os.getenv('WEB_SEARCH_TRUST_ENV', 'False').lower() == 'true', -) - - -OLLAMA_CLOUD_WEB_SEARCH_API_KEY = PersistentConfig( - 'OLLAMA_CLOUD_WEB_SEARCH_API_KEY', - 'rag.web.search.ollama_cloud_api_key', - os.getenv('OLLAMA_CLOUD_API_KEY', ''), -) - -SEARXNG_QUERY_URL = PersistentConfig( - 'SEARXNG_QUERY_URL', - 'rag.web.search.searxng_query_url', - os.getenv('SEARXNG_QUERY_URL', ''), -) - -SEARXNG_LANGUAGE = PersistentConfig( - 'SEARXNG_LANGUAGE', - 'rag.web.search.searxng_language', - os.getenv('SEARXNG_LANGUAGE', 'all'), -) - -YACY_QUERY_URL = PersistentConfig( - 'YACY_QUERY_URL', - 'rag.web.search.yacy_query_url', - os.getenv('YACY_QUERY_URL', ''), -) - -YACY_USERNAME = PersistentConfig( - 'YACY_USERNAME', - 'rag.web.search.yacy_username', - os.getenv('YACY_USERNAME', ''), -) - -YACY_PASSWORD = PersistentConfig( - 'YACY_PASSWORD', - 'rag.web.search.yacy_password', - os.getenv('YACY_PASSWORD', ''), -) - -GOOGLE_PSE_API_KEY = PersistentConfig( - 'GOOGLE_PSE_API_KEY', - 'rag.web.search.google_pse_api_key', - os.getenv('GOOGLE_PSE_API_KEY', ''), -) - -GOOGLE_PSE_ENGINE_ID = PersistentConfig( - 'GOOGLE_PSE_ENGINE_ID', - 'rag.web.search.google_pse_engine_id', - os.getenv('GOOGLE_PSE_ENGINE_ID', ''), -) - -BRAVE_SEARCH_API_KEY = PersistentConfig( - 'BRAVE_SEARCH_API_KEY', - 'rag.web.search.brave_search_api_key', - os.getenv('BRAVE_SEARCH_API_KEY', ''), -) - -KAGI_SEARCH_API_KEY = PersistentConfig( - 'KAGI_SEARCH_API_KEY', - 'rag.web.search.kagi_search_api_key', - os.getenv('KAGI_SEARCH_API_KEY', ''), -) - -MOJEEK_SEARCH_API_KEY = PersistentConfig( - 'MOJEEK_SEARCH_API_KEY', - 'rag.web.search.mojeek_search_api_key', - os.getenv('MOJEEK_SEARCH_API_KEY', ''), -) - -BOCHA_SEARCH_API_KEY = PersistentConfig( - 'BOCHA_SEARCH_API_KEY', - 'rag.web.search.bocha_search_api_key', - os.getenv('BOCHA_SEARCH_API_KEY', ''), -) - -SERPSTACK_API_KEY = PersistentConfig( - 'SERPSTACK_API_KEY', - 'rag.web.search.serpstack_api_key', - os.getenv('SERPSTACK_API_KEY', ''), -) - -SERPSTACK_HTTPS = PersistentConfig( - 'SERPSTACK_HTTPS', - 'rag.web.search.serpstack_https', - os.getenv('SERPSTACK_HTTPS', 'True').lower() == 'true', -) - -SERPER_API_KEY = PersistentConfig( - 'SERPER_API_KEY', - 'rag.web.search.serper_api_key', - os.getenv('SERPER_API_KEY', ''), -) - -SERPLY_API_KEY = PersistentConfig( - 'SERPLY_API_KEY', - 'rag.web.search.serply_api_key', - os.getenv('SERPLY_API_KEY', ''), -) - -DDGS_BACKEND = PersistentConfig( - 'DDGS_BACKEND', - 'rag.web.search.ddgs_backend', - os.getenv('DDGS_BACKEND', 'auto'), -) - -JINA_API_KEY = PersistentConfig( - 'JINA_API_KEY', - 'rag.web.search.jina_api_key', - os.getenv('JINA_API_KEY', ''), -) - -JINA_API_BASE_URL = PersistentConfig( - 'JINA_API_BASE_URL', - 'rag.web.search.jina_api_base_url', - os.getenv('JINA_API_BASE_URL', ''), -) - -SEARCHAPI_API_KEY = PersistentConfig( - 'SEARCHAPI_API_KEY', - 'rag.web.search.searchapi_api_key', - os.getenv('SEARCHAPI_API_KEY', ''), -) - -SEARCHAPI_ENGINE = PersistentConfig( - 'SEARCHAPI_ENGINE', - 'rag.web.search.searchapi_engine', - os.getenv('SEARCHAPI_ENGINE', ''), -) - -SERPAPI_API_KEY = PersistentConfig( - 'SERPAPI_API_KEY', - 'rag.web.search.serpapi_api_key', - os.getenv('SERPAPI_API_KEY', ''), -) - -SERPAPI_ENGINE = PersistentConfig( - 'SERPAPI_ENGINE', - 'rag.web.search.serpapi_engine', - os.getenv('SERPAPI_ENGINE', ''), -) - -BING_SEARCH_V7_ENDPOINT = PersistentConfig( - 'BING_SEARCH_V7_ENDPOINT', - 'rag.web.search.bing_search_v7_endpoint', - os.environ.get('BING_SEARCH_V7_ENDPOINT', 'https://api.bing.microsoft.com/v7.0/search'), -) - -BING_SEARCH_V7_SUBSCRIPTION_KEY = PersistentConfig( - 'BING_SEARCH_V7_SUBSCRIPTION_KEY', - 'rag.web.search.bing_search_v7_subscription_key', - os.environ.get('BING_SEARCH_V7_SUBSCRIPTION_KEY', ''), -) - -AZURE_AI_SEARCH_API_KEY = PersistentConfig( - 'AZURE_AI_SEARCH_API_KEY', - 'rag.web.search.azure_ai_search_api_key', - os.environ.get('AZURE_AI_SEARCH_API_KEY', ''), -) - -AZURE_AI_SEARCH_ENDPOINT = PersistentConfig( - 'AZURE_AI_SEARCH_ENDPOINT', - 'rag.web.search.azure_ai_search_endpoint', - os.environ.get('AZURE_AI_SEARCH_ENDPOINT', ''), -) - -AZURE_AI_SEARCH_INDEX_NAME = PersistentConfig( - 'AZURE_AI_SEARCH_INDEX_NAME', - 'rag.web.search.azure_ai_search_index_name', - os.environ.get('AZURE_AI_SEARCH_INDEX_NAME', ''), -) - -EXA_API_KEY = PersistentConfig( - 'EXA_API_KEY', - 'rag.web.search.exa_api_key', - os.getenv('EXA_API_KEY', ''), -) - -PERPLEXITY_API_KEY = PersistentConfig( - 'PERPLEXITY_API_KEY', - 'rag.web.search.perplexity_api_key', - os.getenv('PERPLEXITY_API_KEY', ''), -) - -PERPLEXITY_MODEL = PersistentConfig( - 'PERPLEXITY_MODEL', - 'rag.web.search.perplexity_model', - os.getenv('PERPLEXITY_MODEL', 'sonar'), -) - -PERPLEXITY_SEARCH_CONTEXT_USAGE = PersistentConfig( - 'PERPLEXITY_SEARCH_CONTEXT_USAGE', - 'rag.web.search.perplexity_search_context_usage', - os.getenv('PERPLEXITY_SEARCH_CONTEXT_USAGE', 'medium'), -) - -PERPLEXITY_SEARCH_API_URL = PersistentConfig( - 'PERPLEXITY_SEARCH_API_URL', - 'rag.web.search.perplexity_search_api_url', - os.getenv('PERPLEXITY_SEARCH_API_URL', 'https://api.perplexity.ai/search'), -) - -SOUGOU_API_SID = PersistentConfig( - 'SOUGOU_API_SID', - 'rag.web.search.sougou_api_sid', - os.getenv('SOUGOU_API_SID', ''), -) - -SOUGOU_API_SK = PersistentConfig( - 'SOUGOU_API_SK', - 'rag.web.search.sougou_api_sk', - os.getenv('SOUGOU_API_SK', ''), -) - -TAVILY_API_KEY = PersistentConfig( - 'TAVILY_API_KEY', - 'rag.web.search.tavily_api_key', - os.getenv('TAVILY_API_KEY', ''), -) - -TAVILY_EXTRACT_DEPTH = PersistentConfig( - 'TAVILY_EXTRACT_DEPTH', - 'rag.web.search.tavily_extract_depth', - os.getenv('TAVILY_EXTRACT_DEPTH', 'basic'), -) - -PLAYWRIGHT_WS_URL = PersistentConfig( - 'PLAYWRIGHT_WS_URL', - 'rag.web.loader.playwright_ws_url', - os.environ.get('PLAYWRIGHT_WS_URL', ''), -) - -PLAYWRIGHT_TIMEOUT = PersistentConfig( - 'PLAYWRIGHT_TIMEOUT', - 'rag.web.loader.playwright_timeout', - int(os.environ.get('PLAYWRIGHT_TIMEOUT', '10000')), -) - -FIRECRAWL_API_KEY = PersistentConfig( - 'FIRECRAWL_API_KEY', - 'rag.web.loader.firecrawl_api_key', - os.environ.get('FIRECRAWL_API_KEY', ''), -) - -FIRECRAWL_API_BASE_URL = PersistentConfig( - 'FIRECRAWL_API_BASE_URL', - 'rag.web.loader.firecrawl_api_url', - os.environ.get('FIRECRAWL_API_BASE_URL', 'https://api.firecrawl.dev'), -) - -FIRECRAWL_TIMEOUT = PersistentConfig( - 'FIRECRAWL_TIMEOUT', - 'rag.web.loader.firecrawl_timeout', - os.environ.get('FIRECRAWL_TIMEOUT', ''), -) - -EXTERNAL_WEB_SEARCH_URL = PersistentConfig( - 'EXTERNAL_WEB_SEARCH_URL', - 'rag.web.search.external_web_search_url', - os.environ.get('EXTERNAL_WEB_SEARCH_URL', ''), -) - -EXTERNAL_WEB_SEARCH_API_KEY = PersistentConfig( - 'EXTERNAL_WEB_SEARCH_API_KEY', - 'rag.web.search.external_web_search_api_key', - os.environ.get('EXTERNAL_WEB_SEARCH_API_KEY', ''), -) - -EXTERNAL_WEB_LOADER_URL = PersistentConfig( - 'EXTERNAL_WEB_LOADER_URL', - 'rag.web.loader.external_web_loader_url', - os.environ.get('EXTERNAL_WEB_LOADER_URL', ''), -) - -EXTERNAL_WEB_LOADER_API_KEY = PersistentConfig( - 'EXTERNAL_WEB_LOADER_API_KEY', - 'rag.web.loader.external_web_loader_api_key', - os.environ.get('EXTERNAL_WEB_LOADER_API_KEY', ''), -) - -YANDEX_WEB_SEARCH_URL = PersistentConfig( - 'YANDEX_WEB_SEARCH_URL', - 'rag.web.search.yandex_web_search_url', - os.environ.get('YANDEX_WEB_SEARCH_URL', ''), -) - -YANDEX_WEB_SEARCH_API_KEY = PersistentConfig( - 'YANDEX_WEB_SEARCH_API_KEY', - 'rag.web.search.yandex_web_search_api_key', - os.environ.get('YANDEX_WEB_SEARCH_API_KEY', ''), -) - -YANDEX_WEB_SEARCH_CONFIG = PersistentConfig( - 'YANDEX_WEB_SEARCH_CONFIG', - 'rag.web.search.yandex_web_search_config', - os.environ.get('YANDEX_WEB_SEARCH_CONFIG', ''), -) - -YOUCOM_API_KEY = PersistentConfig( - 'YOUCOM_API_KEY', - 'rag.web.search.youcom_api_key', - os.environ.get('YOUCOM_API_KEY', ''), -) - -#################################### -# Images -#################################### - -ENABLE_IMAGE_GENERATION = PersistentConfig( - 'ENABLE_IMAGE_GENERATION', - 'image_generation.enable', - os.environ.get('ENABLE_IMAGE_GENERATION', '').lower() == 'true', -) - -IMAGE_GENERATION_ENGINE = PersistentConfig( - 'IMAGE_GENERATION_ENGINE', - 'image_generation.engine', - os.getenv('IMAGE_GENERATION_ENGINE', 'openai'), -) - -IMAGE_GENERATION_MODEL = PersistentConfig( - 'IMAGE_GENERATION_MODEL', - 'image_generation.model', - os.getenv('IMAGE_GENERATION_MODEL', ''), -) - -# Regex pattern for models that support IMAGE_SIZE = "auto". -IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN = os.getenv('IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN', '^gpt-image') - -# Regex pattern for models that return URLs instead of base64 data. -IMAGE_URL_RESPONSE_MODELS_REGEX_PATTERN = os.getenv('IMAGE_URL_RESPONSE_MODELS_REGEX_PATTERN', '^gpt-image') - -IMAGE_SIZE = PersistentConfig('IMAGE_SIZE', 'image_generation.size', os.getenv('IMAGE_SIZE', '512x512')) - -IMAGE_STEPS = PersistentConfig('IMAGE_STEPS', 'image_generation.steps', int(os.getenv('IMAGE_STEPS', 50))) - -ENABLE_IMAGE_PROMPT_GENERATION = PersistentConfig( - 'ENABLE_IMAGE_PROMPT_GENERATION', - 'image_generation.prompt.enable', - os.environ.get('ENABLE_IMAGE_PROMPT_GENERATION', 'true').lower() == 'true', -) - -AUTOMATIC1111_BASE_URL = PersistentConfig( - 'AUTOMATIC1111_BASE_URL', - 'image_generation.automatic1111.base_url', - os.getenv('AUTOMATIC1111_BASE_URL', ''), -) -AUTOMATIC1111_API_AUTH = PersistentConfig( - 'AUTOMATIC1111_API_AUTH', - 'image_generation.automatic1111.api_auth', - os.getenv('AUTOMATIC1111_API_AUTH', ''), -) - -automatic1111_params = os.getenv('AUTOMATIC1111_PARAMS', '') -try: - automatic1111_params = json.loads(automatic1111_params) -except json.JSONDecodeError: - automatic1111_params = {} - -AUTOMATIC1111_PARAMS = PersistentConfig( - 'AUTOMATIC1111_PARAMS', - 'image_generation.automatic1111.api_params', - automatic1111_params, -) - -COMFYUI_BASE_URL = PersistentConfig( - 'COMFYUI_BASE_URL', - 'image_generation.comfyui.base_url', - os.getenv('COMFYUI_BASE_URL', ''), -) - -COMFYUI_API_KEY = PersistentConfig( - 'COMFYUI_API_KEY', - 'image_generation.comfyui.api_key', - os.getenv('COMFYUI_API_KEY', ''), -) - -COMFYUI_DEFAULT_WORKFLOW = """ -{ - "3": { - "inputs": { - "seed": 0, - "steps": 20, - "cfg": 8, - "sampler_name": "euler", - "scheduler": "normal", - "denoise": 1, - "model": [ - "4", - 0 - ], - "positive": [ - "6", - 0 - ], - "negative": [ - "7", - 0 - ], - "latent_image": [ - "5", - 0 - ] - }, - "class_type": "KSampler", - "_meta": { - "title": "KSampler" - } - }, - "4": { - "inputs": { - "ckpt_name": "model.safetensors" - }, - "class_type": "CheckpointLoaderSimple", - "_meta": { - "title": "Load Checkpoint" - } - }, - "5": { - "inputs": { - "width": 512, - "height": 512, - "batch_size": 1 - }, - "class_type": "EmptyLatentImage", - "_meta": { - "title": "Empty Latent Image" - } - }, - "6": { - "inputs": { - "text": "Prompt", - "clip": [ - "4", - 1 - ] - }, - "class_type": "CLIPTextEncode", - "_meta": { - "title": "CLIP Text Encode (Prompt)" - } - }, - "7": { - "inputs": { - "text": "", - "clip": [ - "4", - 1 - ] - }, - "class_type": "CLIPTextEncode", - "_meta": { - "title": "CLIP Text Encode (Prompt)" - } - }, - "8": { - "inputs": { - "samples": [ - "3", - 0 - ], - "vae": [ - "4", - 2 - ] - }, - "class_type": "VAEDecode", - "_meta": { - "title": "VAE Decode" - } - }, - "9": { - "inputs": { - "filename_prefix": "ComfyUI", - "images": [ - "8", - 0 - ] - }, - "class_type": "SaveImage", - "_meta": { - "title": "Save Image" - } - } -} -""" - - -COMFYUI_WORKFLOW = PersistentConfig( - 'COMFYUI_WORKFLOW', - 'image_generation.comfyui.workflow', - os.getenv('COMFYUI_WORKFLOW', COMFYUI_DEFAULT_WORKFLOW), -) - -comfyui_workflow_nodes = os.getenv('COMFYUI_WORKFLOW_NODES', '') -try: - comfyui_workflow_nodes = json.loads(comfyui_workflow_nodes) -except json.JSONDecodeError: - comfyui_workflow_nodes = [] - -COMFYUI_WORKFLOW_NODES = PersistentConfig( - 'COMFYUI_WORKFLOW_NODES', - 'image_generation.comfyui.nodes', - comfyui_workflow_nodes, -) - -IMAGES_OPENAI_API_BASE_URL = PersistentConfig( - 'IMAGES_OPENAI_API_BASE_URL', - 'image_generation.openai.api_base_url', - os.getenv('IMAGES_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), -) -IMAGES_OPENAI_API_VERSION = PersistentConfig( - 'IMAGES_OPENAI_API_VERSION', - 'image_generation.openai.api_version', - os.getenv('IMAGES_OPENAI_API_VERSION', ''), -) - -IMAGES_OPENAI_API_KEY = PersistentConfig( - 'IMAGES_OPENAI_API_KEY', - 'image_generation.openai.api_key', - os.getenv('IMAGES_OPENAI_API_KEY', OPENAI_API_KEY), -) - -images_openai_params = os.getenv('IMAGES_OPENAI_PARAMS', '') -try: - images_openai_params = json.loads(images_openai_params) -except json.JSONDecodeError: - images_openai_params = {} - - -IMAGES_OPENAI_API_PARAMS = PersistentConfig( - 'IMAGES_OPENAI_API_PARAMS', 'image_generation.openai.params', images_openai_params -) - - -IMAGES_GEMINI_API_BASE_URL = PersistentConfig( - 'IMAGES_GEMINI_API_BASE_URL', - 'image_generation.gemini.api_base_url', - os.getenv('IMAGES_GEMINI_API_BASE_URL', GEMINI_API_BASE_URL), -) -IMAGES_GEMINI_API_KEY = PersistentConfig( - 'IMAGES_GEMINI_API_KEY', - 'image_generation.gemini.api_key', - os.getenv('IMAGES_GEMINI_API_KEY', GEMINI_API_KEY), -) - -IMAGES_GEMINI_ENDPOINT_METHOD = PersistentConfig( - 'IMAGES_GEMINI_ENDPOINT_METHOD', - 'image_generation.gemini.endpoint_method', - os.getenv('IMAGES_GEMINI_ENDPOINT_METHOD', ''), -) - -ENABLE_IMAGE_EDIT = PersistentConfig( - 'ENABLE_IMAGE_EDIT', - 'images.edit.enable', - os.environ.get('ENABLE_IMAGE_EDIT', '').lower() == 'true', -) - -IMAGE_EDIT_ENGINE = PersistentConfig( - 'IMAGE_EDIT_ENGINE', - 'images.edit.engine', - os.getenv('IMAGE_EDIT_ENGINE', 'openai'), -) - -IMAGE_EDIT_MODEL = PersistentConfig( - 'IMAGE_EDIT_MODEL', - 'images.edit.model', - os.getenv('IMAGE_EDIT_MODEL', ''), -) - -IMAGE_EDIT_SIZE = PersistentConfig('IMAGE_EDIT_SIZE', 'images.edit.size', os.getenv('IMAGE_EDIT_SIZE', '')) - -IMAGES_EDIT_OPENAI_API_BASE_URL = PersistentConfig( - 'IMAGES_EDIT_OPENAI_API_BASE_URL', - 'images.edit.openai.api_base_url', - os.getenv('IMAGES_EDIT_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), -) -IMAGES_EDIT_OPENAI_API_VERSION = PersistentConfig( - 'IMAGES_EDIT_OPENAI_API_VERSION', - 'images.edit.openai.api_version', - os.getenv('IMAGES_EDIT_OPENAI_API_VERSION', ''), -) - -IMAGES_EDIT_OPENAI_API_KEY = PersistentConfig( - 'IMAGES_EDIT_OPENAI_API_KEY', - 'images.edit.openai.api_key', - os.getenv('IMAGES_EDIT_OPENAI_API_KEY', OPENAI_API_KEY), -) - -IMAGES_EDIT_GEMINI_API_BASE_URL = PersistentConfig( - 'IMAGES_EDIT_GEMINI_API_BASE_URL', - 'images.edit.gemini.api_base_url', - os.getenv('IMAGES_EDIT_GEMINI_API_BASE_URL', GEMINI_API_BASE_URL), -) -IMAGES_EDIT_GEMINI_API_KEY = PersistentConfig( - 'IMAGES_EDIT_GEMINI_API_KEY', - 'images.edit.gemini.api_key', - os.getenv('IMAGES_EDIT_GEMINI_API_KEY', GEMINI_API_KEY), -) - - -IMAGES_EDIT_COMFYUI_BASE_URL = PersistentConfig( - 'IMAGES_EDIT_COMFYUI_BASE_URL', - 'images.edit.comfyui.base_url', - os.getenv('IMAGES_EDIT_COMFYUI_BASE_URL', ''), -) -IMAGES_EDIT_COMFYUI_API_KEY = PersistentConfig( - 'IMAGES_EDIT_COMFYUI_API_KEY', - 'images.edit.comfyui.api_key', - os.getenv('IMAGES_EDIT_COMFYUI_API_KEY', ''), -) - -IMAGES_EDIT_COMFYUI_WORKFLOW = PersistentConfig( - 'IMAGES_EDIT_COMFYUI_WORKFLOW', - 'images.edit.comfyui.workflow', - os.getenv('IMAGES_EDIT_COMFYUI_WORKFLOW', ''), -) - -images_edit_comfyui_workflow_nodes = os.getenv('IMAGES_EDIT_COMFYUI_WORKFLOW_NODES', '') -try: - images_edit_comfyui_workflow_nodes = json.loads(images_edit_comfyui_workflow_nodes) -except json.JSONDecodeError: - images_edit_comfyui_workflow_nodes = [] - -IMAGES_EDIT_COMFYUI_WORKFLOW_NODES = PersistentConfig( - 'IMAGES_EDIT_COMFYUI_WORKFLOW_NODES', - 'images.edit.comfyui.nodes', - images_edit_comfyui_workflow_nodes, -) - -#################################### -# Audio -#################################### - -# Transcription -WHISPER_MODEL = PersistentConfig( - 'WHISPER_MODEL', - 'audio.stt.whisper_model', - os.getenv('WHISPER_MODEL', 'base'), -) - -WHISPER_COMPUTE_TYPE = os.getenv('WHISPER_COMPUTE_TYPE', 'int8') -WHISPER_MODEL_DIR = os.getenv('WHISPER_MODEL_DIR', f'{CACHE_DIR}/whisper/models') -WHISPER_MODEL_AUTO_UPDATE = not OFFLINE_MODE and os.environ.get('WHISPER_MODEL_AUTO_UPDATE', '').lower() == 'true' - -WHISPER_VAD_FILTER = os.getenv('WHISPER_VAD_FILTER', 'False').lower() == 'true' - -WHISPER_MULTILINGUAL = os.getenv('WHISPER_MULTILINGUAL', 'False').lower() == 'true' - -WHISPER_LANGUAGE = os.getenv('WHISPER_LANGUAGE', '').lower() or None - -# Add Deepgram configuration -DEEPGRAM_API_KEY = PersistentConfig( - 'DEEPGRAM_API_KEY', - 'audio.stt.deepgram.api_key', - os.getenv('DEEPGRAM_API_KEY', ''), -) - -# ElevenLabs configuration -ELEVENLABS_API_BASE_URL = os.getenv('ELEVENLABS_API_BASE_URL', 'https://api.elevenlabs.io') - -AUDIO_STT_OPENAI_API_BASE_URL = PersistentConfig( - 'AUDIO_STT_OPENAI_API_BASE_URL', - 'audio.stt.openai.api_base_url', - os.getenv('AUDIO_STT_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), -) - -AUDIO_STT_OPENAI_API_KEY = PersistentConfig( - 'AUDIO_STT_OPENAI_API_KEY', - 'audio.stt.openai.api_key', - os.getenv('AUDIO_STT_OPENAI_API_KEY', OPENAI_API_KEY), -) - -AUDIO_STT_ENGINE = PersistentConfig( - 'AUDIO_STT_ENGINE', - 'audio.stt.engine', - os.getenv('AUDIO_STT_ENGINE', ''), -) - -AUDIO_STT_MODEL = PersistentConfig( - 'AUDIO_STT_MODEL', - 'audio.stt.model', - os.getenv('AUDIO_STT_MODEL', ''), -) - -AUDIO_STT_SUPPORTED_CONTENT_TYPES = PersistentConfig( - 'AUDIO_STT_SUPPORTED_CONTENT_TYPES', - 'audio.stt.supported_content_types', - [ - content_type.strip() - for content_type in os.environ.get('AUDIO_STT_SUPPORTED_CONTENT_TYPES', '').split(',') - if content_type.strip() - ], -) - -AUDIO_STT_AZURE_API_KEY = PersistentConfig( - 'AUDIO_STT_AZURE_API_KEY', - 'audio.stt.azure.api_key', - os.getenv('AUDIO_STT_AZURE_API_KEY', ''), -) - -AUDIO_STT_AZURE_REGION = PersistentConfig( - 'AUDIO_STT_AZURE_REGION', - 'audio.stt.azure.region', - os.getenv('AUDIO_STT_AZURE_REGION', ''), -) - -AUDIO_STT_AZURE_LOCALES = PersistentConfig( - 'AUDIO_STT_AZURE_LOCALES', - 'audio.stt.azure.locales', - os.getenv('AUDIO_STT_AZURE_LOCALES', ''), -) - -AUDIO_STT_AZURE_BASE_URL = PersistentConfig( - 'AUDIO_STT_AZURE_BASE_URL', - 'audio.stt.azure.base_url', - os.getenv('AUDIO_STT_AZURE_BASE_URL', ''), -) - -AUDIO_STT_AZURE_MAX_SPEAKERS = PersistentConfig( - 'AUDIO_STT_AZURE_MAX_SPEAKERS', - 'audio.stt.azure.max_speakers', - os.getenv('AUDIO_STT_AZURE_MAX_SPEAKERS', ''), -) - -AUDIO_STT_MISTRAL_API_KEY = PersistentConfig( - 'AUDIO_STT_MISTRAL_API_KEY', - 'audio.stt.mistral.api_key', - os.getenv('AUDIO_STT_MISTRAL_API_KEY', ''), -) - -AUDIO_STT_MISTRAL_API_BASE_URL = PersistentConfig( - 'AUDIO_STT_MISTRAL_API_BASE_URL', - 'audio.stt.mistral.api_base_url', - os.getenv('AUDIO_STT_MISTRAL_API_BASE_URL', 'https://api.mistral.ai/v1'), -) - -AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS = PersistentConfig( - 'AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS', - 'audio.stt.mistral.use_chat_completions', - os.getenv('AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS', 'false').lower() == 'true', -) - -AUDIO_TTS_OPENAI_API_BASE_URL = PersistentConfig( - 'AUDIO_TTS_OPENAI_API_BASE_URL', - 'audio.tts.openai.api_base_url', - os.getenv('AUDIO_TTS_OPENAI_API_BASE_URL', OPENAI_API_BASE_URL), -) -AUDIO_TTS_OPENAI_API_KEY = PersistentConfig( - 'AUDIO_TTS_OPENAI_API_KEY', - 'audio.tts.openai.api_key', - os.getenv('AUDIO_TTS_OPENAI_API_KEY', OPENAI_API_KEY), -) - -audio_tts_openai_params = os.getenv('AUDIO_TTS_OPENAI_PARAMS', '') -try: - audio_tts_openai_params = json.loads(audio_tts_openai_params) -except json.JSONDecodeError: - audio_tts_openai_params = {} - -AUDIO_TTS_OPENAI_PARAMS = PersistentConfig( - 'AUDIO_TTS_OPENAI_PARAMS', - 'audio.tts.openai.params', - audio_tts_openai_params, -) - - -AUDIO_TTS_API_KEY = PersistentConfig( - 'AUDIO_TTS_API_KEY', - 'audio.tts.api_key', - os.getenv('AUDIO_TTS_API_KEY', ''), -) - -AUDIO_TTS_ENGINE = PersistentConfig( - 'AUDIO_TTS_ENGINE', - 'audio.tts.engine', - os.getenv('AUDIO_TTS_ENGINE', ''), -) - - -AUDIO_TTS_MODEL = PersistentConfig( - 'AUDIO_TTS_MODEL', - 'audio.tts.model', - os.getenv('AUDIO_TTS_MODEL', 'tts-1'), # OpenAI default model -) - -AUDIO_TTS_VOICE = PersistentConfig( - 'AUDIO_TTS_VOICE', - 'audio.tts.voice', - os.getenv('AUDIO_TTS_VOICE', 'alloy'), # OpenAI default voice -) - -AUDIO_TTS_SPLIT_ON = PersistentConfig( - 'AUDIO_TTS_SPLIT_ON', - 'audio.tts.split_on', - os.getenv('AUDIO_TTS_SPLIT_ON', 'punctuation'), -) - -AUDIO_TTS_AZURE_SPEECH_REGION = PersistentConfig( - 'AUDIO_TTS_AZURE_SPEECH_REGION', - 'audio.tts.azure.speech_region', - os.getenv('AUDIO_TTS_AZURE_SPEECH_REGION', ''), -) - -AUDIO_TTS_AZURE_SPEECH_BASE_URL = PersistentConfig( - 'AUDIO_TTS_AZURE_SPEECH_BASE_URL', - 'audio.tts.azure.speech_base_url', - os.getenv('AUDIO_TTS_AZURE_SPEECH_BASE_URL', ''), -) - -AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT = PersistentConfig( - 'AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT', - 'audio.tts.azure.speech_output_format', - os.getenv('AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT', 'audio-24khz-160kbitrate-mono-mp3'), -) - -AUDIO_TTS_MISTRAL_API_KEY = PersistentConfig( - 'AUDIO_TTS_MISTRAL_API_KEY', - 'audio.tts.mistral.api_key', - os.getenv('AUDIO_TTS_MISTRAL_API_KEY', ''), -) - -AUDIO_TTS_MISTRAL_API_BASE_URL = PersistentConfig( - 'AUDIO_TTS_MISTRAL_API_BASE_URL', - 'audio.tts.mistral.api_base_url', - os.getenv('AUDIO_TTS_MISTRAL_API_BASE_URL', 'https://api.mistral.ai/v1'), -) - - #################################### # LDAP #################################### -ENABLE_LDAP = PersistentConfig( +ENABLE_LDAP = ConfigVar( 'ENABLE_LDAP', 'ldap.enable', - os.environ.get('ENABLE_LDAP', 'false').lower() == 'true', + os.getenv('ENABLE_LDAP', 'false').lower() == 'true', ) -LDAP_SERVER_LABEL = PersistentConfig( +LDAP_SERVER_LABEL = ConfigVar( 'LDAP_SERVER_LABEL', 'ldap.server.label', - os.environ.get('LDAP_SERVER_LABEL', 'LDAP Server'), + os.getenv('LDAP_SERVER_LABEL', 'LDAP Server'), ) -LDAP_SERVER_HOST = PersistentConfig( +LDAP_SERVER_HOST = ConfigVar( 'LDAP_SERVER_HOST', 'ldap.server.host', - os.environ.get('LDAP_SERVER_HOST', 'localhost'), + os.getenv('LDAP_SERVER_HOST', 'localhost'), ) -LDAP_SERVER_PORT = PersistentConfig( +LDAP_SERVER_PORT = ConfigVar( 'LDAP_SERVER_PORT', 'ldap.server.port', - int(os.environ.get('LDAP_SERVER_PORT', '389')), + int(os.getenv('LDAP_SERVER_PORT', '389')), ) -LDAP_ATTRIBUTE_FOR_MAIL = PersistentConfig( +LDAP_ATTRIBUTE_FOR_MAIL = ConfigVar( 'LDAP_ATTRIBUTE_FOR_MAIL', 'ldap.server.attribute_for_mail', - os.environ.get('LDAP_ATTRIBUTE_FOR_MAIL', 'mail'), + os.getenv('LDAP_ATTRIBUTE_FOR_MAIL', 'mail'), ) -LDAP_ATTRIBUTE_FOR_USERNAME = PersistentConfig( +LDAP_ATTRIBUTE_FOR_USERNAME = ConfigVar( 'LDAP_ATTRIBUTE_FOR_USERNAME', 'ldap.server.attribute_for_username', - os.environ.get('LDAP_ATTRIBUTE_FOR_USERNAME', 'uid'), + os.getenv('LDAP_ATTRIBUTE_FOR_USERNAME', 'uid'), ) -LDAP_APP_DN = PersistentConfig('LDAP_APP_DN', 'ldap.server.app_dn', os.environ.get('LDAP_APP_DN', '')) +LDAP_APP_DN = ConfigVar('LDAP_APP_DN', 'ldap.server.app_dn', os.getenv('LDAP_APP_DN', '')) -LDAP_APP_PASSWORD = PersistentConfig( +LDAP_APP_PASSWORD = ConfigVar( 'LDAP_APP_PASSWORD', 'ldap.server.app_password', - os.environ.get('LDAP_APP_PASSWORD', ''), + os.getenv('LDAP_APP_PASSWORD', ''), ) -LDAP_SEARCH_BASE = PersistentConfig('LDAP_SEARCH_BASE', 'ldap.server.users_dn', os.environ.get('LDAP_SEARCH_BASE', '')) +LDAP_SEARCH_BASE = ConfigVar('LDAP_SEARCH_BASE', 'ldap.server.users_dn', os.getenv('LDAP_SEARCH_BASE', '')) -LDAP_SEARCH_FILTERS = PersistentConfig( +LDAP_SEARCH_FILTERS = ConfigVar( 'LDAP_SEARCH_FILTER', 'ldap.server.search_filter', - os.environ.get('LDAP_SEARCH_FILTER', os.environ.get('LDAP_SEARCH_FILTERS', '')), + os.getenv('LDAP_SEARCH_FILTER', os.getenv('LDAP_SEARCH_FILTERS', '')), ) -LDAP_USE_TLS = PersistentConfig( +LDAP_USE_TLS = ConfigVar( 'LDAP_USE_TLS', 'ldap.server.use_tls', - os.environ.get('LDAP_USE_TLS', 'True').lower() == 'true', + os.getenv('LDAP_USE_TLS', 'True').lower() == 'true', ) -LDAP_CA_CERT_FILE = PersistentConfig( +LDAP_CA_CERT_FILE = ConfigVar( 'LDAP_CA_CERT_FILE', 'ldap.server.ca_cert_file', - os.environ.get('LDAP_CA_CERT_FILE', ''), + os.getenv('LDAP_CA_CERT_FILE', ''), ) -LDAP_VALIDATE_CERT = PersistentConfig( +LDAP_VALIDATE_CERT = ConfigVar( 'LDAP_VALIDATE_CERT', 'ldap.server.validate_cert', - os.environ.get('LDAP_VALIDATE_CERT', 'True').lower() == 'true', + os.getenv('LDAP_VALIDATE_CERT', 'True').lower() == 'true', ) -LDAP_CIPHERS = PersistentConfig('LDAP_CIPHERS', 'ldap.server.ciphers', os.environ.get('LDAP_CIPHERS', 'ALL')) +LDAP_CIPHERS = ConfigVar('LDAP_CIPHERS', 'ldap.server.ciphers', os.getenv('LDAP_CIPHERS', 'ALL')) -# For LDAP Group Management -ENABLE_LDAP_GROUP_MANAGEMENT = PersistentConfig( +ENABLE_LDAP_GROUP_MANAGEMENT = ConfigVar( 'ENABLE_LDAP_GROUP_MANAGEMENT', 'ldap.group.enable_management', - os.environ.get('ENABLE_LDAP_GROUP_MANAGEMENT', 'False').lower() == 'true', + os.getenv('ENABLE_LDAP_GROUP_MANAGEMENT', 'False').lower() == 'true', ) -ENABLE_LDAP_GROUP_CREATION = PersistentConfig( +ENABLE_LDAP_GROUP_CREATION = ConfigVar( 'ENABLE_LDAP_GROUP_CREATION', 'ldap.group.enable_creation', - os.environ.get('ENABLE_LDAP_GROUP_CREATION', 'False').lower() == 'true', + os.getenv('ENABLE_LDAP_GROUP_CREATION', 'False').lower() == 'true', ) -LDAP_ATTRIBUTE_FOR_GROUPS = PersistentConfig( +LDAP_ATTRIBUTE_FOR_GROUPS = ConfigVar( 'LDAP_ATTRIBUTE_FOR_GROUPS', 'ldap.server.attribute_for_groups', - os.environ.get('LDAP_ATTRIBUTE_FOR_GROUPS', 'memberOf'), + os.getenv('LDAP_ATTRIBUTE_FOR_GROUPS', 'memberOf'), ) diff --git a/backend/open_webui/constants.py b/backend/open_webui/constants.py index ad1bdf4a20..132f3ac19a 100644 --- a/backend/open_webui/constants.py +++ b/backend/open_webui/constants.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from enum import Enum @@ -72,11 +74,11 @@ class ERROR_MESSAGES(str, Enum): EMPTY_CONTENT = 'The content provided is empty. Please ensure that there is text or data present before proceeding.' - DB_NOT_SQLITE = 'This feature is only available when running with SQLite databases.' + DB_NOT_SQLITE = 'This feature is only available with SQLite databases.' - INVALID_URL = 'Oops! The URL you provided is invalid. Please double-check and try again.' + INVALID_URL = 'The URL you provided is invalid. Please double-check and try again.' - WEB_SEARCH_ERROR = lambda err='': f'{err if err else "Oops! Something went wrong while searching the web."}' + WEB_SEARCH_ERROR = lambda err='': err if err else 'Something went wrong while searching the web.' OLLAMA_API_DISABLED = 'The Ollama API is disabled. Please enable it to use this feature.' diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index e734a2f865..20d59ca804 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -1,21 +1,21 @@ +import datetime as dt import importlib.metadata import json import logging import os import pkgutil -import sys -import shutil -import traceback -from datetime import datetime, timezone -from typing import Any -from uuid import uuid4 -from pathlib import Path -from cryptography.hazmat.primitives import serialization import re - +import shutil +import sys +import traceback +from pathlib import Path +from typing import Any, Optional +from uuid import uuid4 import markdown from bs4 import BeautifulSoup +from cryptography.hazmat.primitives import serialization + from open_webui.constants import ERROR_MESSAGES #################################### @@ -41,28 +41,27 @@ try: except ImportError: print('dotenv not installed, skipping...') -DOCKER = os.environ.get('DOCKER', 'False').lower() == 'true' +DOCKER = os.getenv('DOCKER', 'False').lower() == 'true' -# device type embedding models - "cpu" (default), "cuda" (nvidia gpu required) or "mps" (apple silicon) - choosing this right can lead to better performance -USE_CUDA = os.environ.get('USE_CUDA_DOCKER', 'false') +USE_CUDA = os.getenv('USE_CUDA_DOCKER', 'false') +DEVICE_TYPE = 'cpu' +_cuda_error: Optional[str] = None if USE_CUDA.lower() == 'true': try: - import torch + import torch # noqa: E402 - assert torch.cuda.is_available(), 'CUDA not available' + if not torch.cuda.is_available(): + raise RuntimeError('CUDA not available') DEVICE_TYPE = 'cuda' - except Exception as e: - cuda_error = f'Error when testing CUDA but USE_CUDA_DOCKER is true. Resetting USE_CUDA_DOCKER to false: {e}' + except Exception as exc: + _cuda_error = f'CUDA unavailable (USE_CUDA_DOCKER=true), falling back to CPU: {exc}' os.environ['USE_CUDA_DOCKER'] = 'false' USE_CUDA = 'false' - DEVICE_TYPE = 'cpu' -else: - DEVICE_TYPE = 'cpu' -if sys.platform == 'darwin': +if sys.platform == 'darwin' and DEVICE_TYPE == 'cpu': try: - import torch + import torch # noqa: E402 if torch.backends.mps.is_available() and torch.backends.mps.is_built(): DEVICE_TYPE = 'mps' @@ -87,7 +86,7 @@ class JSONFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: log_entry: dict[str, Any] = { - 'ts': datetime.fromtimestamp(record.created, tz=timezone.utc).isoformat(timespec='milliseconds'), + 'ts': dt.datetime.fromtimestamp(record.created, tz=dt.UTC).isoformat(timespec='milliseconds'), 'level': _LEVEL_MAP.get(record.levelname, record.levelname.lower()), 'msg': record.getMessage(), 'caller': record.name, @@ -104,43 +103,37 @@ class JSONFormatter(logging.Formatter): return json.dumps(log_entry, ensure_ascii=False, default=str) -LOG_FORMAT = os.environ.get('LOG_FORMAT', '').lower() +LOG_FORMAT = os.getenv('LOG_FORMAT', '').lower() -GLOBAL_LOG_LEVEL = os.environ.get('GLOBAL_LOG_LEVEL', '').upper() +GLOBAL_LOG_LEVEL = os.getenv('GLOBAL_LOG_LEVEL', '').upper() if GLOBAL_LOG_LEVEL in logging.getLevelNamesMapping(): + _log_cfg: dict[str, Any] = {'level': GLOBAL_LOG_LEVEL, 'force': True} if LOG_FORMAT == 'json': - _handler = logging.StreamHandler(sys.stdout) - _handler.setFormatter(JSONFormatter()) - logging.basicConfig(handlers=[_handler], level=GLOBAL_LOG_LEVEL, force=True) + _json_handler = logging.StreamHandler(sys.stdout) + _json_handler.setFormatter(JSONFormatter()) + _log_cfg['handlers'] = [_json_handler] else: - logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True) + _log_cfg['stream'] = sys.stdout + logging.basicConfig(**_log_cfg) else: GLOBAL_LOG_LEVEL = 'INFO' log = logging.getLogger(__name__) -log.info(f'GLOBAL_LOG_LEVEL: {GLOBAL_LOG_LEVEL}') +log.info('GLOBAL_LOG_LEVEL: %s', GLOBAL_LOG_LEVEL) -if 'cuda_error' in locals(): - log.exception(cuda_error) - del cuda_error +if _cuda_error: + log.error(_cuda_error) + _cuda_error = None SRC_LOG_LEVELS = {} # Legacy variable, do not remove -WEBUI_NAME = os.environ.get('WEBUI_NAME', 'Open WebUI') -if WEBUI_NAME != 'Open WebUI': - WEBUI_NAME += ' (Open WebUI)' - -WEBUI_FAVICON_URL = 'https://openwebui.com/favicon.png' - -TRUSTED_SIGNATURE_KEY = os.environ.get('TRUSTED_SIGNATURE_KEY', '') - #################################### # ENV (dev,test,prod) #################################### -ENV = os.environ.get('ENV', 'dev') +ENV = os.getenv('ENV', 'dev') -FROM_INIT_PY = os.environ.get('FROM_INIT_PY', 'False').lower() == 'true' +FROM_INIT_PY = os.getenv('FROM_INIT_PY', 'False').lower() == 'true' if FROM_INIT_PY: PACKAGE_DATA = {'version': importlib.metadata.version('open-webui')} @@ -153,10 +146,10 @@ else: VERSION = PACKAGE_DATA['version'] -DEPLOYMENT_ID = os.environ.get('DEPLOYMENT_ID', '') -INSTANCE_ID = os.environ.get('INSTANCE_ID', str(uuid4())) +DEPLOYMENT_ID = os.getenv('DEPLOYMENT_ID', '') +INSTANCE_ID = os.getenv('INSTANCE_ID', str(uuid4())) -ENABLE_DB_MIGRATIONS = os.environ.get('ENABLE_DB_MIGRATIONS', 'True').lower() == 'true' +ENABLE_DB_MIGRATIONS = os.getenv('ENABLE_DB_MIGRATIONS', 'True').lower() == 'true' # Function to parse each section @@ -180,7 +173,7 @@ def parse_section(section): try: changelog_path = BASE_DIR / 'CHANGELOG.md' - with open(str(changelog_path.absolute()), 'r', encoding='utf8') as file: + with open(str(changelog_path.absolute()), encoding='utf8') as file: changelog_content = file.read() except Exception: @@ -218,42 +211,6 @@ for version in soup.find_all('h2'): CHANGELOG = changelog_json -#################################### -# SAFE_MODE -#################################### - -SAFE_MODE = os.environ.get('SAFE_MODE', 'false').lower() == 'true' - - -#################################### -# ENABLE_FORWARD_USER_INFO_HEADERS -#################################### - -ENABLE_FORWARD_USER_INFO_HEADERS = os.environ.get('ENABLE_FORWARD_USER_INFO_HEADERS', 'False').lower() == 'true' - -# Header names for user info forwarding (customizable via environment variables) -FORWARD_USER_INFO_HEADER_USER_NAME = os.environ.get('FORWARD_USER_INFO_HEADER_USER_NAME', 'X-OpenWebUI-User-Name') -FORWARD_USER_INFO_HEADER_USER_ID = os.environ.get('FORWARD_USER_INFO_HEADER_USER_ID', 'X-OpenWebUI-User-Id') -FORWARD_USER_INFO_HEADER_USER_EMAIL = os.environ.get('FORWARD_USER_INFO_HEADER_USER_EMAIL', 'X-OpenWebUI-User-Email') -FORWARD_USER_INFO_HEADER_USER_ROLE = os.environ.get('FORWARD_USER_INFO_HEADER_USER_ROLE', 'X-OpenWebUI-User-Role') - -# Header name for chat ID forwarding (customizable via environment variable) -FORWARD_SESSION_INFO_HEADER_MESSAGE_ID = os.environ.get( - 'FORWARD_SESSION_INFO_HEADER_MESSAGE_ID', 'X-OpenWebUI-Message-Id' -) -FORWARD_SESSION_INFO_HEADER_CHAT_ID = os.environ.get('FORWARD_SESSION_INFO_HEADER_CHAT_ID', 'X-OpenWebUI-Chat-Id') - -# Experimental feature, may be removed in future -ENABLE_STAR_SESSIONS_MIDDLEWARE = os.environ.get('ENABLE_STAR_SESSIONS_MIDDLEWARE', 'False').lower() == 'true' - -ENABLE_EASTER_EGGS = os.environ.get('ENABLE_EASTER_EGGS', 'True').lower() == 'true' - -#################################### -# WEBUI_BUILD_HASH -#################################### - -WEBUI_BUILD_HASH = os.environ.get('WEBUI_BUILD_HASH', 'dev-build') - #################################### # DATA/FRONTEND BUILD DIR #################################### @@ -303,11 +260,11 @@ if os.path.exists(f'{DATA_DIR}/ollama.db'): else: pass -DATABASE_URL = os.environ.get('DATABASE_URL', f'sqlite:///{DATA_DIR}/webui.db') +DATABASE_URL = os.getenv('DATABASE_URL', f'sqlite:///{DATA_DIR}/webui.db') -DATABASE_TYPE = os.environ.get('DATABASE_TYPE') -DATABASE_USER = os.environ.get('DATABASE_USER') -DATABASE_PASSWORD = os.environ.get('DATABASE_PASSWORD') +DATABASE_TYPE = os.getenv('DATABASE_TYPE') +DATABASE_USER = os.getenv('DATABASE_USER') +DATABASE_PASSWORD = os.getenv('DATABASE_PASSWORD') DATABASE_CRED = '' if DATABASE_USER: @@ -318,16 +275,16 @@ if DATABASE_PASSWORD: DB_VARS = { 'db_type': DATABASE_TYPE, 'db_cred': DATABASE_CRED, - 'db_host': os.environ.get('DATABASE_HOST'), - 'db_port': os.environ.get('DATABASE_PORT'), - 'db_name': os.environ.get('DATABASE_NAME'), + 'db_host': os.getenv('DATABASE_HOST'), + 'db_port': os.getenv('DATABASE_PORT'), + 'db_name': os.getenv('DATABASE_NAME'), } if all(DB_VARS.values()): DATABASE_URL = ( f'{DB_VARS["db_type"]}://{DB_VARS["db_cred"]}@{DB_VARS["db_host"]}:{DB_VARS["db_port"]}/{DB_VARS["db_name"]}' ) -elif DATABASE_TYPE == 'sqlite+sqlcipher' and not os.environ.get('DATABASE_URL'): +elif DATABASE_TYPE == 'sqlite+sqlcipher' and not os.getenv('DATABASE_URL'): # Handle SQLCipher with local file when DATABASE_URL wasn't explicitly set DATABASE_URL = f'sqlite+sqlcipher:///{DATA_DIR}/webui.db' @@ -335,47 +292,33 @@ elif DATABASE_TYPE == 'sqlite+sqlcipher' and not os.environ.get('DATABASE_URL'): if 'postgres://' in DATABASE_URL: DATABASE_URL = DATABASE_URL.replace('postgres://', 'postgresql://') -DATABASE_SCHEMA = os.environ.get('DATABASE_SCHEMA', None) +DATABASE_SCHEMA = os.getenv('DATABASE_SCHEMA', None) -DATABASE_POOL_SIZE = os.environ.get('DATABASE_POOL_SIZE', None) +_pool_size_raw = os.getenv('DATABASE_POOL_SIZE') +try: + DATABASE_POOL_SIZE = int(_pool_size_raw) if _pool_size_raw else None +except (ValueError, TypeError): + DATABASE_POOL_SIZE = None -if DATABASE_POOL_SIZE != None: - try: - DATABASE_POOL_SIZE = int(DATABASE_POOL_SIZE) - except Exception: - DATABASE_POOL_SIZE = None - -DATABASE_POOL_MAX_OVERFLOW = os.environ.get('DATABASE_POOL_MAX_OVERFLOW', 0) - -if DATABASE_POOL_MAX_OVERFLOW == '': +_pool_overflow_raw = os.getenv('DATABASE_POOL_MAX_OVERFLOW', '0') +try: + DATABASE_POOL_MAX_OVERFLOW = int(_pool_overflow_raw) if _pool_overflow_raw else 0 +except (ValueError, TypeError): DATABASE_POOL_MAX_OVERFLOW = 0 -else: - try: - DATABASE_POOL_MAX_OVERFLOW = int(DATABASE_POOL_MAX_OVERFLOW) - except Exception: - DATABASE_POOL_MAX_OVERFLOW = 0 -DATABASE_POOL_TIMEOUT = os.environ.get('DATABASE_POOL_TIMEOUT', 30) - -if DATABASE_POOL_TIMEOUT == '': +_pool_timeout_raw = os.getenv('DATABASE_POOL_TIMEOUT', '30') +try: + DATABASE_POOL_TIMEOUT = int(_pool_timeout_raw) if _pool_timeout_raw else 30 +except (ValueError, TypeError): DATABASE_POOL_TIMEOUT = 30 -else: - try: - DATABASE_POOL_TIMEOUT = int(DATABASE_POOL_TIMEOUT) - except Exception: - DATABASE_POOL_TIMEOUT = 30 -DATABASE_POOL_RECYCLE = os.environ.get('DATABASE_POOL_RECYCLE', 3600) - -if DATABASE_POOL_RECYCLE == '': +_pool_recycle_raw = os.getenv('DATABASE_POOL_RECYCLE', '3600') +try: + DATABASE_POOL_RECYCLE = int(_pool_recycle_raw) if _pool_recycle_raw else 3600 +except (ValueError, TypeError): DATABASE_POOL_RECYCLE = 3600 -else: - try: - DATABASE_POOL_RECYCLE = int(DATABASE_POOL_RECYCLE) - except Exception: - DATABASE_POOL_RECYCLE = 3600 -DATABASE_ENABLE_SQLITE_WAL = os.environ.get('DATABASE_ENABLE_SQLITE_WAL', 'True').lower() == 'true' +DATABASE_ENABLE_SQLITE_WAL = os.getenv('DATABASE_ENABLE_SQLITE_WAL', 'True').lower() == 'true' # SQLite PRAGMA tuning — these defaults are optimised for WAL-mode web-server # workloads. Each can be overridden via its environment variable. @@ -383,63 +326,56 @@ DATABASE_ENABLE_SQLITE_WAL = os.environ.get('DATABASE_ENABLE_SQLITE_WAL', 'True' # PRAGMA synchronous: NORMAL (1) is safe with WAL and avoids an fsync per # transaction. Valid values: OFF (0), NORMAL (1), FULL (2), EXTRA (3). -DATABASE_SQLITE_PRAGMA_SYNCHRONOUS = os.environ.get('DATABASE_SQLITE_PRAGMA_SYNCHRONOUS', 'NORMAL') +DATABASE_SQLITE_PRAGMA_SYNCHRONOUS = os.getenv('DATABASE_SQLITE_PRAGMA_SYNCHRONOUS', 'NORMAL') # PRAGMA busy_timeout (ms): how long a connection waits for a write lock # before raising SQLITE_BUSY. -DATABASE_SQLITE_PRAGMA_BUSY_TIMEOUT = os.environ.get('DATABASE_SQLITE_PRAGMA_BUSY_TIMEOUT', '5000') +DATABASE_SQLITE_PRAGMA_BUSY_TIMEOUT = os.getenv('DATABASE_SQLITE_PRAGMA_BUSY_TIMEOUT', '5000') # PRAGMA cache_size: negative value = KiB. -65536 ≈ 64 MB page cache. -DATABASE_SQLITE_PRAGMA_CACHE_SIZE = os.environ.get('DATABASE_SQLITE_PRAGMA_CACHE_SIZE', '-65536') +DATABASE_SQLITE_PRAGMA_CACHE_SIZE = os.getenv('DATABASE_SQLITE_PRAGMA_CACHE_SIZE', '-65536') # PRAGMA temp_store: MEMORY (2) keeps temp tables and indices in RAM. # Valid values: DEFAULT (0), FILE (1), MEMORY (2). -DATABASE_SQLITE_PRAGMA_TEMP_STORE = os.environ.get('DATABASE_SQLITE_PRAGMA_TEMP_STORE', 'MEMORY') +DATABASE_SQLITE_PRAGMA_TEMP_STORE = os.getenv('DATABASE_SQLITE_PRAGMA_TEMP_STORE', 'MEMORY') # PRAGMA mmap_size (bytes): memory-mapped I/O size. 268435456 ≈ 256 MB. # Set to 0 to disable mmap. -DATABASE_SQLITE_PRAGMA_MMAP_SIZE = os.environ.get('DATABASE_SQLITE_PRAGMA_MMAP_SIZE', '268435456') +DATABASE_SQLITE_PRAGMA_MMAP_SIZE = os.getenv('DATABASE_SQLITE_PRAGMA_MMAP_SIZE', '268435456') # PRAGMA journal_size_limit (bytes): caps the WAL file size after checkpoint. # Without this the WAL grows unbounded during write bursts and is never # truncated. 67108864 ≈ 64 MB. Set to -1 for no limit (SQLite default). -DATABASE_SQLITE_PRAGMA_JOURNAL_SIZE_LIMIT = os.environ.get('DATABASE_SQLITE_PRAGMA_JOURNAL_SIZE_LIMIT', '67108864') +DATABASE_SQLITE_PRAGMA_JOURNAL_SIZE_LIMIT = os.getenv('DATABASE_SQLITE_PRAGMA_JOURNAL_SIZE_LIMIT', '67108864') -DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = os.environ.get('DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL', None) +DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = os.getenv('DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL', None) if DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL is not None: try: DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = float(DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL) except Exception: DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL = 0.0 -# When enabled, get_db_context reuses existing sessions; set to False to always create new sessions -DATABASE_ENABLE_SESSION_SHARING = os.environ.get('DATABASE_ENABLE_SESSION_SHARING', 'False').lower() == 'true' - -# Enable public visibility of active user count (when disabled, only admins can see it) -ENABLE_PUBLIC_ACTIVE_USERS_COUNT = os.environ.get('ENABLE_PUBLIC_ACTIVE_USERS_COUNT', 'True').lower() == 'true' - -RESET_CONFIG_ON_START = os.environ.get('RESET_CONFIG_ON_START', 'False').lower() == 'true' - -ENABLE_REALTIME_CHAT_SAVE = os.environ.get('ENABLE_REALTIME_CHAT_SAVE', 'False').lower() == 'true' - -ENABLE_QUERIES_CACHE = os.environ.get('ENABLE_QUERIES_CACHE', 'False').lower() == 'true' - -RAG_SYSTEM_CONTEXT = os.environ.get('RAG_SYSTEM_CONTEXT', 'False').lower() == 'true' +DATABASE_ENABLE_SESSION_SHARING = os.getenv('DATABASE_ENABLE_SESSION_SHARING', 'False').lower() == 'true' +ENABLE_PUBLIC_ACTIVE_USERS_COUNT = os.getenv('ENABLE_PUBLIC_ACTIVE_USERS_COUNT', 'True').lower() == 'true' +RESET_CONFIG_ON_START = os.getenv('RESET_CONFIG_ON_START', 'False').lower() == 'true' +ENABLE_REALTIME_CHAT_SAVE = os.getenv('ENABLE_REALTIME_CHAT_SAVE', 'False').lower() == 'true' +ENABLE_QUERIES_CACHE = os.getenv('ENABLE_QUERIES_CACHE', 'False').lower() == 'true' +RAG_SYSTEM_CONTEXT = os.getenv('RAG_SYSTEM_CONTEXT', 'False').lower() == 'true' #################################### # REDIS #################################### -REDIS_URL = os.environ.get('REDIS_URL', '') -REDIS_CLUSTER = os.environ.get('REDIS_CLUSTER', 'False').lower() == 'true' +REDIS_URL = os.getenv('REDIS_URL', '') +REDIS_CLUSTER = os.getenv('REDIS_CLUSTER', 'False').lower() == 'true' -REDIS_KEY_PREFIX = os.environ.get('REDIS_KEY_PREFIX', 'open-webui') +REDIS_KEY_PREFIX = os.getenv('REDIS_KEY_PREFIX', 'open-webui') -REDIS_SENTINEL_HOSTS = os.environ.get('REDIS_SENTINEL_HOSTS', '') -REDIS_SENTINEL_PORT = os.environ.get('REDIS_SENTINEL_PORT', '26379') +REDIS_SENTINEL_HOSTS = os.getenv('REDIS_SENTINEL_HOSTS', '') +REDIS_SENTINEL_PORT = os.getenv('REDIS_SENTINEL_PORT', '26379') # Maximum number of retries for Redis operations when using Sentinel fail-over -REDIS_SENTINEL_MAX_RETRY_COUNT = os.environ.get('REDIS_SENTINEL_MAX_RETRY_COUNT', '2') +REDIS_SENTINEL_MAX_RETRY_COUNT = os.getenv('REDIS_SENTINEL_MAX_RETRY_COUNT', '2') try: REDIS_SENTINEL_MAX_RETRY_COUNT = int(REDIS_SENTINEL_MAX_RETRY_COUNT) if REDIS_SENTINEL_MAX_RETRY_COUNT < 1: @@ -448,7 +384,7 @@ except ValueError: REDIS_SENTINEL_MAX_RETRY_COUNT = 2 -REDIS_SOCKET_CONNECT_TIMEOUT = os.environ.get('REDIS_SOCKET_CONNECT_TIMEOUT', '') +REDIS_SOCKET_CONNECT_TIMEOUT = os.getenv('REDIS_SOCKET_CONNECT_TIMEOUT', '') try: REDIS_SOCKET_CONNECT_TIMEOUT = float(REDIS_SOCKET_CONNECT_TIMEOUT) except ValueError: @@ -459,7 +395,7 @@ except ValueError: # enabled, the kernel sends TCP keepalive probes on idle connections so # half-closed sockets (e.g. after a silent firewall/LB reset or a NIC # flap) are detected before the next command lands on them. -REDIS_SOCKET_KEEPALIVE = os.environ.get('REDIS_SOCKET_KEEPALIVE', 'False').lower() == 'true' +REDIS_SOCKET_KEEPALIVE = os.getenv('REDIS_SOCKET_KEEPALIVE', 'False').lower() == 'true' # How often (in seconds) redis-py should PING an idle pooled connection # before reusing it. Opt-in: defaults to unset (empty string) so behavior @@ -467,7 +403,7 @@ REDIS_SOCKET_KEEPALIVE = os.environ.get('REDIS_SOCKET_KEEPALIVE', 'False').lower # the Redis server `timeout` setting and any firewall/LB idle timeout on # the path to Redis, so stale connections are detected before a real # command lands on them. Set to 0 or empty to disable. -REDIS_HEALTH_CHECK_INTERVAL = os.environ.get('REDIS_HEALTH_CHECK_INTERVAL', '') +REDIS_HEALTH_CHECK_INTERVAL = os.getenv('REDIS_HEALTH_CHECK_INTERVAL', '') try: REDIS_HEALTH_CHECK_INTERVAL = int(REDIS_HEALTH_CHECK_INTERVAL) if REDIS_HEALTH_CHECK_INTERVAL <= 0: @@ -475,7 +411,7 @@ try: except ValueError: REDIS_HEALTH_CHECK_INTERVAL = None -REDIS_RECONNECT_DELAY = os.environ.get('REDIS_RECONNECT_DELAY', '') +REDIS_RECONNECT_DELAY = os.getenv('REDIS_RECONNECT_DELAY', '') if REDIS_RECONNECT_DELAY == '': REDIS_RECONNECT_DELAY = None @@ -488,257 +424,24 @@ else: REDIS_RECONNECT_DELAY = None #################################### -# UVICORN WORKERS +# Uvicorn #################################### -# Number of uvicorn worker processes for handling requests -UVICORN_WORKERS = os.environ.get('UVICORN_WORKERS', '1') try: - UVICORN_WORKERS = int(UVICORN_WORKERS) - if UVICORN_WORKERS < 1: - UVICORN_WORKERS = 1 -except ValueError: + UVICORN_WORKERS = max(int(os.getenv('UVICORN_WORKERS', '1')), 1) +except (ValueError, TypeError): UVICORN_WORKERS = 1 - log.info(f'Invalid UVICORN_WORKERS value, defaulting to {UVICORN_WORKERS}') - -#################################### -# WEBUI_AUTH (Required for security) -#################################### - -WEBUI_AUTH = os.environ.get('WEBUI_AUTH', 'True').lower() == 'true' - -ENABLE_INITIAL_ADMIN_SIGNUP = os.environ.get('ENABLE_INITIAL_ADMIN_SIGNUP', 'False').lower() == 'true' -ENABLE_SIGNUP_PASSWORD_CONFIRMATION = os.environ.get('ENABLE_SIGNUP_PASSWORD_CONFIRMATION', 'False').lower() == 'true' - -#################################### -# Admin Account Runtime Creation -#################################### - -# Optional env vars for creating an admin account on startup -# Useful for headless/automated deployments -WEBUI_ADMIN_EMAIL = os.environ.get('WEBUI_ADMIN_EMAIL', '') -WEBUI_ADMIN_PASSWORD = os.environ.get('WEBUI_ADMIN_PASSWORD', '') -WEBUI_ADMIN_NAME = os.environ.get('WEBUI_ADMIN_NAME', 'Admin') - -WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_EMAIL_HEADER', None) -WEBUI_AUTH_TRUSTED_NAME_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_NAME_HEADER', None) -WEBUI_AUTH_TRUSTED_GROUPS_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_GROUPS_HEADER', None) -WEBUI_AUTH_TRUSTED_ROLE_HEADER = os.environ.get('WEBUI_AUTH_TRUSTED_ROLE_HEADER', None) - -# Custom header name for API key authentication. Defaults to 'x-api-key'. -# Useful when Open WebUI sits behind a reverse proxy / API gateway that -# already uses the Authorization header for its own authentication — set -# this to a unique header (e.g. 'X-OpenWebUI-Key') so the middleware -# checks the custom header instead and avoids the 401 short-circuit. -CUSTOM_API_KEY_HEADER = os.environ.get('CUSTOM_API_KEY_HEADER', 'x-api-key') - -ENABLE_PASSWORD_VALIDATION = os.environ.get('ENABLE_PASSWORD_VALIDATION', 'False').lower() == 'true' -PASSWORD_VALIDATION_REGEX_PATTERN = os.environ.get( - 'PASSWORD_VALIDATION_REGEX_PATTERN', - r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$', -) - - -try: - PASSWORD_VALIDATION_REGEX_PATTERN = rf'{PASSWORD_VALIDATION_REGEX_PATTERN}' - PASSWORD_VALIDATION_REGEX_PATTERN = re.compile(PASSWORD_VALIDATION_REGEX_PATTERN) -except Exception as e: - log.error(f'Invalid PASSWORD_VALIDATION_REGEX_PATTERN: {e}') - PASSWORD_VALIDATION_REGEX_PATTERN = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$') - -PASSWORD_VALIDATION_HINT = os.environ.get('PASSWORD_VALIDATION_HINT', '') - - -BYPASS_MODEL_ACCESS_CONTROL = os.environ.get('BYPASS_MODEL_ACCESS_CONTROL', 'False').lower() == 'true' - -# When enabled, skips pydub-based preprocessing (format conversion, compression, -# and chunked splitting) before sending files to processing engines. Useful when -# the upstream provider handles these steps or when ffmpeg is unavailable. -BYPASS_PYDUB_PREPROCESSING = os.environ.get('BYPASS_PYDUB_PREPROCESSING', 'False').lower() == 'true' - -# When disabled (default), the OpenAI catch-all proxy endpoint (/{path:path}) -# is blocked. Enable only if you need direct passthrough to upstream OpenAI- -# compatible APIs for endpoints not natively handled by Open WebUI. -ENABLE_OPENAI_API_PASSTHROUGH = os.environ.get('ENABLE_OPENAI_API_PASSTHROUGH', 'False').lower() == 'true' - -WEBUI_AUTH_SIGNOUT_REDIRECT_URL = os.environ.get('WEBUI_AUTH_SIGNOUT_REDIRECT_URL', None) - -#################################### -# WEBUI_SECRET_KEY -#################################### - -WEBUI_SECRET_KEY = os.environ.get( - 'WEBUI_SECRET_KEY', - os.environ.get('WEBUI_JWT_SECRET_KEY', 't0p-s3cr3t'), # DEPRECATED: remove at next major version -) - -WEBUI_SESSION_COOKIE_SAME_SITE = os.environ.get('WEBUI_SESSION_COOKIE_SAME_SITE', 'lax') - -WEBUI_SESSION_COOKIE_SECURE = os.environ.get('WEBUI_SESSION_COOKIE_SECURE', 'false').lower() == 'true' - -WEBUI_AUTH_COOKIE_SAME_SITE = os.environ.get('WEBUI_AUTH_COOKIE_SAME_SITE', WEBUI_SESSION_COOKIE_SAME_SITE) - -WEBUI_AUTH_COOKIE_SECURE = ( - os.environ.get( - 'WEBUI_AUTH_COOKIE_SECURE', - os.environ.get('WEBUI_SESSION_COOKIE_SECURE', 'false'), - ).lower() - == 'true' -) - -if WEBUI_AUTH and WEBUI_SECRET_KEY == '': - raise ValueError(ERROR_MESSAGES.ENV_VAR_NOT_FOUND) - -ENABLE_COMPRESSION_MIDDLEWARE = os.environ.get('ENABLE_COMPRESSION_MIDDLEWARE', 'True').lower() == 'true' - -#################################### -# OAUTH Configuration -#################################### -ENABLE_OAUTH_EMAIL_FALLBACK = os.environ.get('ENABLE_OAUTH_EMAIL_FALLBACK', 'False').lower() == 'true' - -ENABLE_OAUTH_ID_TOKEN_COOKIE = os.environ.get('ENABLE_OAUTH_ID_TOKEN_COOKIE', 'True').lower() == 'true' - -OAUTH_CLIENT_INFO_ENCRYPTION_KEY = os.environ.get('OAUTH_CLIENT_INFO_ENCRYPTION_KEY', WEBUI_SECRET_KEY) - -OAUTH_SESSION_TOKEN_ENCRYPTION_KEY = os.environ.get('OAUTH_SESSION_TOKEN_ENCRYPTION_KEY', WEBUI_SECRET_KEY) - -# Maximum number of concurrent OAuth sessions per user per provider -# This prevents unbounded session growth while allowing multi-device usage -OAUTH_MAX_SESSIONS_PER_USER = int(os.environ.get('OAUTH_MAX_SESSIONS_PER_USER', '10')) - -# Token Exchange Configuration -# Allows external apps to exchange OAuth tokens for OpenWebUI tokens -ENABLE_OAUTH_TOKEN_EXCHANGE = os.environ.get('ENABLE_OAUTH_TOKEN_EXCHANGE', 'False').lower() == 'true' - -# Back-Channel Logout Configuration -# When enabled, exposes POST /oauth/backchannel-logout for IdP-initiated logout -# per OpenID Connect Back-Channel Logout 1.0 spec. -# Requires Redis for JWT revocation. -ENABLE_OAUTH_BACKCHANNEL_LOGOUT = os.environ.get('ENABLE_OAUTH_BACKCHANNEL_LOGOUT', 'False').lower() == 'true' - -#################################### -# SCIM Configuration -#################################### - -ENABLE_SCIM = os.environ.get('ENABLE_SCIM', os.environ.get('SCIM_ENABLED', 'False')).lower() == 'true' -SCIM_TOKEN = os.environ.get('SCIM_TOKEN', '') -SCIM_AUTH_PROVIDER = os.environ.get('SCIM_AUTH_PROVIDER', '') - -if ENABLE_SCIM and not SCIM_AUTH_PROVIDER: - log.warning( - 'SCIM is enabled but SCIM_AUTH_PROVIDER is not set. ' - "Set SCIM_AUTH_PROVIDER to the OAuth provider name (e.g. 'microsoft', 'oidc') " - 'to enable externalId storage.' - ) - -#################################### -# LICENSE_KEY -#################################### - -LICENSE_KEY = os.environ.get('LICENSE_KEY', '') - -LICENSE_BLOB = None -LICENSE_BLOB_PATH = os.environ.get('LICENSE_BLOB_PATH', DATA_DIR / 'l.data') -if LICENSE_BLOB_PATH and os.path.exists(LICENSE_BLOB_PATH): - with open(LICENSE_BLOB_PATH, 'rb') as f: - LICENSE_BLOB = f.read() - -LICENSE_PUBLIC_KEY = os.environ.get('LICENSE_PUBLIC_KEY', '') - -pk = None -if LICENSE_PUBLIC_KEY: - pk = serialization.load_pem_public_key( - f""" ------BEGIN PUBLIC KEY----- -{LICENSE_PUBLIC_KEY} ------END PUBLIC KEY----- -""".encode('utf-8') - ) - - -#################################### -# MODELS -#################################### - -ENABLE_CUSTOM_MODEL_FALLBACK = os.environ.get('ENABLE_CUSTOM_MODEL_FALLBACK', 'False').lower() == 'true' - -MODELS_CACHE_TTL = os.environ.get('MODELS_CACHE_TTL', '1') -if MODELS_CACHE_TTL == '': - MODELS_CACHE_TTL = None -else: - try: - MODELS_CACHE_TTL = int(MODELS_CACHE_TTL) - except Exception: - MODELS_CACHE_TTL = 1 - - -#################################### -# CHAT -#################################### - -ENABLE_CHAT_RESPONSE_BASE64_IMAGE_URL_CONVERSION = ( - os.environ.get('ENABLE_CHAT_RESPONSE_BASE64_IMAGE_URL_CONVERSION', 'False').lower() == 'true' -) - -# When enabled, uses a hardcoded extension-to-MIME dictionary as a last-resort -# fallback when both mimetypes.guess_type() and file.meta.content_type fail to -# determine the content type. This can help on minimal container images (e.g. -# wolfi-base) that lack /etc/mime.types AND have legacy files without stored -# content_type metadata. -ENABLE_IMAGE_CONTENT_TYPE_EXTENSION_FALLBACK = ( - os.environ.get('ENABLE_IMAGE_CONTENT_TYPE_EXTENSION_FALLBACK', 'False').lower() == 'true' -) - -CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = os.environ.get('CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE', '1') - -if CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE == '': - CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = 1 -else: - try: - CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = int(CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE) - except Exception: - CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = 1 - - -CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = os.environ.get('CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES', '30') - -if CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES == '': - CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = 30 -else: - try: - CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = int(CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES) - except Exception: - CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = 30 - - -# WARNING: Experimental. Only enable if your upstream Responses API endpoint -# supports stateful sessions (i.e. server-side response storage with -# previous_response_id anchoring). Most proxies and third-party endpoints -# are stateless and will break if this is enabled. -ENABLE_RESPONSES_API_STATEFUL = os.environ.get('ENABLE_RESPONSES_API_STATEFUL', 'False').lower() == 'true' - - -CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = os.environ.get('CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE', '') - -if CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE == '': - CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = None -else: - try: - CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = int(CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE) - except Exception: - CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = None - #################################### # WEBSOCKET SUPPORT #################################### -ENABLE_WEBSOCKET_SUPPORT = os.environ.get('ENABLE_WEBSOCKET_SUPPORT', 'True').lower() == 'true' +ENABLE_WEBSOCKET_SUPPORT = os.getenv('ENABLE_WEBSOCKET_SUPPORT', 'True').lower() == 'true' -WEBSOCKET_MANAGER = os.environ.get('WEBSOCKET_MANAGER', '') +WEBSOCKET_MANAGER = os.getenv('WEBSOCKET_MANAGER', '') -WEBSOCKET_REDIS_OPTIONS = os.environ.get('WEBSOCKET_REDIS_OPTIONS', '') +WEBSOCKET_REDIS_OPTIONS = os.getenv('WEBSOCKET_REDIS_OPTIONS', '') if WEBSOCKET_REDIS_OPTIONS == '': @@ -754,39 +457,39 @@ else: log.warning('Invalid WEBSOCKET_REDIS_OPTIONS, defaulting to None') WEBSOCKET_REDIS_OPTIONS = None -WEBSOCKET_REDIS_URL = os.environ.get('WEBSOCKET_REDIS_URL', REDIS_URL) -WEBSOCKET_REDIS_CLUSTER = os.environ.get('WEBSOCKET_REDIS_CLUSTER', str(REDIS_CLUSTER)).lower() == 'true' +WEBSOCKET_REDIS_URL = os.getenv('WEBSOCKET_REDIS_URL', REDIS_URL) +WEBSOCKET_REDIS_CLUSTER = os.getenv('WEBSOCKET_REDIS_CLUSTER', str(REDIS_CLUSTER)).lower() == 'true' -websocket_redis_lock_timeout = os.environ.get('WEBSOCKET_REDIS_LOCK_TIMEOUT', '60') +websocket_redis_lock_timeout = os.getenv('WEBSOCKET_REDIS_LOCK_TIMEOUT', '60') try: WEBSOCKET_REDIS_LOCK_TIMEOUT = int(websocket_redis_lock_timeout) except ValueError: WEBSOCKET_REDIS_LOCK_TIMEOUT = 60 -WEBSOCKET_SENTINEL_HOSTS = os.environ.get('WEBSOCKET_SENTINEL_HOSTS', '') -WEBSOCKET_SENTINEL_PORT = os.environ.get('WEBSOCKET_SENTINEL_PORT', '26379') -WEBSOCKET_SERVER_LOGGING = os.environ.get('WEBSOCKET_SERVER_LOGGING', 'False').lower() == 'true' +WEBSOCKET_SENTINEL_HOSTS = os.getenv('WEBSOCKET_SENTINEL_HOSTS', '') +WEBSOCKET_SENTINEL_PORT = os.getenv('WEBSOCKET_SENTINEL_PORT', '26379') +WEBSOCKET_SERVER_LOGGING = os.getenv('WEBSOCKET_SERVER_LOGGING', 'False').lower() == 'true' WEBSOCKET_SERVER_ENGINEIO_LOGGING = ( - os.environ.get( + os.getenv( 'WEBSOCKET_SERVER_ENGINEIO_LOGGING', - os.environ.get('WEBSOCKET_SERVER_LOGGING', 'False'), + os.getenv('WEBSOCKET_SERVER_LOGGING', 'False'), ).lower() == 'true' ) -WEBSOCKET_SERVER_PING_TIMEOUT = os.environ.get('WEBSOCKET_SERVER_PING_TIMEOUT', '20') +WEBSOCKET_SERVER_PING_TIMEOUT = os.getenv('WEBSOCKET_SERVER_PING_TIMEOUT', '20') try: WEBSOCKET_SERVER_PING_TIMEOUT = int(WEBSOCKET_SERVER_PING_TIMEOUT) except ValueError: WEBSOCKET_SERVER_PING_TIMEOUT = 20 -WEBSOCKET_SERVER_PING_INTERVAL = os.environ.get('WEBSOCKET_SERVER_PING_INTERVAL', '25') +WEBSOCKET_SERVER_PING_INTERVAL = os.getenv('WEBSOCKET_SERVER_PING_INTERVAL', '25') try: WEBSOCKET_SERVER_PING_INTERVAL = int(WEBSOCKET_SERVER_PING_INTERVAL) except ValueError: WEBSOCKET_SERVER_PING_INTERVAL = 25 -WEBSOCKET_EVENT_CALLER_TIMEOUT = os.environ.get('WEBSOCKET_EVENT_CALLER_TIMEOUT', '') +WEBSOCKET_EVENT_CALLER_TIMEOUT = os.getenv('WEBSOCKET_EVENT_CALLER_TIMEOUT', '') if WEBSOCKET_EVENT_CALLER_TIMEOUT == '': WEBSOCKET_EVENT_CALLER_TIMEOUT = None @@ -797,51 +500,44 @@ else: WEBSOCKET_EVENT_CALLER_TIMEOUT = 300 -REQUESTS_VERIFY = os.environ.get('REQUESTS_VERIFY', 'True').lower() == 'true' +REQUESTS_VERIFY = os.getenv('REQUESTS_VERIFY', 'True').lower() == 'true' -AIOHTTP_CLIENT_TIMEOUT = os.environ.get('AIOHTTP_CLIENT_TIMEOUT', '') - -if AIOHTTP_CLIENT_TIMEOUT == '': - AIOHTTP_CLIENT_TIMEOUT = None -else: - try: - AIOHTTP_CLIENT_TIMEOUT = int(AIOHTTP_CLIENT_TIMEOUT) - except Exception: - AIOHTTP_CLIENT_TIMEOUT = 300 +_aiohttp_timeout_raw = os.getenv('AIOHTTP_CLIENT_TIMEOUT', '') +try: + AIOHTTP_CLIENT_TIMEOUT = int(_aiohttp_timeout_raw) if _aiohttp_timeout_raw else None +except (ValueError, TypeError): + AIOHTTP_CLIENT_TIMEOUT = 300 -AIOHTTP_CLIENT_SESSION_SSL = os.environ.get('AIOHTTP_CLIENT_SESSION_SSL', 'True').lower() == 'true' +AIOHTTP_CLIENT_SESSION_SSL = os.getenv('AIOHTTP_CLIENT_SESSION_SSL', 'True').lower() == 'true' -AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = os.environ.get( +# When False (default), outbound HTTP requests do not follow 3xx redirects. +AIOHTTP_CLIENT_ALLOW_REDIRECTS = os.getenv('AIOHTTP_CLIENT_ALLOW_REDIRECTS', 'False').lower() == 'true' + +# Optional User-Agent override for outbound web-loader fetches. When set, +# SafeWebBaseLoader sends this value instead of the default python-requests UA +# which is aggressively blocked by Cloudflare, Wikipedia, and similar services. +USER_AGENT = os.getenv('USER_AGENT', '') + +_model_list_timeout_raw = os.getenv( 'AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST', - os.environ.get('AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST', '10'), + os.getenv('AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST', '10'), ) +try: + AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = int(_model_list_timeout_raw) if _model_list_timeout_raw else None +except (ValueError, TypeError): + AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = 10 -if AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST == '': - AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = None -else: - try: - AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = int(AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST) - except Exception: - AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = 10 +_tool_data_timeout_raw = os.getenv('AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA', '10') +try: + AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = int(_tool_data_timeout_raw) if _tool_data_timeout_raw else None +except (ValueError, TypeError): + AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = 10 -AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = os.environ.get('AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA', '10') +AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL = os.getenv('AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL', 'True').lower() == 'true' -if AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA == '': - AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = None -else: - try: - AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = int(AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA) - except Exception: - AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = 10 - - -AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL = ( - os.environ.get('AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL', 'True').lower() == 'true' -) - -AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER = os.environ.get('AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER', '') +AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER = os.getenv('AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER', '') if AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER == '': AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER = AIOHTTP_CLIENT_TIMEOUT @@ -856,7 +552,7 @@ else: # AIOHTTP Connection Pool #################################### -AIOHTTP_POOL_CONNECTIONS = os.environ.get('AIOHTTP_POOL_CONNECTIONS', '') +AIOHTTP_POOL_CONNECTIONS = os.getenv('AIOHTTP_POOL_CONNECTIONS', '') if AIOHTTP_POOL_CONNECTIONS == '': AIOHTTP_POOL_CONNECTIONS = None else: @@ -865,7 +561,7 @@ else: except ValueError: AIOHTTP_POOL_CONNECTIONS = None -AIOHTTP_POOL_CONNECTIONS_PER_HOST = os.environ.get('AIOHTTP_POOL_CONNECTIONS_PER_HOST', '') +AIOHTTP_POOL_CONNECTIONS_PER_HOST = os.getenv('AIOHTTP_POOL_CONNECTIONS_PER_HOST', '') if AIOHTTP_POOL_CONNECTIONS_PER_HOST == '': AIOHTTP_POOL_CONNECTIONS_PER_HOST = None else: @@ -874,7 +570,7 @@ else: except ValueError: AIOHTTP_POOL_CONNECTIONS_PER_HOST = None -AIOHTTP_POOL_DNS_TTL = os.environ.get('AIOHTTP_POOL_DNS_TTL', '300') +AIOHTTP_POOL_DNS_TTL = os.getenv('AIOHTTP_POOL_DNS_TTL', '300') try: AIOHTTP_POOL_DNS_TTL = int(AIOHTTP_POOL_DNS_TTL) if AIOHTTP_POOL_DNS_TTL < 0: @@ -882,7 +578,7 @@ try: except ValueError: AIOHTTP_POOL_DNS_TTL = 300 -RAG_EMBEDDING_TIMEOUT = os.environ.get('RAG_EMBEDDING_TIMEOUT', '') +RAG_EMBEDDING_TIMEOUT = os.getenv('RAG_EMBEDDING_TIMEOUT', '') if RAG_EMBEDDING_TIMEOUT == '': RAG_EMBEDDING_TIMEOUT = None @@ -893,17 +589,302 @@ else: RAG_EMBEDDING_TIMEOUT = None +#################################### +# Auth +#################################### + +WEBUI_AUTH = os.getenv('WEBUI_AUTH', 'True').lower() == 'true' + +ENABLE_INITIAL_ADMIN_SIGNUP = os.getenv('ENABLE_INITIAL_ADMIN_SIGNUP', 'False').lower() == 'true' +ENABLE_SIGNUP_PASSWORD_CONFIRMATION = os.getenv('ENABLE_SIGNUP_PASSWORD_CONFIRMATION', 'False').lower() == 'true' + +#################################### +# Secret key & cookies +#################################### + +# WEBUI_JWT_SECRET_KEY is deprecated; use WEBUI_SECRET_KEY instead. +WEBUI_SECRET_KEY = os.getenv( + 'WEBUI_SECRET_KEY', + os.getenv('WEBUI_JWT_SECRET_KEY', 't0p-s3cr3t'), +) + +WEBUI_SESSION_COOKIE_SAME_SITE = os.getenv('WEBUI_SESSION_COOKIE_SAME_SITE', 'lax') +WEBUI_SESSION_COOKIE_SECURE = os.getenv('WEBUI_SESSION_COOKIE_SECURE', 'false').lower() == 'true' +WEBUI_AUTH_COOKIE_SAME_SITE = os.getenv('WEBUI_AUTH_COOKIE_SAME_SITE', WEBUI_SESSION_COOKIE_SAME_SITE) +WEBUI_AUTH_COOKIE_SECURE = ( + os.getenv( + 'WEBUI_AUTH_COOKIE_SECURE', + os.getenv('WEBUI_SESSION_COOKIE_SECURE', 'false'), + ).lower() + == 'true' +) + +if WEBUI_AUTH and WEBUI_SECRET_KEY == '': + raise ValueError(ERROR_MESSAGES.ENV_VAR_NOT_FOUND) + +ENABLE_COMPRESSION_MIDDLEWARE = os.getenv('ENABLE_COMPRESSION_MIDDLEWARE', 'True').lower() == 'true' + +#################################### +# Admin Account Runtime Creation +#################################### + +# Optional env vars for creating an admin account on startup +# Useful for headless/automated deployments +WEBUI_ADMIN_EMAIL = os.getenv('WEBUI_ADMIN_EMAIL', '') +WEBUI_ADMIN_PASSWORD = os.getenv('WEBUI_ADMIN_PASSWORD', '') +WEBUI_ADMIN_NAME = os.getenv('WEBUI_ADMIN_NAME', 'Admin') + +WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os.getenv('WEBUI_AUTH_TRUSTED_EMAIL_HEADER', None) +WEBUI_AUTH_TRUSTED_NAME_HEADER = os.getenv('WEBUI_AUTH_TRUSTED_NAME_HEADER', None) +WEBUI_AUTH_TRUSTED_GROUPS_HEADER = os.getenv('WEBUI_AUTH_TRUSTED_GROUPS_HEADER', None) +WEBUI_AUTH_TRUSTED_ROLE_HEADER = os.getenv('WEBUI_AUTH_TRUSTED_ROLE_HEADER', None) + +# Custom header name for API key authentication. Defaults to 'x-api-key'. +# Useful when Open WebUI sits behind a reverse proxy / API gateway that +# already uses the Authorization header for its own authentication — set +# this to a unique header (e.g. 'X-OpenWebUI-Key') so the middleware +# checks the custom header instead and avoids the 401 short-circuit. +CUSTOM_API_KEY_HEADER = os.getenv('CUSTOM_API_KEY_HEADER', 'x-api-key') + +ENABLE_PASSWORD_VALIDATION = os.getenv('ENABLE_PASSWORD_VALIDATION', 'False').lower() == 'true' +PASSWORD_VALIDATION_REGEX_PATTERN = os.getenv( + 'PASSWORD_VALIDATION_REGEX_PATTERN', + r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$', +) + + +try: + PASSWORD_VALIDATION_REGEX_PATTERN = rf'{PASSWORD_VALIDATION_REGEX_PATTERN}' + PASSWORD_VALIDATION_REGEX_PATTERN = re.compile(PASSWORD_VALIDATION_REGEX_PATTERN) +except Exception as e: + log.error(f'Invalid PASSWORD_VALIDATION_REGEX_PATTERN: {e}') + PASSWORD_VALIDATION_REGEX_PATTERN = re.compile(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\w\s]).{8,}$') + +PASSWORD_VALIDATION_HINT = os.getenv('PASSWORD_VALIDATION_HINT', '') + + +BYPASS_MODEL_ACCESS_CONTROL = os.getenv('BYPASS_MODEL_ACCESS_CONTROL', 'False').lower() == 'true' + +# When enabled, skips pydub-based preprocessing (format conversion, compression, +# and chunked splitting) before sending files to processing engines. Useful when +# the upstream provider handles these steps or when ffmpeg is unavailable. +BYPASS_PYDUB_PREPROCESSING = os.getenv('BYPASS_PYDUB_PREPROCESSING', 'False').lower() == 'true' + +# When disabled (default), the OpenAI catch-all proxy endpoint (/{path:path}) +# is blocked. Enable only if you need direct passthrough to upstream OpenAI- +# compatible APIs for endpoints not natively handled by Open WebUI. +ENABLE_OPENAI_API_PASSTHROUGH = os.getenv('ENABLE_OPENAI_API_PASSTHROUGH', 'False').lower() == 'true' + +WEBUI_AUTH_SIGNOUT_REDIRECT_URL = os.getenv('WEBUI_AUTH_SIGNOUT_REDIRECT_URL', None) + +#################################### +# OAUTH Configuration +#################################### +ENABLE_OAUTH_EMAIL_FALLBACK = os.getenv('ENABLE_OAUTH_EMAIL_FALLBACK', 'False').lower() == 'true' + +ENABLE_OAUTH_ID_TOKEN_COOKIE = os.getenv('ENABLE_OAUTH_ID_TOKEN_COOKIE', 'True').lower() == 'true' + +OAUTH_CLIENT_INFO_ENCRYPTION_KEY = os.getenv('OAUTH_CLIENT_INFO_ENCRYPTION_KEY', WEBUI_SECRET_KEY) + +OAUTH_SESSION_TOKEN_ENCRYPTION_KEY = os.getenv('OAUTH_SESSION_TOKEN_ENCRYPTION_KEY', WEBUI_SECRET_KEY) + +# Maximum number of concurrent OAuth sessions per user per provider +# This prevents unbounded session growth while allowing multi-device usage +OAUTH_MAX_SESSIONS_PER_USER = int(os.getenv('OAUTH_MAX_SESSIONS_PER_USER', '10')) + +# Token Exchange Configuration +# Allows external apps to exchange OAuth tokens for OpenWebUI tokens +ENABLE_OAUTH_TOKEN_EXCHANGE = os.getenv('ENABLE_OAUTH_TOKEN_EXCHANGE', 'False').lower() == 'true' + +# Back-Channel Logout Configuration +# When enabled, exposes POST /oauth/backchannel-logout for IdP-initiated logout +# per OpenID Connect Back-Channel Logout 1.0 spec. +# Requires Redis for JWT revocation. +ENABLE_OAUTH_BACKCHANNEL_LOGOUT = os.getenv('ENABLE_OAUTH_BACKCHANNEL_LOGOUT', 'False').lower() == 'true' + +#################################### +# SCIM Configuration +#################################### + +ENABLE_SCIM = os.getenv('ENABLE_SCIM', os.getenv('SCIM_ENABLED', 'False')).lower() == 'true' +SCIM_TOKEN = os.getenv('SCIM_TOKEN', '') +SCIM_AUTH_PROVIDER = os.getenv('SCIM_AUTH_PROVIDER', '') + +if ENABLE_SCIM and not SCIM_AUTH_PROVIDER: + log.warning( + 'SCIM is enabled but SCIM_AUTH_PROVIDER is not set. ' + "Set SCIM_AUTH_PROVIDER to the OAuth provider name (e.g. 'microsoft', 'oidc') " + 'to enable externalId storage.' + ) + +#################################### +# LICENSE_KEY +#################################### + +LICENSE_KEY = os.getenv('LICENSE_KEY', '') + +LICENSE_BLOB = None +LICENSE_BLOB_PATH = os.getenv('LICENSE_BLOB_PATH', DATA_DIR / 'l.data') +if LICENSE_BLOB_PATH and os.path.exists(LICENSE_BLOB_PATH): + with open(LICENSE_BLOB_PATH, 'rb') as f: + LICENSE_BLOB = f.read() + +LICENSE_PUBLIC_KEY = os.getenv('LICENSE_PUBLIC_KEY', '') + +pk = None +if LICENSE_PUBLIC_KEY: + pk = serialization.load_pem_public_key( + f""" +-----BEGIN PUBLIC KEY----- +{LICENSE_PUBLIC_KEY} +-----END PUBLIC KEY----- +""".encode() + ) + + +#################################### +# WEBUI Identity +#################################### + +WEBUI_NAME = os.getenv('WEBUI_NAME', 'Open WebUI') +if WEBUI_NAME != 'Open WebUI': + WEBUI_NAME += ' (Open WebUI)' + +WEBUI_FAVICON_URL = 'https://openwebui.com/favicon.png' +WEBUI_BUILD_HASH = os.getenv('WEBUI_BUILD_HASH', 'dev-build') +TRUSTED_SIGNATURE_KEY = os.getenv('TRUSTED_SIGNATURE_KEY', '') + +#################################### +# Feature flags +#################################### + +SAFE_MODE = os.getenv('SAFE_MODE', 'False').lower() == 'true' +ENABLE_EASTER_EGGS = os.getenv('ENABLE_EASTER_EGGS', 'True').lower() == 'true' +ENABLE_STAR_SESSIONS_MIDDLEWARE = os.getenv('ENABLE_STAR_SESSIONS_MIDDLEWARE', 'False').lower() == 'true' +ENABLE_KB_EXEC = os.getenv('ENABLE_KB_EXEC', 'False').lower() == 'true' + +ENABLE_PROFILE_IMAGE_URL_FORWARDING = os.getenv('ENABLE_PROFILE_IMAGE_URL_FORWARDING', 'True').lower() == 'true' +PROFILE_IMAGE_ALLOWED_MIME_TYPES = frozenset( + t.strip() + for t in os.getenv( + 'PROFILE_IMAGE_ALLOWED_MIME_TYPES', + 'image/png,image/jpeg,image/gif,image/webp', + ).split(',') + if t.strip() +) + +#################################### +# Forward Headers +#################################### + +ENABLE_FORWARD_USER_INFO_HEADERS = os.getenv('ENABLE_FORWARD_USER_INFO_HEADERS', 'False').lower() == 'true' + +FORWARD_USER_INFO_HEADER_USER_NAME = os.getenv('FORWARD_USER_INFO_HEADER_USER_NAME', 'X-OpenWebUI-User-Name') +FORWARD_USER_INFO_HEADER_USER_ID = os.getenv('FORWARD_USER_INFO_HEADER_USER_ID', 'X-OpenWebUI-User-Id') +FORWARD_USER_INFO_HEADER_USER_EMAIL = os.getenv('FORWARD_USER_INFO_HEADER_USER_EMAIL', 'X-OpenWebUI-User-Email') +FORWARD_USER_INFO_HEADER_USER_ROLE = os.getenv('FORWARD_USER_INFO_HEADER_USER_ROLE', 'X-OpenWebUI-User-Role') +FORWARD_SESSION_INFO_HEADER_MESSAGE_ID = os.getenv('FORWARD_SESSION_INFO_HEADER_MESSAGE_ID', 'X-OpenWebUI-Message-Id') +FORWARD_SESSION_INFO_HEADER_CHAT_ID = os.getenv('FORWARD_SESSION_INFO_HEADER_CHAT_ID', 'X-OpenWebUI-Chat-Id') + +#################################### +# Progressive Web App +#################################### + +EXTERNAL_PWA_MANIFEST_URL = os.getenv('EXTERNAL_PWA_MANIFEST_URL', None) + +#################################### +# GROUP DEFAULTS +#################################### + +# Controls the default "Who can share to this group" setting for new groups. +# Env var values: "true" (anyone), "false" (no one), "members" (only group members). +_default_group_share = os.getenv('DEFAULT_GROUP_SHARE_PERMISSION', 'members').strip().lower() +DEFAULT_GROUP_SHARE_PERMISSION = 'members' if _default_group_share == 'members' else _default_group_share == 'true' + +#################################### +# MODELS +#################################### + +ENABLE_CUSTOM_MODEL_FALLBACK = os.getenv('ENABLE_CUSTOM_MODEL_FALLBACK', 'False').lower() == 'true' + +MODELS_CACHE_TTL = os.getenv('MODELS_CACHE_TTL', '1') +if MODELS_CACHE_TTL == '': + MODELS_CACHE_TTL = None +else: + try: + MODELS_CACHE_TTL = int(MODELS_CACHE_TTL) + except Exception: + MODELS_CACHE_TTL = 1 + + +#################################### +# CHAT +#################################### + +ENABLE_CHAT_RESPONSE_BASE64_IMAGE_URL_CONVERSION = ( + os.getenv('ENABLE_CHAT_RESPONSE_BASE64_IMAGE_URL_CONVERSION', 'False').lower() == 'true' +) + +# When enabled, uses a hardcoded extension-to-MIME dictionary as a last-resort +# fallback when both mimetypes.guess_type() and file.meta.content_type fail to +# determine the content type. This can help on minimal container images (e.g. +# wolfi-base) that lack /etc/mime.types AND have legacy files without stored +# content_type metadata. +ENABLE_IMAGE_CONTENT_TYPE_EXTENSION_FALLBACK = ( + os.getenv('ENABLE_IMAGE_CONTENT_TYPE_EXTENSION_FALLBACK', 'False').lower() == 'true' +) + +CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = os.getenv('CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE', '1') + +if CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE == '': + CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = 1 +else: + try: + CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = int(CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE) + except Exception: + CHAT_RESPONSE_STREAM_DELTA_CHUNK_SIZE = 1 + + +CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = os.getenv('CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES', '30') + +if CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES == '': + CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = 30 +else: + try: + CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = int(CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES) + except Exception: + CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES = 30 + + +# WARNING: Experimental. Only enable if your upstream Responses API endpoint +# supports stateful sessions (i.e. server-side response storage with +# previous_response_id anchoring). Most proxies and third-party endpoints +# are stateless and will break if this is enabled. +ENABLE_RESPONSES_API_STATEFUL = os.getenv('ENABLE_RESPONSES_API_STATEFUL', 'False').lower() == 'true' + + +CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = os.getenv('CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE', '') + +if CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE == '': + CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = None +else: + try: + CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = int(CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE) + except Exception: + CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE = None + + #################################### # SENTENCE TRANSFORMERS #################################### -SENTENCE_TRANSFORMERS_BACKEND = os.environ.get('SENTENCE_TRANSFORMERS_BACKEND', '') +SENTENCE_TRANSFORMERS_BACKEND = os.getenv('SENTENCE_TRANSFORMERS_BACKEND', '') if SENTENCE_TRANSFORMERS_BACKEND == '': SENTENCE_TRANSFORMERS_BACKEND = 'torch' -SENTENCE_TRANSFORMERS_MODEL_KWARGS = os.environ.get('SENTENCE_TRANSFORMERS_MODEL_KWARGS', '') +SENTENCE_TRANSFORMERS_MODEL_KWARGS = os.getenv('SENTENCE_TRANSFORMERS_MODEL_KWARGS', '') if SENTENCE_TRANSFORMERS_MODEL_KWARGS == '': SENTENCE_TRANSFORMERS_MODEL_KWARGS = None else: @@ -913,14 +894,12 @@ else: SENTENCE_TRANSFORMERS_MODEL_KWARGS = None -SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND = os.environ.get('SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND', '') +SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND = os.getenv('SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND', '') if SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND == '': SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND = 'torch' -SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = os.environ.get( - 'SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS', '' -) +SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = os.getenv('SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS', '') if SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS == '': SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = None else: @@ -933,22 +912,34 @@ else: # When enabled (default), scores are normalized to 0-1 range for proper # relevance threshold behavior with MS MARCO models. SENTENCE_TRANSFORMERS_CROSS_ENCODER_SIGMOID_ACTIVATION_FUNCTION = ( - os.environ.get('SENTENCE_TRANSFORMERS_CROSS_ENCODER_SIGMOID_ACTIVATION_FUNCTION', 'True').lower() == 'true' + os.getenv('SENTENCE_TRANSFORMERS_CROSS_ENCODER_SIGMOID_ACTIVATION_FUNCTION', 'True').lower() == 'true' ) +#################################### +# TOOLS/FUNCTIONS PIP OPTIONS +#################################### + +ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS = ( + os.getenv('ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS', 'True').lower() == 'true' +) + +PIP_OPTIONS = os.getenv('PIP_OPTIONS', '').split() +PIP_PACKAGE_INDEX_OPTIONS = os.getenv('PIP_PACKAGE_INDEX_OPTIONS', '').split() + + #################################### # OFFLINE_MODE #################################### -ENABLE_VERSION_UPDATE_CHECK = os.environ.get('ENABLE_VERSION_UPDATE_CHECK', 'true').lower() == 'true' -OFFLINE_MODE = os.environ.get('OFFLINE_MODE', 'false').lower() == 'true' +ENABLE_VERSION_UPDATE_CHECK = os.getenv('ENABLE_VERSION_UPDATE_CHECK', 'true').lower() == 'true' +OFFLINE_MODE = os.getenv('OFFLINE_MODE', 'false').lower() == 'true' if OFFLINE_MODE: os.environ['HF_HUB_OFFLINE'] = '1' ENABLE_VERSION_UPDATE_CHECK = False #################################### -# AUDIT LOGGING +# Audit logging #################################### @@ -970,7 +961,7 @@ AUDIT_UVICORN_LOGGER_NAMES = os.getenv('AUDIT_UVICORN_LOGGER_NAMES', 'uvicorn.ac # METADATA | REQUEST | REQUEST_RESPONSE AUDIT_LOG_LEVEL = os.getenv('AUDIT_LOG_LEVEL', 'NONE').upper() try: - MAX_BODY_LOG_SIZE = int(os.environ.get('MAX_BODY_LOG_SIZE') or 2048) + MAX_BODY_LOG_SIZE = int(os.getenv('MAX_BODY_LOG_SIZE') or 2048) except ValueError: MAX_BODY_LOG_SIZE = 2048 @@ -993,66 +984,39 @@ ENABLE_AUDIT_GET_REQUESTS = os.getenv('ENABLE_AUDIT_GET_REQUESTS', 'False').lowe # OPENTELEMETRY #################################### -ENABLE_OTEL = os.environ.get('ENABLE_OTEL', 'False').lower() == 'true' -ENABLE_OTEL_TRACES = os.environ.get('ENABLE_OTEL_TRACES', 'False').lower() == 'true' -ENABLE_OTEL_METRICS = os.environ.get('ENABLE_OTEL_METRICS', 'False').lower() == 'true' -ENABLE_OTEL_LOGS = os.environ.get('ENABLE_OTEL_LOGS', 'False').lower() == 'true' +ENABLE_OTEL = os.getenv('ENABLE_OTEL', 'False').lower() == 'true' +ENABLE_OTEL_TRACES = os.getenv('ENABLE_OTEL_TRACES', 'False').lower() == 'true' +ENABLE_OTEL_METRICS = os.getenv('ENABLE_OTEL_METRICS', 'False').lower() == 'true' +ENABLE_OTEL_LOGS = os.getenv('ENABLE_OTEL_LOGS', 'False').lower() == 'true' -OTEL_EXPORTER_OTLP_ENDPOINT = os.environ.get('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://localhost:4317') -OTEL_METRICS_EXPORTER_OTLP_ENDPOINT = os.environ.get('OTEL_METRICS_EXPORTER_OTLP_ENDPOINT', OTEL_EXPORTER_OTLP_ENDPOINT) -OTEL_LOGS_EXPORTER_OTLP_ENDPOINT = os.environ.get('OTEL_LOGS_EXPORTER_OTLP_ENDPOINT', OTEL_EXPORTER_OTLP_ENDPOINT) -OTEL_EXPORTER_OTLP_INSECURE = os.environ.get('OTEL_EXPORTER_OTLP_INSECURE', 'False').lower() == 'true' +OTEL_EXPORTER_OTLP_ENDPOINT = os.getenv('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://localhost:4317') +OTEL_METRICS_EXPORTER_OTLP_ENDPOINT = os.getenv('OTEL_METRICS_EXPORTER_OTLP_ENDPOINT', OTEL_EXPORTER_OTLP_ENDPOINT) +OTEL_LOGS_EXPORTER_OTLP_ENDPOINT = os.getenv('OTEL_LOGS_EXPORTER_OTLP_ENDPOINT', OTEL_EXPORTER_OTLP_ENDPOINT) +OTEL_EXPORTER_OTLP_INSECURE = os.getenv('OTEL_EXPORTER_OTLP_INSECURE', 'False').lower() == 'true' OTEL_METRICS_EXPORTER_OTLP_INSECURE = ( - os.environ.get('OTEL_METRICS_EXPORTER_OTLP_INSECURE', str(OTEL_EXPORTER_OTLP_INSECURE)).lower() == 'true' + os.getenv('OTEL_METRICS_EXPORTER_OTLP_INSECURE', str(OTEL_EXPORTER_OTLP_INSECURE)).lower() == 'true' ) OTEL_LOGS_EXPORTER_OTLP_INSECURE = ( - os.environ.get('OTEL_LOGS_EXPORTER_OTLP_INSECURE', str(OTEL_EXPORTER_OTLP_INSECURE)).lower() == 'true' + os.getenv('OTEL_LOGS_EXPORTER_OTLP_INSECURE', str(OTEL_EXPORTER_OTLP_INSECURE)).lower() == 'true' ) -OTEL_SERVICE_NAME = os.environ.get('OTEL_SERVICE_NAME', 'open-webui') -OTEL_RESOURCE_ATTRIBUTES = os.environ.get('OTEL_RESOURCE_ATTRIBUTES', '') # e.g. key1=val1,key2=val2 -OTEL_TRACES_SAMPLER = os.environ.get('OTEL_TRACES_SAMPLER', 'parentbased_always_on').lower() -OTEL_BASIC_AUTH_USERNAME = os.environ.get('OTEL_BASIC_AUTH_USERNAME', '') -OTEL_BASIC_AUTH_PASSWORD = os.environ.get('OTEL_BASIC_AUTH_PASSWORD', '') -OTEL_METRICS_EXPORT_INTERVAL_MILLIS = int(os.environ.get('OTEL_METRICS_EXPORT_INTERVAL_MILLIS', '10000')) +OTEL_SERVICE_NAME = os.getenv('OTEL_SERVICE_NAME', 'open-webui') +OTEL_RESOURCE_ATTRIBUTES = os.getenv('OTEL_RESOURCE_ATTRIBUTES', '') # e.g. key1=val1,key2=val2 +OTEL_TRACES_SAMPLER = os.getenv('OTEL_TRACES_SAMPLER', 'parentbased_always_on').lower() +OTEL_BASIC_AUTH_USERNAME = os.getenv('OTEL_BASIC_AUTH_USERNAME', '') +OTEL_BASIC_AUTH_PASSWORD = os.getenv('OTEL_BASIC_AUTH_PASSWORD', '') +OTEL_METRICS_EXPORT_INTERVAL_MILLIS = int(os.getenv('OTEL_METRICS_EXPORT_INTERVAL_MILLIS', '10000')) -OTEL_METRICS_BASIC_AUTH_USERNAME = os.environ.get('OTEL_METRICS_BASIC_AUTH_USERNAME', OTEL_BASIC_AUTH_USERNAME) -OTEL_METRICS_BASIC_AUTH_PASSWORD = os.environ.get('OTEL_METRICS_BASIC_AUTH_PASSWORD', OTEL_BASIC_AUTH_PASSWORD) -OTEL_LOGS_BASIC_AUTH_USERNAME = os.environ.get('OTEL_LOGS_BASIC_AUTH_USERNAME', OTEL_BASIC_AUTH_USERNAME) -OTEL_LOGS_BASIC_AUTH_PASSWORD = os.environ.get('OTEL_LOGS_BASIC_AUTH_PASSWORD', OTEL_BASIC_AUTH_PASSWORD) +OTEL_METRICS_BASIC_AUTH_USERNAME = os.getenv('OTEL_METRICS_BASIC_AUTH_USERNAME', OTEL_BASIC_AUTH_USERNAME) +OTEL_METRICS_BASIC_AUTH_PASSWORD = os.getenv('OTEL_METRICS_BASIC_AUTH_PASSWORD', OTEL_BASIC_AUTH_PASSWORD) +OTEL_LOGS_BASIC_AUTH_USERNAME = os.getenv('OTEL_LOGS_BASIC_AUTH_USERNAME', OTEL_BASIC_AUTH_USERNAME) +OTEL_LOGS_BASIC_AUTH_PASSWORD = os.getenv('OTEL_LOGS_BASIC_AUTH_PASSWORD', OTEL_BASIC_AUTH_PASSWORD) -OTEL_OTLP_SPAN_EXPORTER = os.environ.get('OTEL_OTLP_SPAN_EXPORTER', 'grpc').lower() # grpc or http +OTEL_OTLP_SPAN_EXPORTER = os.getenv('OTEL_OTLP_SPAN_EXPORTER', 'grpc').lower() # grpc or http -OTEL_METRICS_OTLP_SPAN_EXPORTER = os.environ.get( +OTEL_METRICS_OTLP_SPAN_EXPORTER = os.getenv( 'OTEL_METRICS_OTLP_SPAN_EXPORTER', OTEL_OTLP_SPAN_EXPORTER ).lower() # grpc or http -OTEL_LOGS_OTLP_SPAN_EXPORTER = os.environ.get( +OTEL_LOGS_OTLP_SPAN_EXPORTER = os.getenv( 'OTEL_LOGS_OTLP_SPAN_EXPORTER', OTEL_OTLP_SPAN_EXPORTER ).lower() # grpc or http - -#################################### -# TOOLS/FUNCTIONS PIP OPTIONS -#################################### - -ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS = ( - os.environ.get('ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS', 'True').lower() == 'true' -) - -PIP_OPTIONS = os.getenv('PIP_OPTIONS', '').split() -PIP_PACKAGE_INDEX_OPTIONS = os.getenv('PIP_PACKAGE_INDEX_OPTIONS', '').split() - - -#################################### -# PROGRESSIVE WEB APP OPTIONS -#################################### - -EXTERNAL_PWA_MANIFEST_URL = os.environ.get('EXTERNAL_PWA_MANIFEST_URL') - -#################################### -# GROUP DEFAULTS -#################################### - -# Controls the default "Who can share to this group" setting for new groups. -# Env var values: "true" (anyone), "false" (no one), "members" (only group members). -_default_group_share = os.environ.get('DEFAULT_GROUP_SHARE_PERMISSION', 'members').strip().lower() -DEFAULT_GROUP_SHARE_PERMISSION = 'members' if _default_group_share == 'members' else _default_group_share == 'true' diff --git a/backend/open_webui/functions.py b/backend/open_webui/functions.py index 1e032759ea..7c50ca3d2d 100644 --- a/backend/open_webui/functions.py +++ b/backend/open_webui/functions.py @@ -1,11 +1,10 @@ -import logging -import sys +import asyncio import inspect import json -import asyncio - -from pydantic import BaseModel +import logging +import sys from typing import AsyncGenerator, Generator, Iterator + from fastapi import ( Depends, FastAPI, @@ -16,40 +15,35 @@ from fastapi import ( UploadFile, status, ) +from pydantic import BaseModel from starlette.responses import Response, StreamingResponse - +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL from open_webui.constants import ERROR_MESSAGES +from open_webui.env import BYPASS_MODEL_ACCESS_CONTROL, GLOBAL_LOG_LEVEL +from open_webui.models.functions import Functions +from open_webui.models.models import Models +from open_webui.models.users import UserModel from open_webui.socket.main import ( get_event_call, get_event_emitter, ) - - -from open_webui.models.users import UserModel -from open_webui.models.functions import Functions -from open_webui.models.models import Models - -from open_webui.utils.plugin import ( - load_function_module_by_id, - get_function_module_from_cache, -) from open_webui.utils.access_control import check_model_access - -from open_webui.env import GLOBAL_LOG_LEVEL, BYPASS_MODEL_ACCESS_CONTROL -from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL - from open_webui.utils.misc import ( add_or_update_system_message, get_last_user_message, - prepend_to_first_user_message_content, openai_chat_chunk_message_template, openai_chat_completion_message_template, + prepend_to_first_user_message_content, ) from open_webui.utils.payload import ( apply_model_params_to_body_openai, apply_system_prompt_to_body, ) +from open_webui.utils.plugin import ( + get_function_module_from_cache, + load_function_module_by_id, +) logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) @@ -284,7 +278,7 @@ async def generate_function_chat_completion(request, form_data, user, models: di if params: system = params.pop('system', None) form_data = apply_model_params_to_body_openai(params, form_data) - form_data = apply_system_prompt_to_body(system, form_data, metadata, user) + form_data = await apply_system_prompt_to_body(system, form_data, metadata, user) pipe_id = get_pipe_id(form_data) function_module = await get_function_module_by_id(request, pipe_id) diff --git a/backend/open_webui/internal/config.py b/backend/open_webui/internal/config.py new file mode 100644 index 0000000000..294144ae76 --- /dev/null +++ b/backend/open_webui/internal/config.py @@ -0,0 +1,258 @@ +"""Database-backed configuration with environment variable defaults.""" + +from __future__ import annotations + +import asyncio +import json +import logging +from datetime import datetime +from functools import reduce +from typing import Any, Optional, Union + +import redis +from open_webui.internal.db import Base, get_async_db, get_db +from open_webui.utils.redis import get_redis_connection +from sqlalchemy import JSON, Column, DateTime, Integer, func, select + +log = logging.getLogger(__name__) + + +# ── Model ──────────────────────────────────────────────────────────────────── + + +class ConfigTable(Base): + __tablename__ = 'config' + + id = Column(Integer, primary_key=True) + data = Column(JSON, nullable=False) + version = Column(Integer, nullable=False, default=0) + created_at = Column(DateTime, nullable=False, server_default=func.now()) + updated_at = Column(DateTime, nullable=True, onupdate=func.now()) + + +# ── Blob ───────────────────────────────────────────────────────────────────── + + +class ConfigState: + """In-memory mirror of the single-row config JSON blob.""" + + __slots__ = ('_data',) + + def __init__(self) -> None: + self._data: dict[str, Any] = {} + + @property + def snapshot(self) -> dict: + return self._data + + def read(self, path: str) -> Any: + return reduce( + lambda n, k: n.get(k) if isinstance(n, dict) else None, + path.split('.'), + self._data, + ) + + def write(self, path: str, value: Any) -> None: + keys = path.split('.') + reduce(lambda d, k: d.setdefault(k, {}), keys[:-1], self._data)[keys[-1]] = value + + def replace(self, data: dict) -> None: + self._data = data + + def load(self) -> dict: + with get_db() as db: + row = db.query(ConfigTable).order_by(ConfigTable.id.desc()).first() + self._data = row.data if row else {'version': 0, 'ui': {}} + return self._data + + def persist(self, data: dict | None = None) -> None: + if data is not None: + self._data = data + with get_db() as db: + row = db.query(ConfigTable).first() + if row is None: + db.add(ConfigTable(data=self._data, version=0)) + else: + row.data, row.updated_at = self._data, datetime.now() + db.add(row) + db.commit() + + async def persist_async(self, data: dict | None = None) -> None: + if data is not None: + self._data = data + async with get_async_db() as db: + result = await db.execute(select(ConfigTable).limit(1)) + row = result.scalars().first() + if row is None: + db.add(ConfigTable(data=self._data, version=0)) + else: + row.data, row.updated_at = self._data, datetime.now() + db.add(row) + await db.commit() + + def clear(self) -> None: + with get_db() as db: + db.query(ConfigTable).delete() + db.commit() + + async def clear_async(self) -> None: + from sqlalchemy import delete as sa_delete + + async with get_async_db() as db: + await db.execute(sa_delete(ConfigTable)) + await db.commit() + + +STATE = ConfigState() + + +# ── ConfigVar ────────────────────────────────────────────────────────────────── + + +_persist_enabled: bool = True +_oauth_persist_enabled: bool = False +_all_configs: list[ConfigVar] = [] + + +def initialize(*, enable_persistent: bool = True, enable_oauth_persistent: bool = False) -> dict: + global _persist_enabled, _oauth_persist_enabled + _persist_enabled = enable_persistent + _oauth_persist_enabled = enable_oauth_persistent + return STATE.load() + + +class ConfigVar: + __slots__ = ('env_name', 'config_path', 'env_value', 'config_value', 'value') + + def __init__(self, env_name: str, config_path: str, env_value: Any) -> None: + self.env_name = env_name + self.config_path = config_path + self.env_value = env_value + self.config_value = STATE.read(config_path) + + if self.config_value is not None and _persist_enabled: + if config_path.startswith('oauth.') and not _oauth_persist_enabled: + log.info("Skipping DB value for '%s' (OAuth persistence disabled)", env_name) + self.value = env_value + else: + log.info("'%s' loaded from database", env_name) + self.value = self.config_value + else: + self.value = env_value + + _all_configs.append(self) + + def __str__(self) -> str: + return str(self.value) + + def __repr__(self) -> str: + return f'' + + @property + def __dict__(self): # type: ignore[override] + raise TypeError(f"ConfigVar('{self.env_name}') cannot be cast to dict; use .value") + + def __getattribute__(self, item: str): + if item == '__dict__': + raise TypeError('ConfigVar cannot be cast to dict; use .value') + return super().__getattribute__(item) + + def refresh(self) -> None: + current = STATE.read(self.config_path) + if current is not None: + self.value = current + log.info('Refreshed %s → %s', self.env_name, self.value) + + def commit(self) -> None: + log.info("Persisting '%s'", self.env_name) + STATE.write(self.config_path, self.value) + self.config_value = self.value + STATE.persist() + + async def commit_async(self) -> None: + log.info("Persisting '%s'", self.env_name) + STATE.write(self.config_path, self.value) + self.config_value = self.value + await STATE.persist_async() + + +# ── AppConfig ────────────────────────────────────────────────────────── + + +class AppConfig: + """Attribute-style container for ConfigVars with optional Redis sync.""" + + def __init__( + self, + *, + redis_url: Optional[str] = None, + redis_sentinels: Optional[list] = None, + redis_cluster: bool = False, + redis_key_prefix: str = 'open-webui', + ) -> None: + super().__setattr__('_entries', {}) + super().__setattr__('_key_prefix', redis_key_prefix) + + rc: Union[redis.Redis, redis.cluster.RedisCluster, None] = None + if redis_url: + rc = get_redis_connection(redis_url, redis_sentinels or [], redis_cluster, decode_responses=True) + super().__setattr__('_rc', rc) + + def __setattr__(self, name: str, value: Any) -> None: + entries: dict = super().__getattribute__('_entries') + + if isinstance(value, ConfigVar): + entries[name] = value + return + + entries[name].value = value + + try: + asyncio.get_running_loop().create_task(self._write_async(name)) + except RuntimeError: + entries[name].commit() + + rc = super().__getattribute__('_rc') + if rc and _persist_enabled: + prefix = super().__getattribute__('_key_prefix') + try: + rc.set(f'{prefix}:config:{name}', json.dumps(entries[name].value)) + except Exception as exc: + log.error("Redis write failed for '%s': %s", name, exc) + + async def _write_async(self, name: str) -> None: + try: + await self._entries[name].commit_async() + except Exception as exc: + log.error("Async persist failed for '%s': %s", name, exc) + + def __getattr__(self, name: str) -> Any: + entries = super().__getattribute__('_entries') + if name not in entries: + raise AttributeError(f"No config key '{name}'") + + rc = super().__getattribute__('_rc') + if rc and _persist_enabled: + prefix = super().__getattribute__('_key_prefix') + try: + raw = rc.get(f'{prefix}:config:{name}') + if raw is not None: + decoded = json.loads(raw) + if entries[name].value != decoded: + entries[name].value = decoded + log.info("Updated '%s' from Redis", name) + except Exception as exc: + log.error("Redis read failed for '%s': %s", name, exc) + + return entries[name].value + + def _sync_to_redis(self) -> None: + rc = super().__getattribute__('_rc') + if not rc or not _persist_enabled: + return + prefix = super().__getattribute__('_key_prefix') + for name, s in super().__getattribute__('_entries').items(): + try: + rc.set(f'{prefix}:config:{name}', json.dumps(s.value)) + except Exception as exc: + log.error("Redis sync failed for '%s': %s", name, exc) diff --git a/backend/open_webui/internal/db.py b/backend/open_webui/internal/db.py index c9e4f318e1..69050160a8 100644 --- a/backend/open_webui/internal/db.py +++ b/backend/open_webui/internal/db.py @@ -1,35 +1,36 @@ -import os +from __future__ import annotations + import json import logging +import os +import sys from contextlib import asynccontextmanager, contextmanager from typing import Any, Optional from urllib.parse import parse_qs, urlencode, urlparse, urlunparse -from open_webui.internal.wrappers import register_connection from open_webui.env import ( - OPEN_WEBUI_DIR, - DATABASE_URL, - DATABASE_SCHEMA, + DATABASE_ENABLE_SESSION_SHARING, + DATABASE_ENABLE_SQLITE_WAL, DATABASE_POOL_MAX_OVERFLOW, DATABASE_POOL_RECYCLE, DATABASE_POOL_SIZE, DATABASE_POOL_TIMEOUT, - DATABASE_ENABLE_SQLITE_WAL, - DATABASE_ENABLE_SESSION_SHARING, - DATABASE_SQLITE_PRAGMA_SYNCHRONOUS, + DATABASE_SCHEMA, DATABASE_SQLITE_PRAGMA_BUSY_TIMEOUT, DATABASE_SQLITE_PRAGMA_CACHE_SIZE, - DATABASE_SQLITE_PRAGMA_TEMP_STORE, - DATABASE_SQLITE_PRAGMA_MMAP_SIZE, DATABASE_SQLITE_PRAGMA_JOURNAL_SIZE_LIMIT, + DATABASE_SQLITE_PRAGMA_MMAP_SIZE, + DATABASE_SQLITE_PRAGMA_SYNCHRONOUS, + DATABASE_SQLITE_PRAGMA_TEMP_STORE, + DATABASE_URL, ENABLE_DB_MIGRATIONS, + OPEN_WEBUI_DIR, ) -from peewee_migrate import Router -from sqlalchemy import Dialect, create_engine, MetaData, event, types -from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker +from sqlalchemy import Dialect, MetaData, create_engine, event, types +from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import scoped_session, sessionmaker, Session -from sqlalchemy.pool import QueuePool, NullPool +from sqlalchemy.orm import Session, scoped_session, sessionmaker +from sqlalchemy.pool import NullPool, QueuePool from sqlalchemy.sql.type_api import _T from typing_extensions import Self @@ -120,10 +121,10 @@ class JSONField(types.TypeDecorator): impl = types.Text cache_ok = True - def process_bind_param(self, value: Optional[_T], dialect: Dialect) -> Any: + def process_bind_param(self, value: _T | None, dialect: Dialect) -> Any: return json.dumps(value) - def process_result_value(self, value: Optional[_T], dialect: Dialect) -> Any: + def process_result_value(self, value: _T | None, dialect: Dialect) -> Any: if value is not None: return json.loads(value) @@ -138,41 +139,6 @@ class JSONField(types.TypeDecorator): return json.loads(value) -# Workaround to handle the peewee migration -# This is required to ensure the peewee migration is handled before the alembic migration -def handle_peewee_migration(DATABASE_URL): - db = None - try: - # Normalize SSL params so psycopg2 always sees `sslmode=` (never `ssl=`) - # and cert-file params are preserved in the connection string. - url_without_ssl, ssl_params = extract_ssl_params_from_url(DATABASE_URL) - normalized_url = reattach_ssl_params_to_url(url_without_ssl, ssl_params) - - # Replace the postgresql:// with postgres:// to handle the peewee migration - db = register_connection(normalized_url.replace('postgresql://', 'postgres://')) - migrate_dir = OPEN_WEBUI_DIR / 'internal' / 'migrations' - router = Router(db, logger=log, migrate_dir=migrate_dir) - router.run() - db.close() - - except Exception as e: - log.error(f'Failed to initialize the database connection: {e}') - log.warning('Hint: If your database password contains special characters, you may need to URL-encode it.') - raise - finally: - # Properly closing the database connection - if db and not db.is_closed(): - db.close() - - # Assert if db connection has been closed - if db is not None: - assert db.is_closed(), 'Database connection is still open.' - - -if ENABLE_DB_MIGRATIONS: - handle_peewee_migration(DATABASE_URL) - - # Normalize SSL params from the URL once; the sync engine needs them # reattached in canonical libpq form for psycopg2. _url_without_ssl, _ssl_dict = extract_ssl_params_from_url(DATABASE_URL) @@ -332,6 +298,15 @@ get_db = contextmanager(get_session) # all work without any stripping or translation. ASYNC_SQLALCHEMY_DATABASE_URL = _make_async_url(SQLALCHEMY_DATABASE_URL) +# psycopg v3 cannot run in async mode under Windows' default +# ProactorEventLoop — switch to SelectorEventLoop before creating +# the async engine. This runs at import time, which is early enough +# to cover every entry point (workers, reload, direct invocations). +if sys.platform == 'win32' and _is_postgres_url(DATABASE_URL): + import asyncio + + asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) + if 'sqlite' in ASYNC_SQLALCHEMY_DATABASE_URL: # Generous default — async coroutines + no session sharing = high connection demand. _sqlite_pool_size = DATABASE_POOL_SIZE if isinstance(DATABASE_POOL_SIZE, int) and DATABASE_POOL_SIZE > 0 else 512 @@ -400,7 +375,7 @@ async def get_async_db(): @asynccontextmanager -async def get_async_db_context(db: Optional[AsyncSession] = None): +async def get_async_db_context(db: AsyncSession | None = None): """Async context manager that reuses an existing session if provided and session sharing is enabled.""" if isinstance(db, AsyncSession) and DATABASE_ENABLE_SESSION_SHARING: yield db diff --git a/backend/open_webui/internal/migrations/001_initial_schema.py b/backend/open_webui/internal/migrations/001_initial_schema.py deleted file mode 100644 index 4268201ae7..0000000000 --- a/backend/open_webui/internal/migrations/001_initial_schema.py +++ /dev/null @@ -1,253 +0,0 @@ -"""Peewee migrations -- 001_initial_schema.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - # We perform different migrations for SQLite and other databases - # This is because SQLite is very loose with enforcing its schema, and trying to migrate other databases like SQLite - # will require per-database SQL queries. - # Instead, we assume that because external DB support was added at a later date, it is safe to assume a newer base - # schema instead of trying to migrate from an older schema. - if isinstance(database, pw.SqliteDatabase): - migrate_sqlite(migrator, database, fake=fake) - else: - migrate_external(migrator, database, fake=fake) - - -def migrate_sqlite(migrator: Migrator, database: pw.Database, *, fake=False): - @migrator.create_model - class Auth(pw.Model): - id = pw.CharField(max_length=255, unique=True) - email = pw.CharField(max_length=255) - password = pw.CharField(max_length=255) - active = pw.BooleanField() - - class Meta: - table_name = 'auth' - - @migrator.create_model - class Chat(pw.Model): - id = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - title = pw.CharField() - chat = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'chat' - - @migrator.create_model - class ChatIdTag(pw.Model): - id = pw.CharField(max_length=255, unique=True) - tag_name = pw.CharField(max_length=255) - chat_id = pw.CharField(max_length=255) - user_id = pw.CharField(max_length=255) - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'chatidtag' - - @migrator.create_model - class Document(pw.Model): - id = pw.AutoField() - collection_name = pw.CharField(max_length=255, unique=True) - name = pw.CharField(max_length=255, unique=True) - title = pw.CharField() - filename = pw.CharField() - content = pw.TextField(null=True) - user_id = pw.CharField(max_length=255) - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'document' - - @migrator.create_model - class Modelfile(pw.Model): - id = pw.AutoField() - tag_name = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - modelfile = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'modelfile' - - @migrator.create_model - class Prompt(pw.Model): - id = pw.AutoField() - command = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - title = pw.CharField() - content = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'prompt' - - @migrator.create_model - class Tag(pw.Model): - id = pw.CharField(max_length=255, unique=True) - name = pw.CharField(max_length=255) - user_id = pw.CharField(max_length=255) - data = pw.TextField(null=True) - - class Meta: - table_name = 'tag' - - @migrator.create_model - class User(pw.Model): - id = pw.CharField(max_length=255, unique=True) - name = pw.CharField(max_length=255) - email = pw.CharField(max_length=255) - role = pw.CharField(max_length=255) - profile_image_url = pw.CharField(max_length=255) - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'user' - - -def migrate_external(migrator: Migrator, database: pw.Database, *, fake=False): - @migrator.create_model - class Auth(pw.Model): - id = pw.CharField(max_length=255, unique=True) - email = pw.CharField(max_length=255) - password = pw.TextField() - active = pw.BooleanField() - - class Meta: - table_name = 'auth' - - @migrator.create_model - class Chat(pw.Model): - id = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - title = pw.TextField() - chat = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'chat' - - @migrator.create_model - class ChatIdTag(pw.Model): - id = pw.CharField(max_length=255, unique=True) - tag_name = pw.CharField(max_length=255) - chat_id = pw.CharField(max_length=255) - user_id = pw.CharField(max_length=255) - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'chatidtag' - - @migrator.create_model - class Document(pw.Model): - id = pw.AutoField() - collection_name = pw.CharField(max_length=255, unique=True) - name = pw.CharField(max_length=255, unique=True) - title = pw.TextField() - filename = pw.TextField() - content = pw.TextField(null=True) - user_id = pw.CharField(max_length=255) - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'document' - - @migrator.create_model - class Modelfile(pw.Model): - id = pw.AutoField() - tag_name = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - modelfile = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'modelfile' - - @migrator.create_model - class Prompt(pw.Model): - id = pw.AutoField() - command = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - title = pw.TextField() - content = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'prompt' - - @migrator.create_model - class Tag(pw.Model): - id = pw.CharField(max_length=255, unique=True) - name = pw.CharField(max_length=255) - user_id = pw.CharField(max_length=255) - data = pw.TextField(null=True) - - class Meta: - table_name = 'tag' - - @migrator.create_model - class User(pw.Model): - id = pw.CharField(max_length=255, unique=True) - name = pw.CharField(max_length=255) - email = pw.CharField(max_length=255) - role = pw.CharField(max_length=255) - profile_image_url = pw.TextField() - timestamp = pw.BigIntegerField() - - class Meta: - table_name = 'user' - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_model('user') - - migrator.remove_model('tag') - - migrator.remove_model('prompt') - - migrator.remove_model('modelfile') - - migrator.remove_model('document') - - migrator.remove_model('chatidtag') - - migrator.remove_model('chat') - - migrator.remove_model('auth') diff --git a/backend/open_webui/internal/migrations/002_add_local_sharing.py b/backend/open_webui/internal/migrations/002_add_local_sharing.py deleted file mode 100644 index e3e557602b..0000000000 --- a/backend/open_webui/internal/migrations/002_add_local_sharing.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - migrator.add_fields('chat', share_id=pw.CharField(max_length=255, null=True, unique=True)) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_fields('chat', 'share_id') diff --git a/backend/open_webui/internal/migrations/003_add_auth_api_key.py b/backend/open_webui/internal/migrations/003_add_auth_api_key.py deleted file mode 100644 index acb63fc728..0000000000 --- a/backend/open_webui/internal/migrations/003_add_auth_api_key.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - migrator.add_fields('user', api_key=pw.CharField(max_length=255, null=True, unique=True)) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_fields('user', 'api_key') diff --git a/backend/open_webui/internal/migrations/004_add_archived.py b/backend/open_webui/internal/migrations/004_add_archived.py deleted file mode 100644 index abed1727b9..0000000000 --- a/backend/open_webui/internal/migrations/004_add_archived.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - migrator.add_fields('chat', archived=pw.BooleanField(default=False)) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_fields('chat', 'archived') diff --git a/backend/open_webui/internal/migrations/005_add_updated_at.py b/backend/open_webui/internal/migrations/005_add_updated_at.py deleted file mode 100644 index bff311e2d4..0000000000 --- a/backend/open_webui/internal/migrations/005_add_updated_at.py +++ /dev/null @@ -1,125 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - if isinstance(database, pw.SqliteDatabase): - migrate_sqlite(migrator, database, fake=fake) - else: - migrate_external(migrator, database, fake=fake) - - -def migrate_sqlite(migrator: Migrator, database: pw.Database, *, fake=False): - # Adding fields created_at and updated_at to the 'chat' table - migrator.add_fields( - 'chat', - created_at=pw.DateTimeField(null=True), # Allow null for transition - updated_at=pw.DateTimeField(null=True), # Allow null for transition - ) - - # Populate the new fields from an existing 'timestamp' field - migrator.sql('UPDATE chat SET created_at = timestamp, updated_at = timestamp WHERE timestamp IS NOT NULL') - - # Now that the data has been copied, remove the original 'timestamp' field - migrator.remove_fields('chat', 'timestamp') - - # Update the fields to be not null now that they are populated - migrator.change_fields( - 'chat', - created_at=pw.DateTimeField(null=False), - updated_at=pw.DateTimeField(null=False), - ) - - -def migrate_external(migrator: Migrator, database: pw.Database, *, fake=False): - # Adding fields created_at and updated_at to the 'chat' table - migrator.add_fields( - 'chat', - created_at=pw.BigIntegerField(null=True), # Allow null for transition - updated_at=pw.BigIntegerField(null=True), # Allow null for transition - ) - - # Populate the new fields from an existing 'timestamp' field - migrator.sql('UPDATE chat SET created_at = timestamp, updated_at = timestamp WHERE timestamp IS NOT NULL') - - # Now that the data has been copied, remove the original 'timestamp' field - migrator.remove_fields('chat', 'timestamp') - - # Update the fields to be not null now that they are populated - migrator.change_fields( - 'chat', - created_at=pw.BigIntegerField(null=False), - updated_at=pw.BigIntegerField(null=False), - ) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - if isinstance(database, pw.SqliteDatabase): - rollback_sqlite(migrator, database, fake=fake) - else: - rollback_external(migrator, database, fake=fake) - - -def rollback_sqlite(migrator: Migrator, database: pw.Database, *, fake=False): - # Recreate the timestamp field initially allowing null values for safe transition - migrator.add_fields('chat', timestamp=pw.DateTimeField(null=True)) - - # Copy the earliest created_at date back into the new timestamp field - # This assumes created_at was originally a copy of timestamp - migrator.sql('UPDATE chat SET timestamp = created_at') - - # Remove the created_at and updated_at fields - migrator.remove_fields('chat', 'created_at', 'updated_at') - - # Finally, alter the timestamp field to not allow nulls if that was the original setting - migrator.change_fields('chat', timestamp=pw.DateTimeField(null=False)) - - -def rollback_external(migrator: Migrator, database: pw.Database, *, fake=False): - # Recreate the timestamp field initially allowing null values for safe transition - migrator.add_fields('chat', timestamp=pw.BigIntegerField(null=True)) - - # Copy the earliest created_at date back into the new timestamp field - # This assumes created_at was originally a copy of timestamp - migrator.sql('UPDATE chat SET timestamp = created_at') - - # Remove the created_at and updated_at fields - migrator.remove_fields('chat', 'created_at', 'updated_at') - - # Finally, alter the timestamp field to not allow nulls if that was the original setting - migrator.change_fields('chat', timestamp=pw.BigIntegerField(null=False)) diff --git a/backend/open_webui/internal/migrations/006_migrate_timestamps_and_charfields.py b/backend/open_webui/internal/migrations/006_migrate_timestamps_and_charfields.py deleted file mode 100644 index 86f90eb880..0000000000 --- a/backend/open_webui/internal/migrations/006_migrate_timestamps_and_charfields.py +++ /dev/null @@ -1,129 +0,0 @@ -"""Peewee migrations -- 006_migrate_timestamps_and_charfields.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - # Alter the tables with timestamps - migrator.change_fields( - 'chatidtag', - timestamp=pw.BigIntegerField(), - ) - migrator.change_fields( - 'document', - timestamp=pw.BigIntegerField(), - ) - migrator.change_fields( - 'modelfile', - timestamp=pw.BigIntegerField(), - ) - migrator.change_fields( - 'prompt', - timestamp=pw.BigIntegerField(), - ) - migrator.change_fields( - 'user', - timestamp=pw.BigIntegerField(), - ) - # Alter the tables with varchar to text where necessary - migrator.change_fields( - 'auth', - password=pw.TextField(), - ) - migrator.change_fields( - 'chat', - title=pw.TextField(), - ) - migrator.change_fields( - 'document', - title=pw.TextField(), - filename=pw.TextField(), - ) - migrator.change_fields( - 'prompt', - title=pw.TextField(), - ) - migrator.change_fields( - 'user', - profile_image_url=pw.TextField(), - ) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - if isinstance(database, pw.SqliteDatabase): - # Alter the tables with timestamps - migrator.change_fields( - 'chatidtag', - timestamp=pw.DateField(), - ) - migrator.change_fields( - 'document', - timestamp=pw.DateField(), - ) - migrator.change_fields( - 'modelfile', - timestamp=pw.DateField(), - ) - migrator.change_fields( - 'prompt', - timestamp=pw.DateField(), - ) - migrator.change_fields( - 'user', - timestamp=pw.DateField(), - ) - migrator.change_fields( - 'auth', - password=pw.CharField(max_length=255), - ) - migrator.change_fields( - 'chat', - title=pw.CharField(), - ) - migrator.change_fields( - 'document', - title=pw.CharField(), - filename=pw.CharField(), - ) - migrator.change_fields( - 'prompt', - title=pw.CharField(), - ) - migrator.change_fields( - 'user', - profile_image_url=pw.CharField(), - ) diff --git a/backend/open_webui/internal/migrations/007_add_user_last_active_at.py b/backend/open_webui/internal/migrations/007_add_user_last_active_at.py deleted file mode 100644 index 19a26c3515..0000000000 --- a/backend/open_webui/internal/migrations/007_add_user_last_active_at.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - # Adding fields created_at and updated_at to the 'user' table - migrator.add_fields( - 'user', - created_at=pw.BigIntegerField(null=True), # Allow null for transition - updated_at=pw.BigIntegerField(null=True), # Allow null for transition - last_active_at=pw.BigIntegerField(null=True), # Allow null for transition - ) - - # Populate the new fields from an existing 'timestamp' field - migrator.sql( - 'UPDATE "user" SET created_at = timestamp, updated_at = timestamp, last_active_at = timestamp WHERE timestamp IS NOT NULL' - ) - - # Now that the data has been copied, remove the original 'timestamp' field - migrator.remove_fields('user', 'timestamp') - - # Update the fields to be not null now that they are populated - migrator.change_fields( - 'user', - created_at=pw.BigIntegerField(null=False), - updated_at=pw.BigIntegerField(null=False), - last_active_at=pw.BigIntegerField(null=False), - ) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - # Recreate the timestamp field initially allowing null values for safe transition - migrator.add_fields('user', timestamp=pw.BigIntegerField(null=True)) - - # Copy the earliest created_at date back into the new timestamp field - # This assumes created_at was originally a copy of timestamp - migrator.sql('UPDATE "user" SET timestamp = created_at') - - # Remove the created_at and updated_at fields - migrator.remove_fields('user', 'created_at', 'updated_at', 'last_active_at') - - # Finally, alter the timestamp field to not allow nulls if that was the original setting - migrator.change_fields('user', timestamp=pw.BigIntegerField(null=False)) diff --git a/backend/open_webui/internal/migrations/008_add_memory.py b/backend/open_webui/internal/migrations/008_add_memory.py deleted file mode 100644 index f3af64fe95..0000000000 --- a/backend/open_webui/internal/migrations/008_add_memory.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - @migrator.create_model - class Memory(pw.Model): - id = pw.CharField(max_length=255, unique=True) - user_id = pw.CharField(max_length=255) - content = pw.TextField(null=False) - updated_at = pw.BigIntegerField(null=False) - created_at = pw.BigIntegerField(null=False) - - class Meta: - table_name = 'memory' - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_model('memory') diff --git a/backend/open_webui/internal/migrations/009_add_models.py b/backend/open_webui/internal/migrations/009_add_models.py deleted file mode 100644 index 45f4a3d163..0000000000 --- a/backend/open_webui/internal/migrations/009_add_models.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Peewee migrations -- 009_add_models.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - @migrator.create_model - class Model(pw.Model): - id = pw.TextField(unique=True) - user_id = pw.TextField() - base_model_id = pw.TextField(null=True) - - name = pw.TextField() - - meta = pw.TextField() - params = pw.TextField() - - created_at = pw.BigIntegerField(null=False) - updated_at = pw.BigIntegerField(null=False) - - class Meta: - table_name = 'model' - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_model('model') diff --git a/backend/open_webui/internal/migrations/010_migrate_modelfiles_to_models.py b/backend/open_webui/internal/migrations/010_migrate_modelfiles_to_models.py deleted file mode 100644 index e523d6a098..0000000000 --- a/backend/open_webui/internal/migrations/010_migrate_modelfiles_to_models.py +++ /dev/null @@ -1,130 +0,0 @@ -"""Peewee migrations -- 009_add_models.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator -import json - -from open_webui.utils.misc import parse_ollama_modelfile - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - # Fetch data from 'modelfile' table and insert into 'model' table - migrate_modelfile_to_model(migrator, database) - # Drop the 'modelfile' table - migrator.remove_model('modelfile') - - -def migrate_modelfile_to_model(migrator: Migrator, database: pw.Database): - ModelFile = migrator.orm['modelfile'] - Model = migrator.orm['model'] - - modelfiles = ModelFile.select() - - for modelfile in modelfiles: - # Extract and transform data in Python - - modelfile.modelfile = json.loads(modelfile.modelfile) - meta = json.dumps( - { - 'description': modelfile.modelfile.get('desc'), - 'profile_image_url': modelfile.modelfile.get('imageUrl'), - 'ollama': {'modelfile': modelfile.modelfile.get('content')}, - 'suggestion_prompts': modelfile.modelfile.get('suggestionPrompts'), - 'categories': modelfile.modelfile.get('categories'), - 'user': {**modelfile.modelfile.get('user', {}), 'community': True}, - } - ) - - info = parse_ollama_modelfile(modelfile.modelfile.get('content')) - - # Insert the processed data into the 'model' table - Model.create( - id=f'ollama-{modelfile.tag_name}', - user_id=modelfile.user_id, - base_model_id=info.get('base_model_id'), - name=modelfile.modelfile.get('title'), - meta=meta, - params=json.dumps(info.get('params', {})), - created_at=modelfile.timestamp, - updated_at=modelfile.timestamp, - ) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - recreate_modelfile_table(migrator, database) - move_data_back_to_modelfile(migrator, database) - migrator.remove_model('model') - - -def recreate_modelfile_table(migrator: Migrator, database: pw.Database): - query = """ - CREATE TABLE IF NOT EXISTS modelfile ( - user_id TEXT, - tag_name TEXT, - modelfile JSON, - timestamp BIGINT - ) - """ - migrator.sql(query) - - -def move_data_back_to_modelfile(migrator: Migrator, database: pw.Database): - Model = migrator.orm['model'] - Modelfile = migrator.orm['modelfile'] - - models = Model.select() - - for model in models: - # Extract and transform data in Python - meta = json.loads(model.meta) - - modelfile_data = { - 'title': model.name, - 'desc': meta.get('description'), - 'imageUrl': meta.get('profile_image_url'), - 'content': meta.get('ollama', {}).get('modelfile'), - 'suggestionPrompts': meta.get('suggestion_prompts'), - 'categories': meta.get('categories'), - 'user': {k: v for k, v in meta.get('user', {}).items() if k != 'community'}, - } - - # Insert the processed data back into the 'modelfile' table - Modelfile.create( - user_id=model.user_id, - tag_name=model.id, - modelfile=modelfile_data, - timestamp=model.created_at, - ) diff --git a/backend/open_webui/internal/migrations/011_add_user_settings.py b/backend/open_webui/internal/migrations/011_add_user_settings.py deleted file mode 100644 index 73d27392f7..0000000000 --- a/backend/open_webui/internal/migrations/011_add_user_settings.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - # Adding fields settings to the 'user' table - migrator.add_fields('user', settings=pw.TextField(null=True)) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - # Remove the settings field - migrator.remove_fields('user', 'settings') diff --git a/backend/open_webui/internal/migrations/012_add_tools.py b/backend/open_webui/internal/migrations/012_add_tools.py deleted file mode 100644 index a488678c3c..0000000000 --- a/backend/open_webui/internal/migrations/012_add_tools.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Peewee migrations -- 009_add_models.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - @migrator.create_model - class Tool(pw.Model): - id = pw.TextField(unique=True) - user_id = pw.TextField() - - name = pw.TextField() - content = pw.TextField() - specs = pw.TextField() - - meta = pw.TextField() - - created_at = pw.BigIntegerField(null=False) - updated_at = pw.BigIntegerField(null=False) - - class Meta: - table_name = 'tool' - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_model('tool') diff --git a/backend/open_webui/internal/migrations/013_add_user_info.py b/backend/open_webui/internal/migrations/013_add_user_info.py deleted file mode 100644 index db77cfff3a..0000000000 --- a/backend/open_webui/internal/migrations/013_add_user_info.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Peewee migrations -- 002_add_local_sharing.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - # Adding fields info to the 'user' table - migrator.add_fields('user', info=pw.TextField(null=True)) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - # Remove the settings field - migrator.remove_fields('user', 'info') diff --git a/backend/open_webui/internal/migrations/014_add_files.py b/backend/open_webui/internal/migrations/014_add_files.py deleted file mode 100644 index 9c01ac08c3..0000000000 --- a/backend/open_webui/internal/migrations/014_add_files.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Peewee migrations -- 009_add_models.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - @migrator.create_model - class File(pw.Model): - id = pw.TextField(unique=True) - user_id = pw.TextField() - filename = pw.TextField() - meta = pw.TextField() - created_at = pw.BigIntegerField(null=False) - - class Meta: - table_name = 'file' - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_model('file') diff --git a/backend/open_webui/internal/migrations/015_add_functions.py b/backend/open_webui/internal/migrations/015_add_functions.py deleted file mode 100644 index 488e546ab1..0000000000 --- a/backend/open_webui/internal/migrations/015_add_functions.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Peewee migrations -- 009_add_models.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - @migrator.create_model - class Function(pw.Model): - id = pw.TextField(unique=True) - user_id = pw.TextField() - - name = pw.TextField() - type = pw.TextField() - - content = pw.TextField() - meta = pw.TextField() - - created_at = pw.BigIntegerField(null=False) - updated_at = pw.BigIntegerField(null=False) - - class Meta: - table_name = 'function' - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_model('function') diff --git a/backend/open_webui/internal/migrations/016_add_valves_and_is_active.py b/backend/open_webui/internal/migrations/016_add_valves_and_is_active.py deleted file mode 100644 index 57a2dfbd5b..0000000000 --- a/backend/open_webui/internal/migrations/016_add_valves_and_is_active.py +++ /dev/null @@ -1,49 +0,0 @@ -"""Peewee migrations -- 009_add_models.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - migrator.add_fields('tool', valves=pw.TextField(null=True)) - migrator.add_fields('function', valves=pw.TextField(null=True)) - migrator.add_fields('function', is_active=pw.BooleanField(default=False)) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_fields('tool', 'valves') - migrator.remove_fields('function', 'valves') - migrator.remove_fields('function', 'is_active') diff --git a/backend/open_webui/internal/migrations/017_add_user_oauth_sub.py b/backend/open_webui/internal/migrations/017_add_user_oauth_sub.py deleted file mode 100644 index f998c742d1..0000000000 --- a/backend/open_webui/internal/migrations/017_add_user_oauth_sub.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Peewee migrations -- 017_add_user_oauth_sub.py. -Some examples (model - class or model name):: - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - migrator.add_fields( - 'user', - oauth_sub=pw.TextField(null=True, unique=True), - ) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_fields('user', 'oauth_sub') diff --git a/backend/open_webui/internal/migrations/018_add_function_is_global.py b/backend/open_webui/internal/migrations/018_add_function_is_global.py deleted file mode 100644 index 7f7cd4f725..0000000000 --- a/backend/open_webui/internal/migrations/018_add_function_is_global.py +++ /dev/null @@ -1,48 +0,0 @@ -"""Peewee migrations -- 017_add_user_oauth_sub.py. - -Some examples (model - class or model name):: - - > Model = migrator.orm['table_name'] # Return model in current state by name - > Model = migrator.ModelClass # Return model in current state by name - - > migrator.sql(sql) # Run custom SQL - > migrator.run(func, *args, **kwargs) # Run python function with the given args - > migrator.create_model(Model) # Create a model (could be used as decorator) - > migrator.remove_model(model, cascade=True) # Remove a model - > migrator.add_fields(model, **fields) # Add fields to a model - > migrator.change_fields(model, **fields) # Change fields - > migrator.remove_fields(model, *field_names, cascade=True) - > migrator.rename_field(model, old_field_name, new_field_name) - > migrator.rename_table(model, new_table_name) - > migrator.add_index(model, *col_names, unique=False) - > migrator.add_not_null(model, *field_names) - > migrator.add_default(model, field_name, default) - > migrator.add_constraint(model, name, sql) - > migrator.drop_index(model, *col_names) - > migrator.drop_not_null(model, *field_names) - > migrator.drop_constraints(model, *constraints) - -""" - -from contextlib import suppress - -import peewee as pw -from peewee_migrate import Migrator - -with suppress(ImportError): - import playhouse.postgres_ext as pw_pext - - -def migrate(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your migrations here.""" - - migrator.add_fields( - 'function', - is_global=pw.BooleanField(default=False), - ) - - -def rollback(migrator: Migrator, database: pw.Database, *, fake=False): - """Write your rollback migrations here.""" - - migrator.remove_fields('function', 'is_global') diff --git a/backend/open_webui/internal/wrappers.py b/backend/open_webui/internal/wrappers.py deleted file mode 100644 index 3d54d02e3a..0000000000 --- a/backend/open_webui/internal/wrappers.py +++ /dev/null @@ -1,84 +0,0 @@ -import logging -import os -from contextvars import ContextVar - -from peewee import * -from peewee import InterfaceError as PeeWeeInterfaceError -from peewee import PostgresqlDatabase -from playhouse.db_url import connect, parse -from playhouse.shortcuts import ReconnectMixin - -log = logging.getLogger(__name__) - -db_state_default = {'closed': None, 'conn': None, 'ctx': None, 'transactions': None} -db_state = ContextVar('db_state', default=db_state_default.copy()) - - -class PeeweeConnectionState(object): - def __init__(self, **kwargs): - super().__setattr__('_state', db_state) - super().__init__(**kwargs) - - def __setattr__(self, name, value): - self._state.get()[name] = value - - def __getattr__(self, name): - value = self._state.get()[name] - return value - - -class CustomReconnectMixin(ReconnectMixin): - reconnect_errors = ( - # psycopg2 - (OperationalError, 'termin'), - (InterfaceError, 'closed'), - # peewee - (PeeWeeInterfaceError, 'closed'), - ) - - -class ReconnectingPostgresqlDatabase(CustomReconnectMixin, PostgresqlDatabase): - pass - - -def register_connection(db_url): - # Check if using SQLCipher protocol - if db_url.startswith('sqlite+sqlcipher://'): - database_password = os.environ.get('DATABASE_PASSWORD') - if not database_password or database_password.strip() == '': - raise ValueError('DATABASE_PASSWORD is required when using sqlite+sqlcipher:// URLs') - from playhouse.sqlcipher_ext import SqlCipherDatabase - - # Parse the database path from SQLCipher URL - # Convert sqlite+sqlcipher:///path/to/db.sqlite to /path/to/db.sqlite - db_path = db_url.replace('sqlite+sqlcipher://', '') - - # Use Peewee's native SqlCipherDatabase with encryption - db = SqlCipherDatabase(db_path, passphrase=database_password) - db.autoconnect = True - db.reuse_if_open = True - log.info('Connected to encrypted SQLite database using SQLCipher') - - else: - # Standard database connection (existing logic) - db = connect(db_url, unquote_user=True, unquote_password=True) - if isinstance(db, PostgresqlDatabase): - # Enable autoconnect for SQLite databases, managed by Peewee - db.autoconnect = True - db.reuse_if_open = True - log.info('Connected to PostgreSQL database') - - # Get the connection details - connection = parse(db_url, unquote_user=True, unquote_password=True) - - # Use our custom database class that supports reconnection - db = ReconnectingPostgresqlDatabase(**connection) - db.connect(reuse_if_open=True) - elif isinstance(db, SqliteDatabase): - # Enable autoconnect for SQLite databases, managed by Peewee - db.autoconnect = True - db.reuse_if_open = True - log.info('Connected to SQLite database') - else: - raise ValueError('Unsupported database connection') - return db diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index c825cc82ae..55f3001181 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1,31 +1,26 @@ +from __future__ import annotations + import asyncio import inspect import json import logging import mimetypes import os +import random +import re import shutil import sys import time -import random -import re +from contextlib import asynccontextmanager +from typing import Optional +from urllib.parse import parse_qs, urlencode, urlparse from uuid import uuid4 - -from contextlib import asynccontextmanager -from urllib.parse import urlencode, parse_qs, urlparse -from pydantic import BaseModel -from sqlalchemy import text - -from typing import Optional -from aiocache import cached import aiohttp import anyio.to_thread - -from redis import Redis - - +from aiocache import cached from fastapi import ( + BackgroundTasks, Depends, FastAPI, File, @@ -33,238 +28,314 @@ from fastapi import ( HTTPException, Request, UploadFile, - status, applications, - BackgroundTasks, + status, ) -from fastapi.openapi.docs import get_swagger_ui_html - from fastapi.middleware.cors import CORSMiddleware +from fastapi.openapi.docs import get_swagger_ui_html from fastapi.responses import FileResponse, JSONResponse, RedirectResponse from fastapi.staticfiles import StaticFiles - -from starlette_compress import CompressMiddleware - +from pydantic import BaseModel +from redis import Redis +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession +from starlette.datastructures import Headers from starlette.exceptions import HTTPException as StarletteHTTPException from starlette.middleware.sessions import SessionMiddleware from starlette.responses import Response, StreamingResponse -from starlette.datastructures import Headers - +from starlette_compress import CompressMiddleware +from starsessions import ( + SessionAutoloadMiddleware, +) from starsessions import ( SessionMiddleware as StarSessionsMiddleware, - SessionAutoloadMiddleware, ) from starsessions.stores.redis import RedisStore -from open_webui.utils import logger -from open_webui.utils.asgi_middleware import ( - AuthTokenMiddleware, - CommitSessionMiddleware, - RedirectMiddleware, - WebsocketUpgradeGuardMiddleware, -) -from open_webui.utils.audit import AuditLevel, AuditLoggingMiddleware -from open_webui.utils.logger import start_logger -from open_webui.utils.session_pool import get_session -from open_webui.socket.main import ( - MODELS, - app as socket_app, - periodic_usage_pool_cleanup, - periodic_session_pool_cleanup, - get_event_emitter, - get_models_in_use, - get_user_id_from_session_pool, -) -from open_webui.routers import ( - analytics, - audio, - images, - ollama, - openai, - retrieval, - pipelines, - tasks, - auths, - channels, - chats, - notes, - folders, - configs, - groups, - files, - functions, - memories, - models, - knowledge, - prompts, - evaluations, - skills, - tools, - users, - utils, - scim, - terminals, - automations, - calendar, -) - -from open_webui.routers.retrieval import ( - get_embedding_function, - get_reranking_function, - get_ef, - get_rf, -) - - -from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.internal.db import ScopedSession, engine, get_async_session - -from open_webui.models.functions import Functions -from open_webui.models.models import Models -from open_webui.models.users import UserModel, Users -from open_webui.models.chats import Chats, ChatForm - from open_webui.config import ( - # Ollama - ENABLE_OLLAMA_API, - OLLAMA_BASE_URLS, - OLLAMA_API_CONFIGS, - # OpenAI - ENABLE_OPENAI_API, - OPENAI_API_BASE_URLS, - OPENAI_API_KEYS, - OPENAI_API_CONFIGS, - # Direct Connections - ENABLE_DIRECT_CONNECTIONS, - # Model list - ENABLE_BASE_MODELS_CACHE, - # Thread pool size for FastAPI/AnyIO - THREAD_POOL_SIZE, - # Tool Server Configs - TOOL_SERVER_CONNECTIONS, - # Terminal Server - TERMINAL_SERVER_CONNECTIONS, - # Code Execution - ENABLE_CODE_EXECUTION, - CODE_EXECUTION_ENGINE, - CODE_EXECUTION_JUPYTER_URL, - CODE_EXECUTION_JUPYTER_AUTH, - CODE_EXECUTION_JUPYTER_AUTH_TOKEN, - CODE_EXECUTION_JUPYTER_AUTH_PASSWORD, - CODE_EXECUTION_JUPYTER_TIMEOUT, - ENABLE_CODE_INTERPRETER, - CODE_INTERPRETER_ENGINE, - CODE_INTERPRETER_PROMPT_TEMPLATE, - CODE_INTERPRETER_JUPYTER_URL, - CODE_INTERPRETER_JUPYTER_AUTH, - CODE_INTERPRETER_JUPYTER_AUTH_TOKEN, - CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD, - CODE_INTERPRETER_JUPYTER_TIMEOUT, - ENABLE_MEMORIES, + ADMIN_EMAIL, + API_KEYS_ALLOWED_ENDPOINTS, + AUDIO_STT_ALLOWED_EXTENSIONS, + AUDIO_STT_AZURE_API_KEY, + AUDIO_STT_AZURE_BASE_URL, + AUDIO_STT_AZURE_LOCALES, + AUDIO_STT_AZURE_MAX_SPEAKERS, + AUDIO_STT_AZURE_REGION, + # Audio + AUDIO_STT_ENGINE, + AUDIO_STT_MISTRAL_API_BASE_URL, + AUDIO_STT_MISTRAL_API_KEY, + AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS, + AUDIO_STT_MODEL, + AUDIO_STT_OPENAI_API_BASE_URL, + AUDIO_STT_OPENAI_API_KEY, + AUDIO_STT_SUPPORTED_CONTENT_TYPES, + AUDIO_TTS_API_KEY, + AUDIO_TTS_AZURE_SPEECH_BASE_URL, + AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT, + AUDIO_TTS_AZURE_SPEECH_REGION, + AUDIO_TTS_ENGINE, + AUDIO_TTS_MISTRAL_API_BASE_URL, + AUDIO_TTS_MISTRAL_API_KEY, + AUDIO_TTS_MODEL, + AUDIO_TTS_OPENAI_API_BASE_URL, + AUDIO_TTS_OPENAI_API_KEY, + AUDIO_TTS_OPENAI_PARAMS, + AUDIO_TTS_SPLIT_ON, + AUDIO_TTS_VOICE, + AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH, + AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, # Image AUTOMATIC1111_API_AUTH, AUTOMATIC1111_BASE_URL, AUTOMATIC1111_PARAMS, - COMFYUI_BASE_URL, + AUTOMATION_MAX_COUNT, + AUTOMATION_MIN_INTERVAL, + BING_SEARCH_V7_ENDPOINT, + BING_SEARCH_V7_SUBSCRIPTION_KEY, + BOCHA_SEARCH_API_KEY, + BRAVE_SEARCH_API_KEY, + BRAVE_SEARCH_CONTEXT_TOKENS, + BYPASS_ADMIN_ACCESS_CONTROL, + BYPASS_EMBEDDING_AND_RETRIEVAL, + BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + BYPASS_WEB_SEARCH_WEB_LOADER, + CACHE_DIR, + CHUNK_MIN_SIZE_TARGET, + CHUNK_OVERLAP, + CHUNK_SIZE, + CODE_EXECUTION_ENGINE, + CODE_EXECUTION_JUPYTER_AUTH, + CODE_EXECUTION_JUPYTER_AUTH_PASSWORD, + CODE_EXECUTION_JUPYTER_AUTH_TOKEN, + CODE_EXECUTION_JUPYTER_TIMEOUT, + CODE_EXECUTION_JUPYTER_URL, + CODE_INTERPRETER_ENGINE, + CODE_INTERPRETER_JUPYTER_AUTH, + CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD, + CODE_INTERPRETER_JUPYTER_AUTH_TOKEN, + CODE_INTERPRETER_JUPYTER_TIMEOUT, + CODE_INTERPRETER_JUPYTER_URL, + CODE_INTERPRETER_PROMPT_TEMPLATE, COMFYUI_API_KEY, + COMFYUI_BASE_URL, COMFYUI_WORKFLOW, COMFYUI_WORKFLOW_NODES, + CONTENT_EXTRACTION_ENGINE, + CORS_ALLOW_ORIGIN, + DATALAB_MARKER_ADDITIONAL_CONFIG, + DATALAB_MARKER_API_BASE_URL, + DATALAB_MARKER_API_KEY, + DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION, + DATALAB_MARKER_FORCE_OCR, + DATALAB_MARKER_FORMAT_LINES, + DATALAB_MARKER_OUTPUT_FORMAT, + DATALAB_MARKER_PAGINATE, + DATALAB_MARKER_SKIP_CACHE, + DATALAB_MARKER_STRIP_EXISTING_OCR, + DATALAB_MARKER_USE_LLM, + DDGS_BACKEND, + DEEPGRAM_API_KEY, + DEFAULT_ARENA_MODEL, + DEFAULT_GROUP_ID, + DEFAULT_LOCALE, + DEFAULT_MODEL_METADATA, + DEFAULT_MODEL_PARAMS, + DEFAULT_MODELS, + DEFAULT_PINNED_MODELS, + DEFAULT_PROMPT_SUGGESTIONS, + DEFAULT_RAG_TEMPLATE, + DEFAULT_USER_ROLE, + DOCLING_API_KEY, + DOCLING_PARAMS, + DOCLING_SERVER_URL, + DOCUMENT_INTELLIGENCE_ENDPOINT, + DOCUMENT_INTELLIGENCE_KEY, + DOCUMENT_INTELLIGENCE_MODEL, + ENABLE_ADMIN_ANALYTICS, + # Admin + ENABLE_ADMIN_CHAT_ACCESS, + ENABLE_ADMIN_EXPORT, + ENABLE_API_KEYS, + ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS, + ENABLE_ASYNC_EMBEDDING, + ENABLE_AUTOCOMPLETE_GENERATION, + ENABLE_AUTOMATIONS, + # Model list + ENABLE_BASE_MODELS_CACHE, + ENABLE_CALENDAR, + ENABLE_CHANNELS, + # Code Execution + ENABLE_CODE_EXECUTION, + ENABLE_CODE_INTERPRETER, + ENABLE_COMMUNITY_SHARING, + # Direct Connections + ENABLE_DIRECT_CONNECTIONS, + ENABLE_EVALUATION_ARENA_MODELS, + ENABLE_FOLDERS, + ENABLE_FOLLOW_UP_GENERATION, + ENABLE_GOOGLE_DRIVE_INTEGRATION, + ENABLE_IMAGE_EDIT, ENABLE_IMAGE_GENERATION, ENABLE_IMAGE_PROMPT_GENERATION, - IMAGE_GENERATION_ENGINE, - IMAGE_GENERATION_MODEL, - IMAGE_SIZE, - IMAGE_STEPS, - IMAGES_OPENAI_API_BASE_URL, - IMAGES_OPENAI_API_VERSION, - IMAGES_OPENAI_API_KEY, - IMAGES_OPENAI_API_PARAMS, - IMAGES_GEMINI_API_BASE_URL, - IMAGES_GEMINI_API_KEY, - IMAGES_GEMINI_ENDPOINT_METHOD, - ENABLE_IMAGE_EDIT, - IMAGE_EDIT_ENGINE, - IMAGE_EDIT_MODEL, - IMAGE_EDIT_SIZE, - IMAGES_EDIT_OPENAI_API_BASE_URL, - IMAGES_EDIT_OPENAI_API_KEY, - IMAGES_EDIT_OPENAI_API_VERSION, - IMAGES_EDIT_GEMINI_API_BASE_URL, - IMAGES_EDIT_GEMINI_API_KEY, - IMAGES_EDIT_COMFYUI_BASE_URL, - IMAGES_EDIT_COMFYUI_API_KEY, - IMAGES_EDIT_COMFYUI_WORKFLOW, - IMAGES_EDIT_COMFYUI_WORKFLOW_NODES, - # Audio - AUDIO_STT_ENGINE, - AUDIO_STT_MODEL, - AUDIO_STT_SUPPORTED_CONTENT_TYPES, - AUDIO_STT_OPENAI_API_BASE_URL, - AUDIO_STT_OPENAI_API_KEY, - AUDIO_STT_AZURE_API_KEY, - AUDIO_STT_AZURE_REGION, - AUDIO_STT_AZURE_LOCALES, - AUDIO_STT_AZURE_BASE_URL, - AUDIO_STT_AZURE_MAX_SPEAKERS, - AUDIO_STT_MISTRAL_API_KEY, - AUDIO_STT_MISTRAL_API_BASE_URL, - AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS, - AUDIO_TTS_ENGINE, - AUDIO_TTS_MODEL, - AUDIO_TTS_VOICE, - AUDIO_TTS_OPENAI_API_BASE_URL, - AUDIO_TTS_OPENAI_API_KEY, - AUDIO_TTS_OPENAI_PARAMS, - AUDIO_TTS_API_KEY, - AUDIO_TTS_SPLIT_ON, - AUDIO_TTS_AZURE_SPEECH_REGION, - AUDIO_TTS_AZURE_SPEECH_BASE_URL, - AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT, - AUDIO_TTS_MISTRAL_API_KEY, - AUDIO_TTS_MISTRAL_API_BASE_URL, - PLAYWRIGHT_WS_URL, - PLAYWRIGHT_TIMEOUT, + # WebUI (LDAP) + ENABLE_LDAP, + ENABLE_LDAP_GROUP_CREATION, + # LDAP Group Management + ENABLE_LDAP_GROUP_MANAGEMENT, + ENABLE_LOGIN_FORM, + ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER, + ENABLE_MEMORIES, + ENABLE_MESSAGE_RATING, + ENABLE_NOTES, + # WebUI (OAuth) + ENABLE_OAUTH_ROLE_MANAGEMENT, + # Ollama + ENABLE_OLLAMA_API, + ENABLE_ONEDRIVE_BUSINESS, + ENABLE_ONEDRIVE_INTEGRATION, + ENABLE_ONEDRIVE_PERSONAL, + # OpenAI + ENABLE_OPENAI_API, + ENABLE_PASSWORD_CHANGE_FORM, + ENABLE_RAG_HYBRID_SEARCH, + ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS, + ENABLE_RAG_LOCAL_WEB_FETCH, + ENABLE_RETRIEVAL_QUERY_GENERATION, + ENABLE_SEARCH_QUERY_GENERATION, + ENABLE_SIGNUP, + ENABLE_TAGS_GENERATION, + ENABLE_TITLE_GENERATION, + ENABLE_USER_STATUS, + ENABLE_USER_WEBHOOKS, + ENABLE_VOICE_MODE_PROMPT, + ENABLE_WEB_LOADER_SSL_VERIFICATION, + # Retrieval (Web Search) + ENABLE_WEB_SEARCH, + # Misc + ENV, + EVALUATION_ARENA_MODELS, + EXA_API_KEY, + EXTERNAL_DOCUMENT_LOADER_API_KEY, + EXTERNAL_DOCUMENT_LOADER_URL, + EXTERNAL_WEB_LOADER_API_KEY, + EXTERNAL_WEB_LOADER_URL, + EXTERNAL_WEB_SEARCH_API_KEY, + EXTERNAL_WEB_SEARCH_URL, + FILE_IMAGE_COMPRESSION_HEIGHT, + FILE_IMAGE_COMPRESSION_WIDTH, FIRECRAWL_API_BASE_URL, FIRECRAWL_API_KEY, FIRECRAWL_TIMEOUT, - WEB_LOADER_ENGINE, - WEB_LOADER_CONCURRENT_REQUESTS, - WEB_LOADER_TIMEOUT, - WHISPER_MODEL, - WHISPER_VAD_FILTER, - WHISPER_LANGUAGE, - DEEPGRAM_API_KEY, - WHISPER_MODEL_AUTO_UPDATE, - WHISPER_MODEL_DIR, - # Retrieval - RAG_TEMPLATE, - DEFAULT_RAG_TEMPLATE, - RAG_FULL_CONTEXT, - BYPASS_EMBEDDING_AND_RETRIEVAL, + FOLDER_MAX_FILE_COUNT, + FOLLOW_UP_GENERATION_PROMPT_TEMPLATE, + FRONTEND_BUILD_DIR, + GOOGLE_DRIVE_API_KEY, + GOOGLE_DRIVE_CLIENT_ID, + GOOGLE_PSE_API_KEY, + GOOGLE_PSE_ENGINE_ID, + IFRAME_CSP, + IMAGE_EDIT_ENGINE, + IMAGE_EDIT_MODEL, + IMAGE_EDIT_SIZE, + IMAGE_GENERATION_ENGINE, + IMAGE_GENERATION_MODEL, + IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, + IMAGE_SIZE, + IMAGE_STEPS, + IMAGES_EDIT_COMFYUI_API_KEY, + IMAGES_EDIT_COMFYUI_BASE_URL, + IMAGES_EDIT_COMFYUI_WORKFLOW, + IMAGES_EDIT_COMFYUI_WORKFLOW_NODES, + IMAGES_EDIT_GEMINI_API_BASE_URL, + IMAGES_EDIT_GEMINI_API_KEY, + IMAGES_EDIT_OPENAI_API_BASE_URL, + IMAGES_EDIT_OPENAI_API_KEY, + IMAGES_EDIT_OPENAI_API_VERSION, + IMAGES_GEMINI_API_BASE_URL, + IMAGES_GEMINI_API_KEY, + IMAGES_GEMINI_ENDPOINT_METHOD, + IMAGES_OPENAI_API_BASE_URL, + IMAGES_OPENAI_API_KEY, + IMAGES_OPENAI_API_PARAMS, + IMAGES_OPENAI_API_VERSION, + JINA_API_BASE_URL, + JINA_API_KEY, + JWT_EXPIRES_IN, + KAGI_SEARCH_API_KEY, + LDAP_APP_DN, + LDAP_APP_PASSWORD, + LDAP_ATTRIBUTE_FOR_GROUPS, + LDAP_ATTRIBUTE_FOR_MAIL, + LDAP_ATTRIBUTE_FOR_USERNAME, + LDAP_CA_CERT_FILE, + LDAP_CIPHERS, + LDAP_SEARCH_BASE, + LDAP_SEARCH_FILTERS, + LDAP_SERVER_HOST, + LDAP_SERVER_LABEL, + LDAP_SERVER_PORT, + LDAP_USE_TLS, + LDAP_VALIDATE_CERT, + MINERU_API_KEY, + MINERU_API_MODE, + MINERU_API_TIMEOUT, + MINERU_API_URL, + MINERU_PARAMS, + MISTRAL_OCR_API_BASE_URL, + MISTRAL_OCR_API_KEY, + MODEL_ORDER_LIST, + MOJEEK_SEARCH_API_KEY, + OAUTH_ADMIN_ROLES, + OAUTH_ALLOWED_ROLES, + OAUTH_EMAIL_CLAIM, + OAUTH_PICTURE_CLAIM, + OAUTH_PROVIDERS, + OAUTH_ROLES_CLAIM, + OAUTH_SUB_CLAIM, + OAUTH_USERNAME_CLAIM, + OLLAMA_API_CONFIGS, + OLLAMA_BASE_URLS, + OLLAMA_CLOUD_WEB_SEARCH_API_KEY, + ONEDRIVE_CLIENT_ID_BUSINESS, + ONEDRIVE_CLIENT_ID_PERSONAL, + ONEDRIVE_SHAREPOINT_TENANT_ID, + ONEDRIVE_SHAREPOINT_URL, + OPENAI_API_BASE_URLS, + OPENAI_API_CONFIGS, + OPENAI_API_KEYS, + PADDLEOCR_VL_BASE_URL, + PADDLEOCR_VL_TOKEN, + PDF_EXTRACT_IMAGES, + PDF_LOADER_MODE, + PENDING_USER_OVERLAY_CONTENT, + PENDING_USER_OVERLAY_TITLE, + PERPLEXITY_API_KEY, + PERPLEXITY_MODEL, + PERPLEXITY_SEARCH_API_URL, + PERPLEXITY_SEARCH_CONTEXT_USAGE, + PLAYWRIGHT_TIMEOUT, + PLAYWRIGHT_WS_URL, + QUERY_GENERATION_PROMPT_TEMPLATE, + RAG_ALLOWED_FILE_EXTENSIONS, + RAG_AZURE_OPENAI_API_KEY, + RAG_AZURE_OPENAI_API_VERSION, + RAG_AZURE_OPENAI_BASE_URL, + RAG_EMBEDDING_BATCH_SIZE, + RAG_EMBEDDING_CONCURRENT_REQUESTS, + RAG_EMBEDDING_ENGINE, RAG_EMBEDDING_MODEL, RAG_EMBEDDING_MODEL_AUTO_UPDATE, RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE, - RAG_RERANKING_ENGINE, - RAG_RERANKING_MODEL, - RAG_EXTERNAL_RERANKER_URL, RAG_EXTERNAL_RERANKER_API_KEY, RAG_EXTERNAL_RERANKER_TIMEOUT, - RAG_RERANKING_BATCH_SIZE, - RAG_RERANKING_MODEL_AUTO_UPDATE, - RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, - RAG_EMBEDDING_ENGINE, - RAG_EMBEDDING_BATCH_SIZE, - ENABLE_ASYNC_EMBEDDING, - RAG_EMBEDDING_CONCURRENT_REQUESTS, - RAG_TOP_K, - RAG_TOP_K_RERANKER, - RAG_RELEVANCE_THRESHOLD, - RAG_HYBRID_BM25_WEIGHT, - RAG_ALLOWED_FILE_EXTENSIONS, + RAG_EXTERNAL_RERANKER_URL, RAG_FILE_MAX_COUNT, RAG_FILE_MAX_SIZE, - FILE_IMAGE_COMPRESSION_WIDTH, - FILE_IMAGE_COMPRESSION_HEIGHT, + RAG_FULL_CONTEXT, + RAG_HYBRID_BM25_WEIGHT, + RAG_OLLAMA_API_KEY, + RAG_OLLAMA_BASE_URL, RAG_OPENAI_API_BASE_URL, RAG_OPENAI_API_KEY, RAG_AZURE_OPENAI_BASE_URL, @@ -309,291 +380,249 @@ from open_webui.config import ( PADDLEOCR_VL_BASE_URL, PADDLEOCR_VL_TOKEN, + RAG_RELEVANCE_THRESHOLD, + RAG_RERANKING_BATCH_SIZE, + RAG_RERANKING_ENGINE, + RAG_RERANKING_MODEL, + RAG_RERANKING_MODEL_AUTO_UPDATE, + RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, + # Retrieval + RAG_TEMPLATE, RAG_TEXT_SPLITTER, - ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER, - TIKTOKEN_ENCODING_NAME, - PDF_EXTRACT_IMAGES, - PDF_LOADER_MODE, - YOUTUBE_LOADER_LANGUAGE, - YOUTUBE_LOADER_PROXY_URL, - # Retrieval (Web Search) - ENABLE_WEB_SEARCH, - WEB_SEARCH_ENGINE, - BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, - BYPASS_WEB_SEARCH_WEB_LOADER, - WEB_SEARCH_RESULT_COUNT, - WEB_SEARCH_CONCURRENT_REQUESTS, - WEB_FETCH_MAX_CONTENT_LENGTH, - WEB_SEARCH_TRUST_ENV, - WEB_SEARCH_DOMAIN_FILTER_LIST, - OLLAMA_CLOUD_WEB_SEARCH_API_KEY, - JINA_API_KEY, - JINA_API_BASE_URL, + RAG_TOP_K, + RAG_TOP_K_RERANKER, + RESPONSE_WATERMARK, SEARCHAPI_API_KEY, SEARCHAPI_ENGINE, + SEARXNG_LANGUAGE, + SEARXNG_QUERY_URL, SERPAPI_API_KEY, SERPAPI_ENGINE, - SEARXNG_QUERY_URL, - SEARXNG_LANGUAGE, - YACY_QUERY_URL, - YACY_USERNAME, - YACY_PASSWORD, SERPER_API_KEY, SERPLY_API_KEY, - DDGS_BACKEND, SERPSTACK_API_KEY, SERPSTACK_HTTPS, - TAVILY_API_KEY, - TAVILY_EXTRACT_DEPTH, - BING_SEARCH_V7_ENDPOINT, - BING_SEARCH_V7_SUBSCRIPTION_KEY, - BRAVE_SEARCH_API_KEY, - EXA_API_KEY, - PERPLEXITY_API_KEY, - PERPLEXITY_MODEL, - PERPLEXITY_SEARCH_CONTEXT_USAGE, - PERPLEXITY_SEARCH_API_URL, + SHOW_ADMIN_DETAILS, SOUGOU_API_SID, SOUGOU_API_SK, - KAGI_SEARCH_API_KEY, - MOJEEK_SEARCH_API_KEY, - BOCHA_SEARCH_API_KEY, - GOOGLE_PSE_API_KEY, - GOOGLE_PSE_ENGINE_ID, - GOOGLE_DRIVE_CLIENT_ID, - GOOGLE_DRIVE_API_KEY, - ENABLE_ONEDRIVE_INTEGRATION, - ONEDRIVE_CLIENT_ID_PERSONAL, - ONEDRIVE_CLIENT_ID_BUSINESS, - ONEDRIVE_SHAREPOINT_URL, - ONEDRIVE_SHAREPOINT_TENANT_ID, - ENABLE_ONEDRIVE_PERSONAL, - ENABLE_ONEDRIVE_BUSINESS, - ENABLE_RAG_HYBRID_SEARCH, - ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS, - ENABLE_RAG_LOCAL_WEB_FETCH, - ENABLE_WEB_LOADER_SSL_VERIFICATION, - ENABLE_GOOGLE_DRIVE_INTEGRATION, - UPLOAD_DIR, - EXTERNAL_WEB_SEARCH_URL, - EXTERNAL_WEB_SEARCH_API_KEY, - EXTERNAL_WEB_LOADER_URL, - EXTERNAL_WEB_LOADER_API_KEY, - YANDEX_WEB_SEARCH_URL, - YANDEX_WEB_SEARCH_API_KEY, - YANDEX_WEB_SEARCH_CONFIG, - YOUCOM_API_KEY, - # WebUI - WEBUI_AUTH, - WEBUI_NAME, - WEBUI_BANNERS, - WEBHOOK_URL, - ADMIN_EMAIL, - SHOW_ADMIN_DETAILS, - JWT_EXPIRES_IN, - ENABLE_SIGNUP, - ENABLE_LOGIN_FORM, - ENABLE_PASSWORD_CHANGE_FORM, - ENABLE_API_KEYS, - ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS, - API_KEYS_ALLOWED_ENDPOINTS, - ENABLE_FOLDERS, - FOLDER_MAX_FILE_COUNT, - ENABLE_AUTOMATIONS, - AUTOMATION_MAX_COUNT, - AUTOMATION_MIN_INTERVAL, - ENABLE_CHANNELS, - ENABLE_CALENDAR, - ENABLE_NOTES, - ENABLE_USER_STATUS, - ENABLE_COMMUNITY_SHARING, - ENABLE_MESSAGE_RATING, - ENABLE_USER_WEBHOOKS, - ENABLE_EVALUATION_ARENA_MODELS, - BYPASS_ADMIN_ACCESS_CONTROL, - USER_PERMISSIONS, - DEFAULT_USER_ROLE, - DEFAULT_GROUP_ID, - PENDING_USER_OVERLAY_CONTENT, - PENDING_USER_OVERLAY_TITLE, - DEFAULT_PROMPT_SUGGESTIONS, - DEFAULT_MODELS, - DEFAULT_PINNED_MODELS, - DEFAULT_ARENA_MODEL, - MODEL_ORDER_LIST, - DEFAULT_MODEL_METADATA, - DEFAULT_MODEL_PARAMS, - EVALUATION_ARENA_MODELS, - # WebUI (OAuth) - ENABLE_OAUTH_ROLE_MANAGEMENT, - OAUTH_SUB_CLAIM, - OAUTH_ROLES_CLAIM, - OAUTH_EMAIL_CLAIM, - OAUTH_PICTURE_CLAIM, - OAUTH_USERNAME_CLAIM, - OAUTH_ALLOWED_ROLES, - OAUTH_ADMIN_ROLES, - # WebUI (LDAP) - ENABLE_LDAP, - LDAP_SERVER_LABEL, - LDAP_SERVER_HOST, - LDAP_SERVER_PORT, - LDAP_ATTRIBUTE_FOR_MAIL, - LDAP_ATTRIBUTE_FOR_USERNAME, - LDAP_SEARCH_FILTERS, - LDAP_SEARCH_BASE, - LDAP_APP_DN, - LDAP_APP_PASSWORD, - LDAP_USE_TLS, - LDAP_CA_CERT_FILE, - LDAP_VALIDATE_CERT, - LDAP_CIPHERS, - # LDAP Group Management - ENABLE_LDAP_GROUP_MANAGEMENT, - ENABLE_LDAP_GROUP_CREATION, - LDAP_ATTRIBUTE_FOR_GROUPS, - # Misc - ENV, - CACHE_DIR, STATIC_DIR, - FRONTEND_BUILD_DIR, - CORS_ALLOW_ORIGIN, - DEFAULT_LOCALE, - OAUTH_PROVIDERS, - WEBUI_URL, - RESPONSE_WATERMARK, - # Admin - ENABLE_ADMIN_CHAT_ACCESS, - ENABLE_ADMIN_ANALYTICS, - BYPASS_ADMIN_ACCESS_CONTROL, - ENABLE_ADMIN_EXPORT, + TAGS_GENERATION_PROMPT_TEMPLATE, # Tasks TASK_MODEL, TASK_MODEL_EXTERNAL, - ENABLE_TAGS_GENERATION, - ENABLE_TITLE_GENERATION, - ENABLE_FOLLOW_UP_GENERATION, - ENABLE_SEARCH_QUERY_GENERATION, - ENABLE_RETRIEVAL_QUERY_GENERATION, - ENABLE_AUTOCOMPLETE_GENERATION, + TAVILY_API_KEY, + TAVILY_EXTRACT_DEPTH, + # Terminal Server + TERMINAL_SERVER_CONNECTIONS, + # Thread pool size for FastAPI/AnyIO + THREAD_POOL_SIZE, + TIKA_SERVER_URL, + TIKTOKEN_ENCODING_NAME, TITLE_GENERATION_PROMPT_TEMPLATE, - FOLLOW_UP_GENERATION_PROMPT_TEMPLATE, - TAGS_GENERATION_PROMPT_TEMPLATE, - IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, + # Tool Server Configs + TOOL_SERVER_CONNECTIONS, TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + UPLOAD_DIR, + USER_PERMISSIONS, VOICE_MODE_PROMPT_TEMPLATE, - QUERY_GENERATION_PROMPT_TEMPLATE, - AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, - AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH, + WEB_FETCH_MAX_CONTENT_LENGTH, + WEB_LOADER_CONCURRENT_REQUESTS, + WEB_LOADER_ENGINE, + WEB_LOADER_TIMEOUT, + WEB_SEARCH_CONCURRENT_REQUESTS, + WEB_SEARCH_DOMAIN_FILTER_LIST, + WEB_SEARCH_ENGINE, + WEB_SEARCH_RESULT_COUNT, + WEB_SEARCH_TRUST_ENV, + WEBHOOK_URL, + # WebUI + WEBUI_AUTH, + WEBUI_BANNERS, + WEBUI_NAME, + WEBUI_URL, + WHISPER_LANGUAGE, + WHISPER_MODEL, + WHISPER_MODEL_AUTO_UPDATE, + WHISPER_MODEL_DIR, + WHISPER_VAD_FILTER, + YACY_PASSWORD, + YACY_QUERY_URL, + YACY_USERNAME, + YANDEX_WEB_SEARCH_API_KEY, + YANDEX_WEB_SEARCH_CONFIG, + YANDEX_WEB_SEARCH_URL, + YOUCOM_API_KEY, + YOUTUBE_LOADER_LANGUAGE, + YOUTUBE_LOADER_PROXY_URL, AppConfig, - reset_config, async_reset_config, + reset_config, ) +from open_webui.constants import ERROR_MESSAGES, TASKS from open_webui.env import ( - ENABLE_CUSTOM_MODEL_FALLBACK, - LICENSE_KEY, + AIOHTTP_CLIENT_SESSION_SSL, AUDIT_EXCLUDED_PATHS, AUDIT_INCLUDED_PATHS, - ENABLE_AUDIT_GET_REQUESTS, AUDIT_LOG_LEVEL, + BYPASS_MODEL_ACCESS_CONTROL, CHANGELOG, - REDIS_URL, + DEPLOYMENT_ID, + ENABLE_AUDIT_GET_REQUESTS, + ENABLE_COMPRESSION_MIDDLEWARE, + ENABLE_CUSTOM_MODEL_FALLBACK, + ENABLE_EASTER_EGGS, + # OAuth Back-Channel Logout + ENABLE_OAUTH_BACKCHANNEL_LOGOUT, + ENABLE_OTEL, + ENABLE_PUBLIC_ACTIVE_USERS_COUNT, + # SCIM + ENABLE_SCIM, + ENABLE_SIGNUP_PASSWORD_CONFIRMATION, + ENABLE_STAR_SESSIONS_MIDDLEWARE, + ENABLE_VERSION_UPDATE_CHECK, + ENABLE_WEBSOCKET_SUPPORT, + EXTERNAL_PWA_MANIFEST_URL, + GLOBAL_LOG_LEVEL, + INSTANCE_ID, + LICENSE_KEY, + LOG_FORMAT, + MAX_BODY_LOG_SIZE, REDIS_CLUSTER, REDIS_KEY_PREFIX, REDIS_SENTINEL_HOSTS, REDIS_SENTINEL_PORT, - GLOBAL_LOG_LEVEL, - MAX_BODY_LOG_SIZE, + REDIS_URL, + RESET_CONFIG_ON_START, SAFE_MODE, + SCIM_TOKEN, VERSION, - DEPLOYMENT_ID, - INSTANCE_ID, + # Admin Account Runtime Creation + WEBUI_ADMIN_EMAIL, + WEBUI_ADMIN_NAME, + WEBUI_ADMIN_PASSWORD, + WEBUI_AUTH_SIGNOUT_REDIRECT_URL, + WEBUI_AUTH_TRUSTED_EMAIL_HEADER, + WEBUI_AUTH_TRUSTED_NAME_HEADER, WEBUI_BUILD_HASH, WEBUI_SECRET_KEY, WEBUI_SESSION_COOKIE_SAME_SITE, WEBUI_SESSION_COOKIE_SECURE, - ENABLE_SIGNUP_PASSWORD_CONFIRMATION, - WEBUI_AUTH_TRUSTED_EMAIL_HEADER, - WEBUI_AUTH_TRUSTED_NAME_HEADER, - WEBUI_AUTH_SIGNOUT_REDIRECT_URL, - # SCIM - ENABLE_SCIM, - SCIM_TOKEN, - ENABLE_COMPRESSION_MIDDLEWARE, - ENABLE_WEBSOCKET_SUPPORT, - BYPASS_MODEL_ACCESS_CONTROL, - RESET_CONFIG_ON_START, - ENABLE_VERSION_UPDATE_CHECK, - ENABLE_OTEL, - EXTERNAL_PWA_MANIFEST_URL, - AIOHTTP_CLIENT_SESSION_SSL, - ENABLE_STAR_SESSIONS_MIDDLEWARE, - ENABLE_PUBLIC_ACTIVE_USERS_COUNT, - # Admin Account Runtime Creation - WEBUI_ADMIN_EMAIL, - WEBUI_ADMIN_PASSWORD, - WEBUI_ADMIN_NAME, - ENABLE_EASTER_EGGS, - LOG_FORMAT, - # OAuth Back-Channel Logout - ENABLE_OAUTH_BACKCHANNEL_LOGOUT, ) - - -from open_webui.utils.models import ( - get_all_models, - get_all_base_models, - check_model_access, - get_filtered_models, +from open_webui.internal.db import ScopedSession, engine, get_async_session +from open_webui.models.chats import ChatForm, Chats +from open_webui.models.functions import Functions +from open_webui.models.models import Models +from open_webui.models.users import UserModel, Users +from open_webui.routers import ( + analytics, + audio, + auths, + automations, + calendar, + channels, + chats, + configs, + evaluations, + files, + folders, + functions, + groups, + images, + knowledge, + memories, + models, + notes, + ollama, + openai, + pipelines, + prompts, + retrieval, + scim, + skills, + tasks, + terminals, + tools, + users, + utils, +) +from open_webui.routers.retrieval import ( + get_ef, + get_embedding_function, + get_reranking_function, + get_rf, +) +from open_webui.socket.main import ( + MODELS, + get_event_emitter, + get_models_in_use, + get_user_id_from_session_pool, + periodic_session_pool_cleanup, + periodic_usage_pool_cleanup, +) +from open_webui.socket.main import ( + app as socket_app, +) +from open_webui.tasks import ( + cleanup_task, + create_task, + has_active_tasks, + list_task_ids_by_item_id, + list_tasks, + redis_task_command_listener, + stop_item_tasks, + stop_task, +) # Import from tasks.py +from open_webui.utils import logger +from open_webui.utils.actions import chat_action as chat_action_handler +from open_webui.utils.asgi_middleware import ( + AuthTokenMiddleware, + CommitSessionMiddleware, + RedirectMiddleware, + WebsocketUpgradeGuardMiddleware, +) +from open_webui.utils.audit import AuditLevel, AuditLoggingMiddleware +from open_webui.utils.auth import ( + create_admin_user, + decode_token, + get_admin_user, + get_http_authorization_cred, + get_license_data, + get_verified_user, +) +from open_webui.utils.chat import ( + chat_completed as chat_completed_handler, ) from open_webui.utils.chat import ( generate_chat_completion as chat_completion_handler, - chat_completed as chat_completed_handler, ) -from open_webui.utils.actions import chat_action as chat_action_handler from open_webui.utils.embeddings import generate_embeddings +from open_webui.utils.logger import start_logger from open_webui.utils.middleware import ( build_chat_response_context, process_chat_payload, process_chat_response, ) -from open_webui.utils.tools import set_tool_servers, set_terminal_servers - -from open_webui.utils.auth import ( - get_license_data, - get_http_authorization_cred, - decode_token, - get_admin_user, - get_verified_user, - create_admin_user, +from open_webui.utils.models import ( + check_model_access, + get_all_base_models, + get_all_models, + get_filtered_models, ) -from open_webui.utils.plugin import install_tool_and_function_dependencies from open_webui.utils.oauth import ( + OAuthClientInformationFull, + OAuthClientManager, + OAuthManager, + decrypt_data, + encrypt_data, get_oauth_client_info_with_dynamic_client_registration, get_oauth_client_info_with_static_credentials, - encrypt_data, - decrypt_data, resolve_oauth_client_info, - OAuthManager, - OAuthClientManager, - OAuthClientInformationFull, ) +from open_webui.utils.plugin import install_tool_and_function_dependencies +from open_webui.utils.redis import get_redis_connection, get_sentinels_from_env from open_webui.utils.security_headers import SecurityHeadersMiddleware -from open_webui.utils.redis import get_redis_connection - -from open_webui.tasks import ( - redis_task_command_listener, - list_task_ids_by_item_id, - create_task, - stop_task, - stop_item_tasks, - list_tasks, -) # Import from tasks.py - -from open_webui.utils.redis import get_sentinels_from_env - - -from open_webui.constants import ERROR_MESSAGES, TASKS +from open_webui.utils.session_pool import get_session +from open_webui.utils.tools import set_terminal_servers, set_tool_servers if SAFE_MODE: print('SAFE MODE ENABLED') @@ -710,30 +739,34 @@ async def lifespan(app: FastAPI): # Pre-fetch tool server specs so the first request doesn't pay the latency cost if len(app.state.config.TOOL_SERVER_CONNECTIONS) > 0: + mock_request = Request( + { + 'type': 'http', + 'asgi.version': '3.0', + 'asgi.spec_version': '2.0', + 'method': 'GET', + 'path': '/internal', + 'query_string': b'', + 'headers': Headers({}).raw, + 'client': ('127.0.0.1', 12345), + 'server': ('127.0.0.1', 80), + 'scheme': 'http', + 'app': app, + } + ) + log.info('Initializing tool servers...') try: - mock_request = Request( - { - 'type': 'http', - 'asgi.version': '3.0', - 'asgi.spec_version': '2.0', - 'method': 'GET', - 'path': '/internal', - 'query_string': b'', - 'headers': Headers({}).raw, - 'client': ('127.0.0.1', 12345), - 'server': ('127.0.0.1', 80), - 'scheme': 'http', - 'app': app, - } - ) await set_tool_servers(mock_request) log.info(f'Initialized {len(app.state.TOOL_SERVERS)} tool server(s)') + except Exception as e: + log.warning(f'Failed to initialize tool servers at startup: {e}') + try: await set_terminal_servers(mock_request) log.info(f'Initialized {len(app.state.TERMINAL_SERVERS)} terminal server(s)') except Exception as e: - log.warning(f'Failed to initialize tool/terminal servers at startup: {e}') + log.warning(f'Failed to initialize terminal servers at startup: {e}') # Mark application as ready to accept traffic from a startup perspective. app.state.startup_complete = True @@ -922,7 +955,7 @@ app.state.config.ENABLE_EVALUATION_ARENA_MODELS = ENABLE_EVALUATION_ARENA_MODELS app.state.config.EVALUATION_ARENA_MODELS = EVALUATION_ARENA_MODELS # Migrate legacy access_control → access_grants on boot -from open_webui.utils.access_control import migrate_access_control +from open_webui.utils.access_control import has_permission, migrate_access_control connections = app.state.config.TOOL_SERVER_CONNECTIONS if any('access_control' in c.get('config', {}) for c in connections): @@ -1110,6 +1143,7 @@ app.state.config.YACY_PASSWORD = YACY_PASSWORD app.state.config.GOOGLE_PSE_API_KEY = GOOGLE_PSE_API_KEY app.state.config.GOOGLE_PSE_ENGINE_ID = GOOGLE_PSE_ENGINE_ID app.state.config.BRAVE_SEARCH_API_KEY = BRAVE_SEARCH_API_KEY +app.state.config.BRAVE_SEARCH_CONTEXT_TOKENS = BRAVE_SEARCH_CONTEXT_TOKENS app.state.config.KAGI_SEARCH_API_KEY = KAGI_SEARCH_API_KEY app.state.config.MOJEEK_SEARCH_API_KEY = MOJEEK_SEARCH_API_KEY app.state.config.BOCHA_SEARCH_API_KEY = BOCHA_SEARCH_API_KEY @@ -1297,6 +1331,7 @@ app.state.config.IMAGES_EDIT_COMFYUI_WORKFLOW_NODES = IMAGES_EDIT_COMFYUI_WORKFL app.state.config.STT_ENGINE = AUDIO_STT_ENGINE app.state.config.STT_MODEL = AUDIO_STT_MODEL app.state.config.STT_SUPPORTED_CONTENT_TYPES = AUDIO_STT_SUPPORTED_CONTENT_TYPES +app.state.config.STT_ALLOWED_EXTENSIONS = AUDIO_STT_ALLOWED_EXTENSIONS app.state.config.STT_OPENAI_API_BASE_URL = AUDIO_STT_OPENAI_API_BASE_URL app.state.config.STT_OPENAI_API_KEY = AUDIO_STT_OPENAI_API_KEY @@ -1369,6 +1404,7 @@ app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE = QUERY_GENERATION_PROMPT_TEMP app.state.config.AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE app.state.config.AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH app.state.config.VOICE_MODE_PROMPT_TEMPLATE = VOICE_MODE_PROMPT_TEMPLATE +app.state.config.ENABLE_VOICE_MODE_PROMPT = ENABLE_VOICE_MODE_PROMPT ######################################## @@ -1532,6 +1568,108 @@ async def get_base_models(request: Request, user=Depends(get_admin_user)): return {'data': models} +class ModelUnloadForm(BaseModel): + model: str + + +@app.post('/api/models/unload') +async def unload_model(request: Request, form_data: ModelUnloadForm, user=Depends(get_admin_user)): + """ + Unified model unload endpoint. + Resolves the provider that owns the model and calls its native unload mechanism. + Supports: Ollama (keep_alive=0) and llama.cpp (/models/unload). + """ + model_id = form_data.model + + # --- Ollama provider --- + ollama_models = getattr(request.app.state, 'OLLAMA_MODELS', None) or {} + if model_id in ollama_models: + url_indices = ollama_models[model_id].get('urls', []) + errors = [] + for idx in url_indices: + url = request.app.state.config.OLLAMA_BASE_URLS[idx] + api_config = request.app.state.config.OLLAMA_API_CONFIGS.get( + str(idx), + request.app.state.config.OLLAMA_API_CONFIGS.get(url, {}), + ) + key = api_config.get('key', None) + + prefix_id = api_config.get('prefix_id', None) + actual_model = model_id + if prefix_id and actual_model.startswith(f'{prefix_id}.'): + actual_model = actual_model[len(f'{prefix_id}.') :] + + payload = json.dumps({'model': actual_model, 'keep_alive': 0, 'prompt': ''}) + + try: + timeout = aiohttp.ClientTimeout(total=30) + async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session: + headers = { + 'Content-Type': 'application/json', + **({'Authorization': f'Bearer {key}'} if key else {}), + } + async with session.post( + f'{url}/api/generate', + data=payload, + headers=headers, + ) as r: + if not r.ok: + errors.append({'url_idx': idx, 'error': await r.text()}) + except Exception as e: + log.exception(f'Failed to unload model on Ollama node {idx}: {e}') + errors.append({'url_idx': idx, 'error': str(e)}) + + if errors: + raise HTTPException( + status_code=500, + detail=f'Failed to unload model on {len(errors)} node(s): {errors}', + ) + return {'status': True} + + # --- OpenAI-compatible providers --- + openai_models = getattr(request.app.state, 'OPENAI_MODELS', None) or {} + if model_id in openai_models: + model_info = openai_models[model_id] + idx = model_info.get('urlIdx') + api_config = request.app.state.config.OPENAI_API_CONFIGS.get(str(idx), {}) + provider = api_config.get('provider', '') + base_url = request.app.state.config.OPENAI_API_BASE_URLS[idx] + key = ( + request.app.state.config.OPENAI_API_KEYS[idx] if idx < len(request.app.state.config.OPENAI_API_KEYS) else '' + ) + + if provider == 'llama.cpp': + root_url = base_url.rstrip('/').removesuffix('/v1') + try: + timeout = aiohttp.ClientTimeout(total=30) + async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session: + headers = { + 'Content-Type': 'application/json', + **({'Authorization': f'Bearer {key}'} if key else {}), + } + async with session.post( + f'{root_url}/models/unload', + json={'model': model_id}, + headers=headers, + ) as r: + if not r.ok: + detail = await r.text() + raise HTTPException(status_code=r.status, detail=detail) + return await r.json() + except HTTPException: + raise + except Exception as e: + log.exception(f'Failed to unload model via llama.cpp: {e}') + raise HTTPException(status_code=500, detail=str(e)) + else: + raise HTTPException( + status_code=400, + detail=f'Provider "{provider or "default"}" does not support model unloading', + ) + + raise HTTPException(status_code=404, detail=f'Model "{model_id}" not found') + + ################################## # Embeddings ################################## @@ -1654,16 +1792,32 @@ async def chat_completion( form_data.pop('id', None) user_message = form_data.pop('user_message', None) or form_data.pop('parent_message', None) + + # Drop tool_servers if caller lacks features.direct_tool_servers — + # mirrors the storage-side strip in user/settings/update. + tool_servers = form_data.pop('tool_servers', None) + if ( + tool_servers + and user.role != 'admin' + and not await has_permission( + user.id, + 'features.direct_tool_servers', + request.app.state.config.USER_PERMISSIONS, + ) + ): + tool_servers = None + metadata = { 'user_id': user.id, 'chat_id': form_data.pop('chat_id', None), 'user_message': user_message, 'user_message_id': user_message.get('id') if user_message else None, + 'assistant_message_id': form_data.pop('assistant_message_id', None), 'session_id': form_data.pop('session_id', None), 'folder_id': form_data.pop('folder_id', None), 'filter_ids': form_data.pop('filter_ids', []), 'tool_ids': form_data.get('tool_ids', None), - 'tool_servers': form_data.pop('tool_servers', None), + 'tool_servers': tool_servers, 'files': form_data.get('files', None), 'features': form_data.get('features', {}), 'variables': form_data.get('variables', {}), @@ -1688,7 +1842,9 @@ async def chat_completion( if metadata.get('chat_id') and user: chat_id = metadata['chat_id'] - if not chat_id.startswith('local:'): # temporary chats are not stored + if not chat_id.startswith('local:') and not chat_id.startswith( + 'channel:' + ): # temporary/channel chats are not stored if is_new_chat: # Build the full history upfront with ALL assistant placeholders user_message = metadata.get('user_message') or {} @@ -1731,6 +1887,7 @@ async def chat_completion( ] if user_message_id else [], + 'files': metadata.get('files') or [], 'tags': [], 'timestamp': int(time.time() * 1000), }, @@ -1763,6 +1920,16 @@ async def chat_completion( detail=ERROR_MESSAGES.DEFAULT(), ) + # Persist chat-level files (knowledge collections, docs, etc.) + # The old frontend saveChatHandler did this on every message; + # now the backend owns persistence. + chat_files = metadata.get('files') + if chat_files is not None: + existing_chat = await Chats.get_chat_by_id(chat_id) + if existing_chat: + updated = {**existing_chat.chat, 'files': chat_files} + await Chats.update_chat_by_id(chat_id, updated) + # Save user message to DB user_message = metadata.get('user_message') or {} if user_message and user_message.get('id'): @@ -1893,7 +2060,7 @@ async def chat_completion( if metadata.get('chat_id') and metadata.get('message_id'): # Update the chat message with the error try: - if not metadata['chat_id'].startswith('local:'): + if not metadata['chat_id'].startswith('local:') and not metadata['chat_id'].startswith('channel:'): await Chats.upsert_message_to_chat_by_id_and_message_id( metadata['chat_id'], metadata['message_id'], @@ -1927,42 +2094,42 @@ async def chat_completion( detail=error_detail, ) finally: - # MCP cleanup — MUST run in the SAME asyncio task as - # connect() because the MCP SDK's streamablehttp_client - # uses anyio task groups whose cancel scopes enforce - # same-task exit. Do NOT wrap in asyncio.shield() or - # asyncio.wait_for() — both create a new task. + # Clean up MCP clients. Each client is isolated so one + # failure doesn't skip the rest. + # + # NOTE: asyncio.wait_for() / asyncio.shield() must NOT be used + # here — they create new asyncio Tasks, which violate anyio + # cancel-scope task-ownership rules when the MCPClient's + # exit_stack contains anyio transport resources (streamable_http). + # Exiting those cancel scopes from the wrong task raises + # "Attempted to exit a cancel scope that isn't the current + # task's current cancel scope", which propagates as a + # BaseException through the finally block, discards the response + # return value, and surfaces as a 500 "No response returned." + # MCPClient.disconnect() already catches BaseException internally. try: if mcp_clients := metadata.get('mcp_clients'): for client in reversed(list(mcp_clients.values())): try: await client.disconnect() - except Exception as e: + except BaseException as e: log.debug(f'Error disconnecting MCP client: {e}') - except asyncio.CancelledError: - # Let the client close asynchronously by GC - pass - except Exception as e: + except BaseException as e: log.debug(f'Error cleaning up MCP clients: {e}') - except asyncio.CancelledError: - pass + # Deregister this task, then emit chat:active=false if no others remain try: - if metadata.get('chat_id'): - - async def emit_inactive_event(): - try: - event_emitter = await get_event_emitter(metadata, update_db=False) - if event_emitter: - await event_emitter({'type': 'chat:active', 'data': {'active': False}}) - except Exception: - pass - - try: - # Shield the event emission so it finishes even if the main task is cancelled - await asyncio.shield(emit_inactive_event()) - except asyncio.CancelledError: - pass + chat_id = metadata.get('chat_id') + task_id = metadata.get('task_id') + if chat_id and task_id: + await cleanup_task(request.app.state.redis, task_id, chat_id) + if not await has_active_tasks(request.app.state.redis, chat_id): + event_emitter = await get_event_emitter(metadata, update_db=False) + if event_emitter: + try: + await asyncio.shield(event_emitter({'type': 'chat:active', 'data': {'active': False}})) + except asyncio.CancelledError: + pass except Exception: pass @@ -2012,6 +2179,7 @@ async def chat_completion( ), id=chat_id, ) + per_model_metadata['task_id'] = task_id task_ids.append(task_id) # Emit chat:active=true @@ -2155,7 +2323,7 @@ async def list_tasks_endpoint(request: Request, user=Depends(get_admin_user)): @app.get('/api/tasks/chat/{chat_id:path}') async def list_tasks_by_chat_id_endpoint(request: Request, chat_id: str, user=Depends(get_verified_user)): - if chat_id.startswith('local:'): + if chat_id.startswith('local:') or chat_id.startswith('channel:'): socket_id = chat_id[len('local:') :] owner_id = get_user_id_from_session_pool(socket_id) if owner_id != user.id and user.role != 'admin': @@ -2173,7 +2341,7 @@ async def list_tasks_by_chat_id_endpoint(request: Request, chat_id: str, user=De @app.post('/api/tasks/chat/{chat_id:path}/stop') async def stop_tasks_by_chat_id_endpoint(request: Request, chat_id: str, user=Depends(get_verified_user)): - if chat_id.startswith('local:'): + if chat_id.startswith('local:') or chat_id.startswith('channel:'): socket_id = chat_id[len('local:') :] owner_id = get_user_id_from_session_pool(socket_id) if owner_id != user.id and user.role != 'admin': @@ -2233,20 +2401,22 @@ async def get_app_config(request: Request): 'default_locale': str(DEFAULT_LOCALE), 'oauth': {'providers': {name: config.get('name', name) for name, config in OAUTH_PROVIDERS.items()}}, 'features': { + # --- Public: required by login/signup page pre-auth --- 'auth': WEBUI_AUTH, 'auth_trusted_header': bool(app.state.AUTH_TRUSTED_EMAIL_HEADER), 'enable_signup_password_confirmation': ENABLE_SIGNUP_PASSWORD_CONFIRMATION, 'enable_ldap': app.state.config.ENABLE_LDAP, - 'enable_api_keys': app.state.config.ENABLE_API_KEYS, 'enable_signup': app.state.config.ENABLE_SIGNUP, 'enable_login_form': app.state.config.ENABLE_LOGIN_FORM, - 'enable_password_change_form': app.state.config.ENABLE_PASSWORD_CHANGE_FORM, 'enable_websocket': ENABLE_WEBSOCKET_SUPPORT, - 'enable_version_update_check': ENABLE_VERSION_UPDATE_CHECK, - 'enable_public_active_users_count': ENABLE_PUBLIC_ACTIVE_USERS_COUNT, - 'enable_easter_eggs': ENABLE_EASTER_EGGS, + # --- Authenticated: only consumed by logged-in frontend --- **( { + 'enable_api_keys': app.state.config.ENABLE_API_KEYS, + 'enable_password_change_form': app.state.config.ENABLE_PASSWORD_CHANGE_FORM, + 'enable_version_update_check': ENABLE_VERSION_UPDATE_CHECK, + 'enable_public_active_users_count': ENABLE_PUBLIC_ACTIVE_USERS_COUNT, + 'enable_easter_eggs': ENABLE_EASTER_EGGS, 'enable_direct_connections': app.state.config.ENABLE_DIRECT_CONNECTIONS, 'enable_folders': app.state.config.ENABLE_FOLDERS, 'folder_max_file_count': app.state.config.FOLDER_MAX_FILE_COUNT, @@ -2325,6 +2495,7 @@ async def get_app_config(request: Request): 'pending_user_overlay_title': app.state.config.PENDING_USER_OVERLAY_TITLE, 'pending_user_overlay_content': app.state.config.PENDING_USER_OVERLAY_CONTENT, 'response_watermark': app.state.config.RESPONSE_WATERMARK, + 'iframe_csp': IFRAME_CSP, }, 'license_metadata': app.state.LICENSE_METADATA, **( @@ -2555,7 +2726,7 @@ async def register_client(request, client_id: str) -> bool: 'oauth_client_info': encrypt_data(oauth_client_info.model_dump(mode='json')), }, } - # Re-assign the full list to trigger AppConfig.__setattr__ → PersistentConfig.save() + # Re-assign the full list to trigger AppConfig.__setattr__ → ConfigVar.save() # (in-place list mutation via list[idx] = ... does not trigger __setattr__) request.app.state.config.TOOL_SERVER_CONNECTIONS = connections except Exception as e: @@ -2718,6 +2889,30 @@ async def get_opensearch_xml(): return Response(content=xml_content, media_type='application/xml') +def _sync_db_ping() -> None: + """Verify the database is reachable with a simple SELECT 1. + + Uses a raw connection from the engine pool instead of the thread-local + ScopedSession. This is necessary because CommitSessionMiddleware + deliberately skips healthcheck paths (/health, /ready, /health/db), + so any ScopedSession opened on a healthcheck worker thread is never + rolled back or removed. If the session ever enters an invalid state + (e.g. after a transient connection error), it stays broken on that + thread permanently, causing PendingRollbackError on every subsequent + probe — exactly the failure reported in #24605. + + A raw ``engine.connect()`` context manager obtains a fresh connection + from the pool, executes the ping, and deterministically returns the + connection regardless of success or failure. + """ + with engine.connect() as conn: + conn.execute(text('SELECT 1')) + + +async def async_db_ping() -> None: + await asyncio.to_thread(_sync_db_ping) + + @app.get('/health') async def healthcheck(): return {'status': True} @@ -2739,7 +2934,7 @@ async def readiness_check(): # Check database connectivity try: - ScopedSession.execute(text('SELECT 1;')).all() + await async_db_ping() except Exception as e: log.warning(f'Readiness check DB ping failed: {e!r}') raise HTTPException( @@ -2766,7 +2961,7 @@ async def readiness_check(): @app.get('/health/db') async def healthcheck_with_db(): - ScopedSession.execute(text('SELECT 1;')).all() + await async_db_ping() return {'status': True} @@ -2784,7 +2979,13 @@ async def serve_cache_file( raise HTTPException(status_code=404, detail='File not found') if not os.path.isfile(file_path): raise HTTPException(status_code=404, detail='File not found') - return FileResponse(file_path) + + mime, _ = mimetypes.guess_type(file_path) + inline_safe = mime and mime.split('/', 1)[0] in {'image', 'audio', 'video'} + headers = {'X-Content-Type-Options': 'nosniff'} + if not inline_safe: + headers['Content-Disposition'] = f'attachment; filename="{os.path.basename(file_path)}"' + return FileResponse(file_path, headers=headers) def swagger_ui_html(*args, **kwargs): diff --git a/backend/open_webui/migrations/env.py b/backend/open_webui/migrations/env.py index 961a92becf..a9b9dcacb8 100644 --- a/backend/open_webui/migrations/env.py +++ b/backend/open_webui/migrations/env.py @@ -1,19 +1,26 @@ +from __future__ import annotations + +"""Alembic environment configuration. + +Configures the migration context for both offline (SQL script generation) +and online (live database connection) modes. Handles SQLCipher URLs, +SSL parameter normalisation, and JSON log formatting. +""" + import logging from logging.config import fileConfig from alembic import context +from open_webui.env import DATABASE_PASSWORD, DATABASE_URL, LOG_FORMAT +from open_webui.internal.db import extract_ssl_params_from_url, reattach_ssl_params_to_url from open_webui.models.auths import Auth from open_webui.models.calendar import Calendar, CalendarEvent, CalendarEventAttendee # noqa: F401 -from open_webui.env import DATABASE_URL, DATABASE_PASSWORD, LOG_FORMAT -from open_webui.internal.db import extract_ssl_params_from_url, reattach_ssl_params_to_url -from sqlalchemy import engine_from_config, pool, create_engine +from sqlalchemy import create_engine, engine_from_config, pool + +# ── Alembic config & logging ───────────────────────────────────────────────── -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. config = context.config -# Interpret the config file for Python logging. -# This line sets up loggers basically. if config.config_file_name is not None: fileConfig(config.config_file_name, disable_existing_loggers=False) @@ -24,39 +31,26 @@ if LOG_FORMAT == 'json': for handler in logging.root.handlers: handler.setFormatter(JSONFormatter()) -# add your model's MetaData object here -# for 'autogenerate' support -# from myapp import mymodel -# target_metadata = mymodel.Base.metadata -target_metadata = Auth.metadata +# ── Database URL ───────────────────────────────────────────────────────────── -# other values from the config, defined by the needs of env.py, -# can be acquired: -# my_important_option = config.get_main_option("my_important_option") -# ... etc. +target_metadata = Auth.metadata DB_URL = DATABASE_URL -# Normalize SSL query params for psycopg2 (Alembic uses psycopg2 for sync migrations). -url_without_ssl, ssl_params = extract_ssl_params_from_url(DB_URL) -DB_URL = reattach_ssl_params_to_url(url_without_ssl, ssl_params) if ssl_params else DB_URL +# Normalise SSL query params for psycopg2 (Alembic uses psycopg2 for sync). +_url_no_ssl, _ssl_params = extract_ssl_params_from_url(DB_URL) +if _ssl_params: + DB_URL = reattach_ssl_params_to_url(_url_no_ssl, _ssl_params) if DB_URL: config.set_main_option('sqlalchemy.url', DB_URL.replace('%', '%%')) +# ── Migration runners ──────────────────────────────────────────────────────── + + def run_migrations_offline() -> None: - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - - """ + """Generate SQL script without a live database connection.""" url = config.get_main_option('sqlalchemy.url') context.configure( url=url, @@ -64,56 +58,47 @@ def run_migrations_offline() -> None: literal_binds=True, dialect_opts={'paramstyle': 'named'}, ) - with context.begin_transaction(): context.run_migrations() -def run_migrations_online() -> None: - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - - """ - # Handle SQLCipher URLs +def _build_connectable(): + """Create the appropriate SQLAlchemy engine for the configured DB URL.""" if DB_URL and DB_URL.startswith('sqlite+sqlcipher://'): if not DATABASE_PASSWORD or DATABASE_PASSWORD.strip() == '': raise ValueError('DATABASE_PASSWORD is required when using sqlite+sqlcipher:// URLs') - # Extract database path from SQLCipher URL db_path = DB_URL.replace('sqlite+sqlcipher://', '') if db_path.startswith('/'): - db_path = db_path[1:] # Remove leading slash for relative paths + db_path = db_path[1:] - # Create a custom creator function that uses sqlcipher3 - def create_sqlcipher_connection(): + def _sqlcipher_creator(): import sqlcipher3 conn = sqlcipher3.connect(db_path, check_same_thread=False) conn.execute(f"PRAGMA key = '{DATABASE_PASSWORD}'") return conn - connectable = create_engine( - 'sqlite://', # Dummy URL since we're using creator - creator=create_sqlcipher_connection, - echo=False, - ) - else: - # Standard database connection (existing logic) - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix='sqlalchemy.', - poolclass=pool.NullPool, - ) + return create_engine('sqlite://', creator=_sqlcipher_creator, echo=False) + return engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix='sqlalchemy.', + poolclass=pool.NullPool, + ) + + +def run_migrations_online() -> None: + """Run migrations against a live database connection.""" + connectable = _build_connectable() with connectable.connect() as connection: context.configure(connection=connection, target_metadata=target_metadata) - with context.begin_transaction(): context.run_migrations() +# ── Entrypoint ─────────────────────────────────────────────────────────────── + if context.is_offline_mode(): run_migrations_offline() else: diff --git a/backend/open_webui/migrations/util.py b/backend/open_webui/migrations/util.py index 6ea2a5f4bb..606bdc9479 100644 --- a/backend/open_webui/migrations/util.py +++ b/backend/open_webui/migrations/util.py @@ -1,15 +1,19 @@ +from __future__ import annotations + +"""Alembic migration utilities.""" + from alembic import op -from sqlalchemy import Inspector +from sqlalchemy import inspect -def get_existing_tables(): - con = op.get_bind() - inspector = Inspector.from_engine(con) - tables = set(inspector.get_table_names()) - return tables +def get_existing_tables() -> set[str]: + """Return table names already present in the database.""" + conn = op.get_bind() + return set(inspect(conn).get_table_names()) -def get_revision_id(): +def get_revision_id() -> str: + """Generate a short random revision identifier.""" import uuid - return str(uuid.uuid4()).replace('-', '')[:12] + return uuid.uuid4().hex[:12] diff --git a/backend/open_webui/migrations/versions/018012973d35_add_indexes.py b/backend/open_webui/migrations/versions/018012973d35_add_indexes.py index c5016e1a8b..ca3313c7f0 100644 --- a/backend/open_webui/migrations/versions/018012973d35_add_indexes.py +++ b/backend/open_webui/migrations/versions/018012973d35_add_indexes.py @@ -6,8 +6,8 @@ Create Date: 2025-08-13 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '018012973d35' down_revision = 'd31026856c01' @@ -16,18 +16,34 @@ depends_on = None def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + + def _idx_exists(table, idx_name): + return any(i['name'] == idx_name for i in inspector.get_indexes(table)) + # Chat table indexes - op.create_index('folder_id_idx', 'chat', ['folder_id']) - op.create_index('user_id_pinned_idx', 'chat', ['user_id', 'pinned']) - op.create_index('user_id_archived_idx', 'chat', ['user_id', 'archived']) - op.create_index('updated_at_user_id_idx', 'chat', ['updated_at', 'user_id']) - op.create_index('folder_id_user_id_idx', 'chat', ['folder_id', 'user_id']) + if not _idx_exists('chat', 'folder_id_idx'): + op.create_index('folder_id_idx', 'chat', ['folder_id']) + if not _idx_exists('chat', 'user_id_pinned_idx'): + op.create_index('user_id_pinned_idx', 'chat', ['user_id', 'pinned']) + if not _idx_exists('chat', 'user_id_archived_idx'): + op.create_index('user_id_archived_idx', 'chat', ['user_id', 'archived']) + if not _idx_exists('chat', 'updated_at_user_id_idx'): + op.create_index('updated_at_user_id_idx', 'chat', ['updated_at', 'user_id']) + if not _idx_exists('chat', 'folder_id_user_id_idx'): + op.create_index('folder_id_user_id_idx', 'chat', ['folder_id', 'user_id']) # Tag table index - op.create_index('user_id_idx', 'tag', ['user_id']) + if not _idx_exists('tag', 'user_id_idx'): + op.create_index('user_id_idx', 'tag', ['user_id']) - # Function table index - op.create_index('is_global_idx', 'function', ['is_global']) + # Function table index (only if is_global column exists — added by a later migration) + conn = op.get_bind() + inspector = sa.inspect(conn) + func_cols = {c['name'] for c in inspector.get_columns('function')} + if 'is_global' in func_cols and not _idx_exists('function', 'is_global_idx'): + op.create_index('is_global_idx', 'function', ['is_global']) def downgrade(): diff --git a/backend/open_webui/migrations/versions/1af9b942657b_migrate_tags.py b/backend/open_webui/migrations/versions/1af9b942657b_migrate_tags.py index caffb7e3b4..00d36375d0 100644 --- a/backend/open_webui/migrations/versions/1af9b942657b_migrate_tags.py +++ b/backend/open_webui/migrations/versions/1af9b942657b_migrate_tags.py @@ -6,13 +6,13 @@ Create Date: 2024-10-09 21:02:35.241684 """ -from alembic import op -import sqlalchemy as sa -from sqlalchemy.sql import table, select, update, column -from sqlalchemy.engine.reflection import Inspector - import json +import sqlalchemy as sa +from alembic import op +from sqlalchemy.engine.reflection import Inspector +from sqlalchemy.sql import column, select, table, update + revision = '1af9b942657b' down_revision = '242a2047eae0' branch_labels = None @@ -93,8 +93,11 @@ def upgrade(): conn.execute(update_stmt) # Add columns `pinned` and `meta` to 'chat' - op.add_column('chat', sa.Column('pinned', sa.Boolean(), nullable=True)) - op.add_column('chat', sa.Column('meta', sa.JSON(), nullable=False, server_default='{}')) + chat_columns = {c['name'] for c in inspector.get_columns('chat')} + if 'pinned' not in chat_columns: + op.add_column('chat', sa.Column('pinned', sa.Boolean(), nullable=True)) + if 'meta' not in chat_columns: + op.add_column('chat', sa.Column('meta', sa.JSON(), nullable=False, server_default='{}')) chatidtag = table('chatidtag', column('chat_id', sa.String()), column('tag_name', sa.String())) chat = table( diff --git a/backend/open_webui/migrations/versions/242a2047eae0_update_chat_table.py b/backend/open_webui/migrations/versions/242a2047eae0_update_chat_table.py index 7fadb05a92..e1c42bfb70 100644 --- a/backend/open_webui/migrations/versions/242a2047eae0_update_chat_table.py +++ b/backend/open_webui/migrations/versions/242a2047eae0_update_chat_table.py @@ -6,12 +6,12 @@ Create Date: 2024-10-09 21:02:35.241684 """ -from alembic import op -import sqlalchemy as sa -from sqlalchemy.sql import table, select, update - import json +import sqlalchemy as sa +from alembic import op +from sqlalchemy.sql import select, table, update + revision = '242a2047eae0' down_revision = '6a39f3d8e55c' branch_labels = None @@ -47,29 +47,32 @@ def upgrade(): # If the column is already JSON, no need to do anything pass - # Step 3: Migrate data from 'old_chat' to 'chat' - chat_table = table( - 'chat', - sa.Column('id', sa.String(), primary_key=True), - sa.Column('old_chat', sa.Text()), - sa.Column('chat', sa.JSON()), - ) + # Step 3: Migrate data from 'old_chat' to 'chat' (only if old_chat exists) + # Re-check columns after potential rename above + current_cols = {c['name'] for c in inspector.get_columns('chat')} + if 'old_chat' in current_cols: + chat_table = table( + 'chat', + sa.Column('id', sa.String(), primary_key=True), + sa.Column('old_chat', sa.Text()), + sa.Column('chat', sa.JSON()), + ) - # - Selecting all data from the table - connection = op.get_bind() - results = connection.execute(select(chat_table.c.id, chat_table.c.old_chat)) - for row in results: - try: - # Convert text JSON to actual JSON object, assuming the text is in JSON format - json_data = json.loads(row.old_chat) - except json.JSONDecodeError: - json_data = None # Handle cases where the text cannot be converted to JSON + # - Selecting all data from the table + connection = op.get_bind() + results = connection.execute(select(chat_table.c.id, chat_table.c.old_chat)) + for row in results: + try: + # Convert text JSON to actual JSON object, assuming the text is in JSON format + json_data = json.loads(row.old_chat) + except json.JSONDecodeError: + json_data = None # Handle cases where the text cannot be converted to JSON - connection.execute(sa.update(chat_table).where(chat_table.c.id == row.id).values(chat=json_data)) + connection.execute(sa.update(chat_table).where(chat_table.c.id == row.id).values(chat=json_data)) - # Step 4: Drop 'old_chat' column - print("Dropping 'old_chat' column") - op.drop_column('chat', 'old_chat') + # Step 4: Drop 'old_chat' column + print("Dropping 'old_chat' column") + op.drop_column('chat', 'old_chat') def downgrade(): diff --git a/backend/open_webui/migrations/versions/2f1211949ecc_update_message_and_channel_member_table.py b/backend/open_webui/migrations/versions/2f1211949ecc_update_message_and_channel_member_table.py index 51a8e329f1..1c0cb6da81 100644 --- a/backend/open_webui/migrations/versions/2f1211949ecc_update_message_and_channel_member_table.py +++ b/backend/open_webui/migrations/versions/2f1211949ecc_update_message_and_channel_member_table.py @@ -8,9 +8,9 @@ Create Date: 2025-11-27 03:07:56.200231 from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa import open_webui.internal.db +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '2f1211949ecc' @@ -20,63 +20,76 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + # New columns to be added to channel_member table - op.add_column('channel_member', sa.Column('status', sa.Text(), nullable=True)) - op.add_column( - 'channel_member', - sa.Column( - 'is_active', - sa.Boolean(), - nullable=False, - default=True, - server_default=sa.sql.expression.true(), - ), - ) - - op.add_column( - 'channel_member', - sa.Column( - 'is_channel_muted', - sa.Boolean(), - nullable=False, - default=False, - server_default=sa.sql.expression.false(), - ), - ) - op.add_column( - 'channel_member', - sa.Column( - 'is_channel_pinned', - sa.Boolean(), - nullable=False, - default=False, - server_default=sa.sql.expression.false(), - ), - ) - - op.add_column('channel_member', sa.Column('data', sa.JSON(), nullable=True)) - op.add_column('channel_member', sa.Column('meta', sa.JSON(), nullable=True)) - - op.add_column('channel_member', sa.Column('joined_at', sa.BigInteger(), nullable=False)) - op.add_column('channel_member', sa.Column('left_at', sa.BigInteger(), nullable=True)) - - op.add_column('channel_member', sa.Column('last_read_at', sa.BigInteger(), nullable=True)) - - op.add_column('channel_member', sa.Column('updated_at', sa.BigInteger(), nullable=True)) + cm_cols = {c['name'] for c in inspector.get_columns('channel_member')} + if 'status' not in cm_cols: + op.add_column('channel_member', sa.Column('status', sa.Text(), nullable=True)) + if 'is_active' not in cm_cols: + op.add_column( + 'channel_member', + sa.Column( + 'is_active', + sa.Boolean(), + nullable=False, + default=True, + server_default=sa.sql.expression.true(), + ), + ) + if 'is_channel_muted' not in cm_cols: + op.add_column( + 'channel_member', + sa.Column( + 'is_channel_muted', + sa.Boolean(), + nullable=False, + default=False, + server_default=sa.sql.expression.false(), + ), + ) + if 'is_channel_pinned' not in cm_cols: + op.add_column( + 'channel_member', + sa.Column( + 'is_channel_pinned', + sa.Boolean(), + nullable=False, + default=False, + server_default=sa.sql.expression.false(), + ), + ) + if 'data' not in cm_cols: + op.add_column('channel_member', sa.Column('data', sa.JSON(), nullable=True)) + if 'meta' not in cm_cols: + op.add_column('channel_member', sa.Column('meta', sa.JSON(), nullable=True)) + if 'joined_at' not in cm_cols: + op.add_column('channel_member', sa.Column('joined_at', sa.BigInteger(), nullable=False)) + if 'left_at' not in cm_cols: + op.add_column('channel_member', sa.Column('left_at', sa.BigInteger(), nullable=True)) + if 'last_read_at' not in cm_cols: + op.add_column('channel_member', sa.Column('last_read_at', sa.BigInteger(), nullable=True)) + if 'updated_at' not in cm_cols: + op.add_column('channel_member', sa.Column('updated_at', sa.BigInteger(), nullable=True)) # New columns to be added to message table - op.add_column( - 'message', - sa.Column( - 'is_pinned', - sa.Boolean(), - nullable=False, - default=False, - server_default=sa.sql.expression.false(), - ), - ) - op.add_column('message', sa.Column('pinned_at', sa.BigInteger(), nullable=True)) - op.add_column('message', sa.Column('pinned_by', sa.Text(), nullable=True)) + msg_cols = {c['name'] for c in inspector.get_columns('message')} + if 'is_pinned' not in msg_cols: + op.add_column( + 'message', + sa.Column( + 'is_pinned', + sa.Boolean(), + nullable=False, + default=False, + server_default=sa.sql.expression.false(), + ), + ) + if 'pinned_at' not in msg_cols: + op.add_column('message', sa.Column('pinned_at', sa.BigInteger(), nullable=True)) + if 'pinned_by' not in msg_cols: + op.add_column('message', sa.Column('pinned_by', sa.Text(), nullable=True)) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/374d2f66af06_add_prompt_history_table.py b/backend/open_webui/migrations/versions/374d2f66af06_add_prompt_history_table.py index c412107032..69dd73c700 100644 --- a/backend/open_webui/migrations/versions/374d2f66af06_add_prompt_history_table.py +++ b/backend/open_webui/migrations/versions/374d2f66af06_add_prompt_history_table.py @@ -6,11 +6,11 @@ Create Date: 2026-01-23 17:15:00.000000 """ -from typing import Sequence, Union import uuid +from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op revision: str = '374d2f66af06' down_revision: Union[str, None] = 'c440947495f3' @@ -20,150 +20,167 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) - # Step 1: Read existing data from OLD table (schema likely command as PK) - # We use batch_alter previously, but we want to move to new table. - # We need to assume the OLD structure. + # If the final state already exists (prompt has 'id' PK + prompt_history exists), + # the migration completed successfully on a prior run — nothing to do. + if 'prompt_history' in existing_tables and 'prompt_new' not in existing_tables: + # prompt_history exists and prompt_new was already renamed → done + prompt_cols = {c['name'] for c in inspector.get_columns('prompt')} + if 'id' in prompt_cols and 'version_id' in prompt_cols: + return - old_prompt_table = sa.table( - 'prompt', - sa.column('command', sa.Text()), - sa.column('user_id', sa.Text()), - sa.column('title', sa.Text()), - sa.column('content', sa.Text()), - sa.column('timestamp', sa.BigInteger()), - sa.column('access_control', sa.JSON()), - ) - - # Check if table exists/read data - try: - existing_prompts = conn.execute( - sa.select( - old_prompt_table.c.command, - old_prompt_table.c.user_id, - old_prompt_table.c.title, - old_prompt_table.c.content, - old_prompt_table.c.timestamp, - old_prompt_table.c.access_control, + # Step 1: Read existing data from OLD table (schema: command as PK) + # Only read if the old-schema prompt table still exists (has 'command' but no 'version_id') + existing_prompts = [] + if 'prompt' in existing_tables and 'prompt_new' not in existing_tables: + prompt_cols = {c['name'] for c in inspector.get_columns('prompt')} + if 'command' in prompt_cols and 'version_id' not in prompt_cols: + old_prompt_table = sa.table( + 'prompt', + sa.column('command', sa.Text()), + sa.column('user_id', sa.Text()), + sa.column('title', sa.Text()), + sa.column('content', sa.Text()), + sa.column('timestamp', sa.BigInteger()), + sa.column('access_control', sa.JSON()), ) - ).fetchall() - except Exception: - # Fallback if table doesn't exist (new install) - existing_prompts = [] + try: + existing_prompts = conn.execute( + sa.select( + old_prompt_table.c.command, + old_prompt_table.c.user_id, + old_prompt_table.c.title, + old_prompt_table.c.content, + old_prompt_table.c.timestamp, + old_prompt_table.c.access_control, + ) + ).fetchall() + except Exception: + existing_prompts = [] - # Step 2: Create new prompt table with 'id' as PRIMARY KEY - op.create_table( - 'prompt_new', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('command', sa.String(), unique=True, index=True), - sa.Column('user_id', sa.String(), nullable=False), - sa.Column('name', sa.Text(), nullable=False), - sa.Column('content', sa.Text(), nullable=False), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('access_control', sa.JSON(), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'), - sa.Column('version_id', sa.Text(), nullable=True), - sa.Column('tags', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - ) - - # Step 3: Create prompt_history table - op.create_table( - 'prompt_history', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('prompt_id', sa.Text(), nullable=False, index=True), - sa.Column('parent_id', sa.Text(), nullable=True), - sa.Column('snapshot', sa.JSON(), nullable=False), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('commit_message', sa.Text(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - ) - - # Step 4: Migrate data - prompt_new_table = sa.table( - 'prompt_new', - sa.column('id', sa.Text()), - sa.column('command', sa.String()), - sa.column('user_id', sa.String()), - sa.column('name', sa.Text()), - sa.column('content', sa.Text()), - sa.column('data', sa.JSON()), - sa.column('meta', sa.JSON()), - sa.column('access_control', sa.JSON()), - sa.column('is_active', sa.Boolean()), - sa.column('version_id', sa.Text()), - sa.column('tags', sa.JSON()), - sa.column('created_at', sa.BigInteger()), - sa.column('updated_at', sa.BigInteger()), - ) - - prompt_history_table = sa.table( - 'prompt_history', - sa.column('id', sa.Text()), - sa.column('prompt_id', sa.Text()), - sa.column('parent_id', sa.Text()), - sa.column('snapshot', sa.JSON()), - sa.column('user_id', sa.Text()), - sa.column('commit_message', sa.Text()), - sa.column('created_at', sa.BigInteger()), - ) - - for row in existing_prompts: - command = row[0] - user_id = row[1] - title = row[2] - content = row[3] - timestamp = row[4] - access_control = row[5] - - new_uuid = str(uuid.uuid4()) - history_uuid = str(uuid.uuid4()) - clean_command = command[1:] if command and command.startswith('/') else command - - # Insert into prompt_new - conn.execute( - sa.insert(prompt_new_table).values( - id=new_uuid, - command=clean_command, - user_id=user_id, - name=title, - content=content, - data={}, - meta={}, - access_control=access_control, - is_active=True, - version_id=history_uuid, - tags=[], - created_at=timestamp, - updated_at=timestamp, - ) + # Step 2: Create new prompt table with 'id' as PRIMARY KEY (if not already created) + if 'prompt_new' not in existing_tables: + op.create_table( + 'prompt_new', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('command', sa.String(), unique=True, index=True), + sa.Column('user_id', sa.String(), nullable=False), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('content', sa.Text(), nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('access_control', sa.JSON(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False, server_default='1'), + sa.Column('version_id', sa.Text(), nullable=True), + sa.Column('tags', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), ) - # Create initial history entry - conn.execute( - sa.insert(prompt_history_table).values( - id=history_uuid, - prompt_id=new_uuid, - parent_id=None, - snapshot={ - 'name': title, - 'content': content, - 'command': clean_command, - 'data': {}, - 'meta': {}, - 'access_control': access_control, - }, - user_id=user_id, - commit_message=None, - created_at=timestamp, - ) + # Step 3: Create prompt_history table (if not already created) + if 'prompt_history' not in existing_tables: + op.create_table( + 'prompt_history', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('prompt_id', sa.Text(), nullable=False, index=True), + sa.Column('parent_id', sa.Text(), nullable=True), + sa.Column('snapshot', sa.JSON(), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('commit_message', sa.Text(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), ) - # Step 5: Replace old table with new one - op.drop_table('prompt') - op.rename_table('prompt_new', 'prompt') + # Step 4: Migrate data (only if we have old data to migrate) + if existing_prompts: + prompt_new_table = sa.table( + 'prompt_new', + sa.column('id', sa.Text()), + sa.column('command', sa.String()), + sa.column('user_id', sa.String()), + sa.column('name', sa.Text()), + sa.column('content', sa.Text()), + sa.column('data', sa.JSON()), + sa.column('meta', sa.JSON()), + sa.column('access_control', sa.JSON()), + sa.column('is_active', sa.Boolean()), + sa.column('version_id', sa.Text()), + sa.column('tags', sa.JSON()), + sa.column('created_at', sa.BigInteger()), + sa.column('updated_at', sa.BigInteger()), + ) + + prompt_history_table = sa.table( + 'prompt_history', + sa.column('id', sa.Text()), + sa.column('prompt_id', sa.Text()), + sa.column('parent_id', sa.Text()), + sa.column('snapshot', sa.JSON()), + sa.column('user_id', sa.Text()), + sa.column('commit_message', sa.Text()), + sa.column('created_at', sa.BigInteger()), + ) + + for row in existing_prompts: + command = row[0] + user_id = row[1] + title = row[2] + content = row[3] + timestamp = row[4] + access_control = row[5] + + new_uuid = str(uuid.uuid4()) + history_uuid = str(uuid.uuid4()) + clean_command = command[1:] if command and command.startswith('/') else command + + # Insert into prompt_new + conn.execute( + sa.insert(prompt_new_table).values( + id=new_uuid, + command=clean_command, + user_id=user_id, + name=title, + content=content, + data={}, + meta={}, + access_control=access_control, + is_active=True, + version_id=history_uuid, + tags=[], + created_at=timestamp, + updated_at=timestamp, + ) + ) + + # Create initial history entry + conn.execute( + sa.insert(prompt_history_table).values( + id=history_uuid, + prompt_id=new_uuid, + parent_id=None, + snapshot={ + 'name': title, + 'content': content, + 'command': clean_command, + 'data': {}, + 'meta': {}, + 'access_control': access_control, + }, + user_id=user_id, + commit_message=None, + created_at=timestamp, + ) + ) + + # Step 5: Replace old table with new one (only if prompt_new exists) + # Re-check tables after potential creation above + inspector.clear_cache() + current_tables = set(inspector.get_table_names()) + if 'prompt_new' in current_tables: + if 'prompt' in current_tables: + op.drop_table('prompt') + op.rename_table('prompt_new', 'prompt') def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/3781e22d8b01_update_message_table.py b/backend/open_webui/migrations/versions/3781e22d8b01_update_message_table.py index 170137f23c..aaebaacb49 100644 --- a/backend/open_webui/migrations/versions/3781e22d8b01_update_message_table.py +++ b/backend/open_webui/migrations/versions/3781e22d8b01_update_message_table.py @@ -6,8 +6,8 @@ Create Date: 2024-12-30 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '3781e22d8b01' down_revision = '7826ab40b532' @@ -16,38 +16,48 @@ depends_on = None def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + # Add 'type' column to the 'channel' table - op.add_column( - 'channel', - sa.Column( - 'type', - sa.Text(), - nullable=True, - ), - ) + channel_cols = {c['name'] for c in inspector.get_columns('channel')} + if 'type' not in channel_cols: + op.add_column( + 'channel', + sa.Column( + 'type', + sa.Text(), + nullable=True, + ), + ) # Add 'parent_id' column to the 'message' table for threads - op.add_column( - 'message', - sa.Column('parent_id', sa.Text(), nullable=True), - ) + message_cols = {c['name'] for c in inspector.get_columns('message')} + if 'parent_id' not in message_cols: + op.add_column( + 'message', + sa.Column('parent_id', sa.Text(), nullable=True), + ) - op.create_table( - 'message_reaction', - sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), # Unique reaction ID - sa.Column('user_id', sa.Text(), nullable=False), # User who reacted - sa.Column('message_id', sa.Text(), nullable=False), # Message that was reacted to - sa.Column('name', sa.Text(), nullable=False), # Reaction name (e.g. "thumbs_up") - sa.Column('created_at', sa.BigInteger(), nullable=True), # Timestamp of when the reaction was added - ) + if 'message_reaction' not in existing_tables: + op.create_table( + 'message_reaction', + sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), # Unique reaction ID + sa.Column('user_id', sa.Text(), nullable=False), # User who reacted + sa.Column('message_id', sa.Text(), nullable=False), # Message that was reacted to + sa.Column('name', sa.Text(), nullable=False), # Reaction name (e.g. "thumbs_up") + sa.Column('created_at', sa.BigInteger(), nullable=True), # Timestamp of when the reaction was added + ) - op.create_table( - 'channel_member', - sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), # Record ID for the membership row - sa.Column('channel_id', sa.Text(), nullable=False), # Associated channel - sa.Column('user_id', sa.Text(), nullable=False), # Associated user - sa.Column('created_at', sa.BigInteger(), nullable=True), # Timestamp of when the user joined the channel - ) + if 'channel_member' not in existing_tables: + op.create_table( + 'channel_member', + sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), # Record ID for the membership row + sa.Column('channel_id', sa.Text(), nullable=False), # Associated channel + sa.Column('user_id', sa.Text(), nullable=False), # Associated user + sa.Column('created_at', sa.BigInteger(), nullable=True), # Timestamp of when the user joined the channel + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/37f288994c47_add_group_member_table.py b/backend/open_webui/migrations/versions/37f288994c47_add_group_member_table.py index 4bf24d3b46..daf0aef172 100644 --- a/backend/open_webui/migrations/versions/37f288994c47_add_group_member_table.py +++ b/backend/open_webui/migrations/versions/37f288994c47_add_group_member_table.py @@ -6,13 +6,13 @@ Create Date: 2025-11-17 03:45:25.123939 """ -import uuid -import time import json +import time +import uuid from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '37f288994c47' @@ -22,6 +22,13 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'group_member' in existing_tables: + return # Already created — skip everything + # 1. Create new table op.create_table( 'group_member', diff --git a/backend/open_webui/migrations/versions/38d63c18f30f_add_oauth_session_table.py b/backend/open_webui/migrations/versions/38d63c18f30f_add_oauth_session_table.py index d415f500f3..b212c7f43a 100644 --- a/backend/open_webui/migrations/versions/38d63c18f30f_add_oauth_session_table.py +++ b/backend/open_webui/migrations/versions/38d63c18f30f_add_oauth_session_table.py @@ -8,8 +8,8 @@ Create Date: 2025-09-08 14:19:59.583921 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '38d63c18f30f' @@ -19,50 +19,39 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - # Ensure 'id' column in 'user' table is unique and primary key (ForeignKey constraint) inspector = sa.inspect(op.get_bind()) - columns = inspector.get_columns('user') + existing_tables = set(inspector.get_table_names()) - pk_columns = inspector.get_pk_constraint('user')['constrained_columns'] - id_column = next((col for col in columns if col['name'] == 'id'), None) + # ── Create oauth_session table (idempotent) ─────────────────────── + if 'oauth_session' not in existing_tables: + op.create_table( + 'oauth_session', + sa.Column('id', sa.Text(), primary_key=True, nullable=False, unique=True), + sa.Column( + 'user_id', + sa.Text(), + sa.ForeignKey('user.id', ondelete='CASCADE'), + nullable=False, + ), + sa.Column('provider', sa.Text(), nullable=False), + sa.Column('token', sa.Text(), nullable=False), + sa.Column('expires_at', sa.BigInteger(), nullable=False), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + ) - if id_column and not id_column.get('unique', False): - unique_constraints = inspector.get_unique_constraints('user') - unique_columns = {tuple(u['column_names']) for u in unique_constraints} + # Create indexes (idempotent — no-ops when table was just created + # with the columns above, and safe to call if indexes already exist). + existing_indexes = { + idx['name'] for idx in inspector.get_indexes('oauth_session') + } if 'oauth_session' in existing_tables else set() - with op.batch_alter_table('user') as batch_op: - # If primary key is wrong, drop it - if pk_columns and pk_columns != ['id']: - batch_op.drop_constraint(inspector.get_pk_constraint('user')['name'], type_='primary') - - # Add unique constraint if missing - if ('id',) not in unique_columns: - batch_op.create_unique_constraint('uq_user_id', ['id']) - - # Re-create correct primary key - batch_op.create_primary_key('pk_user_id', ['id']) - - # Create oauth_session table - op.create_table( - 'oauth_session', - sa.Column('id', sa.Text(), primary_key=True, nullable=False, unique=True), - sa.Column( - 'user_id', - sa.Text(), - sa.ForeignKey('user.id', ondelete='CASCADE'), - nullable=False, - ), - sa.Column('provider', sa.Text(), nullable=False), - sa.Column('token', sa.Text(), nullable=False), - sa.Column('expires_at', sa.BigInteger(), nullable=False), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - ) - - # Create indexes for better performance - op.create_index('idx_oauth_session_user_id', 'oauth_session', ['user_id']) - op.create_index('idx_oauth_session_expires_at', 'oauth_session', ['expires_at']) - op.create_index('idx_oauth_session_user_provider', 'oauth_session', ['user_id', 'provider']) + if 'idx_oauth_session_user_id' not in existing_indexes: + op.create_index('idx_oauth_session_user_id', 'oauth_session', ['user_id']) + if 'idx_oauth_session_expires_at' not in existing_indexes: + op.create_index('idx_oauth_session_expires_at', 'oauth_session', ['expires_at']) + if 'idx_oauth_session_user_provider' not in existing_indexes: + op.create_index('idx_oauth_session_user_provider', 'oauth_session', ['user_id', 'provider']) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/3ab32c4b8f59_update_tags.py b/backend/open_webui/migrations/versions/3ab32c4b8f59_update_tags.py index 31bd355ede..8aaa4d4d47 100644 --- a/backend/open_webui/migrations/versions/3ab32c4b8f59_update_tags.py +++ b/backend/open_webui/migrations/versions/3ab32c4b8f59_update_tags.py @@ -6,13 +6,13 @@ Create Date: 2024-10-09 21:02:35.241684 """ -from alembic import op -import sqlalchemy as sa -from sqlalchemy.sql import table, select, update, column -from sqlalchemy.engine.reflection import Inspector - import json +import sqlalchemy as sa +from alembic import op +from sqlalchemy.engine.reflection import Inspector +from sqlalchemy.sql import column, select, table, update + revision = '3ab32c4b8f59' down_revision = '1af9b942657b' branch_labels = None diff --git a/backend/open_webui/migrations/versions/3af16a1c9fb6_update_user_table.py b/backend/open_webui/migrations/versions/3af16a1c9fb6_update_user_table.py index 629c1c8c24..e3767a71a7 100644 --- a/backend/open_webui/migrations/versions/3af16a1c9fb6_update_user_table.py +++ b/backend/open_webui/migrations/versions/3af16a1c9fb6_update_user_table.py @@ -8,8 +8,8 @@ Create Date: 2025-08-21 02:07:18.078283 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '3af16a1c9fb6' @@ -19,10 +19,18 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - op.add_column('user', sa.Column('username', sa.String(length=50), nullable=True)) - op.add_column('user', sa.Column('bio', sa.Text(), nullable=True)) - op.add_column('user', sa.Column('gender', sa.Text(), nullable=True)) - op.add_column('user', sa.Column('date_of_birth', sa.Date(), nullable=True)) + conn = op.get_bind() + inspector = sa.inspect(conn) + user_cols = {c['name'] for c in inspector.get_columns('user')} + + if 'username' not in user_cols: + op.add_column('user', sa.Column('username', sa.String(length=50), nullable=True)) + if 'bio' not in user_cols: + op.add_column('user', sa.Column('bio', sa.Text(), nullable=True)) + if 'gender' not in user_cols: + op.add_column('user', sa.Column('gender', sa.Text(), nullable=True)) + if 'date_of_birth' not in user_cols: + op.add_column('user', sa.Column('date_of_birth', sa.Date(), nullable=True)) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/3c9b0ca343fd_add_knowledge_directory_table.py b/backend/open_webui/migrations/versions/3c9b0ca343fd_add_knowledge_directory_table.py new file mode 100644 index 0000000000..ab2b0c9498 --- /dev/null +++ b/backend/open_webui/migrations/versions/3c9b0ca343fd_add_knowledge_directory_table.py @@ -0,0 +1,69 @@ +"""add knowledge_directory table + +Revision ID: 3c9b0ca343fd +Revises: a0b1c2d3e4f5 +Create Date: 2026-05-13 21:58:40.832482 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision: str = '3c9b0ca343fd' +down_revision: Union[str, None] = 'a0b1c2d3e4f5' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'knowledge_directory' not in existing_tables: + # Create knowledge_directory table + op.create_table( + 'knowledge_directory', + sa.Column('id', sa.Text(), nullable=False), + sa.Column('knowledge_id', sa.Text(), nullable=False), + sa.Column('parent_id', sa.Text(), nullable=True), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + sa.ForeignKeyConstraint(['knowledge_id'], ['knowledge.id'], ondelete='CASCADE'), + sa.ForeignKeyConstraint(['parent_id'], ['knowledge_directory.id'], ondelete='CASCADE'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('knowledge_id', 'parent_id', 'name', name='uq_knowledge_directory_knowledge_parent_name'), + ) + op.create_index('ix_knowledge_directory_knowledge_id', 'knowledge_directory', ['knowledge_id']) + op.create_index('ix_knowledge_directory_parent_id', 'knowledge_directory', ['parent_id']) + + # Add directory_id column to knowledge_file + kf_cols = {c['name'] for c in inspector.get_columns('knowledge_file')} + if 'directory_id' not in kf_cols: + with op.batch_alter_table('knowledge_file') as batch: + batch.add_column(sa.Column('directory_id', sa.Text(), nullable=True)) + batch.create_foreign_key( + 'fk_knowledge_file_directory_id', + 'knowledge_directory', + ['directory_id'], + ['id'], + ondelete='SET NULL', + ) + batch.create_index('ix_knowledge_file_directory_id', ['directory_id']) + + +def downgrade() -> None: + # Remove directory_id from knowledge_file + with op.batch_alter_table('knowledge_file') as batch: + batch.drop_index('ix_knowledge_file_directory_id') + batch.drop_constraint('fk_knowledge_file_directory_id', type_='foreignkey') + batch.drop_column('directory_id') + + # Drop knowledge_directory table + op.drop_index('ix_knowledge_directory_parent_id', table_name='knowledge_directory') + op.drop_index('ix_knowledge_directory_knowledge_id', table_name='knowledge_directory') + op.drop_table('knowledge_directory') diff --git a/backend/open_webui/migrations/versions/3e0e00844bb0_add_knowledge_file_table.py b/backend/open_webui/migrations/versions/3e0e00844bb0_add_knowledge_file_table.py index f772987a44..70c0562749 100644 --- a/backend/open_webui/migrations/versions/3e0e00844bb0_add_knowledge_file_table.py +++ b/backend/open_webui/migrations/versions/3e0e00844bb0_add_knowledge_file_table.py @@ -6,16 +6,15 @@ Create Date: 2025-12-02 06:54:19.401334 """ +import json +import time +import uuid from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa -from sqlalchemy import inspect import open_webui.internal.db - -import time -import json -import uuid +import sqlalchemy as sa +from alembic import op +from sqlalchemy import inspect # revision identifiers, used by Alembic. revision: str = '3e0e00844bb0' @@ -25,6 +24,13 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'knowledge_file' in existing_tables: + return # Already created — skip everything + op.create_table( 'knowledge_file', sa.Column('id', sa.Text(), primary_key=True), diff --git a/backend/open_webui/migrations/versions/461111b60977_add_missing_primary_keys_to_legacy_.py b/backend/open_webui/migrations/versions/461111b60977_add_missing_primary_keys_to_legacy_.py new file mode 100644 index 0000000000..67b737c530 --- /dev/null +++ b/backend/open_webui/migrations/versions/461111b60977_add_missing_primary_keys_to_legacy_.py @@ -0,0 +1,64 @@ +"""add missing primary keys to legacy peewee tables + +Revision ID: 461111b60977 +Revises: 3c9b0ca343fd +Create Date: 2026-05-14 04:38:14.000000 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = '461111b60977' +down_revision: Union[str, None] = '3c9b0ca343fd' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + +# Tables bootstrapped by the old Peewee migration layer that may have +# UNIQUE(id) but no PRIMARY KEY constraint. Fresh Alembic installs +# already have correct PKs from 7e5b5dc7342b_init.py. +# 'tag' uses a composite PK since the same tag name can exist for multiple users. +LEGACY_TABLES = { + 'auth': ['id'], 'chat': ['id'], 'chatidtag': ['id'], 'document': ['id'], + 'file': ['id'], 'function': ['id'], 'memory': ['id'], 'model': ['id'], + 'prompt': ['id'], 'tag': ['id', 'user_id'], 'tool': ['id'], 'user': ['id'], +} + + +def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + for table_name, pk_columns in LEGACY_TABLES.items(): + if table_name not in existing_tables: + continue + + pk = inspector.get_pk_constraint(table_name) + pk_cols = pk.get('constrained_columns', []) + + # Already has the correct PK — nothing to do + if sorted(pk_cols) == sorted(pk_columns): + continue + + # Check that all PK columns exist + columns = {c['name'] for c in inspector.get_columns(table_name)} + if not all(c in columns for c in pk_columns): + continue + + print(f"Promoting UNIQUE(id) -> PRIMARY KEY({', '.join(pk_columns)}) for '{table_name}'") + + conn.execute(sa.text(f'DROP TABLE IF EXISTS _alembic_tmp_{table_name}')) + with op.batch_alter_table(table_name) as batch_op: + # Drop existing PK if any (e.g. on wrong column) + if pk_cols and pk.get('name'): + batch_op.drop_constraint(pk['name'], type_='primary') + + batch_op.create_primary_key(f'pk_{table_name}', pk_columns) + + +def downgrade() -> None: + # Downgrade is a no-op — we don't want to remove PKs + pass diff --git a/backend/open_webui/migrations/versions/4ace53fd72c8_update_folder_table_datetime.py b/backend/open_webui/migrations/versions/4ace53fd72c8_update_folder_table_datetime.py index 91e0dce0be..e1e3b32635 100644 --- a/backend/open_webui/migrations/versions/4ace53fd72c8_update_folder_table_datetime.py +++ b/backend/open_webui/migrations/versions/4ace53fd72c8_update_folder_table_datetime.py @@ -6,8 +6,8 @@ Create Date: 2024-10-23 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '4ace53fd72c8' down_revision = 'af906e964978' @@ -16,6 +16,18 @@ depends_on = None def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + columns = {c['name']: c for c in inspector.get_columns('folder')} + + created_at_col = columns.get('created_at') + if not created_at_col: + return + + # Only convert if still DateTime — skip if already BigInteger + if isinstance(created_at_col['type'], sa.BigInteger): + return + # Perform safe alterations using batch operation with op.batch_alter_table('folder', schema=None) as batch_op: # Step 1: Remove server defaults for created_at and updated_at @@ -48,20 +60,24 @@ def upgrade(): def downgrade(): - # Downgrade: Convert columns back to DateTime and restore defaults + # Convert columns back to DateTime and restore defaults. Mirrors the + # upgrade's postgresql_using cast — without it, Postgres can't + # auto-cast BigInteger → timestamp and aborts with DatatypeMismatch. with op.batch_alter_table('folder', schema=None) as batch_op: batch_op.alter_column( 'created_at', type_=sa.DateTime(), existing_type=sa.BigInteger(), existing_nullable=False, - server_default=sa.func.now(), # Restoring server default on downgrade + server_default=sa.func.now(), + postgresql_using='to_timestamp(created_at)::timestamp without time zone', ) batch_op.alter_column( 'updated_at', type_=sa.DateTime(), existing_type=sa.BigInteger(), existing_nullable=False, - server_default=sa.func.now(), # Restoring server default on downgrade - onupdate=sa.func.now(), # Restoring onupdate behavior if it was there + server_default=sa.func.now(), + onupdate=sa.func.now(), + postgresql_using='to_timestamp(updated_at)::timestamp without time zone', ) diff --git a/backend/open_webui/migrations/versions/4de81c2a3af1_add_pinned_note_table.py b/backend/open_webui/migrations/versions/4de81c2a3af1_add_pinned_note_table.py new file mode 100644 index 0000000000..a7b019f35a --- /dev/null +++ b/backend/open_webui/migrations/versions/4de81c2a3af1_add_pinned_note_table.py @@ -0,0 +1,83 @@ +"""add pinned_note table + +Revision ID: 4de81c2a3af1 +Revises: 56359461a091 +Create Date: 2026-05-09 04:29:27.651341 + +""" + +from typing import Sequence, Union + +import open_webui.internal.db +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = '4de81c2a3af1' +down_revision: Union[str, None] = '56359461a091' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +import time +import uuid + +from sqlalchemy import insert, select, update +from sqlalchemy.sql import column, table + + +def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'pinned_note' not in existing_tables: + op.create_table( + 'pinned_note', + sa.Column('id', sa.Text(), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('note_id', sa.Text(), sa.ForeignKey('note.id', ondelete='CASCADE'), nullable=False), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user_id', 'note_id', name='uq_pinned_note'), + ) + + note_table = table('note', column('id', sa.Text), column('user_id', sa.Text), column('is_pinned', sa.Boolean)) + + pinned_note_table = table( + 'pinned_note', + column('id', sa.Text), + column('user_id', sa.Text), + column('note_id', sa.Text), + column('created_at', sa.BigInteger), + ) + + notes = conn.execute(select(note_table.c.id, note_table.c.user_id).where(note_table.c.is_pinned == True)).fetchall() + + if notes: + now = int(time.time_ns()) + conn.execute( + insert(pinned_note_table), + [{'id': str(uuid.uuid4()), 'user_id': note[1], 'note_id': note[0], 'created_at': now} for note in notes], + ) + + with op.batch_alter_table('note', schema=None) as batch_op: + batch_op.drop_column('is_pinned') + + +def downgrade() -> None: + with op.batch_alter_table('note', schema=None) as batch_op: + batch_op.add_column(sa.Column('is_pinned', sa.Boolean(), nullable=True)) + + conn = op.get_bind() + + note_table = table('note', column('id', sa.Text), column('is_pinned', sa.Boolean)) + + pinned_note_table = table('pinned_note', column('note_id', sa.Text)) + + notes = conn.execute(select(pinned_note_table.c.note_id)).fetchall() + + for note in notes: + conn.execute(update(note_table).where(note_table.c.id == note[0]).values(is_pinned=True)) + + op.drop_table('pinned_note') diff --git a/backend/open_webui/migrations/versions/56359461a091_add_calendar_tables.py b/backend/open_webui/migrations/versions/56359461a091_add_calendar_tables.py index e556440f56..571390a6fa 100644 --- a/backend/open_webui/migrations/versions/56359461a091_add_calendar_tables.py +++ b/backend/open_webui/migrations/versions/56359461a091_add_calendar_tables.py @@ -8,9 +8,8 @@ Create Date: 2026-04-19 16:20:58.162045 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision: str = '56359461a091' @@ -19,58 +18,84 @@ branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None +def _index_exists(inspector, index_name, table_name): + """Check if an index already exists on the given table.""" + indexes = inspector.get_indexes(table_name) + return any(idx['name'] == index_name for idx in indexes) + + def upgrade() -> None: - op.create_table( - 'calendar', - sa.Column('id', sa.Text(), nullable=False), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('name', sa.Text(), nullable=False), - sa.Column('color', sa.Text(), nullable=True), - sa.Column('is_default', sa.Boolean(), nullable=False), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - sa.PrimaryKeyConstraint('id'), - ) - op.create_index('ix_calendar_user', 'calendar', ['user_id'], unique=False) + conn = op.get_bind() + inspector = sa.inspect(conn) + tables = inspector.get_table_names() - op.create_table( - 'calendar_event', - sa.Column('id', sa.Text(), nullable=False), - sa.Column('calendar_id', sa.Text(), nullable=False), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('title', sa.Text(), nullable=False), - sa.Column('description', sa.Text(), nullable=True), - sa.Column('start_at', sa.BigInteger(), nullable=False), - sa.Column('end_at', sa.BigInteger(), nullable=True), - sa.Column('all_day', sa.Boolean(), nullable=False), - sa.Column('rrule', sa.Text(), nullable=True), - sa.Column('color', sa.Text(), nullable=True), - sa.Column('location', sa.Text(), nullable=True), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('is_cancelled', sa.Boolean(), nullable=False), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - sa.PrimaryKeyConstraint('id'), - ) - op.create_index('ix_calendar_event_calendar', 'calendar_event', ['calendar_id', 'start_at'], unique=False) - op.create_index('ix_calendar_event_user_date', 'calendar_event', ['user_id', 'start_at'], unique=False) + if 'calendar' not in tables: + op.create_table( + 'calendar', + sa.Column('id', sa.Text(), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('color', sa.Text(), nullable=True), + sa.Column('is_default', sa.Boolean(), nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + sa.PrimaryKeyConstraint('id'), + ) - op.create_table( - 'calendar_event_attendee', - sa.Column('id', sa.Text(), nullable=False), - sa.Column('event_id', sa.Text(), nullable=False), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('status', sa.Text(), nullable=False), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('event_id', 'user_id', name='uq_event_attendee'), - ) - op.create_index('ix_calendar_event_attendee_user', 'calendar_event_attendee', ['user_id', 'status'], unique=False) + inspector.clear_cache() + if 'calendar' in inspector.get_table_names(): + if not _index_exists(inspector, 'ix_calendar_user', 'calendar'): + op.create_index('ix_calendar_user', 'calendar', ['user_id'], unique=False) + + if 'calendar_event' not in tables: + op.create_table( + 'calendar_event', + sa.Column('id', sa.Text(), nullable=False), + sa.Column('calendar_id', sa.Text(), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('title', sa.Text(), nullable=False), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('start_at', sa.BigInteger(), nullable=False), + sa.Column('end_at', sa.BigInteger(), nullable=True), + sa.Column('all_day', sa.Boolean(), nullable=False), + sa.Column('rrule', sa.Text(), nullable=True), + sa.Column('color', sa.Text(), nullable=True), + sa.Column('location', sa.Text(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('is_cancelled', sa.Boolean(), nullable=False), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + sa.PrimaryKeyConstraint('id'), + ) + + inspector.clear_cache() + if 'calendar_event' in inspector.get_table_names(): + if not _index_exists(inspector, 'ix_calendar_event_calendar', 'calendar_event'): + op.create_index('ix_calendar_event_calendar', 'calendar_event', ['calendar_id', 'start_at'], unique=False) + if not _index_exists(inspector, 'ix_calendar_event_user_date', 'calendar_event'): + op.create_index('ix_calendar_event_user_date', 'calendar_event', ['user_id', 'start_at'], unique=False) + + if 'calendar_event_attendee' not in tables: + op.create_table( + 'calendar_event_attendee', + sa.Column('id', sa.Text(), nullable=False), + sa.Column('event_id', sa.Text(), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('status', sa.Text(), nullable=False), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('event_id', 'user_id', name='uq_event_attendee'), + ) + + inspector.clear_cache() + if 'calendar_event_attendee' in inspector.get_table_names(): + if not _index_exists(inspector, 'ix_calendar_event_attendee_user', 'calendar_event_attendee'): + op.create_index('ix_calendar_event_attendee_user', 'calendar_event_attendee', ['user_id', 'status'], unique=False) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/57c599a3cb57_add_channel_table.py b/backend/open_webui/migrations/versions/57c599a3cb57_add_channel_table.py index 79f0e8827e..4db23c2ace 100644 --- a/backend/open_webui/migrations/versions/57c599a3cb57_add_channel_table.py +++ b/backend/open_webui/migrations/versions/57c599a3cb57_add_channel_table.py @@ -6,8 +6,8 @@ Create Date: 2024-12-22 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '57c599a3cb57' down_revision = '922e7a387820' @@ -16,30 +16,36 @@ depends_on = None def upgrade(): - op.create_table( - 'channel', - sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), - sa.Column('user_id', sa.Text()), - sa.Column('name', sa.Text()), - sa.Column('description', sa.Text(), nullable=True), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('access_control', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.Column('updated_at', sa.BigInteger(), nullable=True), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) - op.create_table( - 'message', - sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), - sa.Column('user_id', sa.Text()), - sa.Column('channel_id', sa.Text(), nullable=True), - sa.Column('content', sa.Text()), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.Column('updated_at', sa.BigInteger(), nullable=True), - ) + if 'channel' not in existing_tables: + op.create_table( + 'channel', + sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), + sa.Column('user_id', sa.Text()), + sa.Column('name', sa.Text()), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('access_control', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=True), + sa.Column('updated_at', sa.BigInteger(), nullable=True), + ) + + if 'message' not in existing_tables: + op.create_table( + 'message', + sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), + sa.Column('user_id', sa.Text()), + sa.Column('channel_id', sa.Text(), nullable=True), + sa.Column('content', sa.Text()), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=True), + sa.Column('updated_at', sa.BigInteger(), nullable=True), + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/6283dc0e4d8d_add_channel_file_table.py b/backend/open_webui/migrations/versions/6283dc0e4d8d_add_channel_file_table.py index 2bd2d9fd60..7f2913bd5e 100644 --- a/backend/open_webui/migrations/versions/6283dc0e4d8d_add_channel_file_table.py +++ b/backend/open_webui/migrations/versions/6283dc0e4d8d_add_channel_file_table.py @@ -8,9 +8,9 @@ Create Date: 2025-12-10 15:11:39.424601 from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa import open_webui.internal.db +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '6283dc0e4d8d' @@ -20,31 +20,36 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - op.create_table( - 'channel_file', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column( - 'channel_id', - sa.Text(), - sa.ForeignKey('channel.id', ondelete='CASCADE'), - nullable=False, - ), - sa.Column( - 'file_id', - sa.Text(), - sa.ForeignKey('file.id', ondelete='CASCADE'), - nullable=False, - ), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - # indexes - sa.Index('ix_channel_file_channel_id', 'channel_id'), - sa.Index('ix_channel_file_file_id', 'file_id'), - sa.Index('ix_channel_file_user_id', 'user_id'), - # unique constraints - sa.UniqueConstraint('channel_id', 'file_id', name='uq_channel_file_channel_file'), # prevent duplicate entries - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'channel_file' not in existing_tables: + op.create_table( + 'channel_file', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column( + 'channel_id', + sa.Text(), + sa.ForeignKey('channel.id', ondelete='CASCADE'), + nullable=False, + ), + sa.Column( + 'file_id', + sa.Text(), + sa.ForeignKey('file.id', ondelete='CASCADE'), + nullable=False, + ), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + # indexes + sa.Index('ix_channel_file_channel_id', 'channel_id'), + sa.Index('ix_channel_file_file_id', 'file_id'), + sa.Index('ix_channel_file_user_id', 'user_id'), + # unique constraints + sa.UniqueConstraint('channel_id', 'file_id', name='uq_channel_file_channel_file'), # prevent duplicate entries + ) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/6a39f3d8e55c_add_knowledge_table.py b/backend/open_webui/migrations/versions/6a39f3d8e55c_add_knowledge_table.py index c65ca01415..b1fd2ab40a 100644 --- a/backend/open_webui/migrations/versions/6a39f3d8e55c_add_knowledge_table.py +++ b/backend/open_webui/migrations/versions/6a39f3d8e55c_add_knowledge_table.py @@ -6,11 +6,12 @@ Create Date: 2024-10-01 14:02:35.241684 """ -from alembic import op -import sqlalchemy as sa -from sqlalchemy.sql import table, column, select import json +import sqlalchemy as sa +from alembic import op +from sqlalchemy.sql import column, select, table + revision = '6a39f3d8e55c' down_revision = 'c0fbf31ca0db' branch_labels = None @@ -18,62 +19,67 @@ depends_on = None def upgrade(): - # Creating the 'knowledge' table - print('Creating knowledge table') - knowledge_table = op.create_table( - 'knowledge', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('name', sa.Text(), nullable=False), - sa.Column('description', sa.Text(), nullable=True), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=True), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) - print('Migrating data from document table to knowledge table') - # Representation of the existing 'document' table - document_table = table( - 'document', - column('collection_name', sa.String()), - column('user_id', sa.String()), - column('name', sa.String()), - column('title', sa.Text()), - column('content', sa.Text()), - column('timestamp', sa.BigInteger()), - ) - - # Select all from existing document table - documents = op.get_bind().execute( - select( - document_table.c.collection_name, - document_table.c.user_id, - document_table.c.name, - document_table.c.title, - document_table.c.content, - document_table.c.timestamp, + if 'knowledge' not in existing_tables: + # Creating the 'knowledge' table + print('Creating knowledge table') + knowledge_table = op.create_table( + 'knowledge', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=True), ) - ) - # Insert data into knowledge table from document table - for doc in documents: - op.get_bind().execute( - knowledge_table.insert().values( - id=doc.collection_name, - user_id=doc.user_id, - description=doc.name, - meta={ - 'legacy': True, - 'document': True, - 'tags': json.loads(doc.content or '{}').get('tags', []), - }, - name=doc.title, - created_at=doc.timestamp, - updated_at=doc.timestamp, # using created_at for both created_at and updated_at in project + print('Migrating data from document table to knowledge table') + # Representation of the existing 'document' table + document_table = table( + 'document', + column('collection_name', sa.String()), + column('user_id', sa.String()), + column('name', sa.String()), + column('title', sa.Text()), + column('content', sa.Text()), + column('timestamp', sa.BigInteger()), + ) + + # Select all from existing document table + documents = conn.execute( + select( + document_table.c.collection_name, + document_table.c.user_id, + document_table.c.name, + document_table.c.title, + document_table.c.content, + document_table.c.timestamp, ) ) + # Insert data into knowledge table from document table + for doc in documents: + conn.execute( + knowledge_table.insert().values( + id=doc.collection_name, + user_id=doc.user_id, + description=doc.name, + meta={ + 'legacy': True, + 'document': True, + 'tags': json.loads(doc.content or '{}').get('tags', []), + }, + name=doc.title, + created_at=doc.timestamp, + updated_at=doc.timestamp, + ) + ) + def downgrade(): op.drop_table('knowledge') diff --git a/backend/open_webui/migrations/versions/7826ab40b532_update_file_table.py b/backend/open_webui/migrations/versions/7826ab40b532_update_file_table.py index 4211c6642e..b3313e3762 100644 --- a/backend/open_webui/migrations/versions/7826ab40b532_update_file_table.py +++ b/backend/open_webui/migrations/versions/7826ab40b532_update_file_table.py @@ -6,8 +6,8 @@ Create Date: 2024-12-23 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '7826ab40b532' down_revision = '57c599a3cb57' @@ -16,10 +16,15 @@ depends_on = None def upgrade(): - op.add_column( - 'file', - sa.Column('access_control', sa.JSON(), nullable=True), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + file_cols = {c['name'] for c in inspector.get_columns('file')} + + if 'access_control' not in file_cols: + op.add_column( + 'file', + sa.Column('access_control', sa.JSON(), nullable=True), + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/7e5b5dc7342b_init.py b/backend/open_webui/migrations/versions/7e5b5dc7342b_init.py index 39f488d72e..6b96d9037d 100644 --- a/backend/open_webui/migrations/versions/7e5b5dc7342b_init.py +++ b/backend/open_webui/migrations/versions/7e5b5dc7342b_init.py @@ -1,44 +1,43 @@ -"""init +from __future__ import annotations + +"""Initial Alembic schema — creates all base tables. Revision ID: 7e5b5dc7342b -Revises: +Revises: — Create Date: 2024-06-24 13:15:33.808998 - """ from typing import Sequence, Union +import open_webui.internal.db # noqa: F401 import sqlalchemy as sa from alembic import op - -import open_webui.internal.db from open_webui.internal.db import JSONField from open_webui.migrations.util import get_existing_tables -# revision identifiers, used by Alembic. revision: str = '7e5b5dc7342b' down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None +# ── Table definitions ──────────────────────────────────────────────────────── +# Each table is only created if it doesn't already exist, because databases +# migrated from the Peewee era will already have these tables. -def upgrade() -> None: - existing_tables = set(get_existing_tables()) - - # ### commands auto generated by Alembic - please adjust! ### - if 'auth' not in existing_tables: - op.create_table( - 'auth', +_TABLES: list[tuple[str, list[sa.Column], list]] = [ + ( + 'auth', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('email', sa.String(), nullable=True), sa.Column('password', sa.Text(), nullable=True), sa.Column('active', sa.Boolean(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'chat' not in existing_tables: - op.create_table( - 'chat', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'chat', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('user_id', sa.String(), nullable=True), sa.Column('title', sa.Text(), nullable=True), @@ -47,24 +46,23 @@ def upgrade() -> None: sa.Column('updated_at', sa.BigInteger(), nullable=True), sa.Column('share_id', sa.Text(), nullable=True), sa.Column('archived', sa.Boolean(), nullable=True), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('share_id'), - ) - - if 'chatidtag' not in existing_tables: - op.create_table( - 'chatidtag', + ], + [sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('share_id')], + ), + ( + 'chatidtag', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('tag_name', sa.String(), nullable=True), sa.Column('chat_id', sa.String(), nullable=True), sa.Column('user_id', sa.String(), nullable=True), sa.Column('timestamp', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'document' not in existing_tables: - op.create_table( - 'document', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'document', + [ sa.Column('collection_name', sa.String(), nullable=False), sa.Column('name', sa.String(), nullable=True), sa.Column('title', sa.Text(), nullable=True), @@ -72,24 +70,23 @@ def upgrade() -> None: sa.Column('content', sa.Text(), nullable=True), sa.Column('user_id', sa.String(), nullable=True), sa.Column('timestamp', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('collection_name'), - sa.UniqueConstraint('name'), - ) - - if 'file' not in existing_tables: - op.create_table( - 'file', + ], + [sa.PrimaryKeyConstraint('collection_name'), sa.UniqueConstraint('name')], + ), + ( + 'file', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('user_id', sa.String(), nullable=True), sa.Column('filename', sa.Text(), nullable=True), sa.Column('meta', JSONField(), nullable=True), sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'function' not in existing_tables: - op.create_table( - 'function', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'function', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('user_id', sa.String(), nullable=True), sa.Column('name', sa.Text(), nullable=True), @@ -101,23 +98,23 @@ def upgrade() -> None: sa.Column('is_global', sa.Boolean(), nullable=True), sa.Column('updated_at', sa.BigInteger(), nullable=True), sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'memory' not in existing_tables: - op.create_table( - 'memory', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'memory', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('user_id', sa.String(), nullable=True), sa.Column('content', sa.Text(), nullable=True), sa.Column('updated_at', sa.BigInteger(), nullable=True), sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'model' not in existing_tables: - op.create_table( - 'model', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'model', + [ sa.Column('id', sa.Text(), nullable=False), sa.Column('user_id', sa.Text(), nullable=True), sa.Column('base_model_id', sa.Text(), nullable=True), @@ -126,33 +123,33 @@ def upgrade() -> None: sa.Column('meta', JSONField(), nullable=True), sa.Column('updated_at', sa.BigInteger(), nullable=True), sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'prompt' not in existing_tables: - op.create_table( - 'prompt', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'prompt', + [ sa.Column('command', sa.String(), nullable=False), sa.Column('user_id', sa.String(), nullable=True), sa.Column('title', sa.Text(), nullable=True), sa.Column('content', sa.Text(), nullable=True), sa.Column('timestamp', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('command'), - ) - - if 'tag' not in existing_tables: - op.create_table( - 'tag', + ], + [sa.PrimaryKeyConstraint('command')], + ), + ( + 'tag', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('name', sa.String(), nullable=True), sa.Column('user_id', sa.String(), nullable=True), sa.Column('data', sa.Text(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'tool' not in existing_tables: - op.create_table( - 'tool', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'tool', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('user_id', sa.String(), nullable=True), sa.Column('name', sa.Text(), nullable=True), @@ -162,12 +159,12 @@ def upgrade() -> None: sa.Column('valves', JSONField(), nullable=True), sa.Column('updated_at', sa.BigInteger(), nullable=True), sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.PrimaryKeyConstraint('id'), - ) - - if 'user' not in existing_tables: - op.create_table( - 'user', + ], + [sa.PrimaryKeyConstraint('id')], + ), + ( + 'user', + [ sa.Column('id', sa.String(), nullable=False), sa.Column('name', sa.String(), nullable=True), sa.Column('email', sa.String(), nullable=True), @@ -180,25 +177,23 @@ def upgrade() -> None: sa.Column('settings', JSONField(), nullable=True), sa.Column('info', JSONField(), nullable=True), sa.Column('oauth_sub', sa.Text(), nullable=True), + ], + [ sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('api_key'), sa.UniqueConstraint('oauth_sub'), - ) - # ### end Alembic commands ### + ], + ), +] + + +def upgrade() -> None: + existing = set(get_existing_tables()) + for name, columns, constraints in _TABLES: + if name not in existing: + op.create_table(name, *columns, *constraints) def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('user') - op.drop_table('tool') - op.drop_table('tag') - op.drop_table('prompt') - op.drop_table('model') - op.drop_table('memory') - op.drop_table('function') - op.drop_table('file') - op.drop_table('document') - op.drop_table('chatidtag') - op.drop_table('chat') - op.drop_table('auth') - # ### end Alembic commands ### + for name, _, _ in reversed(_TABLES): + op.drop_table(name) diff --git a/backend/open_webui/migrations/versions/81cc2ce44d79_update_channel_file_and_knowledge_table.py b/backend/open_webui/migrations/versions/81cc2ce44d79_update_channel_file_and_knowledge_table.py index e45a2443df..2294f89562 100644 --- a/backend/open_webui/migrations/versions/81cc2ce44d79_update_channel_file_and_knowledge_table.py +++ b/backend/open_webui/migrations/versions/81cc2ce44d79_update_channel_file_and_knowledge_table.py @@ -8,9 +8,9 @@ Create Date: 2025-12-10 16:07:58.001282 from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa import open_webui.internal.db +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '81cc2ce44d79' @@ -20,20 +20,27 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + # Add message_id column to channel_file table - with op.batch_alter_table('channel_file', schema=None) as batch_op: - batch_op.add_column( - sa.Column( - 'message_id', - sa.Text(), - sa.ForeignKey('message.id', ondelete='CASCADE', name='fk_channel_file_message_id'), - nullable=True, + cf_cols = {c['name'] for c in inspector.get_columns('channel_file')} + if 'message_id' not in cf_cols: + with op.batch_alter_table('channel_file', schema=None) as batch_op: + batch_op.add_column( + sa.Column( + 'message_id', + sa.Text(), + sa.ForeignKey('message.id', ondelete='CASCADE', name='fk_channel_file_message_id'), + nullable=True, + ) ) - ) # Add data column to knowledge table - with op.batch_alter_table('knowledge', schema=None) as batch_op: - batch_op.add_column(sa.Column('data', sa.JSON(), nullable=True)) + k_cols = {c['name'] for c in inspector.get_columns('knowledge')} + if 'data' not in k_cols: + with op.batch_alter_table('knowledge', schema=None) as batch_op: + batch_op.add_column(sa.Column('data', sa.JSON(), nullable=True)) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/8452d01d26d7_add_chat_message_table.py b/backend/open_webui/migrations/versions/8452d01d26d7_add_chat_message_table.py index 3254b57858..e247e5788e 100644 --- a/backend/open_webui/migrations/versions/8452d01d26d7_add_chat_message_table.py +++ b/backend/open_webui/migrations/versions/8452d01d26d7_add_chat_message_table.py @@ -6,13 +6,13 @@ Create Date: 2026-02-01 04:00:00.000000 """ -import time import json import logging +import time from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op log = logging.getLogger(__name__) @@ -56,6 +56,13 @@ def _flush_batch(conn, table, batch): def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'chat_message' in existing_tables: + return # Already created — skip everything + # Step 1: Create table op.create_table( 'chat_message', @@ -85,8 +92,6 @@ def upgrade() -> None: op.create_index('chat_message_user_created_idx', 'chat_message', ['user_id', 'created_at']) # Step 2: Backfill from existing chats - conn = op.get_bind() - chat_table = sa.table( 'chat', sa.column('id', sa.Text()), diff --git a/backend/open_webui/migrations/versions/90ef40d4714e_update_channel_and_channel_members_table.py b/backend/open_webui/migrations/versions/90ef40d4714e_update_channel_and_channel_members_table.py index 9d115b1e5c..5936667624 100644 --- a/backend/open_webui/migrations/versions/90ef40d4714e_update_channel_and_channel_members_table.py +++ b/backend/open_webui/migrations/versions/90ef40d4714e_update_channel_and_channel_members_table.py @@ -8,9 +8,9 @@ Create Date: 2025-11-30 06:33:38.790341 from typing import Sequence, Union -from alembic import op -import sqlalchemy as sa import open_webui.internal.db +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = '90ef40d4714e' @@ -20,42 +20,53 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + # Update 'channel' table - op.add_column('channel', sa.Column('is_private', sa.Boolean(), nullable=True)) - - op.add_column('channel', sa.Column('archived_at', sa.BigInteger(), nullable=True)) - op.add_column('channel', sa.Column('archived_by', sa.Text(), nullable=True)) - - op.add_column('channel', sa.Column('deleted_at', sa.BigInteger(), nullable=True)) - op.add_column('channel', sa.Column('deleted_by', sa.Text(), nullable=True)) - - op.add_column('channel', sa.Column('updated_by', sa.Text(), nullable=True)) + channel_cols = {c['name'] for c in inspector.get_columns('channel')} + if 'is_private' not in channel_cols: + op.add_column('channel', sa.Column('is_private', sa.Boolean(), nullable=True)) + if 'archived_at' not in channel_cols: + op.add_column('channel', sa.Column('archived_at', sa.BigInteger(), nullable=True)) + if 'archived_by' not in channel_cols: + op.add_column('channel', sa.Column('archived_by', sa.Text(), nullable=True)) + if 'deleted_at' not in channel_cols: + op.add_column('channel', sa.Column('deleted_at', sa.BigInteger(), nullable=True)) + if 'deleted_by' not in channel_cols: + op.add_column('channel', sa.Column('deleted_by', sa.Text(), nullable=True)) + if 'updated_by' not in channel_cols: + op.add_column('channel', sa.Column('updated_by', sa.Text(), nullable=True)) # Update 'channel_member' table - op.add_column('channel_member', sa.Column('role', sa.Text(), nullable=True)) - op.add_column('channel_member', sa.Column('invited_by', sa.Text(), nullable=True)) - op.add_column('channel_member', sa.Column('invited_at', sa.BigInteger(), nullable=True)) + cm_cols = {c['name'] for c in inspector.get_columns('channel_member')} + if 'role' not in cm_cols: + op.add_column('channel_member', sa.Column('role', sa.Text(), nullable=True)) + if 'invited_by' not in cm_cols: + op.add_column('channel_member', sa.Column('invited_by', sa.Text(), nullable=True)) + if 'invited_at' not in cm_cols: + op.add_column('channel_member', sa.Column('invited_at', sa.BigInteger(), nullable=True)) # Create 'channel_webhook' table - op.create_table( - 'channel_webhook', - sa.Column('id', sa.Text(), primary_key=True, unique=True, nullable=False), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column( - 'channel_id', - sa.Text(), - sa.ForeignKey('channel.id', ondelete='CASCADE'), - nullable=False, - ), - sa.Column('name', sa.Text(), nullable=False), - sa.Column('profile_image_url', sa.Text(), nullable=True), - sa.Column('token', sa.Text(), nullable=False), - sa.Column('last_used_at', sa.BigInteger(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - ) - - pass + if 'channel_webhook' not in existing_tables: + op.create_table( + 'channel_webhook', + sa.Column('id', sa.Text(), primary_key=True, unique=True, nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column( + 'channel_id', + sa.Text(), + sa.ForeignKey('channel.id', ondelete='CASCADE'), + nullable=False, + ), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('profile_image_url', sa.Text(), nullable=True), + sa.Column('token', sa.Text(), nullable=False), + sa.Column('last_used_at', sa.BigInteger(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + ) def downgrade() -> None: @@ -74,5 +85,3 @@ def downgrade() -> None: # Drop 'channel_webhook' table op.drop_table('channel_webhook') - - pass diff --git a/backend/open_webui/migrations/versions/922e7a387820_add_group_table.py b/backend/open_webui/migrations/versions/922e7a387820_add_group_table.py index 5e617be1e6..4150f5ffdf 100644 --- a/backend/open_webui/migrations/versions/922e7a387820_add_group_table.py +++ b/backend/open_webui/migrations/versions/922e7a387820_add_group_table.py @@ -6,8 +6,8 @@ Create Date: 2024-11-14 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '922e7a387820' down_revision = '4ace53fd72c8' @@ -16,70 +16,55 @@ depends_on = None def upgrade(): - op.create_table( - 'group', - sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), - sa.Column('user_id', sa.Text(), nullable=True), - sa.Column('name', sa.Text(), nullable=True), - sa.Column('description', sa.Text(), nullable=True), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('permissions', sa.JSON(), nullable=True), - sa.Column('user_ids', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.Column('updated_at', sa.BigInteger(), nullable=True), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'group' not in existing_tables: + op.create_table( + 'group', + sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), + sa.Column('user_id', sa.Text(), nullable=True), + sa.Column('name', sa.Text(), nullable=True), + sa.Column('description', sa.Text(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('permissions', sa.JSON(), nullable=True), + sa.Column('user_ids', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=True), + sa.Column('updated_at', sa.BigInteger(), nullable=True), + ) # Add 'access_control' column to 'model' table - op.add_column( - 'model', - sa.Column('access_control', sa.JSON(), nullable=True), - ) - - # Add 'is_active' column to 'model' table - op.add_column( - 'model', - sa.Column( - 'is_active', - sa.Boolean(), - nullable=False, - server_default=sa.sql.expression.true(), - ), - ) + model_cols = {c['name'] for c in inspector.get_columns('model')} + if 'access_control' not in model_cols: + op.add_column('model', sa.Column('access_control', sa.JSON(), nullable=True)) + if 'is_active' not in model_cols: + op.add_column( + 'model', + sa.Column('is_active', sa.Boolean(), nullable=False, server_default=sa.sql.expression.true()), + ) # Add 'access_control' column to 'knowledge' table - op.add_column( - 'knowledge', - sa.Column('access_control', sa.JSON(), nullable=True), - ) + knowledge_cols = {c['name'] for c in inspector.get_columns('knowledge')} + if 'access_control' not in knowledge_cols: + op.add_column('knowledge', sa.Column('access_control', sa.JSON(), nullable=True)) # Add 'access_control' column to 'prompt' table - op.add_column( - 'prompt', - sa.Column('access_control', sa.JSON(), nullable=True), - ) + prompt_cols = {c['name'] for c in inspector.get_columns('prompt')} + if 'access_control' not in prompt_cols: + op.add_column('prompt', sa.Column('access_control', sa.JSON(), nullable=True)) # Add 'access_control' column to 'tools' table - op.add_column( - 'tool', - sa.Column('access_control', sa.JSON(), nullable=True), - ) + tool_cols = {c['name'] for c in inspector.get_columns('tool')} + if 'access_control' not in tool_cols: + op.add_column('tool', sa.Column('access_control', sa.JSON(), nullable=True)) def downgrade(): op.drop_table('group') - - # Drop 'access_control' column from 'model' table op.drop_column('model', 'access_control') - - # Drop 'is_active' column from 'model' table op.drop_column('model', 'is_active') - - # Drop 'access_control' column from 'knowledge' table op.drop_column('knowledge', 'access_control') - - # Drop 'access_control' column from 'prompt' table op.drop_column('prompt', 'access_control') - - # Drop 'access_control' column from 'tools' table op.drop_column('tool', 'access_control') diff --git a/backend/open_webui/migrations/versions/9f0c9cd09105_add_note_table.py b/backend/open_webui/migrations/versions/9f0c9cd09105_add_note_table.py index c75db04ca5..ae096e0808 100644 --- a/backend/open_webui/migrations/versions/9f0c9cd09105_add_note_table.py +++ b/backend/open_webui/migrations/versions/9f0c9cd09105_add_note_table.py @@ -6,8 +6,8 @@ Create Date: 2025-05-03 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = '9f0c9cd09105' down_revision = '3781e22d8b01' @@ -16,17 +16,22 @@ depends_on = None def upgrade(): - op.create_table( - 'note', - sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), - sa.Column('user_id', sa.Text(), nullable=True), - sa.Column('title', sa.Text(), nullable=True), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('access_control', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.Column('updated_at', sa.BigInteger(), nullable=True), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'note' not in existing_tables: + op.create_table( + 'note', + sa.Column('id', sa.Text(), nullable=False, primary_key=True, unique=True), + sa.Column('user_id', sa.Text(), nullable=True), + sa.Column('title', sa.Text(), nullable=True), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('access_control', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=True), + sa.Column('updated_at', sa.BigInteger(), nullable=True), + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/a0b1c2d3e4f5_add_memory_user_id_index.py b/backend/open_webui/migrations/versions/a0b1c2d3e4f5_add_memory_user_id_index.py new file mode 100644 index 0000000000..b73e654149 --- /dev/null +++ b/backend/open_webui/migrations/versions/a0b1c2d3e4f5_add_memory_user_id_index.py @@ -0,0 +1,28 @@ +"""Add memory user_id index + +Revision ID: a0b1c2d3e4f5 +Revises: 4de81c2a3af1 +Create Date: 2025-09-15 03:00:00.000000 + +""" + +import sqlalchemy as sa +from alembic import op + +revision = 'a0b1c2d3e4f5' +down_revision = '4de81c2a3af1' +branch_labels = None +depends_on = None + + +def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_indexes = {idx['name'] for idx in inspector.get_indexes('memory')} + + if 'ix_memory_user_id' not in existing_indexes: + op.create_index('ix_memory_user_id', 'memory', ['user_id']) + + +def downgrade(): + op.drop_index('ix_memory_user_id', table_name='memory') diff --git a/backend/open_webui/migrations/versions/a1b2c3d4e5f6_add_skill_table.py b/backend/open_webui/migrations/versions/a1b2c3d4e5f6_add_skill_table.py index f11f7d8d1b..1ffce041e1 100644 --- a/backend/open_webui/migrations/versions/a1b2c3d4e5f6_add_skill_table.py +++ b/backend/open_webui/migrations/versions/a1b2c3d4e5f6_add_skill_table.py @@ -8,9 +8,8 @@ Create Date: 2026-02-11 09:30:00.000000 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op from open_webui.migrations.util import get_existing_tables revision: str = 'a1b2c3d4e5f6' diff --git a/backend/open_webui/migrations/versions/a3dd5bedd151_add_tasks_and_summary_to_chat.py b/backend/open_webui/migrations/versions/a3dd5bedd151_add_tasks_and_summary_to_chat.py index 20a3152cfe..5ccff52312 100644 --- a/backend/open_webui/migrations/versions/a3dd5bedd151_add_tasks_and_summary_to_chat.py +++ b/backend/open_webui/migrations/versions/a3dd5bedd151_add_tasks_and_summary_to_chat.py @@ -8,8 +8,8 @@ Create Date: 2026-03-29 22:15:00.000000 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'a3dd5bedd151' @@ -19,8 +19,14 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - op.add_column('chat', sa.Column('tasks', sa.JSON(), nullable=True)) - op.add_column('chat', sa.Column('summary', sa.Text(), nullable=True)) + conn = op.get_bind() + inspector = sa.inspect(conn) + columns = [col['name'] for col in inspector.get_columns('chat')] + + if 'tasks' not in columns: + op.add_column('chat', sa.Column('tasks', sa.JSON(), nullable=True)) + if 'summary' not in columns: + op.add_column('chat', sa.Column('summary', sa.Text(), nullable=True)) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/a5c220713937_add_reply_to_id_column_to_message.py b/backend/open_webui/migrations/versions/a5c220713937_add_reply_to_id_column_to_message.py index 29157baa07..0108e44614 100644 --- a/backend/open_webui/migrations/versions/a5c220713937_add_reply_to_id_column_to_message.py +++ b/backend/open_webui/migrations/versions/a5c220713937_add_reply_to_id_column_to_message.py @@ -8,8 +8,8 @@ Create Date: 2025-09-27 02:24:18.058455 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'a5c220713937' @@ -19,16 +19,18 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + msg_cols = {c['name'] for c in inspector.get_columns('message')} + # Add 'reply_to_id' column to the 'message' table for replying to messages - op.add_column( - 'message', - sa.Column('reply_to_id', sa.Text(), nullable=True), - ) - pass + if 'reply_to_id' not in msg_cols: + op.add_column( + 'message', + sa.Column('reply_to_id', sa.Text(), nullable=True), + ) def downgrade() -> None: # Remove 'reply_to_id' column from the 'message' table op.drop_column('message', 'reply_to_id') - - pass diff --git a/backend/open_webui/migrations/versions/af906e964978_add_feedback_table.py b/backend/open_webui/migrations/versions/af906e964978_add_feedback_table.py index 4d8fd63e80..65dcf6f5f9 100644 --- a/backend/open_webui/migrations/versions/af906e964978_add_feedback_table.py +++ b/backend/open_webui/migrations/versions/af906e964978_add_feedback_table.py @@ -6,8 +6,8 @@ Create Date: 2024-10-20 17:02:35.241684 """ -from alembic import op import sqlalchemy as sa +from alembic import op # Revision identifiers, used by Alembic. revision = 'af906e964978' @@ -17,23 +17,28 @@ depends_on = None def upgrade(): - # ### Create feedback table ### - op.create_table( - 'feedback', - sa.Column('id', sa.Text(), primary_key=True), # Unique identifier for each feedback (TEXT type) - sa.Column('user_id', sa.Text(), nullable=True), # ID of the user providing the feedback (TEXT type) - sa.Column('version', sa.BigInteger(), default=0), # Version of feedback (BIGINT type) - sa.Column('type', sa.Text(), nullable=True), # Type of feedback (TEXT type) - sa.Column('data', sa.JSON(), nullable=True), # Feedback data (JSON type) - sa.Column('meta', sa.JSON(), nullable=True), # Metadata for feedback (JSON type) - sa.Column('snapshot', sa.JSON(), nullable=True), # snapshot data for feedback (JSON type) - sa.Column( - 'created_at', sa.BigInteger(), nullable=False - ), # Feedback creation timestamp (BIGINT representing epoch) - sa.Column( - 'updated_at', sa.BigInteger(), nullable=False - ), # Feedback update timestamp (BIGINT representing epoch) - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'feedback' not in existing_tables: + # ### Create feedback table ### + op.create_table( + 'feedback', + sa.Column('id', sa.Text(), primary_key=True), # Unique identifier for each feedback (TEXT type) + sa.Column('user_id', sa.Text(), nullable=True), # ID of the user providing the feedback (TEXT type) + sa.Column('version', sa.BigInteger(), default=0), # Version of feedback (BIGINT type) + sa.Column('type', sa.Text(), nullable=True), # Type of feedback (TEXT type) + sa.Column('data', sa.JSON(), nullable=True), # Feedback data (JSON type) + sa.Column('meta', sa.JSON(), nullable=True), # Metadata for feedback (JSON type) + sa.Column('snapshot', sa.JSON(), nullable=True), # snapshot data for feedback (JSON type) + sa.Column( + 'created_at', sa.BigInteger(), nullable=False + ), # Feedback creation timestamp (BIGINT representing epoch) + sa.Column( + 'updated_at', sa.BigInteger(), nullable=False + ), # Feedback update timestamp (BIGINT representing epoch) + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/b10670c03dd5_update_user_table.py b/backend/open_webui/migrations/versions/b10670c03dd5_update_user_table.py index 623289d885..ccb12515f1 100644 --- a/backend/open_webui/migrations/versions/b10670c03dd5_update_user_table.py +++ b/backend/open_webui/migrations/versions/b10670c03dd5_update_user_table.py @@ -6,15 +6,13 @@ Create Date: 2025-11-28 04:55:31.737538 """ -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -import open_webui.internal.db import json import time +from typing import Sequence, Union + +import open_webui.internal.db +import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'b10670c03dd5' @@ -22,20 +20,49 @@ down_revision: Union[str, None] = '2f1211949ecc' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None +# ── Ad-hoc table references for Core DML ───────────────────────────────── +# These are lightweight table() / column() references used only inside this +# migration for SELECT / UPDATE / INSERT — they do NOT create or alter +# anything on disk. + +_user = sa.table( + 'user', + sa.column('id', sa.Text), + sa.column('oauth_sub', sa.Text), + sa.column('oauth', sa.JSON), + sa.column('api_key', sa.Text), + sa.column('info', sa.Text), + sa.column('settings', sa.Text), +) + +_api_key = sa.table( + 'api_key', + sa.column('id', sa.Text), + sa.column('user_id', sa.Text), + sa.column('key', sa.Text), + sa.column('created_at', sa.BigInteger), + sa.column('updated_at', sa.BigInteger), +) + def _drop_sqlite_indexes_for_column(table_name, column_name, conn): """ - SQLite requires manual removal of any indexes referencing a column - before ALTER TABLE ... DROP COLUMN can succeed. + SQLite requires manual removal of any user-created indexes referencing + a column before ALTER TABLE ... DROP COLUMN can succeed. + + NOTE: PRAGMAs have no Core equivalent — raw text is unavoidable here. """ indexes = conn.execute(sa.text(f"PRAGMA index_list('{table_name}')")).fetchall() for idx in indexes: index_name = idx[1] # index name - # Get indexed columns + # Skip system-managed autoindexes (PK / UNIQUE constraints) — they + # cannot be dropped directly and will disappear when the column is + # removed via batch_alter_table. + if index_name.startswith('sqlite_autoindex_'): + continue idx_info = conn.execute(sa.text(f"PRAGMA index_info('{index_name}')")).fetchall() - - indexed_cols = [row[2] for row in idx_info] # col names + indexed_cols = [row[2] for row in idx_info] if column_name in indexed_cols: conn.execute(sa.text(f'DROP INDEX IF EXISTS {index_name}')) @@ -44,33 +71,31 @@ def _convert_column_to_json(table: str, column: str): conn = op.get_bind() dialect = conn.dialect.name + t = sa.table(table, sa.column('id', sa.Text), sa.column(column, sa.Text)) + t_json = sa.column(f'{column}_json', sa.JSON) + # SQLite cannot ALTER COLUMN → must recreate column if dialect == 'sqlite': - # 1. Add temporary column op.add_column(table, sa.Column(f'{column}_json', sa.JSON(), nullable=True)) - # 2. Load old data - rows = conn.execute(sa.text(f'SELECT id, {column} FROM "{table}"')).fetchall() + rows = conn.execute(sa.select(t.c.id, t.c[column])).fetchall() - for row in rows: - uid, raw = row + for uid, raw in rows: if raw is None: parsed = None else: try: parsed = json.loads(raw) except Exception: - parsed = None # fallback safe behavior + parsed = None conn.execute( - sa.text(f'UPDATE "{table}" SET {column}_json = :val WHERE id = :id'), - {'val': json.dumps(parsed) if parsed else None, 'id': uid}, + sa.update(sa.table(table, sa.column('id'), t_json)) + .where(sa.column('id') == uid) + .values({f'{column}_json': json.dumps(parsed) if parsed else None}) ) - # 3. Drop old TEXT column op.drop_column(table, column) - - # 4. Rename new JSON column → original name op.alter_column(table, f'{column}_json', new_column_name=column) else: @@ -87,15 +112,19 @@ def _convert_column_to_text(table: str, column: str): conn = op.get_bind() dialect = conn.dialect.name + t = sa.table(table, sa.column('id', sa.Text), sa.column(column)) + t_text = sa.column(f'{column}_text', sa.Text) + if dialect == 'sqlite': op.add_column(table, sa.Column(f'{column}_text', sa.Text(), nullable=True)) - rows = conn.execute(sa.text(f'SELECT id, {column} FROM "{table}"')).fetchall() + rows = conn.execute(sa.select(t.c.id, t.c[column])).fetchall() for uid, raw in rows: conn.execute( - sa.text(f'UPDATE "{table}" SET {column}_text = :val WHERE id = :id'), - {'val': json.dumps(raw) if raw else None, 'id': uid}, + sa.update(sa.table(table, sa.column('id'), t_text)) + .where(sa.column('id') == uid) + .values({f'{column}_text': json.dumps(raw) if raw else None}) ) op.drop_column(table, column) @@ -111,88 +140,105 @@ def _convert_column_to_text(table: str, column: str): def upgrade() -> None: - op.add_column('user', sa.Column('profile_banner_image_url', sa.Text(), nullable=True)) - op.add_column('user', sa.Column('timezone', sa.String(), nullable=True)) - - op.add_column('user', sa.Column('presence_state', sa.String(), nullable=True)) - op.add_column('user', sa.Column('status_emoji', sa.String(), nullable=True)) - op.add_column('user', sa.Column('status_message', sa.Text(), nullable=True)) - op.add_column('user', sa.Column('status_expires_at', sa.BigInteger(), nullable=True)) - - op.add_column('user', sa.Column('oauth', sa.JSON(), nullable=True)) - - # Convert info (TEXT/JSONField) → JSON - _convert_column_to_json('user', 'info') - # Convert settings (TEXT/JSONField) → JSON - _convert_column_to_json('user', 'settings') - - op.create_table( - 'api_key', - sa.Column('id', sa.Text(), primary_key=True, unique=True), - sa.Column('user_id', sa.Text(), sa.ForeignKey('user.id', ondelete='CASCADE')), - sa.Column('key', sa.Text(), unique=True, nullable=False), - sa.Column('data', sa.JSON(), nullable=True), - sa.Column('expires_at', sa.BigInteger(), nullable=True), - sa.Column('last_used_at', sa.BigInteger(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - ) - conn = op.get_bind() - users = conn.execute(sa.text('SELECT id, oauth_sub FROM "user" WHERE oauth_sub IS NOT NULL')).fetchall() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + user_columns = {c['name'] for c in inspector.get_columns('user')} - for uid, oauth_sub in users: - if oauth_sub: - # Example formats supported: - # provider@sub - # plain sub (stored as {"oidc": {"sub": sub}}) - if '@' in oauth_sub: - provider, sub = oauth_sub.split('@', 1) - else: - provider, sub = 'oidc', oauth_sub + # ── Add new columns (idempotent) ────────────────────────────────── + for col_name, col_type in [ + ('profile_banner_image_url', sa.Text()), + ('timezone', sa.String()), + ('presence_state', sa.String()), + ('status_emoji', sa.String()), + ('status_message', sa.Text()), + ('status_expires_at', sa.BigInteger()), + ('oauth', sa.JSON()), + ]: + if col_name not in user_columns: + op.add_column('user', sa.Column(col_name, col_type, nullable=True)) - oauth_json = json.dumps({provider: {'sub': sub}}) - conn.execute( - sa.text('UPDATE "user" SET oauth = :oauth WHERE id = :id'), - {'oauth': oauth_json, 'id': uid}, - ) + # Convert info (TEXT/JSONField) → JSON (skip if already JSON) + user_col_types = {c['name']: c['type'] for c in inspector.get_columns('user')} + if isinstance(user_col_types.get('info'), sa.Text): + _convert_column_to_json('user', 'info') + # Convert settings (TEXT/JSONField) → JSON (skip if already JSON) + if isinstance(user_col_types.get('settings'), sa.Text): + _convert_column_to_json('user', 'settings') - users_with_keys = conn.execute(sa.text('SELECT id, api_key FROM "user" WHERE api_key IS NOT NULL')).fetchall() - now = int(time.time()) + # ── Create api_key table (idempotent) ───────────────────────────── + if 'api_key' not in existing_tables: + op.create_table( + 'api_key', + sa.Column('id', sa.Text(), primary_key=True, unique=True), + sa.Column('user_id', sa.Text(), sa.ForeignKey('user.id', ondelete='CASCADE')), + sa.Column('key', sa.Text(), unique=True, nullable=False), + sa.Column('data', sa.JSON(), nullable=True), + sa.Column('expires_at', sa.BigInteger(), nullable=True), + sa.Column('last_used_at', sa.BigInteger(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + ) - for uid, api_key in users_with_keys: - if api_key: - conn.execute( - sa.text(""" - INSERT INTO api_key (id, user_id, key, created_at, updated_at) - VALUES (:id, :user_id, :key, :created_at, :updated_at) - """), - { - 'id': f'key_{uid}', - 'user_id': uid, - 'key': api_key, - 'created_at': now, - 'updated_at': now, - }, - ) + # ── Migrate oauth_sub → oauth JSON (only if old column still exists) + if 'oauth_sub' in user_columns: + rows = conn.execute( + sa.select(_user.c.id, _user.c.oauth_sub) + .where(_user.c.oauth_sub.is_not(None)) + ).fetchall() - if conn.dialect.name == 'sqlite': - _drop_sqlite_indexes_for_column('user', 'api_key', conn) - _drop_sqlite_indexes_for_column('user', 'oauth_sub', conn) + for uid, oauth_sub in rows: + if oauth_sub: + provider, sub = (oauth_sub.split('@', 1) if '@' in oauth_sub + else ('oidc', oauth_sub)) + conn.execute( + sa.update(_user) + .where(_user.c.id == uid) + .values(oauth=json.dumps({provider: {'sub': sub}})) + ) - with op.batch_alter_table('user') as batch_op: - batch_op.drop_column('api_key') - batch_op.drop_column('oauth_sub') + # ── Migrate api_key column → api_key table (only if old column still exists) + if 'api_key' in user_columns: + rows = conn.execute( + sa.select(_user.c.id, _user.c.api_key) + .where(_user.c.api_key.is_not(None)) + ).fetchall() + now = int(time.time()) + + for uid, key_val in rows: + if key_val: + conn.execute( + sa.insert(_api_key).values( + id=f'key_{uid}', + user_id=uid, + key=key_val, + created_at=now, + updated_at=now, + ) + ) + + # ── Drop legacy columns (idempotent) ────────────────────────────── + cols_to_drop = {'api_key', 'oauth_sub'} & user_columns + if cols_to_drop: + if conn.dialect.name == 'sqlite': + for col in cols_to_drop: + _drop_sqlite_indexes_for_column('user', col, conn) + + with op.batch_alter_table('user') as batch_op: + for col in cols_to_drop: + batch_op.drop_column(col) def downgrade() -> None: - # --- 1. Restore old oauth_sub column --- op.add_column('user', sa.Column('oauth_sub', sa.Text(), nullable=True)) conn = op.get_bind() - users = conn.execute(sa.text('SELECT id, oauth FROM "user" WHERE oauth IS NOT NULL')).fetchall() + rows = conn.execute( + sa.select(_user.c.id, _user.c.oauth) + .where(_user.c.oauth.is_not(None)) + ).fetchall() - for uid, oauth in users: + for uid, oauth in rows: try: data = json.loads(oauth) provider = list(data.keys())[0] @@ -202,24 +248,24 @@ def downgrade() -> None: oauth_sub = None conn.execute( - sa.text('UPDATE "user" SET oauth_sub = :oauth_sub WHERE id = :id'), - {'oauth_sub': oauth_sub, 'id': uid}, + sa.update(_user) + .where(_user.c.id == uid) + .values(oauth_sub=oauth_sub) ) op.drop_column('user', 'oauth') - # --- 2. Restore api_key field --- + # --- Restore api_key field --- op.add_column('user', sa.Column('api_key', sa.String(), nullable=True)) - # Restore values from api_key - keys = conn.execute(sa.text('SELECT user_id, key FROM api_key')).fetchall() + keys = conn.execute(sa.select(_api_key.c.user_id, _api_key.c.key)).fetchall() for uid, key in keys: conn.execute( - sa.text('UPDATE "user" SET api_key = :key WHERE id = :id'), - {'key': key, 'id': uid}, + sa.update(_user) + .where(_user.c.id == uid) + .values(api_key=key) ) - # Drop new table op.drop_table('api_key') with op.batch_alter_table('user') as batch_op: diff --git a/backend/open_webui/migrations/versions/b2c3d4e5f6a7_add_scim_column_to_user_table.py b/backend/open_webui/migrations/versions/b2c3d4e5f6a7_add_scim_column_to_user_table.py index e3668d3b6e..cf942ec8c0 100644 --- a/backend/open_webui/migrations/versions/b2c3d4e5f6a7_add_scim_column_to_user_table.py +++ b/backend/open_webui/migrations/versions/b2c3d4e5f6a7_add_scim_column_to_user_table.py @@ -8,8 +8,8 @@ Create Date: 2026-02-13 14:19:00.000000 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'b2c3d4e5f6a7' @@ -19,7 +19,12 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - op.add_column('user', sa.Column('scim', sa.JSON(), nullable=True)) + conn = op.get_bind() + inspector = sa.inspect(conn) + user_cols = {c['name'] for c in inspector.get_columns('user')} + + if 'scim' not in user_cols: + op.add_column('user', sa.Column('scim', sa.JSON(), nullable=True)) def downgrade() -> None: diff --git a/backend/open_webui/migrations/versions/b7c8d9e0f1a2_add_last_read_at_to_chat.py b/backend/open_webui/migrations/versions/b7c8d9e0f1a2_add_last_read_at_to_chat.py index fb254432f6..fd298b7929 100644 --- a/backend/open_webui/migrations/versions/b7c8d9e0f1a2_add_last_read_at_to_chat.py +++ b/backend/open_webui/migrations/versions/b7c8d9e0f1a2_add_last_read_at_to_chat.py @@ -6,9 +6,8 @@ Create Date: 2026-04-01 04:00:00.000000 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = 'b7c8d9e0f1a2' @@ -18,9 +17,14 @@ depends_on = None def upgrade(): - op.add_column('chat', sa.Column('last_read_at', sa.BigInteger(), nullable=True)) - # Set existing chats to be marked as read - op.execute('UPDATE chat SET last_read_at = updated_at') + conn = op.get_bind() + inspector = sa.inspect(conn) + columns = [col['name'] for col in inspector.get_columns('chat')] + + if 'last_read_at' not in columns: + op.add_column('chat', sa.Column('last_read_at', sa.BigInteger(), nullable=True)) + # Set existing chats to be marked as read + op.execute('UPDATE chat SET last_read_at = updated_at') def downgrade(): diff --git a/backend/open_webui/migrations/versions/c0fbf31ca0db_update_file_table.py b/backend/open_webui/migrations/versions/c0fbf31ca0db_update_file_table.py index 709b644150..75eada2d3f 100644 --- a/backend/open_webui/migrations/versions/c0fbf31ca0db_update_file_table.py +++ b/backend/open_webui/migrations/versions/c0fbf31ca0db_update_file_table.py @@ -19,10 +19,17 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + file_cols = {c['name'] for c in inspector.get_columns('file')} + # ### commands auto generated by Alembic - please adjust! ### - op.add_column('file', sa.Column('hash', sa.Text(), nullable=True)) - op.add_column('file', sa.Column('data', sa.JSON(), nullable=True)) - op.add_column('file', sa.Column('updated_at', sa.BigInteger(), nullable=True)) + if 'hash' not in file_cols: + op.add_column('file', sa.Column('hash', sa.Text(), nullable=True)) + if 'data' not in file_cols: + op.add_column('file', sa.Column('data', sa.JSON(), nullable=True)) + if 'updated_at' not in file_cols: + op.add_column('file', sa.Column('updated_at', sa.BigInteger(), nullable=True)) def downgrade(): diff --git a/backend/open_webui/migrations/versions/c1d2e3f4a5b6_add_shared_chat_table.py b/backend/open_webui/migrations/versions/c1d2e3f4a5b6_add_shared_chat_table.py index 2451f50ae2..b70022e168 100644 --- a/backend/open_webui/migrations/versions/c1d2e3f4a5b6_add_shared_chat_table.py +++ b/backend/open_webui/migrations/versions/c1d2e3f4a5b6_add_shared_chat_table.py @@ -9,8 +9,8 @@ Create Date: 2026-04-16 23:00:00.000000 import time import uuid -from alembic import op import sqlalchemy as sa +from alembic import op revision = 'c1d2e3f4a5b6' down_revision = 'e1f2a3b4c5d6' @@ -61,18 +61,21 @@ access_grant_t = sa.table( def upgrade(): conn = op.get_bind() + inspector = sa.inspect(conn) + tables = inspector.get_table_names() - # 1. Create shared_chat table - op.create_table( - 'shared_chat', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('chat_id', sa.Text(), sa.ForeignKey('chat.id', ondelete='CASCADE'), nullable=False), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('title', sa.Text(), nullable=True), - sa.Column('chat', sa.JSON(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=True), - sa.Column('updated_at', sa.BigInteger(), nullable=True), - ) + # 1. Create shared_chat table (idempotent) + if 'shared_chat' not in tables: + op.create_table( + 'shared_chat', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('chat_id', sa.Text(), sa.ForeignKey('chat.id', ondelete='CASCADE'), nullable=False), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('title', sa.Text(), nullable=True), + sa.Column('chat', sa.JSON(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=True), + sa.Column('updated_at', sa.BigInteger(), nullable=True), + ) # 2. Migrate existing shared-* rows shared_rows = conn.execute( @@ -96,31 +99,53 @@ def upgrade(): if not original: continue - # Insert snapshot into shared_chat - conn.execute( - shared_chat_t.insert().values( - id=share_token, - chat_id=original_chat_id, - user_id=original.user_id, - title=row.title, - chat=row.chat, - created_at=row.created_at, - updated_at=row.updated_at, + # Check if shared_chat record already exists (idempotent) + existing_shared = conn.execute( + sa.select(shared_chat_t.c.id).where( + shared_chat_t.c.id == share_token ) - ) + ).fetchone() - # Create user:*:read grant for backward compat - conn.execute( - access_grant_t.insert().values( - id=str(uuid.uuid4()), - resource_type='shared_chat', - resource_id=original_chat_id, - principal_type='user', - principal_id='*', - permission='read', - created_at=row.created_at or int(time.time()), + if not existing_shared: + # Insert snapshot into shared_chat + conn.execute( + shared_chat_t.insert().values( + id=share_token, + chat_id=original_chat_id, + user_id=original.user_id, + title=row.title, + chat=row.chat, + created_at=row.created_at, + updated_at=row.updated_at, + ) + ) + + # Check if access_grant record already exists (idempotent) + existing_grant = conn.execute( + sa.select(access_grant_t.c.id).where( + sa.and_( + access_grant_t.c.resource_type == 'shared_chat', + access_grant_t.c.resource_id == original_chat_id, + access_grant_t.c.principal_type == 'user', + access_grant_t.c.principal_id == '*', + access_grant_t.c.permission == 'read', + ) + ) + ).fetchone() + + if not existing_grant: + # Create user:*:read grant for backward compat + conn.execute( + access_grant_t.insert().values( + id=str(uuid.uuid4()), + resource_type='shared_chat', + resource_id=original_chat_id, + principal_type='user', + principal_id='*', + permission='read', + created_at=row.created_at or int(time.time()), + ) ) - ) # 3. Clean up old phantom rows conn.execute( diff --git a/backend/open_webui/migrations/versions/c29facfe716b_update_file_table_path.py b/backend/open_webui/migrations/versions/c29facfe716b_update_file_table_path.py index 37fe63ef15..a08485f87f 100644 --- a/backend/open_webui/migrations/versions/c29facfe716b_update_file_table_path.py +++ b/backend/open_webui/migrations/versions/c29facfe716b_update_file_table_path.py @@ -6,11 +6,12 @@ Create Date: 2024-10-20 17:02:35.241684 """ -from alembic import op -import sqlalchemy as sa import json -from sqlalchemy.sql import table, column -from sqlalchemy import String, Text, JSON, and_ + +import sqlalchemy as sa +from alembic import op +from sqlalchemy import JSON, String, Text, and_ +from sqlalchemy.sql import column, table revision = 'c29facfe716b' down_revision = 'c69f45358db4' @@ -19,8 +20,13 @@ depends_on = None def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + file_cols = {c['name'] for c in inspector.get_columns('file')} + # 1. Add the `path` column to the "file" table. - op.add_column('file', sa.Column('path', sa.Text(), nullable=True)) + if 'path' not in file_cols: + op.add_column('file', sa.Column('path', sa.Text(), nullable=True)) # 2. Convert the `meta` column from Text/JSONField to `JSON()` # Use Alembic's default batch_op for dialect compatibility. diff --git a/backend/open_webui/migrations/versions/c440947495f3_add_chat_file_table.py b/backend/open_webui/migrations/versions/c440947495f3_add_chat_file_table.py index 0eae928b91..b1d0859fe1 100644 --- a/backend/open_webui/migrations/versions/c440947495f3_add_chat_file_table.py +++ b/backend/open_webui/migrations/versions/c440947495f3_add_chat_file_table.py @@ -8,8 +8,8 @@ Create Date: 2025-12-21 20:27:41.694897 from typing import Sequence, Union -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision: str = 'c440947495f3' @@ -19,36 +19,39 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - op.create_table( - 'chat_file', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column( - 'chat_id', - sa.Text(), - sa.ForeignKey('chat.id', ondelete='CASCADE'), - nullable=False, - ), - sa.Column( - 'file_id', - sa.Text(), - sa.ForeignKey('file.id', ondelete='CASCADE'), - nullable=False, - ), - sa.Column('message_id', sa.Text(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - # indexes - sa.Index('ix_chat_file_chat_id', 'chat_id'), - sa.Index('ix_chat_file_file_id', 'file_id'), - sa.Index('ix_chat_file_message_id', 'message_id'), - sa.Index('ix_chat_file_user_id', 'user_id'), - # unique constraints - sa.UniqueConstraint('chat_id', 'file_id', name='uq_chat_file_chat_file'), # prevent duplicate entries - ) - pass + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'chat_file' not in existing_tables: + op.create_table( + 'chat_file', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column( + 'chat_id', + sa.Text(), + sa.ForeignKey('chat.id', ondelete='CASCADE'), + nullable=False, + ), + sa.Column( + 'file_id', + sa.Text(), + sa.ForeignKey('file.id', ondelete='CASCADE'), + nullable=False, + ), + sa.Column('message_id', sa.Text(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + # indexes + sa.Index('ix_chat_file_chat_id', 'chat_id'), + sa.Index('ix_chat_file_file_id', 'file_id'), + sa.Index('ix_chat_file_message_id', 'message_id'), + sa.Index('ix_chat_file_user_id', 'user_id'), + # unique constraints + sa.UniqueConstraint('chat_id', 'file_id', name='uq_chat_file_chat_file'), # prevent duplicate entries + ) def downgrade() -> None: op.drop_table('chat_file') - pass diff --git a/backend/open_webui/migrations/versions/c69f45358db4_add_folder_table.py b/backend/open_webui/migrations/versions/c69f45358db4_add_folder_table.py index c9572fe7a3..646074427e 100644 --- a/backend/open_webui/migrations/versions/c69f45358db4_add_folder_table.py +++ b/backend/open_webui/migrations/versions/c69f45358db4_add_folder_table.py @@ -6,8 +6,8 @@ Create Date: 2024-10-16 02:02:35.241684 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = 'c69f45358db4' down_revision = '3ab32c4b8f59' @@ -16,30 +16,37 @@ depends_on = None def upgrade(): - op.create_table( - 'folder', - sa.Column('id', sa.Text(), nullable=False), - sa.Column('parent_id', sa.Text(), nullable=True), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('name', sa.Text(), nullable=False), - sa.Column('items', sa.JSON(), nullable=True), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('is_expanded', sa.Boolean(), default=False, nullable=False), - sa.Column('created_at', sa.DateTime(), server_default=sa.func.now(), nullable=False), - sa.Column( - 'updated_at', - sa.DateTime(), - nullable=False, - server_default=sa.func.now(), - onupdate=sa.func.now(), - ), - sa.PrimaryKeyConstraint('id', 'user_id'), - ) + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) - op.add_column( - 'chat', - sa.Column('folder_id', sa.Text(), nullable=True), - ) + if 'folder' not in existing_tables: + op.create_table( + 'folder', + sa.Column('id', sa.Text(), nullable=False), + sa.Column('parent_id', sa.Text(), nullable=True), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('items', sa.JSON(), nullable=True), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('is_expanded', sa.Boolean(), default=False, nullable=False), + sa.Column('created_at', sa.DateTime(), server_default=sa.func.now(), nullable=False), + sa.Column( + 'updated_at', + sa.DateTime(), + nullable=False, + server_default=sa.func.now(), + onupdate=sa.func.now(), + ), + sa.PrimaryKeyConstraint('id', 'user_id'), + ) + + chat_cols = {c['name'] for c in inspector.get_columns('chat')} + if 'folder_id' not in chat_cols: + op.add_column( + 'chat', + sa.Column('folder_id', sa.Text(), nullable=True), + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/ca81bd47c050_add_config_table.py b/backend/open_webui/migrations/versions/ca81bd47c050_add_config_table.py index 5fdf933dd6..ff54232bdd 100644 --- a/backend/open_webui/migrations/versions/ca81bd47c050_add_config_table.py +++ b/backend/open_webui/migrations/versions/ca81bd47c050_add_config_table.py @@ -1,9 +1,8 @@ -"""Add config table +"""Add config table. Revision ID: ca81bd47c050 Revises: 7e5b5dc7342b Create Date: 2024-08-25 15:26:35.241684 - """ from typing import Sequence, Union @@ -11,29 +10,40 @@ from typing import Sequence, Union import sqlalchemy as sa from alembic import op -# revision identifiers, used by Alembic. revision: str = 'ca81bd47c050' down_revision: Union[str, None] = '7e5b5dc7342b' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None -def upgrade(): - op.create_table( - 'config', - sa.Column('id', sa.Integer, primary_key=True), - sa.Column('data', sa.JSON(), nullable=False), - sa.Column('version', sa.Integer, nullable=False), - sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.func.now()), - sa.Column( - 'updated_at', - sa.DateTime(), - nullable=True, - server_default=sa.func.now(), - onupdate=sa.func.now(), - ), - ) +def upgrade() -> None: + """Create a key-value config table with versioning.""" + conn = op.get_bind() + inspector = sa.inspect(conn) + existing_tables = set(inspector.get_table_names()) + + if 'config' not in existing_tables: + op.create_table( + 'config', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('data', sa.JSON(), nullable=False), + sa.Column('version', sa.Integer, nullable=False), + sa.Column( + 'created_at', + sa.DateTime(), + nullable=False, + server_default=sa.func.now(), + ), + sa.Column( + 'updated_at', + sa.DateTime(), + nullable=True, + server_default=sa.func.now(), + onupdate=sa.func.now(), + ), + ) -def downgrade(): +def downgrade() -> None: + """Drop the config table.""" op.drop_table('config') diff --git a/backend/open_webui/migrations/versions/d31026856c01_update_folder_table_data.py b/backend/open_webui/migrations/versions/d31026856c01_update_folder_table_data.py index 444e131db7..60c2e6e9e0 100644 --- a/backend/open_webui/migrations/versions/d31026856c01_update_folder_table_data.py +++ b/backend/open_webui/migrations/versions/d31026856c01_update_folder_table_data.py @@ -6,8 +6,8 @@ Create Date: 2025-07-13 03:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = 'd31026856c01' down_revision = '9f0c9cd09105' @@ -16,7 +16,12 @@ depends_on = None def upgrade(): - op.add_column('folder', sa.Column('data', sa.JSON(), nullable=True)) + conn = op.get_bind() + inspector = sa.inspect(conn) + folder_cols = {c['name'] for c in inspector.get_columns('folder')} + + if 'data' not in folder_cols: + op.add_column('folder', sa.Column('data', sa.JSON(), nullable=True)) def downgrade(): diff --git a/backend/open_webui/migrations/versions/d4e5f6a7b8c9_add_automation_tables.py b/backend/open_webui/migrations/versions/d4e5f6a7b8c9_add_automation_tables.py index fc90dc417f..1df1cf7092 100644 --- a/backend/open_webui/migrations/versions/d4e5f6a7b8c9_add_automation_tables.py +++ b/backend/open_webui/migrations/versions/d4e5f6a7b8c9_add_automation_tables.py @@ -7,8 +7,8 @@ Create Date: 2026-03-30 from typing import Union -from alembic import op import sqlalchemy as sa +from alembic import op revision: str = 'd4e5f6a7b8c9' down_revision: Union[str, None] = 'a3dd5bedd151' @@ -16,36 +16,56 @@ branch_labels = None depends_on = None -def upgrade(): - op.create_table( - 'automation', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('user_id', sa.Text(), nullable=False), - sa.Column('name', sa.Text(), nullable=False), - sa.Column('data', sa.JSON(), nullable=False), - sa.Column('meta', sa.JSON(), nullable=True), - sa.Column('is_active', sa.Boolean(), nullable=False, default=True), - sa.Column('last_run_at', sa.BigInteger(), nullable=True), - sa.Column('next_run_at', sa.BigInteger(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - sa.Column('updated_at', sa.BigInteger(), nullable=False), - ) - op.create_index('ix_automation_next_run', 'automation', ['next_run_at']) +def _index_exists(inspector, index_name, table_name): + """Check if an index already exists on the given table (works for both SQLite and PostgreSQL).""" + indexes = inspector.get_indexes(table_name) + return any(idx['name'] == index_name for idx in indexes) - op.create_table( - 'automation_run', - sa.Column('id', sa.Text(), primary_key=True), - sa.Column('automation_id', sa.Text(), nullable=False), - sa.Column('chat_id', sa.Text(), nullable=True), - sa.Column('status', sa.Text(), nullable=False), - sa.Column('error', sa.Text(), nullable=True), - sa.Column('created_at', sa.BigInteger(), nullable=False), - ) - op.create_index( - 'ix_automation_run_automation_id', - 'automation_run', - ['automation_id'], - ) + +def upgrade(): + conn = op.get_bind() + inspector = sa.inspect(conn) + tables = inspector.get_table_names() + + if 'automation' not in tables: + op.create_table( + 'automation', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('user_id', sa.Text(), nullable=False), + sa.Column('name', sa.Text(), nullable=False), + sa.Column('data', sa.JSON(), nullable=False), + sa.Column('meta', sa.JSON(), nullable=True), + sa.Column('is_active', sa.Boolean(), nullable=False, default=True), + sa.Column('last_run_at', sa.BigInteger(), nullable=True), + sa.Column('next_run_at', sa.BigInteger(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + sa.Column('updated_at', sa.BigInteger(), nullable=False), + ) + + inspector.clear_cache() + if 'automation' in inspector.get_table_names(): + if not _index_exists(inspector, 'ix_automation_next_run', 'automation'): + op.create_index('ix_automation_next_run', 'automation', ['next_run_at']) + + if 'automation_run' not in tables: + op.create_table( + 'automation_run', + sa.Column('id', sa.Text(), primary_key=True), + sa.Column('automation_id', sa.Text(), nullable=False), + sa.Column('chat_id', sa.Text(), nullable=True), + sa.Column('status', sa.Text(), nullable=False), + sa.Column('error', sa.Text(), nullable=True), + sa.Column('created_at', sa.BigInteger(), nullable=False), + ) + + inspector.clear_cache() + if 'automation_run' in inspector.get_table_names(): + if not _index_exists(inspector, 'ix_automation_run_automation_id', 'automation_run'): + op.create_index( + 'ix_automation_run_automation_id', + 'automation_run', + ['automation_id'], + ) def downgrade(): diff --git a/backend/open_webui/migrations/versions/e1f2a3b4c5d6_add_is_pinned_to_note.py b/backend/open_webui/migrations/versions/e1f2a3b4c5d6_add_is_pinned_to_note.py index 0d80558746..7232b11b83 100644 --- a/backend/open_webui/migrations/versions/e1f2a3b4c5d6_add_is_pinned_to_note.py +++ b/backend/open_webui/migrations/versions/e1f2a3b4c5d6_add_is_pinned_to_note.py @@ -6,8 +6,8 @@ Create Date: 2026-04-14 22:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op revision = 'e1f2a3b4c5d6' down_revision = 'b7c8d9e0f1a2' @@ -16,7 +16,12 @@ depends_on = None def upgrade(): - op.add_column('note', sa.Column('is_pinned', sa.Boolean(), nullable=True)) + conn = op.get_bind() + inspector = sa.inspect(conn) + columns = [col['name'] for col in inspector.get_columns('note')] + + if 'is_pinned' not in columns: + op.add_column('note', sa.Column('is_pinned', sa.Boolean(), nullable=True)) def downgrade(): diff --git a/backend/open_webui/migrations/versions/f1e2d3c4b5a6_add_access_grant_table.py b/backend/open_webui/migrations/versions/f1e2d3c4b5a6_add_access_grant_table.py index 5ed572cf7a..6a33d087b5 100644 --- a/backend/open_webui/migrations/versions/f1e2d3c4b5a6_add_access_grant_table.py +++ b/backend/open_webui/migrations/versions/f1e2d3c4b5a6_add_access_grant_table.py @@ -11,13 +11,12 @@ Access control semantics: - {read: {...}, write: {...}}: Custom permissions -> insert specific grants """ -from typing import Sequence, Union import time import uuid +from typing import Sequence, Union -from alembic import op import sqlalchemy as sa - +from alembic import op from open_webui.migrations.util import get_existing_tables revision: str = 'f1e2d3c4b5a6' @@ -81,13 +80,18 @@ def upgrade() -> None: if table_name not in existing_tables: continue - # Query all rows - try: - result = conn.execute(sa.text(f'SELECT id, access_control FROM "{table_name}"')) - rows = result.fetchall() - except Exception: + # Check if access_control and id columns exist (may already be dropped on re-run, + # or table may have been rebuilt without id during intermediate migration states) + insp = sa.inspect(conn) + insp.clear_cache() # Ensure fresh metadata after prior migrations that rebuild tables + table_cols = {c['name'] for c in insp.get_columns(table_name)} + if 'access_control' not in table_cols or 'id' not in table_cols: continue + # Query all rows + result = conn.execute(sa.text(f'SELECT id, access_control FROM "{table_name}"')) + rows = result.fetchall() + for row in rows: resource_id = row[0] access_control_json = row[1] @@ -208,15 +212,15 @@ def upgrade() -> None: except Exception: pass - # Drop access_control columns from resource tables + # Drop access_control columns from resource tables (only if column still exists) + inspector = sa.inspect(conn) for table_name, _ in resource_tables: if table_name not in existing_tables: continue - try: + cols = {c['name'] for c in inspector.get_columns(table_name)} + if 'access_control' in cols: with op.batch_alter_table(table_name) as batch: batch.drop_column('access_control') - except Exception: - pass def downgrade() -> None: diff --git a/backend/open_webui/models/access_grants.py b/backend/open_webui/models/access_grants.py index f031495912..1c86dc08e7 100644 --- a/backend/open_webui/models/access_grants.py +++ b/backend/open_webui/models/access_grants.py @@ -3,13 +3,11 @@ import time import uuid from typing import Optional -from sqlalchemy import select, delete -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, get_async_db_context - from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, Text, UniqueConstraint, or_, and_ +from sqlalchemy import BigInteger, Column, Text, UniqueConstraint, and_, delete, or_, select from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -623,8 +621,8 @@ class AccessGrantsTable: Get all users who have the specified permission on a resource. Returns a list of UserModel instances. """ - from open_webui.models.users import Users, UserModel from open_webui.models.groups import Groups + from open_webui.models.users import UserModel, Users async with get_async_db_context(db) as db: result = await db.execute( diff --git a/backend/open_webui/models/auths.py b/backend/open_webui/models/auths.py index 2c8c6ba99f..253c662029 100644 --- a/backend/open_webui/models/auths.py +++ b/backend/open_webui/models/auths.py @@ -1,14 +1,15 @@ +from __future__ import annotations + import logging import uuid from typing import Optional -from sqlalchemy import select, delete, update -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context from open_webui.models.users import User, UserModel, UserProfileImageResponse, Users from open_webui.utils.validate import validate_profile_image_url from pydantic import BaseModel, field_validator -from sqlalchemy import Boolean, Column, String, Text +from sqlalchemy import Boolean, Column, String, Text, delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -44,7 +45,7 @@ class Token(BaseModel): class ApiKey(BaseModel): - api_key: Optional[str] = None + api_key: str | None = None class SigninResponse(Token, UserProfileImageResponse): @@ -74,18 +75,18 @@ class SignupForm(BaseModel): name: str email: str password: str - profile_image_url: Optional[str] = '/user.png' + profile_image_url: str | None = '/user.png' @field_validator('profile_image_url') @classmethod - def check_profile_image_url(cls, v: Optional[str]) -> Optional[str]: + def check_profile_image_url(cls, v: str | None) -> str | None: if v is not None: return validate_profile_image_url(v) return v class AddUserForm(SignupForm): - role: Optional[str] = 'pending' + role: str | None = 'pending' class AuthsTable: @@ -96,9 +97,9 @@ class AuthsTable: name: str, profile_image_url: str = '/user.png', role: str = 'pending', - oauth: Optional[dict] = None, - db: Optional[AsyncSession] = None, - ) -> Optional[UserModel]: + oauth: dict | None = None, + db: AsyncSession | None = None, + ) -> UserModel | None: async with get_async_db_context(db) as db: log.info('insert_new_auth') @@ -119,8 +120,8 @@ class AuthsTable: return None async def authenticate_user( - self, email: str, verify_password: callable, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + self, email: str, verify_password: callable, db: AsyncSession | None = None + ) -> UserModel | None: log.info(f'authenticate_user: {email}') user = await Users.get_user_by_email(email, db=db) @@ -141,9 +142,7 @@ class AuthsTable: except Exception: return None - async def authenticate_user_by_api_key( - self, api_key: str, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + async def authenticate_user_by_api_key(self, api_key: str, db: AsyncSession | None = None) -> UserModel | None: log.info(f'authenticate_user_by_api_key') # if no api_key, return None if not api_key: @@ -155,7 +154,7 @@ class AuthsTable: except Exception: return False - async def authenticate_user_by_email(self, email: str, db: Optional[AsyncSession] = None) -> Optional[UserModel]: + async def authenticate_user_by_email(self, email: str, db: AsyncSession | None = None) -> UserModel | None: log.info(f'authenticate_user_by_email: {email}') try: async with get_async_db_context(db) as db: @@ -171,7 +170,7 @@ class AuthsTable: except Exception: return None - async def update_user_password_by_id(self, id: str, new_password: str, db: Optional[AsyncSession] = None) -> bool: + async def update_user_password_by_id(self, id: str, new_password: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: result = await db.execute(update(Auth).filter_by(id=id).values(password=new_password)) @@ -180,7 +179,7 @@ class AuthsTable: except Exception: return False - async def update_email_by_id(self, id: str, email: str, db: Optional[AsyncSession] = None) -> bool: + async def update_email_by_id(self, id: str, email: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: result = await db.execute(update(Auth).filter_by(id=id).values(email=email)) @@ -192,7 +191,7 @@ class AuthsTable: except Exception: return False - async def delete_auth_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_auth_by_id(self, id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: # Delete User diff --git a/backend/open_webui/models/automations.py b/backend/open_webui/models/automations.py index 05f449ad13..4038a3bdbe 100644 --- a/backend/open_webui/models/automations.py +++ b/backend/open_webui/models/automations.py @@ -1,13 +1,12 @@ -import time import logging +import time from typing import Optional from uuid import uuid4 -from pydantic import BaseModel, ConfigDict -from sqlalchemy import Column, Text, JSON, Boolean, BigInteger, Index, select, or_, func, cast, String, delete, update -from sqlalchemy.ext.asyncio import AsyncSession - from open_webui.internal.db import Base, get_async_db_context +from pydantic import BaseModel, ConfigDict +from sqlalchemy import JSON, BigInteger, Boolean, Column, Index, String, Text, cast, delete, func, or_, select, update +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/models/calendar.py b/backend/open_webui/models/calendar.py index 47f0a6f722..f2f9ed464c 100644 --- a/backend/open_webui/models/calendar.py +++ b/backend/open_webui/models/calendar.py @@ -1,30 +1,29 @@ -import time import logging +import time from typing import Optional from uuid import uuid4 -from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy import ( - Column, - Text, - JSON, - Boolean, - BigInteger, - Index, - UniqueConstraint, - select, - or_, - exists, - func, - delete, - update, -) -from sqlalchemy.ext.asyncio import AsyncSession - from open_webui.internal.db import Base, get_async_db_context from open_webui.models.access_grants import AccessGrantModel, AccessGrants from open_webui.models.groups import Groups from open_webui.models.users import User, UserModel, UserResponse +from pydantic import BaseModel, ConfigDict, Field +from sqlalchemy import ( + JSON, + BigInteger, + Boolean, + Column, + Index, + Text, + UniqueConstraint, + delete, + exists, + func, + or_, + select, + update, +) +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -395,14 +394,16 @@ class CalendarTable: # Delete events await db.execute(delete(CalendarEvent).filter(CalendarEvent.calendar_id == id)) - # Delete access grants - await AccessGrants.revoke_all_access('calendar', id, db=db) - # Delete calendar await db.execute(delete(Calendar).filter(Calendar.id == id)) await db.commit() - return True - except Exception: + + # Revoke access grants in a separate transaction to avoid + # write-lock contention on SQLite when session sharing is off. + await AccessGrants.revoke_all_access('calendar', id) + return True + except Exception as e: + log.exception(f'Failed to delete calendar {id}: {e}') return False diff --git a/backend/open_webui/models/channels.py b/backend/open_webui/models/channels.py index 942c06d6b3..9d5f130355 100644 --- a/backend/open_webui/models/channels.py +++ b/backend/open_webui/models/channels.py @@ -4,29 +4,33 @@ import time import uuid from typing import Optional -from sqlalchemy import select, delete, update, func, case, or_, and_ -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context -from open_webui.models.groups import Groups from open_webui.models.access_grants import ( AccessGrantModel, AccessGrants, ) - -from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy.dialects.postgresql import JSONB - - +from open_webui.models.groups import Groups +from open_webui.utils.validate import validate_profile_image_url +from pydantic import BaseModel, ConfigDict, Field, field_validator from sqlalchemy import ( + JSON, BigInteger, Boolean, Column, ForeignKey, String, Text, - JSON, UniqueConstraint, + and_, + case, + delete, + func, + or_, + select, + update, ) +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.ext.asyncio import AsyncSession #################### # Channel DB Schema @@ -244,6 +248,13 @@ class ChannelWebhookForm(BaseModel): name: str profile_image_url: Optional[str] = None + @field_validator('profile_image_url', mode='before') + @classmethod + def check_profile_image_url(cls, v: Optional[str]) -> Optional[str]: + if v is None: + return v + return validate_profile_image_url(v) + class ChannelTable: async def _get_access_grants(self, channel_id: str, db: Optional[AsyncSession] = None) -> list[AccessGrantModel]: diff --git a/backend/open_webui/models/chat_messages.py b/backend/open_webui/models/chat_messages.py index 0758e0354d..b33be1f7eb 100644 --- a/backend/open_webui/models/chat_messages.py +++ b/backend/open_webui/models/chat_messages.py @@ -3,21 +3,24 @@ import time import uuid from typing import Any, Optional -from sqlalchemy import select, delete, func, cast, Integer -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, get_async_db_context from open_webui.utils.response import normalize_usage - from pydantic import BaseModel, ConfigDict from sqlalchemy import ( + JSON, BigInteger, Boolean, Column, ForeignKey, - Text, - JSON, Index, + Integer, + Text, + cast, + delete, + func, + select, ) +from sqlalchemy.ext.asyncio import AsyncSession #################### # Helpers @@ -48,6 +51,25 @@ def get_usage(data: dict) -> Optional[dict]: return normalize_usage(usage) if usage else None +def _token_columns(dialect: str): + """Return (input_tokens, output_tokens) SQL column expressions. + + Falls back to OpenAI-style keys (prompt_tokens / completion_tokens) + when the normalized keys are absent. + """ + if dialect == 'sqlite': + extract = lambda key: cast(func.json_extract(ChatMessage.usage, f'$.{key}'), Integer) + elif dialect == 'postgresql': + extract = lambda key: cast(func.json_extract_path_text(ChatMessage.usage, key), Integer) + else: + raise NotImplementedError(f'Unsupported dialect: {dialect}') + + return ( + func.coalesce(extract('input_tokens'), extract('prompt_tokens')), + func.coalesce(extract('output_tokens'), extract('completion_tokens')), + ) + + #################### # ChatMessage DB Schema #################### @@ -222,6 +244,79 @@ class ChatMessageTable: messages = result.scalars().all() return [ChatMessageModel.model_validate(message) for message in messages] + # DB column names that differ from the JSON message keys. + DB_TO_JSON_KEY_MAP = { + 'parent_id': 'parentId', + 'model_id': 'model', + 'status_history': 'statusHistory', + 'created_at': 'timestamp', + } + # DB-internal columns excluded from the reconstructed message dict. + EXCLUDED_COLUMNS = frozenset({'id', 'chat_id', 'user_id', 'updated_at'}) + + async def get_messages_map_by_chat_id(self, chat_id: str, db: Optional[AsyncSession] = None) -> Optional[dict]: + """Build a {message_id: message_dict} map from chat_message rows. + + Returns the same shape as chat.history.messages so callers + (get_message_list, middleware) work unchanged. Returns None if + no rows exist for the chat (caller should fall back to the + embedded JSON blob for legacy chats). + """ + async with get_async_db_context(db) as db: + result = await db.execute(select(ChatMessage).filter_by(chat_id=chat_id)) + rows = result.scalars().all() + + if not rows: + return None + + # Strip the composite-id prefix ("{chat_id}-") to recover the + # original message_id used as map key. + prefix = f'{chat_id}-' + prefix_len = len(prefix) + col_keys = [c.key for c in ChatMessage.__table__.columns] + + messages_map: dict[str, dict] = {} + for row in rows: + msg_id = row.id[prefix_len:] if row.id.startswith(prefix) else row.id + + msg: dict = {'id': msg_id} + for key in col_keys: + if key in self.EXCLUDED_COLUMNS: + continue + val = getattr(row, key) + if val is None: + continue + json_key = self.DB_TO_JSON_KEY_MAP.get(key, key) + msg[json_key] = val + + # Ensure content always has a value + msg.setdefault('content', '') + + # Mirror usage into info.usage for callers that read it there + if 'usage' in msg: + msg['info'] = {'usage': msg['usage']} + + messages_map[msg_id] = msg + + # Reconstruct childrenIds from parentId links so that the map + # is fully navigable (callers like the frontend rely on this). + for msg_id, msg in messages_map.items(): + parent_id = msg.get('parentId') + if parent_id and parent_id in messages_map: + parent = messages_map[parent_id] + children = parent.get('childrenIds') + if children is None: + parent['childrenIds'] = [msg_id] + elif msg_id not in children: + children.append(msg_id) + + # Ensure every message has a childrenIds list (leaf nodes get []) + for msg in messages_map.values(): + if 'childrenIds' not in msg: + msg['childrenIds'] = [] + + return messages_map + async def get_messages_by_user_id( self, user_id: str, @@ -343,20 +438,7 @@ class ChatMessageTable: bind = await db.connection() dialect = bind.dialect.name - if dialect == 'sqlite': - input_tokens = cast(func.json_extract(ChatMessage.usage, '$.input_tokens'), Integer) - output_tokens = cast(func.json_extract(ChatMessage.usage, '$.output_tokens'), Integer) - elif dialect == 'postgresql': - input_tokens = cast( - func.json_extract_path_text(ChatMessage.usage, 'input_tokens'), - Integer, - ) - output_tokens = cast( - func.json_extract_path_text(ChatMessage.usage, 'output_tokens'), - Integer, - ) - else: - raise NotImplementedError(f'Unsupported dialect: {dialect}') + input_tokens, output_tokens = _token_columns(dialect) stmt = select( ChatMessage.model_id, @@ -404,20 +486,7 @@ class ChatMessageTable: bind = await db.connection() dialect = bind.dialect.name - if dialect == 'sqlite': - input_tokens = cast(func.json_extract(ChatMessage.usage, '$.input_tokens'), Integer) - output_tokens = cast(func.json_extract(ChatMessage.usage, '$.output_tokens'), Integer) - elif dialect == 'postgresql': - input_tokens = cast( - func.json_extract_path_text(ChatMessage.usage, 'input_tokens'), - Integer, - ) - output_tokens = cast( - func.json_extract_path_text(ChatMessage.usage, 'output_tokens'), - Integer, - ) - else: - raise NotImplementedError(f'Unsupported dialect: {dialect}') + input_tokens, output_tokens = _token_columns(dialect) stmt = select( ChatMessage.user_id, @@ -513,6 +582,7 @@ class ChatMessageTable: """Get message counts grouped by day and model.""" async with get_async_db_context(db) as db: from datetime import datetime, timedelta + from open_webui.models.groups import GroupMember stmt = select(ChatMessage.created_at, ChatMessage.model_id).filter( diff --git a/backend/open_webui/models/chats.py b/backend/open_webui/models/chats.py index bcf6951e49..954d8640f0 100644 --- a/backend/open_webui/models/chats.py +++ b/backend/open_webui/models/chats.py @@ -1,32 +1,39 @@ -import logging +from __future__ import annotations + import json +import logging import time import uuid from typing import Optional -from sqlalchemy import select, delete, update, func, or_, and_, text -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.sql import exists -from sqlalchemy.sql.expression import bindparam from open_webui.internal.db import Base, JSONField, get_async_db_context -from open_webui.models.tags import TagModel, Tag, Tags -from open_webui.models.folders import Folders -from open_webui.models.chat_messages import ChatMessage, ChatMessages from open_webui.models.automations import AutomationRun +from open_webui.models.chat_messages import ChatMessage, ChatMessages +from open_webui.models.folders import Folders +from open_webui.models.tags import Tag, TagModel, Tags from open_webui.utils.misc import sanitize_data_for_db, sanitize_text_for_db - from pydantic import BaseModel, ConfigDict from sqlalchemy import ( + JSON, BigInteger, Boolean, Column, ForeignKey, + Index, String, Text, - JSON, - Index, UniqueConstraint, + and_, + delete, + func, + or_, + select, + text, + update, ) +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.sql import exists +from sqlalchemy.sql.expression import bindparam #################### # Chat DB Schema @@ -81,17 +88,17 @@ class ChatModel(BaseModel): created_at: int # timestamp in epoch updated_at: int # timestamp in epoch - share_id: Optional[str] = None + share_id: str | None = None archived: bool = False - pinned: Optional[bool] = False + pinned: bool | None = False meta: dict = {} - folder_id: Optional[str] = None + folder_id: str | None = None - tasks: Optional[list] = None - summary: Optional[str] = None + tasks: list | None = None + summary: str | None = None - last_read_at: Optional[int] = None + last_read_at: int | None = None class ChatFile(Base): @@ -115,7 +122,7 @@ class ChatFileModel(BaseModel): user_id: str chat_id: str - message_id: Optional[str] = None + message_id: str | None = None file_id: str created_at: int @@ -131,14 +138,14 @@ class ChatFileModel(BaseModel): class ChatForm(BaseModel): chat: dict - folder_id: Optional[str] = None + folder_id: str | None = None class ChatImportForm(ChatForm): - meta: Optional[dict] = {} - pinned: Optional[bool] = False - created_at: Optional[int] = None - updated_at: Optional[int] = None + meta: dict | None = {} + pinned: bool | None = False + created_at: int | None = None + updated_at: int | None = None class ChatsImportForm(BaseModel): @@ -161,14 +168,14 @@ class ChatResponse(BaseModel): chat: dict updated_at: int # timestamp in epoch created_at: int # timestamp in epoch - share_id: Optional[str] = None # id of the chat to be shared + share_id: str | None = None # id of the chat to be shared archived: bool - pinned: Optional[bool] = False + pinned: bool | None = False meta: dict = {} - folder_id: Optional[str] = None + folder_id: str | None = None - tasks: Optional[list] = None - summary: Optional[str] = None + tasks: list | None = None + summary: str | None = None class ChatTitleIdResponse(BaseModel): @@ -176,13 +183,13 @@ class ChatTitleIdResponse(BaseModel): title: str updated_at: int created_at: int - last_read_at: Optional[int] = None + last_read_at: int | None = None class SharedChatResponse(BaseModel): id: str title: str - share_id: Optional[str] = None + share_id: str | None = None updated_at: int created_at: int @@ -225,17 +232,17 @@ class ChatUsageStatsListResponse(BaseModel): class MessageStats(BaseModel): id: str role: str - model: Optional[str] = None + model: str | None = None content_length: int - token_count: Optional[int] = None - timestamp: Optional[int] = None - rating: Optional[int] = None # Derived from message.annotation.rating - tags: Optional[list[str]] = None # Derived from message.annotation.tags + token_count: int | None = None + timestamp: int | None = None + rating: int | None = None # Derived from message.annotation.rating + tags: list[str | None] = None # Derived from message.annotation.tags class ChatHistoryStats(BaseModel): messages: dict[str, MessageStats] - currentId: Optional[str] = None + currentId: str | None = None class ChatBody(BaseModel): @@ -293,8 +300,8 @@ class ChatTable: return changed async def insert_new_chat( - self, id: str, user_id: str, form_data: ChatForm, db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + self, id: str, user_id: str, form_data: ChatForm, db: AsyncSession | None = None + ) -> ChatModel | None: async with get_async_db_context(db) as db: chat = ChatModel( **{ @@ -353,7 +360,7 @@ class ChatTable: self, user_id: str, chat_import_forms: list[ChatImportForm], - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatModel]: async with get_async_db_context(db) as db: chats = [] @@ -366,24 +373,24 @@ class ChatTable: await db.commit() # Dual-write messages to chat_message table - try: - for form_data, chat_obj in zip(chat_import_forms, chats): - history = form_data.chat.get('history', {}) - messages = history.get('messages', {}) - for message_id, message in messages.items(): - if isinstance(message, dict) and message.get('role'): + for form_data, chat_obj in zip(chat_import_forms, chats): + history = form_data.chat.get('history', {}) + messages = history.get('messages', {}) + for message_id, message in messages.items(): + if isinstance(message, dict) and message.get('role'): + try: await ChatMessages.upsert_message( message_id=message_id, chat_id=chat_obj.id, user_id=user_id, data=message, ) - except Exception as e: - log.warning(f'Failed to write imported messages to chat_message table: {e}') + except Exception as e: + log.warning(f'Failed to write imported message {message_id} for chat {chat_obj.id}: {e}') return [ChatModel.model_validate(chat) for chat in chats] - async def update_chat_by_id(self, id: str, chat: dict, db: Optional[AsyncSession] = None) -> Optional[ChatModel]: + async def update_chat_by_id(self, id: str, chat: dict, db: AsyncSession | None = None) -> ChatModel | None: try: async with get_async_db_context(db) as db: chat_item = await db.get(Chat, id) @@ -398,7 +405,7 @@ class ChatTable: except Exception: return None - async def update_chat_last_read_at_by_id(self, id: str, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def update_chat_last_read_at_by_id(self, id: str, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: chat = await db.get(Chat, id) @@ -410,7 +417,7 @@ class ChatTable: except Exception: return False - async def update_chat_title_by_id(self, id: str, title: str) -> Optional[ChatModel]: + async def update_chat_title_by_id(self, id: str, title: str) -> ChatModel | None: try: async with get_async_db_context() as db: chat_item = await db.get(Chat, id) @@ -426,7 +433,7 @@ class ChatTable: except Exception: return None - async def update_chat_tags_by_id(self, id: str, tags: list[str], user) -> Optional[ChatModel]: + async def update_chat_tags_by_id(self, id: str, tags: list[str], user) -> ChatModel | None: async with get_async_db_context() as db: chat = await db.get(Chat, id) if chat is None: @@ -451,7 +458,7 @@ class ChatTable: return ChatModel.model_validate(chat) - async def get_chat_title_by_id(self, id: str) -> Optional[str]: + async def get_chat_title_by_id(self, id: str) -> str | None: async with get_async_db_context() as db: result = await db.execute(select(Chat.title).filter_by(id=id)) row = result.first() @@ -459,14 +466,89 @@ class ChatTable: return None return row[0] or 'New Chat' - async def get_messages_map_by_chat_id(self, id: str) -> Optional[dict]: + @staticmethod + def get_unresolved_parent_ids(messages_map: dict) -> set[str]: + """Return parent IDs referenced by messages but absent from the map. + + An empty set means the message graph is fully connected. + """ + return { + msg['parentId'] + for msg in messages_map.values() + if msg.get('parentId') and msg['parentId'] not in messages_map + } + + async def backfill_messages_by_chat_id(self, chat_id: str, user_id: str, messages: dict[str, dict]) -> None: + """Write messages to the ``chat_message`` table so future lookups + use the fast path. Errors are logged but never raised. + """ + for message_id, message in messages.items(): + if not isinstance(message, dict) or not message.get('role'): + continue + try: + await ChatMessages.upsert_message( + message_id=message_id, + chat_id=chat_id, + user_id=user_id, + data=message, + ) + except Exception as e: + log.warning('Backfill failed for message %s in chat %s: %s', message_id, chat_id, e) + + async def get_messages_map_by_chat_id(self, id: str) -> dict | None: + """Message map for walking history (see ``get_message_list``). + + Prefer ``chat_message`` rows to avoid loading the large embedded + history; fall back to the legacy JSON when no rows exist. + When rows exist but the parent-link graph has gaps (e.g. migration + failures), missing messages are merged from the legacy history + and backfilled so future requests self-heal. + """ + # Fast path: build from normalized chat_message rows. + messages_map = await ChatMessages.get_messages_map_by_chat_id(id) + + if messages_map is not None: + unresolved_ids = self.get_unresolved_parent_ids(messages_map) + if not unresolved_ids: + return messages_map + + # Graph has gaps — enrich from the legacy embedded history. + log.info( + 'Chat %s: %d unresolved parent reference(s) in chat_message — enriching from legacy history', + id, + len(unresolved_ids), + ) + chat = await self.get_chat_by_id(id) + if chat: + history_messages = chat.chat.get('history', {}).get('messages', {}) or {} + missing_messages = { + message_id: history_messages[message_id] + for message_id in unresolved_ids + if message_id in history_messages + } + + if missing_messages: + messages_map.update(missing_messages) + + # Backfill so future requests use the fast path. + await self.backfill_messages_by_chat_id(id, chat.user_id, missing_messages) + + return messages_map + + # No rows — fall back to the legacy embedded history. chat = await self.get_chat_by_id(id) if chat is None: return None - return chat.chat.get('history', {}).get('messages', {}) or {} + history_messages = chat.chat.get('history', {}).get('messages', {}) or {} - async def get_message_by_id_and_message_id(self, id: str, message_id: str) -> Optional[dict]: + # Backfill so future requests use the fast path. + if history_messages: + await self.backfill_messages_by_chat_id(id, chat.user_id, history_messages) + + return history_messages + + async def get_message_by_id_and_message_id(self, id: str, message_id: str) -> dict | None: chat = await self.get_chat_by_id(id) if chat is None: return None @@ -475,7 +557,7 @@ class ChatTable: async def upsert_message_to_chat_by_id_and_message_id( self, id: str, message_id: str, message: dict - ) -> Optional[ChatModel]: + ) -> ChatModel | None: chat = await self.get_chat_by_id(id) if chat is None: return None @@ -515,7 +597,7 @@ class ChatTable: async def add_message_status_to_chat_by_id_and_message_id( self, id: str, message_id: str, status: dict - ) -> Optional[ChatModel]: + ) -> ChatModel | None: chat = await self.get_chat_by_id(id) if chat is None: return None @@ -551,9 +633,7 @@ class ChatTable: await self.update_chat_by_id(id, chat, db=db) return message_files - async def insert_shared_chat_by_chat_id( - self, chat_id: str, db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + async def insert_shared_chat_by_chat_id(self, chat_id: str, db: AsyncSession | None = None) -> ChatModel | None: """Create a shared snapshot for a chat. Returns the original chat with share_id set.""" from open_webui.models.shared_chats import SharedChats @@ -576,9 +656,7 @@ class ChatTable: await db.refresh(chat) return ChatModel.model_validate(chat) - async def update_shared_chat_by_chat_id( - self, chat_id: str, db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + async def update_shared_chat_by_chat_id(self, chat_id: str, db: AsyncSession | None = None) -> ChatModel | None: """Re-snapshot the shared chat with current chat data.""" from open_webui.models.shared_chats import SharedChats @@ -593,7 +671,7 @@ class ChatTable: except Exception: return None - async def delete_shared_chat_by_chat_id(self, chat_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_shared_chat_by_chat_id(self, chat_id: str, db: AsyncSession | None = None) -> bool: """Delete shared snapshot for a chat.""" from open_webui.models.shared_chats import SharedChats @@ -602,7 +680,7 @@ class ChatTable: except Exception: return False - async def unarchive_all_chats_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def unarchive_all_chats_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(update(Chat).filter_by(user_id=user_id).values(archived=False)) @@ -612,8 +690,8 @@ class ChatTable: return False async def update_chat_share_id_by_id( - self, id: str, share_id: Optional[str], db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + self, id: str, share_id: str | None, db: AsyncSession | None = None + ) -> ChatModel | None: try: async with get_async_db_context(db) as db: chat = await db.get(Chat, id) @@ -624,7 +702,7 @@ class ChatTable: except Exception: return None - async def toggle_chat_pinned_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ChatModel]: + async def toggle_chat_pinned_by_id(self, id: str, db: AsyncSession | None = None) -> ChatModel | None: try: async with get_async_db_context(db) as db: chat = await db.get(Chat, id) @@ -636,7 +714,7 @@ class ChatTable: except Exception: return None - async def toggle_chat_archive_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ChatModel]: + async def toggle_chat_archive_by_id(self, id: str, db: AsyncSession | None = None) -> ChatModel | None: try: async with get_async_db_context(db) as db: chat = await db.get(Chat, id) @@ -649,7 +727,7 @@ class ChatTable: except Exception: return None - async def archive_all_chats_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def archive_all_chats_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(update(Chat).filter_by(user_id=user_id).values(archived=True)) @@ -661,10 +739,10 @@ class ChatTable: async def get_archived_chat_list_by_user_id( self, user_id: str, - filter: Optional[dict] = None, + filter: dict | None = None, skip: int = 0, limit: int = 50, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatTitleIdResponse]: async with get_async_db_context(db) as db: stmt = select(Chat.id, Chat.title, Chat.updated_at, Chat.created_at).filter_by( @@ -714,10 +792,10 @@ class ChatTable: async def get_shared_chat_list_by_user_id( self, user_id: str, - filter: Optional[dict] = None, + filter: dict | None = None, skip: int = 0, limit: int = 50, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[SharedChatResponse]: """Delegate to SharedChats for listing shared chats by user.""" from open_webui.models.shared_chats import SharedChats @@ -728,10 +806,10 @@ class ChatTable: self, user_id: str, include_archived: bool = False, - filter: Optional[dict] = None, + filter: dict | None = None, skip: int = 0, limit: int = 50, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatTitleIdResponse]: async with get_async_db_context(db) as db: stmt = select(Chat.id, Chat.title, Chat.updated_at, Chat.created_at, Chat.last_read_at).filter_by( @@ -784,9 +862,9 @@ class ChatTable: include_archived: bool = False, include_folders: bool = False, include_pinned: bool = False, - skip: Optional[int] = None, - limit: Optional[int] = None, - db: Optional[AsyncSession] = None, + skip: int | None = None, + limit: int | None = None, + db: AsyncSession | None = None, ) -> list[ChatTitleIdResponse]: async with get_async_db_context(db) as db: stmt = select(Chat.id, Chat.title, Chat.updated_at, Chat.created_at, Chat.last_read_at).filter_by( @@ -830,7 +908,7 @@ class ChatTable: chat_ids: list[str], skip: int = 0, limit: int = 50, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatModel]: async with get_async_db_context(db) as db: result = await db.execute( @@ -839,7 +917,7 @@ class ChatTable: all_chats = result.scalars().all() return [ChatModel.model_validate(chat) for chat in all_chats] - async def get_chat_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ChatModel]: + async def get_chat_by_id(self, id: str, db: AsyncSession | None = None) -> ChatModel | None: try: async with get_async_db_context(db) as db: chat_item = await db.get(Chat, id) @@ -854,7 +932,7 @@ class ChatTable: except Exception: return None - async def get_chat_by_share_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ChatModel]: + async def get_chat_by_share_id(self, id: str, db: AsyncSession | None = None) -> ChatModel | None: """Look up a shared chat snapshot by its share token.""" from open_webui.models.shared_chats import SharedChats @@ -876,8 +954,8 @@ class ChatTable: return None async def get_chat_by_id_and_user_id( - self, id: str, user_id: str, db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + self, id: str, user_id: str, db: AsyncSession | None = None + ) -> ChatModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(Chat).filter_by(id=id, user_id=user_id)) @@ -886,7 +964,7 @@ class ChatTable: except Exception: return None - async def is_chat_owner(self, id: str, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def is_chat_owner(self, id: str, user_id: str, db: AsyncSession | None = None) -> bool: """ Lightweight ownership check — uses EXISTS subquery instead of loading the full Chat row (which includes the potentially large JSON blob). @@ -898,7 +976,7 @@ class ChatTable: except Exception: return False - async def get_chat_folder_id(self, id: str, user_id: str, db: Optional[AsyncSession] = None) -> Optional[str]: + async def get_chat_folder_id(self, id: str, user_id: str, db: AsyncSession | None = None) -> str | None: """ Fetch only the folder_id column for a chat, without loading the full JSON blob. Returns None if chat doesn't exist or doesn't belong to user. @@ -911,7 +989,7 @@ class ChatTable: except Exception: return None - async def get_chats(self, skip: int = 0, limit: int = 50, db: Optional[AsyncSession] = None) -> list[ChatModel]: + async def get_chats(self, skip: int = 0, limit: int = 50, db: AsyncSession | None = None) -> list[ChatModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Chat).order_by(Chat.updated_at.desc())) all_chats = result.scalars().all() @@ -920,10 +998,10 @@ class ChatTable: async def get_chats_by_user_id( self, user_id: str, - filter: Optional[dict] = None, - skip: Optional[int] = None, - limit: Optional[int] = None, - db: Optional[AsyncSession] = None, + filter: dict | None = None, + skip: int | None = None, + limit: int | None = None, + db: AsyncSession | None = None, ) -> ChatListResponse: async with get_async_db_context(db) as db: stmt = select(Chat).filter_by(user_id=user_id) @@ -966,7 +1044,7 @@ class ChatTable: ) async def get_pinned_chats_by_user_id( - self, user_id: str, db: Optional[AsyncSession] = None + self, user_id: str, db: AsyncSession | None = None ) -> list[ChatTitleIdResponse]: async with get_async_db_context(db) as db: result = await db.execute( @@ -988,7 +1066,7 @@ class ChatTable: for chat in all_chats ] - async def get_archived_chats_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> list[ChatModel]: + async def get_archived_chats_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> list[ChatModel]: async with get_async_db_context(db) as db: result = await db.execute( select(Chat).filter_by(user_id=user_id, archived=True).order_by(Chat.updated_at.desc()) @@ -1002,7 +1080,7 @@ class ChatTable: include_archived: bool = False, skip: int = 0, limit: int = 60, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatModel]: """ Filters chats based on a search query using Python, allowing pagination using skip and limit. @@ -1195,7 +1273,7 @@ class ChatTable: user_id: str, skip: int = 0, limit: int = 60, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatTitleIdResponse]: async with get_async_db_context(db) as db: stmt = ( @@ -1227,7 +1305,7 @@ class ChatTable: ] async def get_chats_by_folder_ids_and_user_id( - self, folder_ids: list[str], user_id: str, db: Optional[AsyncSession] = None + self, folder_ids: list[str], user_id: str, db: AsyncSession | None = None ) -> list[ChatModel]: async with get_async_db_context(db) as db: stmt = ( @@ -1243,8 +1321,8 @@ class ChatTable: return [ChatModel.model_validate(chat) for chat in all_chats] async def update_chat_folder_id_by_id_and_user_id( - self, id: str, user_id: str, folder_id: str, db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + self, id: str, user_id: str, folder_id: str, db: AsyncSession | None = None + ) -> ChatModel | None: try: async with get_async_db_context(db) as db: chat = await db.get(Chat, id) @@ -1258,7 +1336,7 @@ class ChatTable: return None async def get_chat_tags_by_id_and_user_id( - self, id: str, user_id: str, db: Optional[AsyncSession] = None + self, id: str, user_id: str, db: AsyncSession | None = None ) -> list[TagModel]: async with get_async_db_context(db) as db: stmt = select(Chat.meta).where(Chat.id == id) @@ -1273,7 +1351,7 @@ class ChatTable: tag_name: str, skip: int = 0, limit: int = 50, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ChatTitleIdResponse]: async with get_async_db_context(db) as db: stmt = select(Chat.id, Chat.title, Chat.updated_at, Chat.created_at, Chat.last_read_at).filter_by( @@ -1318,8 +1396,8 @@ class ChatTable: ] async def add_chat_tag_by_id_and_user_id_and_tag_name( - self, id: str, user_id: str, tag_name: str, db: Optional[AsyncSession] = None - ) -> Optional[ChatModel]: + self, id: str, user_id: str, tag_name: str, db: AsyncSession | None = None + ) -> ChatModel | None: tag_id = tag_name.replace(' ', '_').lower() await Tags.ensure_tags_exist([tag_name], user_id, db=db) try: @@ -1337,7 +1415,7 @@ class ChatTable: return None async def count_chats_by_tag_name_and_user_id( - self, tag_name: str, user_id: str, db: Optional[AsyncSession] = None + self, tag_name: str, user_id: str, db: AsyncSession | None = None ) -> int: async with get_async_db_context(db) as db: stmt = select(func.count(Chat.id)).filter_by(user_id=user_id, archived=False) @@ -1364,7 +1442,7 @@ class ChatTable: tag_ids: list[str], user_id: str, threshold: int = 0, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> None: """Delete tag rows from *tag_ids* that appear in at most *threshold* non-archived chats for *user_id*. One query to find orphans, one to @@ -1385,7 +1463,7 @@ class ChatTable: await Tags.delete_tags_by_ids_and_user_id(orphans, user_id, db=db) async def count_chats_by_folder_id_and_user_id( - self, folder_id: str, user_id: str, db: Optional[AsyncSession] = None + self, folder_id: str, user_id: str, db: AsyncSession | None = None ) -> int: async with get_async_db_context(db) as db: result = await db.execute(select(func.count(Chat.id)).filter_by(user_id=user_id, folder_id=folder_id)) @@ -1395,7 +1473,7 @@ class ChatTable: return count async def delete_tag_by_id_and_user_id_and_tag_name( - self, id: str, user_id: str, tag_name: str, db: Optional[AsyncSession] = None + self, id: str, user_id: str, tag_name: str, db: AsyncSession | None = None ) -> bool: try: async with get_async_db_context(db) as db: @@ -1413,7 +1491,7 @@ class ChatTable: except Exception: return False - async def delete_all_tags_by_id_and_user_id(self, id: str, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_all_tags_by_id_and_user_id(self, id: str, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: chat = await db.get(Chat, id) @@ -1427,7 +1505,7 @@ class ChatTable: except Exception: return False - async def delete_chat_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_chat_by_id(self, id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(update(AutomationRun).filter_by(chat_id=id).values(chat_id=None)) @@ -1439,7 +1517,7 @@ class ChatTable: except Exception: return False - async def delete_chat_by_id_and_user_id(self, id: str, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_chat_by_id_and_user_id(self, id: str, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(update(AutomationRun).filter_by(chat_id=id).values(chat_id=None)) @@ -1451,7 +1529,7 @@ class ChatTable: except Exception: return False - async def delete_chats_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_chats_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await self.delete_shared_chats_by_user_id(user_id, db=db) @@ -1473,7 +1551,7 @@ class ChatTable: return False async def delete_chats_by_user_id_and_folder_id( - self, user_id: str, folder_id: str, db: Optional[AsyncSession] = None + self, user_id: str, folder_id: str, db: AsyncSession | None = None ) -> bool: try: async with get_async_db_context(db) as db: @@ -1493,8 +1571,8 @@ class ChatTable: self, user_id: str, folder_id: str, - new_folder_id: Optional[str], - db: Optional[AsyncSession] = None, + new_folder_id: str | None, + db: AsyncSession | None = None, ) -> bool: try: async with get_async_db_context(db) as db: @@ -1507,9 +1585,10 @@ class ChatTable: except Exception: return False - async def delete_shared_chats_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_shared_chats_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> bool: """Delete all shared chat snapshots created by a user.""" - from open_webui.models.shared_chats import SharedChats, SharedChat as SharedChatTable + from open_webui.models.shared_chats import SharedChat as SharedChatTable + from open_webui.models.shared_chats import SharedChats try: async with get_async_db_context(db) as db: @@ -1530,8 +1609,8 @@ class ChatTable: message_id: str, file_ids: list[str], user_id: str, - db: Optional[AsyncSession] = None, - ) -> Optional[list[ChatFileModel]]: + db: AsyncSession | None = None, + ) -> list[ChatFileModel | None]: if not file_ids: return None @@ -1570,7 +1649,7 @@ class ChatTable: return None async def get_chat_files_by_chat_id_and_message_id( - self, chat_id: str, message_id: str, db: Optional[AsyncSession] = None + self, chat_id: str, message_id: str, db: AsyncSession | None = None ) -> list[ChatFileModel]: async with get_async_db_context(db) as db: result = await db.execute( @@ -1579,7 +1658,7 @@ class ChatTable: all_chat_files = result.scalars().all() return [ChatFileModel.model_validate(chat_file) for chat_file in all_chat_files] - async def delete_chat_file(self, chat_id: str, file_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_chat_file(self, chat_id: str, file_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(delete(ChatFile).filter_by(chat_id=chat_id, file_id=file_id)) @@ -1588,7 +1667,7 @@ class ChatTable: except Exception: return False - async def get_shared_chat_ids_by_file_id(self, file_id: str, db: Optional[AsyncSession] = None) -> list[str]: + async def get_shared_chat_ids_by_file_id(self, file_id: str, db: AsyncSession | None = None) -> list[str]: """Return IDs of chats that contain this file and have an active share link.""" async with get_async_db_context(db) as db: result = await db.execute( @@ -1598,7 +1677,7 @@ class ChatTable: ) return [row[0] for row in result.all()] - async def update_chat_tasks_by_id(self, id: str, tasks: list[dict]) -> Optional[ChatModel]: + async def update_chat_tasks_by_id(self, id: str, tasks: list[dict]) -> ChatModel | None: """Update the tasks list on a chat.""" try: async with get_async_db_context() as db: diff --git a/backend/open_webui/models/feedbacks.py b/backend/open_webui/models/feedbacks.py index 02f61f82ee..00bb6f1588 100644 --- a/backend/open_webui/models/feedbacks.py +++ b/backend/open_webui/models/feedbacks.py @@ -3,13 +3,11 @@ import time import uuid from typing import Optional -from sqlalchemy import select, delete, func -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context from open_webui.models.users import User, UserModel - from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, Text, JSON, Boolean +from sqlalchemy import JSON, BigInteger, Boolean, Column, Text, delete, func, select +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -103,7 +101,8 @@ class FeedbackForm(BaseModel): data: Optional[RatingData] = None meta: Optional[dict] = None snapshot: Optional[SnapshotData] = None - model_config = ConfigDict(extra='allow') + # ignore: drop client-supplied id/user_id/version/timestamps at parse time. + model_config = ConfigDict(extra='ignore') class UserResponse(BaseModel): @@ -145,12 +144,13 @@ class FeedbackTable: ) -> Optional[FeedbackModel]: async with get_async_db_context(db) as db: id = str(uuid.uuid4()) + # Spread form_data first so server-controlled fields win on duplicate keys. feedback = FeedbackModel( **{ + **form_data.model_dump(), 'id': id, 'user_id': user_id, 'version': 0, - **form_data.model_dump(), 'created_at': int(time.time()), 'updated_at': int(time.time()), } @@ -317,8 +317,8 @@ class FeedbackTable: If days=0, returns all time data starting from first feedback. Returns: [{"date": "2026-01-08", "won": 5, "lost": 2}, ...] """ - from datetime import datetime, timedelta from collections import defaultdict + from datetime import datetime, timedelta async with get_async_db_context(db) as db: if days == 0: diff --git a/backend/open_webui/models/files.py b/backend/open_webui/models/files.py index cfdcfbc2d9..17fe85b294 100644 --- a/backend/open_webui/models/files.py +++ b/backend/open_webui/models/files.py @@ -1,13 +1,14 @@ +from __future__ import annotations + import logging import time from typing import Optional -from sqlalchemy import select, delete, func -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context from open_webui.utils.misc import sanitize_metadata from pydantic import BaseModel, ConfigDict, model_validator -from sqlalchemy import BigInteger, Column, String, Text, JSON +from sqlalchemy import JSON, BigInteger, Column, String, Text, delete, func, select +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -39,16 +40,16 @@ class FileModel(BaseModel): id: str user_id: str - hash: Optional[str] = None + hash: str | None = None filename: str - path: Optional[str] = None + path: str | None = None - data: Optional[dict] = None - meta: Optional[dict] = None + data: dict | None = None + meta: dict | None = None - created_at: Optional[int] # timestamp in epoch - updated_at: Optional[int] # timestamp in epoch + created_at: int | None # timestamp in epoch + updated_at: int | None # timestamp in epoch #################### @@ -57,9 +58,9 @@ class FileModel(BaseModel): class FileMeta(BaseModel): - name: Optional[str] = None - content_type: Optional[str] = None - size: Optional[int] = None + name: str | None = None + content_type: str | None = None + size: int | None = None model_config = ConfigDict(extra='allow') @@ -84,22 +85,22 @@ class FileMeta(BaseModel): class FileModelResponse(BaseModel): id: str user_id: str - hash: Optional[str] = None + hash: str | None = None filename: str - data: Optional[dict] = None - meta: Optional[FileMeta] = None + data: dict | None = None + meta: FileMeta | None = None created_at: int # timestamp in epoch - updated_at: Optional[int] = None # timestamp in epoch, optional for legacy files + updated_at: int | None = None # timestamp in epoch, optional for legacy files model_config = ConfigDict(extra='allow') class FileMetadataResponse(BaseModel): id: str - hash: Optional[str] = None - meta: Optional[dict] = None + hash: str | None = None + meta: dict | None = None created_at: int # timestamp in epoch updated_at: int # timestamp in epoch @@ -111,7 +112,7 @@ class FileListResponse(BaseModel): class FileForm(BaseModel): id: str - hash: Optional[str] = None + hash: str | None = None filename: str path: str data: dict = {} @@ -119,15 +120,15 @@ class FileForm(BaseModel): class FileUpdateForm(BaseModel): - hash: Optional[str] = None - data: Optional[dict] = None - meta: Optional[dict] = None + hash: str | None = None + data: dict | None = None + meta: dict | None = None class FilesTable: async def insert_new_file( - self, user_id: str, form_data: FileForm, db: Optional[AsyncSession] = None - ) -> Optional[FileModel]: + self, user_id: str, form_data: FileForm, db: AsyncSession | None = None + ) -> FileModel | None: async with get_async_db_context(db) as db: file_data = form_data.model_dump() @@ -158,7 +159,7 @@ class FilesTable: log.exception(f'Error inserting a new file: {e}') return None - async def get_file_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[FileModel]: + async def get_file_by_id(self, id: str, db: AsyncSession | None = None) -> FileModel | None: try: async with get_async_db_context(db) as db: try: @@ -170,8 +171,8 @@ class FilesTable: return None async def get_file_by_id_and_user_id( - self, id: str, user_id: str, db: Optional[AsyncSession] = None - ) -> Optional[FileModel]: + self, id: str, user_id: str, db: AsyncSession | None = None + ) -> FileModel | None: async with get_async_db_context(db) as db: try: result = await db.execute(select(File).filter_by(id=id, user_id=user_id)) @@ -183,9 +184,7 @@ class FilesTable: except Exception: return None - async def get_file_metadata_by_id( - self, id: str, db: Optional[AsyncSession] = None - ) -> Optional[FileMetadataResponse]: + async def get_file_metadata_by_id(self, id: str, db: AsyncSession | None = None) -> FileMetadataResponse | None: async with get_async_db_context(db) as db: try: file = await db.get(File, id) @@ -201,12 +200,12 @@ class FilesTable: except Exception: return None - async def get_files(self, db: Optional[AsyncSession] = None) -> list[FileModel]: + async def get_files(self, db: AsyncSession | None = None) -> list[FileModel]: async with get_async_db_context(db) as db: result = await db.execute(select(File)) return [FileModel.model_validate(file) for file in result.scalars().all()] - async def check_access_by_user_id(self, id, user_id, permission='write', db: Optional[AsyncSession] = None) -> bool: + async def check_access_by_user_id(self, id, user_id, permission='write', db: AsyncSession | None = None) -> bool: file = await self.get_file_by_id(id, db=db) if not file: return False @@ -215,13 +214,13 @@ class FilesTable: # Implement additional access control logic here as needed return False - async def get_files_by_ids(self, ids: list[str], db: Optional[AsyncSession] = None) -> list[FileModel]: + async def get_files_by_ids(self, ids: list[str], db: AsyncSession | None = None) -> list[FileModel]: async with get_async_db_context(db) as db: result = await db.execute(select(File).filter(File.id.in_(ids)).order_by(File.updated_at.desc())) return [FileModel.model_validate(file) for file in result.scalars().all()] async def get_file_metadatas_by_ids( - self, ids: list[str], db: Optional[AsyncSession] = None + self, ids: list[str], db: AsyncSession | None = None ) -> list[FileMetadataResponse]: async with get_async_db_context(db) as db: result = await db.execute( @@ -240,17 +239,17 @@ class FilesTable: for row in result.all() ] - async def get_files_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> list[FileModel]: + async def get_files_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> list[FileModel]: async with get_async_db_context(db) as db: result = await db.execute(select(File).filter_by(user_id=user_id)) return [FileModel.model_validate(file) for file in result.scalars().all()] async def get_file_list( self, - user_id: Optional[str] = None, + user_id: str | None = None, skip: int = 0, limit: int = 50, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> 'FileListResponse': async with get_async_db_context(db) as db: stmt = select(File) @@ -290,11 +289,11 @@ class FilesTable: async def search_files( self, - user_id: Optional[str] = None, + user_id: str | None = None, filename: str = '*', skip: int = 0, limit: int = 100, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[FileModel]: """ Search files with glob pattern matching, optional user filter, and pagination. @@ -323,8 +322,8 @@ class FilesTable: return [FileModel.model_validate(file) for file in result.scalars().all()] async def update_file_by_id( - self, id: str, form_data: FileUpdateForm, db: Optional[AsyncSession] = None - ) -> Optional[FileModel]: + self, id: str, form_data: FileUpdateForm, db: AsyncSession | None = None + ) -> FileModel | None: async with get_async_db_context(db) as db: try: result = await db.execute(select(File).filter_by(id=id)) @@ -347,8 +346,8 @@ class FilesTable: return None async def update_file_hash_by_id( - self, id: str, hash: Optional[str], db: Optional[AsyncSession] = None - ) -> Optional[FileModel]: + self, id: str, hash: str | None, db: AsyncSession | None = None + ) -> FileModel | None: async with get_async_db_context(db) as db: try: result = await db.execute(select(File).filter_by(id=id)) @@ -361,9 +360,7 @@ class FilesTable: except Exception: return None - async def update_file_data_by_id( - self, id: str, data: dict, db: Optional[AsyncSession] = None - ) -> Optional[FileModel]: + async def update_file_data_by_id(self, id: str, data: dict, db: AsyncSession | None = None) -> FileModel | None: async with get_async_db_context(db) as db: try: result = await db.execute(select(File).filter_by(id=id)) @@ -375,9 +372,7 @@ class FilesTable: except Exception as e: return None - async def update_file_metadata_by_id( - self, id: str, meta: dict, db: Optional[AsyncSession] = None - ) -> Optional[FileModel]: + async def update_file_metadata_by_id(self, id: str, meta: dict, db: AsyncSession | None = None) -> FileModel | None: async with get_async_db_context(db) as db: try: result = await db.execute(select(File).filter_by(id=id)) @@ -389,7 +384,20 @@ class FilesTable: except Exception: return None - async def delete_file_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def update_file_name_by_id(self, id: str, name: str, db: AsyncSession | None = None) -> FileModel | None: + async with get_async_db_context(db) as db: + try: + result = await db.execute(select(File).filter_by(id=id)) + file = result.scalars().first() + file.filename = name + file.meta = {**(file.meta if file.meta else {}), 'name': name} + file.updated_at = int(time.time()) + await db.commit() + return FileModel.model_validate(file) + except Exception: + return None + + async def delete_file_by_id(self, id: str, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: try: await db.execute(delete(File).filter_by(id=id)) @@ -399,7 +407,7 @@ class FilesTable: except Exception: return False - async def delete_all_files(self, db: Optional[AsyncSession] = None) -> bool: + async def delete_all_files(self, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: try: await db.execute(delete(File)) diff --git a/backend/open_webui/models/folders.py b/backend/open_webui/models/folders.py index c553239482..1688b8bd46 100644 --- a/backend/open_webui/models/folders.py +++ b/backend/open_webui/models/folders.py @@ -1,15 +1,13 @@ import logging +import re import time import uuid from typing import Optional -import re - - -from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, Text, JSON, Boolean, func, select, delete -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context +from pydantic import BaseModel, ConfigDict +from sqlalchemy import JSON, BigInteger, Boolean, Column, Text, delete, func, select +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/models/functions.py b/backend/open_webui/models/functions.py index ddac317863..3a47d402cf 100644 --- a/backend/open_webui/models/functions.py +++ b/backend/open_webui/models/functions.py @@ -1,13 +1,14 @@ +from __future__ import annotations + import logging import time from typing import Optional -from sqlalchemy import select, delete, update -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context -from open_webui.models.users import Users, UserModel, UserResponse +from open_webui.models.users import UserModel, UserResponse, Users from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Boolean, Column, String, Text, Index +from sqlalchemy import BigInteger, Boolean, Column, Index, String, Text, delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -37,8 +38,8 @@ class Function(Base): class FunctionMeta(BaseModel): - description: Optional[str] = None - manifest: Optional[dict] = {} + description: str | None = None + manifest: dict | None = {} model_config = ConfigDict(extra='allow') @@ -64,7 +65,7 @@ class FunctionWithValvesModel(BaseModel): type: str content: str meta: FunctionMeta - valves: Optional[dict] = None + valves: dict | None = None is_active: bool = False is_global: bool = False updated_at: int # timestamp in epoch @@ -93,7 +94,7 @@ class FunctionResponse(BaseModel): class FunctionUserResponse(FunctionResponse): - user: Optional[UserResponse] = None + user: UserResponse | None = None class FunctionForm(BaseModel): @@ -104,7 +105,7 @@ class FunctionForm(BaseModel): class FunctionValves(BaseModel): - valves: Optional[dict] = None + valves: dict | None = None class FunctionsTable: @@ -113,8 +114,8 @@ class FunctionsTable: user_id: str, type: str, form_data: FunctionForm, - db: Optional[AsyncSession] = None, - ) -> Optional[FunctionModel]: + db: AsyncSession | None = None, + ) -> FunctionModel | None: function = FunctionModel( **{ **form_data.model_dump(), @@ -143,7 +144,7 @@ class FunctionsTable: self, user_id: str, functions: list[FunctionWithValvesModel], - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[FunctionWithValvesModel]: # Synchronize functions for a user by updating existing ones, inserting new ones, and removing those that are no longer present. try: @@ -191,7 +192,7 @@ class FunctionsTable: log.exception(f'Error syncing functions for user {user_id}: {e}') return [] - async def get_function_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[FunctionModel]: + async def get_function_by_id(self, id: str, db: AsyncSession | None = None) -> FunctionModel | None: try: async with get_async_db_context(db) as db: function = await db.get(Function, id) @@ -199,7 +200,7 @@ class FunctionsTable: except Exception: return None - async def get_functions_by_ids(self, ids: list[str], db: Optional[AsyncSession] = None) -> list[FunctionModel]: + async def get_functions_by_ids(self, ids: list[str], db: AsyncSession | None = None) -> list[FunctionModel]: """ Batch fetch multiple functions by their IDs in a single query. Returns functions in the same order as the input IDs (None entries filtered out). @@ -218,7 +219,7 @@ class FunctionsTable: return [] async def get_functions( - self, active_only=False, include_valves=False, db: Optional[AsyncSession] = None + self, active_only=False, include_valves=False, db: AsyncSession | None = None ) -> list[FunctionModel | FunctionWithValvesModel]: async with get_async_db_context(db) as db: if active_only: @@ -233,7 +234,7 @@ class FunctionsTable: else: return [FunctionModel.model_validate(function) for function in functions] - async def get_function_list(self, db: Optional[AsyncSession] = None) -> list[FunctionUserResponse]: + async def get_function_list(self, db: AsyncSession | None = None) -> list[FunctionUserResponse]: async with get_async_db_context(db) as db: result = await db.execute(select(Function).order_by(Function.updated_at.desc())) functions = result.scalars().all() @@ -262,7 +263,7 @@ class FunctionsTable: ] async def get_functions_by_type( - self, type: str, active_only=False, db: Optional[AsyncSession] = None + self, type: str, active_only=False, db: AsyncSession | None = None ) -> list[FunctionModel]: async with get_async_db_context(db) as db: if active_only: @@ -271,17 +272,17 @@ class FunctionsTable: result = await db.execute(select(Function).filter_by(type=type)) return [FunctionModel.model_validate(function) for function in result.scalars().all()] - async def get_global_filter_functions(self, db: Optional[AsyncSession] = None) -> list[FunctionModel]: + async def get_global_filter_functions(self, db: AsyncSession | None = None) -> list[FunctionModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Function).filter_by(type='filter', is_active=True, is_global=True)) return [FunctionModel.model_validate(function) for function in result.scalars().all()] - async def get_global_action_functions(self, db: Optional[AsyncSession] = None) -> list[FunctionModel]: + async def get_global_action_functions(self, db: AsyncSession | None = None) -> list[FunctionModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Function).filter_by(type='action', is_active=True, is_global=True)) return [FunctionModel.model_validate(function) for function in result.scalars().all()] - async def get_function_valves_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[dict]: + async def get_function_valves_by_id(self, id: str, db: AsyncSession | None = None) -> dict | None: async with get_async_db_context(db) as db: try: function = await db.get(Function, id) @@ -290,7 +291,7 @@ class FunctionsTable: log.exception(f'Error getting function valves by id {id}: {e}') return None - async def get_function_valves_by_ids(self, ids: list[str], db: Optional[AsyncSession] = None) -> dict[str, dict]: + async def get_function_valves_by_ids(self, ids: list[str], db: AsyncSession | None = None) -> dict[str, dict]: """ Batch fetch valves for multiple functions in a single query. Returns a dict mapping function_id -> valves dict. @@ -308,8 +309,8 @@ class FunctionsTable: return {} async def update_function_valves_by_id( - self, id: str, valves: dict, db: Optional[AsyncSession] = None - ) -> Optional[FunctionValves]: + self, id: str, valves: dict, db: AsyncSession | None = None + ) -> FunctionValves | None: async with get_async_db_context(db) as db: try: function = await db.get(Function, id) @@ -322,8 +323,8 @@ class FunctionsTable: return None async def update_function_metadata_by_id( - self, id: str, metadata: dict, db: Optional[AsyncSession] = None - ) -> Optional[FunctionModel]: + self, id: str, metadata: dict, db: AsyncSession | None = None + ) -> FunctionModel | None: async with get_async_db_context(db) as db: try: function = await db.get(Function, id) @@ -345,8 +346,8 @@ class FunctionsTable: return None async def get_user_valves_by_id_and_user_id( - self, id: str, user_id: str, db: Optional[AsyncSession] = None - ) -> Optional[dict]: + self, id: str, user_id: str, db: AsyncSession | None = None + ) -> dict | None: try: user = await Users.get_user_by_id(user_id, db=db) user_settings = user.settings.model_dump() if user.settings else {} @@ -363,8 +364,8 @@ class FunctionsTable: return None async def update_user_valves_by_id_and_user_id( - self, id: str, user_id: str, valves: dict, db: Optional[AsyncSession] = None - ) -> Optional[dict]: + self, id: str, user_id: str, valves: dict, db: AsyncSession | None = None + ) -> dict | None: try: user = await Users.get_user_by_id(user_id, db=db) user_settings = user.settings.model_dump() if user.settings else {} @@ -386,8 +387,8 @@ class FunctionsTable: return None async def update_function_by_id( - self, id: str, updated: dict, db: Optional[AsyncSession] = None - ) -> Optional[FunctionModel]: + self, id: str, updated: dict, db: AsyncSession | None = None + ) -> FunctionModel | None: async with get_async_db_context(db) as db: try: await db.execute( @@ -404,7 +405,7 @@ class FunctionsTable: except Exception: return None - async def deactivate_all_functions(self, db: Optional[AsyncSession] = None) -> Optional[bool]: + async def deactivate_all_functions(self, db: AsyncSession | None = None) -> bool | None: async with get_async_db_context(db) as db: try: await db.execute( @@ -418,7 +419,7 @@ class FunctionsTable: except Exception: return None - async def delete_function_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_function_by_id(self, id: str, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: try: await db.execute(delete(Function).filter_by(id=id)) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index bc199fac5b..66785794a7 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -1,25 +1,29 @@ import json import logging import time -from typing import Optional import uuid +from typing import Optional -from sqlalchemy import select, delete, update, func, and_, or_, cast, String -from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.internal.db import Base, JSONField, get_async_db_context from open_webui.env import DEFAULT_GROUP_SHARE_PERMISSION - +from open_webui.internal.db import Base, JSONField, get_async_db_context from open_webui.models.files import FileMetadataResponse - - from pydantic import BaseModel, ConfigDict from sqlalchemy import ( + JSON, BigInteger, Column, - Text, - JSON, ForeignKey, + String, + Text, + and_, + cast, + delete, + func, + or_, + select, + update, ) +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/models/knowledge.py b/backend/open_webui/models/knowledge.py index 2750ef6058..b582040175 100644 --- a/backend/open_webui/models/knowledge.py +++ b/backend/open_webui/models/knowledge.py @@ -1,34 +1,36 @@ import json import logging import time -from typing import Optional import uuid +from typing import Optional -from sqlalchemy import select, delete, update, or_, func -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context - +from open_webui.models.access_grants import AccessGrantModel, AccessGrants from open_webui.models.files import ( File, - FileModel, FileMetadataResponse, + FileModel, FileModelResponse, ) from open_webui.models.groups import Groups -from open_webui.models.users import User, UserModel, Users, UserResponse -from open_webui.models.access_grants import AccessGrantModel, AccessGrants - - +from open_webui.models.users import User, UserModel, UserResponse, Users from pydantic import BaseModel, ConfigDict, Field from sqlalchemy import ( + JSON, BigInteger, Column, ForeignKey, + Index, String, Text, - JSON, UniqueConstraint, + delete, + func, + or_, + select, + update, ) +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -54,6 +56,25 @@ class Knowledge(Base): updated_at = Column(BigInteger) +class KnowledgeDirectory(Base): + __tablename__ = 'knowledge_directory' + + id = Column(Text, unique=True, primary_key=True) + knowledge_id = Column(Text, ForeignKey('knowledge.id', ondelete='CASCADE'), nullable=False) + parent_id = Column(Text, ForeignKey('knowledge_directory.id', ondelete='CASCADE'), nullable=True) + name = Column(Text, nullable=False) + user_id = Column(Text, nullable=False) + + created_at = Column(BigInteger, nullable=False) + updated_at = Column(BigInteger, nullable=False) + + __table_args__ = ( + UniqueConstraint('knowledge_id', 'parent_id', 'name', name='uq_knowledge_directory_knowledge_parent_name'), + Index('ix_knowledge_directory_knowledge_id', 'knowledge_id'), + Index('ix_knowledge_directory_parent_id', 'parent_id'), + ) + + class KnowledgeModel(BaseModel): model_config = ConfigDict(from_attributes=True) @@ -78,18 +99,23 @@ class KnowledgeFile(Base): knowledge_id = Column(Text, ForeignKey('knowledge.id', ondelete='CASCADE'), nullable=False) file_id = Column(Text, ForeignKey('file.id', ondelete='CASCADE'), nullable=False) + directory_id = Column(Text, ForeignKey('knowledge_directory.id', ondelete='SET NULL'), nullable=True) user_id = Column(Text, nullable=False) created_at = Column(BigInteger, nullable=False) updated_at = Column(BigInteger, nullable=False) - __table_args__ = (UniqueConstraint('knowledge_id', 'file_id', name='uq_knowledge_file_knowledge_file'),) + __table_args__ = ( + UniqueConstraint('knowledge_id', 'file_id', name='uq_knowledge_file_knowledge_file'), + Index('ix_knowledge_file_directory_id', 'directory_id'), + ) class KnowledgeFileModel(BaseModel): id: str knowledge_id: str file_id: str + directory_id: Optional[str] = None user_id: str created_at: int # timestamp in epoch @@ -98,6 +124,24 @@ class KnowledgeFileModel(BaseModel): model_config = ConfigDict(from_attributes=True) +class KnowledgeDirectoryModel(BaseModel): + model_config = ConfigDict(from_attributes=True) + + id: str + knowledge_id: str + parent_id: Optional[str] = None + name: str + user_id: str + + created_at: int # timestamp in epoch + updated_at: int # timestamp in epoch + + +class KnowledgeDirectoryForm(BaseModel): + name: str + parent_id: Optional[str] = None + + #################### # Forms #################### @@ -130,6 +174,8 @@ class KnowledgeListResponse(BaseModel): class KnowledgeFileListResponse(BaseModel): items: list[FileUserResponse] + directories: list[KnowledgeDirectoryModel] = Field(default_factory=list) + breadcrumbs: list[KnowledgeDirectoryModel] = Field(default_factory=list) total: int @@ -313,17 +359,42 @@ class KnowledgeTable: permission='read', ) - # Apply filename search + # Apply filename / content search + # Use ->> (as_string) instead of CAST(-> AS TEXT) to avoid + # PostgreSQL "invalid memory alloc request size" on large + # extracted-content rows (#24670). + content_text = File.data['content'].as_string() + search_filter = None if filter: q = filter.get('query') if q: - stmt = stmt.filter(File.filename.ilike(f'%{q}%')) + search_filter = or_( + File.filename.ilike(f'%{q}%'), + content_text.ilike(f'%{q}%'), + ) + stmt = stmt.filter(search_filter) # Order by file changes stmt = stmt.order_by(File.updated_at.desc(), File.id.asc()) - # Count before pagination - count_result = await db.execute(select(func.count()).select_from(stmt.subquery())) + # Lightweight count: avoid selecting File.data and ORDER BY + count_stmt = ( + select(func.count(File.id)) + .select_from(File) + .join(KnowledgeFile, File.id == KnowledgeFile.file_id) + .join(Knowledge, KnowledgeFile.knowledge_id == Knowledge.id) + ) + count_stmt = AccessGrants.has_permission_filter( + db=db, + query=count_stmt, + DocumentModel=Knowledge, + filter=filter, + resource_type='knowledge', + permission='read', + ) + if search_filter is not None: + count_stmt = count_stmt.filter(search_filter) + count_result = await db.execute(count_stmt) total = count_result.scalar() if skip: @@ -461,13 +532,30 @@ class KnowledgeTable: .filter(KnowledgeFile.knowledge_id == knowledge_id) ) + # Filter by directory_id (None = root level) + directory_id = filter.get('directory_id') if filter else None + if directory_id: + stmt = stmt.filter(KnowledgeFile.directory_id == directory_id) + elif filter and 'directory_id' in filter: + # Explicit None = root level only + stmt = stmt.filter(KnowledgeFile.directory_id.is_(None)) + # Default sort: updated_at descending primary_sort = File.updated_at.desc() if filter: query_key = filter.get('query') if query_key: - stmt = stmt.filter(or_(File.filename.ilike(f'%{query_key}%'))) + # Use ->> (as_string) instead of CAST(-> AS TEXT) to + # avoid PostgreSQL memory allocation failures on large + # content (#24670). + content_text = File.data['content'].as_string() + stmt = stmt.filter( + or_( + File.filename.ilike(f'%{query_key}%'), + content_text.ilike(f'%{query_key}%'), + ) + ) view_option = filter.get('view_option') if view_option == 'created': @@ -510,7 +598,19 @@ class KnowledgeTable: ) ) - return KnowledgeFileListResponse(items=files, total=total) + return KnowledgeFileListResponse( + items=files, + directories=await self.get_directories( + knowledge_id, + parent_id=filter.get('directory_id') if filter else None, + db=db, + ), + breadcrumbs=await self.get_directory_breadcrumbs( + filter.get('directory_id') if filter else None, + db=db, + ), + total=total, + ) except Exception as e: print(e) return KnowledgeFileListResponse(items=[], total=0) @@ -542,6 +642,7 @@ class KnowledgeTable: knowledge_id: str, file_id: str, user_id: str, + directory_id: Optional[str] = None, db: Optional[AsyncSession] = None, ) -> Optional[KnowledgeFileModel]: async with get_async_db_context(db) as db: @@ -550,6 +651,7 @@ class KnowledgeTable: 'id': str(uuid.uuid4()), 'knowledge_id': knowledge_id, 'file_id': file_id, + 'directory_id': directory_id, 'user_id': user_id, 'created_at': int(time.time()), 'updated_at': int(time.time()), @@ -674,5 +776,304 @@ class KnowledgeTable: except Exception: return False + # ── Directory CRUD ──────────────────────────────────────────────── + + async def create_directory( + self, + knowledge_id: str, + name: str, + user_id: str, + parent_id: Optional[str] = None, + db: Optional[AsyncSession] = None, + ) -> Optional[KnowledgeDirectoryModel]: + async with get_async_db_context(db) as db: + try: + now = int(time.time()) + directory = KnowledgeDirectory( + id=str(uuid.uuid4()), + knowledge_id=knowledge_id, + parent_id=parent_id, + name=name, + user_id=user_id, + created_at=now, + updated_at=now, + ) + db.add(directory) + await db.commit() + await db.refresh(directory) + return KnowledgeDirectoryModel.model_validate(directory) + except Exception as e: + log.exception(e) + return None + + async def get_directories( + self, + knowledge_id: str, + parent_id: Optional[str] = None, + db: Optional[AsyncSession] = None, + ) -> list[KnowledgeDirectoryModel]: + """List directories at a given level (parent_id=None for root).""" + async with get_async_db_context(db) as db: + stmt = select(KnowledgeDirectory).filter( + KnowledgeDirectory.knowledge_id == knowledge_id + ) + if parent_id: + stmt = stmt.filter(KnowledgeDirectory.parent_id == parent_id) + else: + stmt = stmt.filter(KnowledgeDirectory.parent_id.is_(None)) + + stmt = stmt.order_by(KnowledgeDirectory.name.asc()) + result = await db.execute(stmt) + return [KnowledgeDirectoryModel.model_validate(d) for d in result.scalars().all()] + + async def get_all_directories( + self, + knowledge_id: str, + db: Optional[AsyncSession] = None, + ) -> list[KnowledgeDirectoryModel]: + """Get ALL directories for a KB (no parent filter). Used for tree building.""" + async with get_async_db_context(db) as db: + stmt = ( + select(KnowledgeDirectory) + .filter(KnowledgeDirectory.knowledge_id == knowledge_id) + .order_by(KnowledgeDirectory.name.asc()) + ) + result = await db.execute(stmt) + return [KnowledgeDirectoryModel.model_validate(d) for d in result.scalars().all()] + + async def get_files_with_directory_ids( + self, + knowledge_id: str, + db: Optional[AsyncSession] = None, + ) -> list[tuple[FileModel, Optional[str]]]: + """Get all files in a KB with their directory_id from KnowledgeFile.""" + try: + async with get_async_db_context(db) as db: + result = await db.execute( + select(File, KnowledgeFile.directory_id) + .join(KnowledgeFile, File.id == KnowledgeFile.file_id) + .filter(KnowledgeFile.knowledge_id == knowledge_id) + ) + return [ + (FileModel.model_validate(file), dir_id) + for file, dir_id in result.all() + ] + except Exception: + return [] + + async def get_directory_by_id( + self, directory_id: str, db: Optional[AsyncSession] = None + ) -> Optional[KnowledgeDirectoryModel]: + async with get_async_db_context(db) as db: + result = await db.execute( + select(KnowledgeDirectory).filter_by(id=directory_id) + ) + directory = result.scalars().first() + return KnowledgeDirectoryModel.model_validate(directory) if directory else None + + async def get_directory_breadcrumbs( + self, + directory_id: Optional[str], + db: Optional[AsyncSession] = None, + ) -> list[KnowledgeDirectoryModel]: + """Walk up the parent chain to build breadcrumbs (root first).""" + if not directory_id: + return [] + + async with get_async_db_context(db) as db: + breadcrumbs = [] + current_id = directory_id + seen = set() + + while current_id and current_id not in seen: + seen.add(current_id) + result = await db.execute( + select(KnowledgeDirectory).filter_by(id=current_id) + ) + directory = result.scalars().first() + if not directory: + break + breadcrumbs.append(KnowledgeDirectoryModel.model_validate(directory)) + current_id = directory.parent_id + + breadcrumbs.reverse() # root first + return breadcrumbs + + async def rename_directory( + self, + directory_id: str, + name: str, + db: Optional[AsyncSession] = None, + ) -> Optional[KnowledgeDirectoryModel]: + async with get_async_db_context(db) as db: + try: + await db.execute( + update(KnowledgeDirectory) + .filter_by(id=directory_id) + .values(name=name, updated_at=int(time.time())) + ) + await db.commit() + return await self.get_directory_by_id(directory_id, db=db) + except Exception as e: + log.exception(e) + return None + + async def move_directory( + self, + directory_id: str, + new_parent_id: Optional[str], + db: Optional[AsyncSession] = None, + ) -> Optional[KnowledgeDirectoryModel]: + """Move a directory to a new parent, with cycle detection.""" + async with get_async_db_context(db) as db: + try: + # Cycle detection: walk up from new_parent_id to ensure + # we don't encounter directory_id + if new_parent_id: + current = new_parent_id + seen = set() + while current and current not in seen: + if current == directory_id: + return None # Would create a cycle + seen.add(current) + result = await db.execute( + select(KnowledgeDirectory.parent_id).filter_by(id=current) + ) + row = result.first() + current = row[0] if row else None + + await db.execute( + update(KnowledgeDirectory) + .filter_by(id=directory_id) + .values(parent_id=new_parent_id, updated_at=int(time.time())) + ) + await db.commit() + return await self.get_directory_by_id(directory_id, db=db) + except Exception as e: + log.exception(e) + return None + + async def update_directory( + self, + directory_id: str, + name: Optional[str] = None, + parent_id: Optional[str] = '__unset__', + db: Optional[AsyncSession] = None, + ) -> Optional[KnowledgeDirectoryModel]: + """Update directory name and/or parent. Pass parent_id=None to move to root.""" + # Handle move if parent_id is being changed + if parent_id != '__unset__': + result = await self.move_directory(directory_id, parent_id, db=db) + if result is None: + return None # Cycle detected or error + + if name is not None: + return await self.rename_directory(directory_id, name, db=db) + + return await self.get_directory_by_id(directory_id, db=db) + + async def delete_directory( + self, + directory_id: str, + move_files_to_parent: bool = True, + db: Optional[AsyncSession] = None, + ) -> bool: + """ + Delete a directory. + - If move_files_to_parent=True: files move to parent dir (or root) + - If move_files_to_parent=False: files are also deleted + """ + async with get_async_db_context(db) as db: + try: + # Get the directory to find its parent + result = await db.execute( + select(KnowledgeDirectory).filter_by(id=directory_id) + ) + directory = result.scalars().first() + if not directory: + return False + + parent_id = directory.parent_id + + if move_files_to_parent: + # Move files in this directory to its parent (or root) + await db.execute( + update(KnowledgeFile) + .filter_by(directory_id=directory_id) + .values(directory_id=parent_id) + ) + # Recursively move files from all subdirectories too + await self._move_files_from_subtree(directory_id, parent_id, db=db) + else: + # Delete files in this directory and all subdirectories + await self._delete_files_in_subtree(directory_id, db=db) + + # CASCADE on parent_id will handle deleting subdirectories + await db.execute( + delete(KnowledgeDirectory).filter_by(id=directory_id) + ) + await db.commit() + return True + except Exception as e: + log.exception(e) + return False + + async def _move_files_from_subtree( + self, + directory_id: str, + target_directory_id: Optional[str], + db: AsyncSession, + ) -> None: + """Recursively move all files from a directory subtree to the target.""" + result = await db.execute( + select(KnowledgeDirectory.id).filter_by(parent_id=directory_id) + ) + child_ids = [row[0] for row in result.all()] + + for child_id in child_ids: + await db.execute( + update(KnowledgeFile) + .filter_by(directory_id=child_id) + .values(directory_id=target_directory_id) + ) + await self._move_files_from_subtree(child_id, target_directory_id, db=db) + + async def _delete_files_in_subtree( + self, + directory_id: str, + db: AsyncSession, + ) -> None: + """Recursively delete all files from a directory subtree.""" + await db.execute( + delete(KnowledgeFile).filter_by(directory_id=directory_id) + ) + result = await db.execute( + select(KnowledgeDirectory.id).filter_by(parent_id=directory_id) + ) + child_ids = [row[0] for row in result.all()] + for child_id in child_ids: + await self._delete_files_in_subtree(child_id, db=db) + + async def move_file_to_directory( + self, + knowledge_id: str, + file_id: str, + directory_id: Optional[str] = None, + db: Optional[AsyncSession] = None, + ) -> bool: + """Move a file to a different directory within the same KB.""" + async with get_async_db_context(db) as db: + try: + await db.execute( + update(KnowledgeFile) + .filter_by(knowledge_id=knowledge_id, file_id=file_id) + .values(directory_id=directory_id, updated_at=int(time.time())) + ) + await db.commit() + return True + except Exception as e: + log.exception(e) + return False + Knowledges = KnowledgeTable() diff --git a/backend/open_webui/models/memories.py b/backend/open_webui/models/memories.py index e956826800..d7f51e2c9e 100644 --- a/backend/open_webui/models/memories.py +++ b/backend/open_webui/models/memories.py @@ -1,12 +1,13 @@ +from __future__ import annotations + import time import uuid from typing import Optional -from sqlalchemy import select, delete -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, get_async_db_context from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, String, Text +from sqlalchemy import BigInteger, Column, String, Text, delete, select +from sqlalchemy.ext.asyncio import AsyncSession #################### # Memory DB Schema @@ -19,7 +20,7 @@ class Memory(Base): __tablename__ = 'memory' id = Column(String, primary_key=True, unique=True) - user_id = Column(String) + user_id = Column(String, index=True) content = Column(Text) updated_at = Column(BigInteger) created_at = Column(BigInteger) @@ -45,8 +46,8 @@ class MemoriesTable: self, user_id: str, content: str, - db: Optional[AsyncSession] = None, - ) -> Optional[MemoryModel]: + db: AsyncSession | None = None, + ) -> MemoryModel | None: async with get_async_db_context(db) as db: id = str(uuid.uuid4()) @@ -73,8 +74,8 @@ class MemoriesTable: id: str, user_id: str, content: str, - db: Optional[AsyncSession] = None, - ) -> Optional[MemoryModel]: + db: AsyncSession | None = None, + ) -> MemoryModel | None: async with get_async_db_context(db) as db: try: memory = await db.get(Memory, id) @@ -90,7 +91,7 @@ class MemoriesTable: except Exception: return None - async def get_memories(self, db: Optional[AsyncSession] = None) -> list[MemoryModel]: + async def get_memories(self, db: AsyncSession | None = None) -> list[MemoryModel]: async with get_async_db_context(db) as db: try: result = await db.execute(select(Memory)) @@ -99,7 +100,7 @@ class MemoriesTable: except Exception: return None - async def get_memories_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> list[MemoryModel]: + async def get_memories_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> list[MemoryModel]: async with get_async_db_context(db) as db: try: result = await db.execute(select(Memory).filter_by(user_id=user_id)) @@ -108,7 +109,7 @@ class MemoriesTable: except Exception: return None - async def get_memory_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[MemoryModel]: + async def get_memory_by_id(self, id: str, db: AsyncSession | None = None) -> MemoryModel | None: async with get_async_db_context(db) as db: try: memory = await db.get(Memory, id) @@ -116,7 +117,7 @@ class MemoriesTable: except Exception: return None - async def delete_memory_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_memory_by_id(self, id: str, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: try: await db.execute(delete(Memory).filter_by(id=id)) @@ -127,7 +128,7 @@ class MemoriesTable: except Exception: return False - async def delete_memories_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_memories_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: try: await db.execute(delete(Memory).filter_by(user_id=user_id)) @@ -137,7 +138,7 @@ class MemoriesTable: except Exception: return False - async def delete_memory_by_id_and_user_id(self, id: str, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_memory_by_id_and_user_id(self, id: str, user_id: str, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: try: memory = await db.get(Memory, id) diff --git a/backend/open_webui/models/messages.py b/backend/open_webui/models/messages.py index 7f33a72eff..342abed2f8 100644 --- a/backend/open_webui/models/messages.py +++ b/backend/open_webui/models/messages.py @@ -3,17 +3,13 @@ import time import uuid from typing import Optional -from sqlalchemy import select, delete, func -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context -from open_webui.models.tags import TagModel, Tag, Tags -from open_webui.models.users import Users, User, UserNameResponse -from open_webui.models.channels import Channels, ChannelMember - - +from open_webui.models.channels import ChannelMember, Channels +from open_webui.models.tags import Tag, TagModel, Tags +from open_webui.models.users import User, UserNameResponse, Users from pydantic import BaseModel, ConfigDict, field_validator -from sqlalchemy import BigInteger, Boolean, Column, String, Text, JSON -from sqlalchemy import or_, func, and_, text +from sqlalchemy import JSON, BigInteger, Boolean, Column, String, Text, and_, delete, func, or_, select, text +from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.sql import exists #################### diff --git a/backend/open_webui/models/models.py b/backend/open_webui/models/models.py index 79c13153ac..443cd4530d 100755 --- a/backend/open_webui/models/models.py +++ b/backend/open_webui/models/models.py @@ -1,21 +1,18 @@ +from __future__ import annotations + import json import logging import time from typing import Optional -from sqlalchemy import select, delete, update, or_, func, String, cast -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context - -from open_webui.models.groups import Groups -from open_webui.models.users import User, UserModel, Users, UserResponse from open_webui.models.access_grants import AccessGrantModel, AccessGrants - - +from open_webui.models.groups import Groups +from open_webui.models.users import User, UserModel, UserResponse, Users from pydantic import BaseModel, ConfigDict, Field, model_validator - +from sqlalchemy import BigInteger, Boolean, Column, String, Text, cast, delete, func, or_, select, update from sqlalchemy.dialects.postgresql import JSONB -from sqlalchemy import BigInteger, Column, Text, Boolean +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -35,14 +32,14 @@ class ModelParams(BaseModel): # ModelMeta is a model for the data stored in the meta field of the Model table class ModelMeta(BaseModel): - profile_image_url: Optional[str] = '/static/favicon.png' + profile_image_url: str | None = '/static/favicon.png' - description: Optional[str] = None + description: str | None = None """ User-facing description of the model. """ - capabilities: Optional[dict] = None + capabilities: dict | None = None model_config = ConfigDict(extra='allow') @@ -100,7 +97,7 @@ class Model(Base): class ModelModel(BaseModel): id: str user_id: str - base_model_id: Optional[str] = None + base_model_id: str | None = None name: str params: ModelParams @@ -121,11 +118,11 @@ class ModelModel(BaseModel): class ModelUserResponse(ModelModel): - user: Optional[UserResponse] = None + user: UserResponse | None = None class ModelAccessResponse(ModelUserResponse): - write_access: Optional[bool] = False + write_access: bool | None = False class ModelResponse(ModelModel): @@ -146,23 +143,23 @@ class ModelForm(BaseModel): model_config = ConfigDict(extra='ignore') id: str - base_model_id: Optional[str] = None + base_model_id: str | None = None name: str meta: ModelMeta params: ModelParams - access_grants: Optional[list[dict]] = None + access_grants: list[dict | None] = None is_active: bool = True class ModelsTable: - async def _get_access_grants(self, model_id: str, db: Optional[AsyncSession] = None) -> list[AccessGrantModel]: + async def _get_access_grants(self, model_id: str, db: AsyncSession | None = None) -> list[AccessGrantModel]: return await AccessGrants.get_grants_by_resource('model', model_id, db=db) async def _to_model_model( self, model: Model, - access_grants: Optional[list[AccessGrantModel]] = None, - db: Optional[AsyncSession] = None, + access_grants: list[AccessGrantModel | None] = None, + db: AsyncSession | None = None, ) -> ModelModel: model_data = ModelModel.model_validate(model).model_dump(exclude={'access_grants'}) model_data['access_grants'] = ( @@ -171,8 +168,8 @@ class ModelsTable: return ModelModel.model_validate(model_data) async def insert_new_model( - self, form_data: ModelForm, user_id: str, db: Optional[AsyncSession] = None - ) -> Optional[ModelModel]: + self, form_data: ModelForm, user_id: str, db: AsyncSession | None = None + ) -> ModelModel | None: try: async with get_async_db_context(db) as db: result = Model( @@ -196,7 +193,7 @@ class ModelsTable: log.exception(f'Failed to insert a new model: {e}') return None - async def get_all_models(self, db: Optional[AsyncSession] = None) -> list[ModelModel]: + async def get_all_models(self, db: AsyncSession | None = None) -> list[ModelModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Model)) all_models = result.scalars().all() @@ -207,7 +204,7 @@ class ModelsTable: for model in all_models ] - async def get_models(self, db: Optional[AsyncSession] = None) -> list[ModelUserResponse]: + async def get_models(self, db: AsyncSession | None = None) -> list[ModelUserResponse]: async with get_async_db_context(db) as db: result = await db.execute(select(Model).filter(Model.base_model_id != None)) all_models = result.scalars().all() @@ -238,7 +235,7 @@ class ModelsTable: ) return models - async def get_base_models(self, db: Optional[AsyncSession] = None) -> list[ModelModel]: + async def get_base_models(self, db: AsyncSession | None = None) -> list[ModelModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Model).filter(Model.base_model_id == None)) all_models = result.scalars().all() @@ -250,7 +247,7 @@ class ModelsTable: ] async def get_models_by_user_id( - self, user_id: str, permission: str = 'write', db: Optional[AsyncSession] = None + self, user_id: str, permission: str = 'write', db: AsyncSession | None = None ) -> list[ModelUserResponse]: models = await self.get_models(db=db) user_groups = await Groups.get_groups_by_member_id(user_id, db=db) @@ -287,7 +284,7 @@ class ModelsTable: filter: dict = {}, skip: int = 0, limit: int = 30, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> ModelListResponse: async with get_async_db_context(db) as db: stmt = select(Model, User).outerjoin(User, User.id == Model.user_id) @@ -391,7 +388,7 @@ class ModelsTable: return ModelListResponse(items=models, total=total) - async def get_model_meta_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[tuple[dict, int]]: + async def get_model_meta_by_id(self, id: str, db: AsyncSession | None = None) -> tuple[dict, int | None]: """Return (meta, updated_at) for a model, skipping access grant resolution.""" try: async with get_async_db_context(db) as db: @@ -404,7 +401,7 @@ class ModelsTable: self, user_id: str, is_admin: bool = False, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> set[str]: """Extract unique tag names from model meta, querying only the meta column.""" async with get_async_db_context(db) as db: @@ -437,7 +434,7 @@ class ModelsTable: return tags_set - async def get_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]: + async def get_model_by_id(self, id: str, db: AsyncSession | None = None) -> ModelModel | None: try: async with get_async_db_context(db) as db: model = await db.get(Model, id) @@ -445,7 +442,7 @@ class ModelsTable: except Exception: return None - async def get_models_by_ids(self, ids: list[str], db: Optional[AsyncSession] = None) -> list[ModelModel]: + async def get_models_by_ids(self, ids: list[str], db: AsyncSession | None = None) -> list[ModelModel]: try: async with get_async_db_context(db) as db: result = await db.execute(select(Model).filter(Model.id.in_(ids))) @@ -463,7 +460,7 @@ class ModelsTable: except Exception: return [] - async def toggle_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]: + async def toggle_model_by_id(self, id: str, db: AsyncSession | None = None) -> ModelModel | None: async with get_async_db_context(db) as db: try: result = await db.execute(select(Model).filter_by(id=id)) @@ -480,9 +477,7 @@ class ModelsTable: except Exception: return None - async def update_model_by_id( - self, id: str, model: ModelForm, db: Optional[AsyncSession] = None - ) -> Optional[ModelModel]: + async def update_model_by_id(self, id: str, model: ModelForm, db: AsyncSession | None = None) -> ModelModel | None: try: async with get_async_db_context(db) as db: # update only the fields that are present in the model @@ -499,7 +494,7 @@ class ModelsTable: log.exception(f'Failed to update the model by id {id}: {e}') return None - async def update_model_updated_at_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ModelModel]: + async def update_model_updated_at_by_id(self, id: str, db: AsyncSession | None = None) -> ModelModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(Model).filter_by(id=id)) @@ -514,7 +509,7 @@ class ModelsTable: log.exception(f'Failed to update the model updated_at by id {id}: {e}') return None - async def delete_model_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_model_by_id(self, id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await AccessGrants.revoke_all_access('model', id, db=db) @@ -525,7 +520,7 @@ class ModelsTable: except Exception: return False - async def delete_all_models(self, db: Optional[AsyncSession] = None) -> bool: + async def delete_all_models(self, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: result = await db.execute(select(Model.id)) @@ -540,7 +535,7 @@ class ModelsTable: return False async def sync_models( - self, user_id: str, models: list[ModelModel], db: Optional[AsyncSession] = None + self, user_id: str, models: list[ModelModel], db: AsyncSession | None = None ) -> list[ModelModel]: try: async with get_async_db_context(db) as db: diff --git a/backend/open_webui/models/notes.py b/backend/open_webui/models/notes.py index 1a34750a7d..1cddd2f8fa 100644 --- a/backend/open_webui/models/notes.py +++ b/backend/open_webui/models/notes.py @@ -1,19 +1,16 @@ import json import time import uuid -from typing import Optional from functools import lru_cache +from typing import Optional -from sqlalchemy import Boolean, select, delete, update, or_, func, cast -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, get_async_db_context -from open_webui.models.groups import Groups -from open_webui.models.users import User, UserModel, Users, UserResponse from open_webui.models.access_grants import AccessGrantModel, AccessGrants - - +from open_webui.models.groups import Groups +from open_webui.models.users import User, UserModel, UserResponse, Users from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy import BigInteger, Column, Text, JSON +from sqlalchemy import JSON, BigInteger, Boolean, Column, ForeignKey, Text, delete, func, or_, select, update +from sqlalchemy.ext.asyncio import AsyncSession #################### # Note DB Schema @@ -29,7 +26,6 @@ class Note(Base): title = Column(Text) data = Column(JSON, nullable=True) meta = Column(JSON, nullable=True) - is_pinned = Column(Boolean, default=False, nullable=True) created_at = Column(BigInteger) updated_at = Column(BigInteger) @@ -52,6 +48,15 @@ class NoteModel(BaseModel): updated_at: int # timestamp in epoch +class PinnedNote(Base): + __tablename__ = 'pinned_note' + + id = Column(Text, primary_key=True) + user_id = Column(Text, nullable=False) + note_id = Column(Text, ForeignKey('note.id', ondelete='CASCADE'), nullable=False) + created_at = Column(BigInteger, nullable=False) + + #################### # Forms #################### @@ -100,6 +105,7 @@ class NoteTable: access_grants: Optional[list[AccessGrantModel]] = None, db: Optional[AsyncSession] = None, ) -> NoteModel: + # We exclude access_grants to inject them note_data = NoteModel.model_validate(note).model_dump(exclude={'access_grants'}) note_data['access_grants'] = ( access_grants if access_grants is not None else await self._get_access_grants(note_data['id'], db=db) @@ -131,7 +137,7 @@ class NoteTable: } ) - new_note = Note(**note.model_dump(exclude={'access_grants'})) + new_note = Note(**note.model_dump(exclude={'access_grants', 'is_pinned'})) db.add(new_note) await db.commit() @@ -174,7 +180,7 @@ class NoteTable: or_( func.replace(func.replace(Note.title, '-', ''), ' ', '').ilike(f'%{word}%'), func.replace( - func.replace(cast(Note.data['content']['md'], Text), '-', ''), + func.replace(Note.data['content']['md'].as_string(), '-', ''), ' ', '', ).ilike(f'%{word}%'), @@ -314,15 +320,28 @@ class NoteTable: await db.commit() return await self._to_note_model(note, db=db) if note else None - async def toggle_note_pinned_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[NoteModel]: + async def toggle_note_pinned_by_id( + self, id: str, user_id: str, db: Optional[AsyncSession] = None + ) -> Optional[NoteModel]: try: async with get_async_db_context(db) as db: result = await db.execute(select(Note).filter(Note.id == id)) note = result.scalars().first() if not note: return None - note.is_pinned = not note.is_pinned - note.updated_at = int(time.time_ns()) + + # Check if already pinned + pin_result = await db.execute(select(PinnedNote).filter_by(user_id=user_id, note_id=id)) + pinned_note = pin_result.scalars().first() + + if pinned_note: + await db.execute(delete(PinnedNote).filter_by(user_id=user_id, note_id=id)) + else: + new_pin = PinnedNote( + id=str(uuid.uuid4()), user_id=user_id, note_id=id, created_at=int(time.time_ns()) + ) + db.add(new_pin) + await db.commit() return await self._to_note_model(note, db=db) except Exception: @@ -338,7 +357,12 @@ class NoteTable: user_groups = await Groups.get_groups_by_member_id(user_id, db=db) user_group_ids = [group.id for group in user_groups] - stmt = select(Note).filter(Note.is_pinned == True).order_by(Note.updated_at.desc()) + stmt = ( + select(Note) + .join(PinnedNote, PinnedNote.note_id == Note.id) + .filter(PinnedNote.user_id == user_id) + .order_by(PinnedNote.created_at.desc()) + ) stmt = self._has_permission(db, stmt, {'user_id': user_id, 'group_ids': user_group_ids}, permission) result = await db.execute(stmt) @@ -351,11 +375,17 @@ class NoteTable: try: async with get_async_db_context(db) as db: await AccessGrants.revoke_all_access('note', id, db=db) + await db.execute(delete(PinnedNote).filter(PinnedNote.note_id == id)) await db.execute(delete(Note).filter(Note.id == id)) await db.commit() return True except Exception: return False + async def get_pinned_note_ids(self, user_id: str, db: Optional[AsyncSession] = None) -> list[str]: + async with get_async_db_context(db) as db: + result = await db.execute(select(PinnedNote.note_id).filter_by(user_id=user_id)) + return result.scalars().all() + Notes = NoteTable() diff --git a/backend/open_webui/models/oauth_sessions.py b/backend/open_webui/models/oauth_sessions.py index c43567f670..0619bd574a 100644 --- a/backend/open_webui/models/oauth_sessions.py +++ b/backend/open_webui/models/oauth_sessions.py @@ -1,20 +1,17 @@ -import time -import logging -import uuid -from typing import Optional, List import base64 import hashlib import json +import logging +import time +import uuid +from typing import List, Optional from cryptography.fernet import Fernet - -from sqlalchemy import select, delete, update -from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.internal.db import Base, get_async_db_context from open_webui.env import OAUTH_SESSION_TOKEN_ENCRYPTION_KEY - +from open_webui.internal.db import Base, get_async_db_context from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, String, Text, Index +from sqlalchemy import BigInteger, Column, Index, String, Text, delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/models/prompt_history.py b/backend/open_webui/models/prompt_history.py index 5d0f4a65b2..a73032c4bb 100644 --- a/backend/open_webui/models/prompt_history.py +++ b/backend/open_webui/models/prompt_history.py @@ -1,18 +1,16 @@ """Prompt history model for version tracking.""" +import difflib +import json import time import uuid from typing import Optional -import json -import difflib -from sqlalchemy import select, delete, func -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, get_async_db_context -from open_webui.models.users import Users, UserResponse - +from open_webui.models.users import UserResponse, Users from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, Text, JSON, Index +from sqlalchemy import JSON, BigInteger, Column, Index, Text, delete, func, select +from sqlalchemy.ext.asyncio import AsyncSession #################### # PromptHistory DB Schema diff --git a/backend/open_webui/models/prompts.py b/backend/open_webui/models/prompts.py index dec1848aa7..732c868227 100644 --- a/backend/open_webui/models/prompts.py +++ b/backend/open_webui/models/prompts.py @@ -1,19 +1,18 @@ +from __future__ import annotations + import json import time import uuid from typing import Optional -from sqlalchemy import select, delete, update, or_, func, text, cast, String -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context -from open_webui.models.groups import Groups -from open_webui.models.users import Users, User, UserModel, UserResponse -from open_webui.models.prompt_history import PromptHistories from open_webui.models.access_grants import AccessGrantModel, AccessGrants - - +from open_webui.models.groups import Groups +from open_webui.models.prompt_history import PromptHistories +from open_webui.models.users import User, UserModel, UserResponse, Users from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy import BigInteger, Boolean, Column, Text, JSON +from sqlalchemy import JSON, BigInteger, Boolean, Column, String, Text, cast, delete, func, or_, select, text, update +from sqlalchemy.ext.asyncio import AsyncSession #################### # Prompts DB Schema @@ -40,18 +39,18 @@ class Prompt(Base): class PromptModel(BaseModel): - id: Optional[str] = None + id: str | None = None command: str user_id: str name: str content: str - data: Optional[dict] = None - meta: Optional[dict] = None - tags: Optional[list[str]] = None - is_active: Optional[bool] = True - version_id: Optional[str] = None - created_at: Optional[int] = None - updated_at: Optional[int] = None + data: dict | None = None + meta: dict | None = None + tags: list[str | None] = None + is_active: bool | None = True + version_id: str | None = None + created_at: int | None = None + updated_at: int | None = None access_grants: list[AccessGrantModel] = Field(default_factory=list) model_config = ConfigDict(from_attributes=True) @@ -63,11 +62,11 @@ class PromptModel(BaseModel): class PromptUserResponse(PromptModel): - user: Optional[UserResponse] = None + user: UserResponse | None = None class PromptAccessResponse(PromptUserResponse): - write_access: Optional[bool] = False + write_access: bool | None = False class PromptListResponse(BaseModel): @@ -84,24 +83,24 @@ class PromptForm(BaseModel): command: str name: str # Changed from title content: str - data: Optional[dict] = None - meta: Optional[dict] = None - tags: Optional[list[str]] = None - access_grants: Optional[list[dict]] = None - version_id: Optional[str] = None # Active version - commit_message: Optional[str] = None # For history tracking - is_production: Optional[bool] = True # Whether to set new version as production + data: dict | None = None + meta: dict | None = None + tags: list[str | None] = None + access_grants: list[dict | None] = None + version_id: str | None = None # Active version + commit_message: str | None = None # For history tracking + is_production: bool | None = True # Whether to set new version as production class PromptsTable: - async def _get_access_grants(self, prompt_id: str, db: Optional[AsyncSession] = None) -> list[AccessGrantModel]: + async def _get_access_grants(self, prompt_id: str, db: AsyncSession | None = None) -> list[AccessGrantModel]: return await AccessGrants.get_grants_by_resource('prompt', prompt_id, db=db) async def _to_prompt_model( self, prompt: Prompt, - access_grants: Optional[list[AccessGrantModel]] = None, - db: Optional[AsyncSession] = None, + access_grants: list[AccessGrantModel | None] = None, + db: AsyncSession | None = None, ) -> PromptModel: prompt_data = PromptModel.model_validate(prompt).model_dump(exclude={'access_grants'}) prompt_data['access_grants'] = ( @@ -110,8 +109,8 @@ class PromptsTable: return PromptModel.model_validate(prompt_data) async def insert_new_prompt( - self, user_id: str, form_data: PromptForm, db: Optional[AsyncSession] = None - ) -> Optional[PromptModel]: + self, user_id: str, form_data: PromptForm, db: AsyncSession | None = None + ) -> PromptModel | None: now = int(time.time()) prompt_id = str(uuid.uuid4()) @@ -171,7 +170,7 @@ class PromptsTable: except Exception: return None - async def get_prompt_by_id(self, prompt_id: str, db: Optional[AsyncSession] = None) -> Optional[PromptModel]: + async def get_prompt_by_id(self, prompt_id: str, db: AsyncSession | None = None) -> PromptModel | None: """Get prompt by UUID.""" try: async with get_async_db_context(db) as db: @@ -183,7 +182,7 @@ class PromptsTable: except Exception: return None - async def get_prompt_by_command(self, command: str, db: Optional[AsyncSession] = None) -> Optional[PromptModel]: + async def get_prompt_by_command(self, command: str, db: AsyncSession | None = None) -> PromptModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(Prompt).filter_by(command=command)) @@ -194,7 +193,7 @@ class PromptsTable: except Exception: return None - async def get_prompts(self, db: Optional[AsyncSession] = None) -> list[PromptUserResponse]: + async def get_prompts(self, db: AsyncSession | None = None) -> list[PromptUserResponse]: async with get_async_db_context(db) as db: result = await db.execute( select(Prompt).filter(Prompt.is_active == True).order_by(Prompt.updated_at.desc()) @@ -229,26 +228,53 @@ class PromptsTable: return prompts async def get_prompts_by_user_id( - self, user_id: str, permission: str = 'write', db: Optional[AsyncSession] = None + self, user_id: str, permission: str = 'write', db: AsyncSession | None = None ) -> list[PromptUserResponse]: - prompts = await self.get_prompts(db=db) - user_groups = await Groups.get_groups_by_member_id(user_id, db=db) - user_group_ids = {group.id for group in user_groups} + async with get_async_db_context(db) as db: + user_groups = await Groups.get_groups_by_member_id(user_id, db=db) + user_group_ids = [group.id for group in user_groups] - result = [] - for prompt in prompts: - if prompt.user_id == user_id: - result.append(prompt) - elif await AccessGrants.has_access( - user_id=user_id, - resource_type='prompt', - resource_id=prompt.id, - permission=permission, - user_group_ids=user_group_ids, + query = select(Prompt).filter(Prompt.is_active == True).order_by(Prompt.updated_at.desc()) + query = AccessGrants.has_permission_filter( db=db, - ): - result.append(prompt) - return result + query=query, + DocumentModel=Prompt, + filter={'user_id': user_id, 'group_ids': user_group_ids}, + resource_type='prompt', + permission=permission, + ) + + result = await db.execute(query) + accessible_prompts = result.scalars().all() + + if not accessible_prompts: + return [] + + prompt_ids = [p.id for p in accessible_prompts] + owner_ids = list({p.user_id for p in accessible_prompts}) + + users = await Users.get_users_by_user_ids(owner_ids, db=db) + users_dict = {u.id: u for u in users} + grants_map = await AccessGrants.get_grants_by_resources('prompt', prompt_ids, db=db) + + results = [] + for prompt in accessible_prompts: + user = users_dict.get(prompt.user_id) + results.append( + PromptUserResponse.model_validate( + { + **( + await self._to_prompt_model( + prompt, + access_grants=grants_map.get(prompt.id, []), + db=db, + ) + ).model_dump(), + 'user': user.model_dump() if user else None, + } + ) + ) + return results async def search_prompts( self, @@ -256,7 +282,7 @@ class PromptsTable: filter: dict = {}, skip: int = 0, limit: int = 30, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> PromptListResponse: async with get_async_db_context(db) as db: # Join with User table for user filtering and sorting @@ -377,8 +403,8 @@ class PromptsTable: command: str, form_data: PromptForm, user_id: str, - db: Optional[AsyncSession] = None, - ) -> Optional[PromptModel]: + db: AsyncSession | None = None, + ) -> PromptModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(Prompt).filter_by(command=command)) @@ -443,8 +469,8 @@ class PromptsTable: prompt_id: str, form_data: PromptForm, user_id: str, - db: Optional[AsyncSession] = None, - ) -> Optional[PromptModel]: + db: AsyncSession | None = None, + ) -> PromptModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(Prompt).filter_by(id=prompt_id)) @@ -518,9 +544,9 @@ class PromptsTable: prompt_id: str, name: str, command: str, - tags: Optional[list[str]] = None, - db: Optional[AsyncSession] = None, - ) -> Optional[PromptModel]: + tags: list[str | None] = None, + db: AsyncSession | None = None, + ) -> PromptModel | None: """Update only name, command, and tags (no history created).""" try: async with get_async_db_context(db) as db: @@ -546,8 +572,8 @@ class PromptsTable: self, prompt_id: str, version_id: str, - db: Optional[AsyncSession] = None, - ) -> Optional[PromptModel]: + db: AsyncSession | None = None, + ) -> PromptModel | None: """Set the active version of a prompt and restore content from that version's snapshot.""" try: async with get_async_db_context(db) as db: @@ -579,7 +605,7 @@ class PromptsTable: except Exception: return None - async def toggle_prompt_active(self, prompt_id: str, db: Optional[AsyncSession] = None) -> Optional[PromptModel]: + async def toggle_prompt_active(self, prompt_id: str, db: AsyncSession | None = None) -> PromptModel | None: """Toggle the is_active flag on a prompt.""" try: async with get_async_db_context(db) as db: @@ -595,7 +621,7 @@ class PromptsTable: except Exception: return None - async def delete_prompt_by_command(self, command: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_prompt_by_command(self, command: str, db: AsyncSession | None = None) -> bool: """Permanently delete a prompt and its history.""" try: async with get_async_db_context(db) as db: @@ -612,7 +638,7 @@ class PromptsTable: except Exception: return False - async def delete_prompt_by_id(self, prompt_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_prompt_by_id(self, prompt_id: str, db: AsyncSession | None = None) -> bool: """Permanently delete a prompt and its history.""" try: async with get_async_db_context(db) as db: @@ -629,15 +655,41 @@ class PromptsTable: except Exception: return False - async def get_tags(self, db: Optional[AsyncSession] = None) -> list[str]: + async def get_tags(self, db: AsyncSession | None = None) -> list[str]: try: async with get_async_db_context(db) as db: - result = await db.execute(select(Prompt).filter_by(is_active=True)) - prompts = result.scalars().all() + result = await db.execute(select(Prompt.tags).filter(Prompt.is_active == True)) tags = set() - for prompt in prompts: - if prompt.tags: - for tag in prompt.tags: + for (tag_list,) in result.all(): + if tag_list: + for tag in tag_list: + if tag: + tags.add(tag) + return sorted(list(tags)) + except Exception: + return [] + + async def get_tags_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> list[str]: + try: + async with get_async_db_context(db) as db: + user_groups = await Groups.get_groups_by_member_id(user_id, db=db) + user_group_ids = [group.id for group in user_groups] + + query = select(Prompt.tags).filter(Prompt.is_active == True) + query = AccessGrants.has_permission_filter( + db=db, + query=query, + DocumentModel=Prompt, + filter={'user_id': user_id, 'group_ids': user_group_ids}, + resource_type='prompt', + permission='read', + ) + + result = await db.execute(query) + tags = set() + for (tag_list,) in result.all(): + if tag_list: + for tag in tag_list: if tag: tags.add(tag) return sorted(list(tags)) diff --git a/backend/open_webui/models/shared_chats.py b/backend/open_webui/models/shared_chats.py index 37a3fea852..9132f11301 100644 --- a/backend/open_webui/models/shared_chats.py +++ b/backend/open_webui/models/shared_chats.py @@ -3,12 +3,10 @@ import time import uuid from typing import Optional -from sqlalchemy import select, delete -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context - from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, ForeignKey, Text, JSON +from sqlalchemy import JSON, BigInteger, Column, ForeignKey, Text, delete, select +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/models/skills.py b/backend/open_webui/models/skills.py index 0fc6dfc52d..5bc8b54efc 100644 --- a/backend/open_webui/models/skills.py +++ b/backend/open_webui/models/skills.py @@ -2,15 +2,13 @@ import logging import time from typing import Optional -from sqlalchemy import select, delete, update, or_ -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, get_async_db_context -from open_webui.models.users import Users, User, UserModel, UserResponse -from open_webui.models.groups import Groups from open_webui.models.access_grants import AccessGrantModel, AccessGrants - +from open_webui.models.groups import Groups +from open_webui.models.users import User, UserModel, UserResponse, Users from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy import JSON, BigInteger, Boolean, Column, String, Text, func +from sqlalchemy import JSON, BigInteger, Boolean, Column, String, Text, delete, func, or_, select, update +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/models/tags.py b/backend/open_webui/models/tags.py index ee2baefc01..defd424d59 100644 --- a/backend/open_webui/models/tags.py +++ b/backend/open_webui/models/tags.py @@ -1,15 +1,14 @@ +from __future__ import annotations + import logging import time import uuid from typing import Optional -from sqlalchemy import select, delete -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context - - from pydantic import BaseModel, ConfigDict -from sqlalchemy import BigInteger, Column, String, JSON, PrimaryKeyConstraint, Index +from sqlalchemy import JSON, BigInteger, Column, Index, PrimaryKeyConstraint, String, delete, select +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -39,7 +38,7 @@ class TagModel(BaseModel): id: str name: str user_id: str - meta: Optional[dict] = None + meta: dict | None = None model_config = ConfigDict(from_attributes=True) @@ -54,7 +53,7 @@ class TagChatIdForm(BaseModel): class TagTable: - async def insert_new_tag(self, name: str, user_id: str, db: Optional[AsyncSession] = None) -> Optional[TagModel]: + async def insert_new_tag(self, name: str, user_id: str, db: AsyncSession | None = None) -> TagModel | None: async with get_async_db_context(db) as db: id = name.replace(' ', '_').lower() tag = TagModel(**{'id': id, 'user_id': user_id, 'name': name}) @@ -72,8 +71,8 @@ class TagTable: return None async def get_tag_by_name_and_user_id( - self, name: str, user_id: str, db: Optional[AsyncSession] = None - ) -> Optional[TagModel]: + self, name: str, user_id: str, db: AsyncSession | None = None + ) -> TagModel | None: try: id = name.replace(' ', '_').lower() async with get_async_db_context(db) as db: @@ -83,19 +82,19 @@ class TagTable: except Exception: return None - async def get_tags_by_user_id(self, user_id: str, db: Optional[AsyncSession] = None) -> list[TagModel]: + async def get_tags_by_user_id(self, user_id: str, db: AsyncSession | None = None) -> list[TagModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Tag).filter_by(user_id=user_id)) return [TagModel.model_validate(tag) for tag in result.scalars().all()] async def get_tags_by_ids_and_user_id( - self, ids: list[str], user_id: str, db: Optional[AsyncSession] = None + self, ids: list[str], user_id: str, db: AsyncSession | None = None ) -> list[TagModel]: async with get_async_db_context(db) as db: result = await db.execute(select(Tag).filter(Tag.id.in_(ids), Tag.user_id == user_id)) return [TagModel.model_validate(tag) for tag in result.scalars().all()] - async def delete_tag_by_name_and_user_id(self, name: str, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_tag_by_name_and_user_id(self, name: str, user_id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: id = name.replace(' ', '_').lower() @@ -108,7 +107,7 @@ class TagTable: return False async def delete_tags_by_ids_and_user_id( - self, ids: list[str], user_id: str, db: Optional[AsyncSession] = None + self, ids: list[str], user_id: str, db: AsyncSession | None = None ) -> bool: """Delete all tags whose id is in *ids* for the given user, in one query.""" if not ids: @@ -122,7 +121,7 @@ class TagTable: log.error(f'delete_tags_by_ids: {e}') return False - async def ensure_tags_exist(self, names: list[str], user_id: str, db: Optional[AsyncSession] = None) -> None: + async def ensure_tags_exist(self, names: list[str], user_id: str, db: AsyncSession | None = None) -> None: """Create tag rows for any *names* that don't already exist for *user_id*.""" if not names: return diff --git a/backend/open_webui/models/tools.py b/backend/open_webui/models/tools.py index 70035121aa..9a1a202292 100644 --- a/backend/open_webui/models/tools.py +++ b/backend/open_webui/models/tools.py @@ -1,16 +1,16 @@ +from __future__ import annotations + import logging import time from typing import Optional -from sqlalchemy import select, delete, update -from sqlalchemy.ext.asyncio import AsyncSession from open_webui.internal.db import Base, JSONField, get_async_db_context -from open_webui.models.users import Users, UserResponse -from open_webui.models.groups import Groups from open_webui.models.access_grants import AccessGrantModel, AccessGrants - +from open_webui.models.groups import Groups +from open_webui.models.users import UserResponse, Users from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy import BigInteger, Column, String, Text +from sqlalchemy import BigInteger, Column, String, Text, delete, select, update +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -37,8 +37,8 @@ class Tool(Base): class ToolMeta(BaseModel): - description: Optional[str] = None - manifest: Optional[dict] = {} + description: str | None = None + manifest: dict | None = {} class ToolModel(BaseModel): @@ -62,7 +62,7 @@ class ToolModel(BaseModel): class ToolUserModel(ToolModel): - user: Optional[UserResponse] = None + user: UserResponse | None = None class ToolResponse(BaseModel): @@ -76,13 +76,13 @@ class ToolResponse(BaseModel): class ToolUserResponse(ToolResponse): - user: Optional[UserResponse] = None + user: UserResponse | None = None model_config = ConfigDict(extra='allow') class ToolAccessResponse(ToolUserResponse): - write_access: Optional[bool] = False + write_access: bool | None = False class ToolForm(BaseModel): @@ -90,22 +90,22 @@ class ToolForm(BaseModel): name: str content: str meta: ToolMeta - access_grants: Optional[list[dict]] = None + access_grants: list[dict | None] = None class ToolValves(BaseModel): - valves: Optional[dict] = None + valves: dict | None = None class ToolsTable: - async def _get_access_grants(self, tool_id: str, db: Optional[AsyncSession] = None) -> list[AccessGrantModel]: + async def _get_access_grants(self, tool_id: str, db: AsyncSession | None = None) -> list[AccessGrantModel]: return await AccessGrants.get_grants_by_resource('tool', tool_id, db=db) async def _to_tool_model( self, tool: Tool, - access_grants: Optional[list[AccessGrantModel]] = None, - db: Optional[AsyncSession] = None, + access_grants: list[AccessGrantModel | None] = None, + db: AsyncSession | None = None, ) -> ToolModel: tool_data = ToolModel.model_validate(tool).model_dump(exclude={'access_grants'}) tool_data['access_grants'] = ( @@ -118,8 +118,8 @@ class ToolsTable: user_id: str, form_data: ToolForm, specs: list[dict], - db: Optional[AsyncSession] = None, - ) -> Optional[ToolModel]: + db: AsyncSession | None = None, + ) -> ToolModel | None: async with get_async_db_context(db) as db: try: result = Tool( @@ -143,7 +143,7 @@ class ToolsTable: log.exception(f'Error creating a new tool: {e}') return None - async def get_tool_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[ToolModel]: + async def get_tool_by_id(self, id: str, db: AsyncSession | None = None) -> ToolModel | None: try: async with get_async_db_context(db) as db: tool = await db.get(Tool, id) @@ -151,7 +151,7 @@ class ToolsTable: except Exception: return None - async def get_tools(self, defer_content: bool = False, db: Optional[AsyncSession] = None) -> list[ToolUserModel]: + async def get_tools(self, defer_content: bool = False, db: AsyncSession | None = None) -> list[ToolUserModel]: async with get_async_db_context(db) as db: stmt = select(Tool).order_by(Tool.updated_at.desc()) if defer_content: @@ -190,7 +190,7 @@ class ToolsTable: user_id: str, permission: str = 'write', defer_content: bool = False, - db: Optional[AsyncSession] = None, + db: AsyncSession | None = None, ) -> list[ToolUserModel]: tools = await self.get_tools(defer_content=defer_content, db=db) user_groups = await Groups.get_groups_by_member_id(user_id, db=db) @@ -211,7 +211,7 @@ class ToolsTable: result.append(tool) return result - async def get_tool_valves_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[dict]: + async def get_tool_valves_by_id(self, id: str, db: AsyncSession | None = None) -> dict | None: try: async with get_async_db_context(db) as db: tool = await db.get(Tool, id) @@ -221,8 +221,8 @@ class ToolsTable: return None async def update_tool_valves_by_id( - self, id: str, valves: dict, db: Optional[AsyncSession] = None - ) -> Optional[ToolValves]: + self, id: str, valves: dict, db: AsyncSession | None = None + ) -> ToolValves | None: try: async with get_async_db_context(db) as db: await db.execute(update(Tool).filter_by(id=id).values(valves=valves, updated_at=int(time.time()))) @@ -232,8 +232,8 @@ class ToolsTable: return None async def get_user_valves_by_id_and_user_id( - self, id: str, user_id: str, db: Optional[AsyncSession] = None - ) -> Optional[dict]: + self, id: str, user_id: str, db: AsyncSession | None = None + ) -> dict | None: try: user = await Users.get_user_by_id(user_id, db=db) user_settings = user.settings.model_dump() if user.settings else {} @@ -250,8 +250,8 @@ class ToolsTable: return None async def update_user_valves_by_id_and_user_id( - self, id: str, user_id: str, valves: dict, db: Optional[AsyncSession] = None - ) -> Optional[dict]: + self, id: str, user_id: str, valves: dict, db: AsyncSession | None = None + ) -> dict | None: try: user = await Users.get_user_by_id(user_id, db=db) user_settings = user.settings.model_dump() if user.settings else {} @@ -272,7 +272,7 @@ class ToolsTable: log.exception(f'Error updating user valves by id {id} and user_id {user_id}: {e}') return None - async def update_tool_by_id(self, id: str, updated: dict, db: Optional[AsyncSession] = None) -> Optional[ToolModel]: + async def update_tool_by_id(self, id: str, updated: dict, db: AsyncSession | None = None) -> ToolModel | None: try: async with get_async_db_context(db) as db: access_grants = updated.pop('access_grants', None) @@ -287,7 +287,7 @@ class ToolsTable: except Exception: return None - async def delete_tool_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_tool_by_id(self, id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await AccessGrants.revoke_all_access('tool', id, db=db) diff --git a/backend/open_webui/models/users.py b/backend/open_webui/models/users.py index 025e79bd8a..56c3c21e63 100644 --- a/backend/open_webui/models/users.py +++ b/backend/open_webui/models/users.py @@ -1,29 +1,33 @@ +from __future__ import annotations + +import datetime import time from typing import Optional -from sqlalchemy import select, delete, update, func, or_, case, exists -from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.internal.db import Base, JSONField, get_async_db_context - from open_webui.env import DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL - +from open_webui.internal.db import Base, JSONField, get_async_db_context from open_webui.utils.misc import throttle from open_webui.utils.validate import validate_profile_image_url - from pydantic import BaseModel, ConfigDict, field_validator, model_validator from sqlalchemy import ( - BigInteger, JSON, - Column, - String, + BigInteger, Boolean, - Text, + Column, Date, + String, + Text, + case, cast, + delete, + exists, + func, + or_, + select, + update, ) from sqlalchemy.dialects.postgresql import JSONB - -import datetime +from sqlalchemy.ext.asyncio import AsyncSession #################### # User DB Schema @@ -33,7 +37,7 @@ import datetime class UserSettings(BaseModel): - ui: Optional[dict] = {} + ui: dict | None = {} model_config = ConfigDict(extra='allow') pass @@ -76,29 +80,29 @@ class UserModel(BaseModel): id: str email: str - username: Optional[str] = None + username: str | None = None role: str = 'pending' name: str - profile_image_url: Optional[str] = None - profile_banner_image_url: Optional[str] = None + profile_image_url: str | None = None + profile_banner_image_url: str | None = None - bio: Optional[str] = None - gender: Optional[str] = None - date_of_birth: Optional[datetime.date] = None - timezone: Optional[str] = None + bio: str | None = None + gender: str | None = None + date_of_birth: datetime.date | None = None + timezone: str | None = None - presence_state: Optional[str] = None - status_emoji: Optional[str] = None - status_message: Optional[str] = None - status_expires_at: Optional[int] = None + presence_state: str | None = None + status_emoji: str | None = None + status_message: str | None = None + status_expires_at: int | None = None - info: Optional[dict] = None - settings: Optional[UserSettings] = None + info: dict | None = None + settings: UserSettings | None = None - oauth: Optional[dict] = None - scim: Optional[dict] = None + oauth: dict | None = None + scim: dict | None = None last_active_at: int # timestamp in epoch updated_at: int # timestamp in epoch @@ -136,9 +140,9 @@ class ApiKeyModel(BaseModel): id: str user_id: str key: str - data: Optional[dict] = None - expires_at: Optional[int] = None - last_used_at: Optional[int] = None + data: dict | None = None + expires_at: int | None = None + last_used_at: int | None = None created_at: int # timestamp in epoch updated_at: int # timestamp in epoch @@ -153,9 +157,9 @@ class ApiKeyModel(BaseModel): class UpdateProfileForm(BaseModel): profile_image_url: str name: str - bio: Optional[str] = None - gender: Optional[str] = None - date_of_birth: Optional[datetime.date] = None + bio: str | None = None + gender: str | None = None + date_of_birth: datetime.date | None = None @field_validator('profile_image_url') @classmethod @@ -182,9 +186,9 @@ class UserGroupIdsListResponse(BaseModel): class UserStatus(BaseModel): - status_emoji: Optional[str] = None - status_message: Optional[str] = None - status_expires_at: Optional[int] = None + status_emoji: str | None = None + status_message: str | None = None + status_expires_at: int | None = None class UserInfoResponse(UserStatus): @@ -192,8 +196,8 @@ class UserInfoResponse(UserStatus): name: str email: str role: str - bio: Optional[str] = None - groups: Optional[list] = [] + bio: str | None = None + groups: list | None = [] is_active: bool = False @@ -205,7 +209,7 @@ class UserIdNameResponse(BaseModel): class UserIdNameStatusResponse(UserStatus): id: str name: str - is_active: Optional[bool] = None + is_active: bool | None = None class UserInfoListResponse(BaseModel): @@ -239,15 +243,15 @@ class UserRoleUpdateForm(BaseModel): class UserUpdateForm(BaseModel): - role: Optional[str] = None - name: Optional[str] = None - email: Optional[str] = None - profile_image_url: Optional[str] = None - password: Optional[str] = None + role: str | None = None + name: str | None = None + email: str | None = None + profile_image_url: str | None = None + password: str | None = None @field_validator('profile_image_url', mode='before') @classmethod - def check_profile_image_url(cls, v: Optional[str]) -> Optional[str]: + def check_profile_image_url(cls, v: str | None) -> str | None: if v is None: return v return validate_profile_image_url(v) @@ -261,10 +265,10 @@ class UsersTable: email: str, profile_image_url: str = '/user.png', role: str = 'pending', - username: Optional[str] = None, - oauth: Optional[dict] = None, - db: Optional[AsyncSession] = None, - ) -> Optional[UserModel]: + username: str | None = None, + oauth: dict | None = None, + db: AsyncSession | None = None, + ) -> UserModel | None: async with get_async_db_context(db) as db: user = UserModel( **{ @@ -289,7 +293,7 @@ class UsersTable: else: return None - async def get_user_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[UserModel]: + async def get_user_by_id(self, id: str, db: AsyncSession | None = None) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -298,7 +302,7 @@ class UsersTable: except Exception: return None - async def get_user_by_api_key(self, api_key: str, db: Optional[AsyncSession] = None) -> Optional[UserModel]: + async def get_user_by_api_key(self, api_key: str, db: AsyncSession | None = None) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute( @@ -309,7 +313,7 @@ class UsersTable: except Exception: return None - async def get_user_by_email(self, email: str, db: Optional[AsyncSession] = None) -> Optional[UserModel]: + async def get_user_by_email(self, email: str, db: AsyncSession | None = None) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter(func.lower(User.email) == email.lower())) @@ -318,9 +322,7 @@ class UsersTable: except Exception: return None - async def get_user_by_oauth_sub( - self, provider: str, sub: str, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + async def get_user_by_oauth_sub(self, provider: str, sub: str, db: AsyncSession | None = None) -> UserModel | None: try: async with get_async_db_context(db) as db: dialect_name = db.bind.dialect.name @@ -339,8 +341,8 @@ class UsersTable: return None async def get_user_by_scim_external_id( - self, provider: str, external_id: str, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + self, provider: str, external_id: str, db: AsyncSession | None = None + ) -> UserModel | None: try: async with get_async_db_context(db) as db: dialect_name = db.bind.dialect.name @@ -359,15 +361,15 @@ class UsersTable: async def get_users( self, - filter: Optional[dict] = None, - skip: Optional[int] = None, - limit: Optional[int] = None, - db: Optional[AsyncSession] = None, + filter: dict | None = None, + skip: int | None = None, + limit: int | None = None, + db: AsyncSession | None = None, ) -> dict: async with get_async_db_context(db) as db: # Import here to avoid circular imports - from open_webui.models.groups import GroupMember from open_webui.models.channels import ChannelMember + from open_webui.models.groups import GroupMember # Join GroupMember so we can order by group_id when requested stmt = select(User) @@ -501,7 +503,7 @@ class UsersTable: 'total': total, } - async def get_users_by_group_id(self, group_id: str, db: Optional[AsyncSession] = None) -> list[UserModel]: + async def get_users_by_group_id(self, group_id: str, db: AsyncSession | None = None) -> list[UserModel]: async with get_async_db_context(db) as db: from open_webui.models.groups import GroupMember @@ -511,25 +513,23 @@ class UsersTable: users = result.scalars().all() return [UserModel.model_validate(user) for user in users] - async def get_users_by_user_ids( - self, user_ids: list[str], db: Optional[AsyncSession] = None - ) -> list[UserStatusModel]: + async def get_users_by_user_ids(self, user_ids: list[str], db: AsyncSession | None = None) -> list[UserStatusModel]: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter(User.id.in_(user_ids))) users = result.scalars().all() return [UserModel.model_validate(user) for user in users] - async def get_num_users(self, db: Optional[AsyncSession] = None) -> Optional[int]: + async def get_num_users(self, db: AsyncSession | None = None) -> int | None: async with get_async_db_context(db) as db: result = await db.execute(select(func.count()).select_from(User)) return result.scalar() - async def has_users(self, db: Optional[AsyncSession] = None) -> bool: + async def has_users(self, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: result = await db.execute(select(exists(select(User)))) return result.scalar() - async def get_first_user(self, db: Optional[AsyncSession] = None) -> UserModel: + async def get_first_user(self, db: AsyncSession | None = None) -> UserModel: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).order_by(User.created_at).limit(1)) @@ -538,7 +538,7 @@ class UsersTable: except Exception: return None - async def get_user_webhook_url_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[str]: + async def get_user_webhook_url_by_id(self, id: str, db: AsyncSession | None = None) -> str | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -551,7 +551,7 @@ class UsersTable: except Exception: return None - async def get_num_users_active_today(self, db: Optional[AsyncSession] = None) -> Optional[int]: + async def get_num_users_active_today(self, db: AsyncSession | None = None) -> int | None: async with get_async_db_context(db) as db: current_timestamp = int(datetime.datetime.now().timestamp()) today_midnight_timestamp = current_timestamp - (current_timestamp % 86400) @@ -560,9 +560,7 @@ class UsersTable: ) return result.scalar() - async def update_user_role_by_id( - self, id: str, role: str, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + async def update_user_role_by_id(self, id: str, role: str, db: AsyncSession | None = None) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -577,8 +575,8 @@ class UsersTable: return None async def update_user_status_by_id( - self, id: str, form_data: UserStatus, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + self, id: str, form_data: UserStatus, db: AsyncSession | None = None + ) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -594,8 +592,8 @@ class UsersTable: return None async def update_user_profile_image_url_by_id( - self, id: str, profile_image_url: str, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + self, id: str, profile_image_url: str, db: AsyncSession | None = None + ) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -610,7 +608,7 @@ class UsersTable: return None @throttle(DATABASE_USER_ACTIVE_STATUS_UPDATE_INTERVAL) - async def update_last_active_by_id(self, id: str, db: Optional[AsyncSession] = None) -> None: + async def update_last_active_by_id(self, id: str, db: AsyncSession | None = None) -> None: try: async with get_async_db_context(db) as db: await db.execute(update(User).filter_by(id=id).values(last_active_at=int(time.time()))) @@ -619,8 +617,8 @@ class UsersTable: pass async def update_user_oauth_by_id( - self, id: str, provider: str, sub: str, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + self, id: str, provider: str, sub: str, db: AsyncSession | None = None + ) -> UserModel | None: """ Update or insert an OAuth provider/sub pair into the user's oauth JSON field. Example resulting structure: @@ -656,8 +654,8 @@ class UsersTable: id: str, provider: str, external_id: str, - db: Optional[AsyncSession] = None, - ) -> Optional[UserModel]: + db: AsyncSession | None = None, + ) -> UserModel | None: """ Update or insert a SCIM provider/external_id pair into the user's scim JSON field. Example resulting structure: @@ -684,7 +682,7 @@ class UsersTable: except Exception: return None - async def update_user_by_id(self, id: str, updated: dict, db: Optional[AsyncSession] = None) -> Optional[UserModel]: + async def update_user_by_id(self, id: str, updated: dict, db: AsyncSession | None = None) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -701,8 +699,8 @@ class UsersTable: return None async def update_user_settings_by_id( - self, id: str, updated: dict, db: Optional[AsyncSession] = None - ) -> Optional[UserModel]: + self, id: str, updated: dict, db: AsyncSession | None = None + ) -> UserModel | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=id)) @@ -726,10 +724,10 @@ class UsersTable: except Exception: return None - async def delete_user_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_user_by_id(self, id: str, db: AsyncSession | None = None) -> bool: try: - from open_webui.models.groups import Groups from open_webui.models.chats import Chats + from open_webui.models.groups import Groups # Remove User from Groups await Groups.remove_user_from_all_groups(id) @@ -748,7 +746,7 @@ class UsersTable: except Exception: return False - async def get_user_api_key_by_id(self, id: str, db: Optional[AsyncSession] = None) -> Optional[str]: + async def get_user_api_key_by_id(self, id: str, db: AsyncSession | None = None) -> str | None: try: async with get_async_db_context(db) as db: result = await db.execute(select(ApiKey).filter_by(user_id=id)) @@ -757,7 +755,7 @@ class UsersTable: except Exception: return None - async def update_user_api_key_by_id(self, id: str, api_key: str, db: Optional[AsyncSession] = None) -> bool: + async def update_user_api_key_by_id(self, id: str, api_key: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(delete(ApiKey).filter_by(user_id=id)) @@ -779,7 +777,7 @@ class UsersTable: except Exception: return False - async def delete_user_api_key_by_id(self, id: str, db: Optional[AsyncSession] = None) -> bool: + async def delete_user_api_key_by_id(self, id: str, db: AsyncSession | None = None) -> bool: try: async with get_async_db_context(db) as db: await db.execute(delete(ApiKey).filter_by(user_id=id)) @@ -788,13 +786,13 @@ class UsersTable: except Exception: return False - async def get_valid_user_ids(self, user_ids: list[str], db: Optional[AsyncSession] = None) -> list[str]: + async def get_valid_user_ids(self, user_ids: list[str], db: AsyncSession | None = None) -> list[str]: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter(User.id.in_(user_ids))) users = result.scalars().all() return [user.id for user in users] - async def get_super_admin_user(self, db: Optional[AsyncSession] = None) -> Optional[UserModel]: + async def get_super_admin_user(self, db: AsyncSession | None = None) -> UserModel | None: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(role='admin').limit(1)) user = result.scalars().first() @@ -803,7 +801,7 @@ class UsersTable: else: return None - async def get_active_user_count(self, db: Optional[AsyncSession] = None) -> int: + async def get_active_user_count(self, db: AsyncSession | None = None) -> int: async with get_async_db_context(db) as db: # Consider user active if last_active_at within the last 3 minutes three_minutes_ago = int(time.time()) - 180 @@ -820,7 +818,7 @@ class UsersTable: return user.last_active_at >= three_minutes_ago return False - async def is_user_active(self, user_id: str, db: Optional[AsyncSession] = None) -> bool: + async def is_user_active(self, user_id: str, db: AsyncSession | None = None) -> bool: async with get_async_db_context(db) as db: result = await db.execute(select(User).filter_by(id=user_id)) user = result.scalars().first() diff --git a/backend/open_webui/retrieval/loaders/datalab_marker.py b/backend/open_webui/retrieval/loaders/datalab_marker.py index dd4a763b70..be8cb9baaa 100644 --- a/backend/open_webui/retrieval/loaders/datalab_marker.py +++ b/backend/open_webui/retrieval/loaders/datalab_marker.py @@ -1,11 +1,12 @@ +import json +import logging import os import time -import requests -import logging -import json from typing import List, Optional -from langchain_core.documents import Document + +import requests from fastapi import HTTPException, status +from langchain_core.documents import Document log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/loaders/external_document.py b/backend/open_webui/retrieval/loaders/external_document.py index 77b1abfcd8..ddafc3124b 100644 --- a/backend/open_webui/retrieval/loaders/external_document.py +++ b/backend/open_webui/retrieval/loaders/external_document.py @@ -1,8 +1,9 @@ -import requests -import logging, os +import logging +import os from typing import Iterator, List, Union from urllib.parse import quote +import requests from langchain_core.document_loaders import BaseLoader from langchain_core.documents import Document from open_webui.utils.headers import include_user_info_headers diff --git a/backend/open_webui/retrieval/loaders/external_web.py b/backend/open_webui/retrieval/loaders/external_web.py index 64248427b3..e3fd0b2614 100644 --- a/backend/open_webui/retrieval/loaders/external_web.py +++ b/backend/open_webui/retrieval/loaders/external_web.py @@ -1,7 +1,7 @@ -import requests import logging from typing import Iterator, List, Union +import requests from langchain_core.document_loaders import BaseLoader from langchain_core.documents import Document diff --git a/backend/open_webui/retrieval/loaders/main.py b/backend/open_webui/retrieval/loaders/main.py index 8928ecb29a..93278d402f 100644 --- a/backend/open_webui/retrieval/loaders/main.py +++ b/backend/open_webui/retrieval/loaders/main.py @@ -1,10 +1,10 @@ import asyncio -import requests -import logging -import ftfy -import sys import json +import logging +import sys +import ftfy +import requests from azure.identity import DefaultAzureCredential from langchain_community.document_loaders import ( AzureAIDocumentIntelligenceLoader, @@ -17,16 +17,13 @@ from langchain_community.document_loaders import ( YoutubeLoader, ) from langchain_core.documents import Document - -from open_webui.retrieval.loaders.external_document import ExternalDocumentLoader - -from open_webui.retrieval.loaders.mistral import MistralLoader +from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, GLOBAL_LOG_LEVEL, REQUESTS_VERIFY from open_webui.retrieval.loaders.datalab_marker import DatalabMarkerLoader +from open_webui.retrieval.loaders.external_document import ExternalDocumentLoader from open_webui.retrieval.loaders.mineru import MinerULoader +from open_webui.retrieval.loaders.mistral import MistralLoader from open_webui.retrieval.loaders.paddleocr_vl import PaddleOCRVLLoader -from open_webui.env import GLOBAL_LOG_LEVEL, REQUESTS_VERIFY, AIOHTTP_CLIENT_SESSION_SSL - logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/loaders/mineru.py b/backend/open_webui/retrieval/loaders/mineru.py index 1f0848a613..63608f9bf9 100644 --- a/backend/open_webui/retrieval/loaders/mineru.py +++ b/backend/open_webui/retrieval/loaders/mineru.py @@ -1,12 +1,13 @@ -import os -import time -import requests import logging +import os import tempfile +import time import zipfile from typing import List, Optional -from langchain_core.documents import Document + +import requests from fastapi import HTTPException, status +from langchain_core.documents import Document log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/loaders/mistral.py b/backend/open_webui/retrieval/loaders/mistral.py index 51681ad5dc..868bbacbd6 100644 --- a/backend/open_webui/retrieval/loaders/mistral.py +++ b/backend/open_webui/retrieval/loaders/mistral.py @@ -1,16 +1,16 @@ -import requests -import aiohttp import asyncio import base64 import logging import os import sys import time -from typing import List, Dict, Any from contextlib import asynccontextmanager +from typing import Any, Dict, List +import aiohttp +import requests from langchain_core.documents import Document -from open_webui.env import GLOBAL_LOG_LEVEL, AIOHTTP_CLIENT_SESSION_SSL +from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, GLOBAL_LOG_LEVEL logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/loaders/paddleocr_vl.py b/backend/open_webui/retrieval/loaders/paddleocr_vl.py index b89369b2a4..40c185eab6 100644 --- a/backend/open_webui/retrieval/loaders/paddleocr_vl.py +++ b/backend/open_webui/retrieval/loaders/paddleocr_vl.py @@ -1,10 +1,10 @@ import base64 -import os -import requests import logging +import os import sys from typing import List +import requests from langchain_core.documents import Document from open_webui.env import GLOBAL_LOG_LEVEL diff --git a/backend/open_webui/retrieval/loaders/tavily.py b/backend/open_webui/retrieval/loaders/tavily.py index 742ac499cf..bdf70830e4 100644 --- a/backend/open_webui/retrieval/loaders/tavily.py +++ b/backend/open_webui/retrieval/loaders/tavily.py @@ -1,7 +1,7 @@ -import requests import logging from typing import Iterator, List, Literal, Union +import requests from langchain_core.document_loaders import BaseLoader from langchain_core.documents import Document diff --git a/backend/open_webui/retrieval/loaders/youtube.py b/backend/open_webui/retrieval/loaders/youtube.py index 34a1d20740..97c1a0c20c 100644 --- a/backend/open_webui/retrieval/loaders/youtube.py +++ b/backend/open_webui/retrieval/loaders/youtube.py @@ -1,8 +1,8 @@ import logging -from xml.etree.ElementTree import ParseError - from typing import Any, Dict, Generator, List, Optional, Sequence, Union from urllib.parse import parse_qs, urlparse +from xml.etree.ElementTree import ParseError + from langchain_core.documents import Document log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/models/base_reranker.py b/backend/open_webui/retrieval/models/base_reranker.py index 6be7a5649b..78002e087a 100644 --- a/backend/open_webui/retrieval/models/base_reranker.py +++ b/backend/open_webui/retrieval/models/base_reranker.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Optional, List, Tuple +from typing import List, Optional, Tuple class BaseReranker(ABC): diff --git a/backend/open_webui/retrieval/models/colbert.py b/backend/open_webui/retrieval/models/colbert.py index ceb41824e3..d11bde1b09 100644 --- a/backend/open_webui/retrieval/models/colbert.py +++ b/backend/open_webui/retrieval/models/colbert.py @@ -1,11 +1,10 @@ -import os import logging -import torch +import os + import numpy as np +import torch from colbert.infra import ColBERTConfig from colbert.modeling.checkpoint import Checkpoint - - from open_webui.retrieval.models.base_reranker import BaseReranker log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/models/external.py b/backend/open_webui/retrieval/models/external.py index f04583b965..6d2849eb88 100644 --- a/backend/open_webui/retrieval/models/external.py +++ b/backend/open_webui/retrieval/models/external.py @@ -1,9 +1,8 @@ import logging -import requests -from typing import Optional, List, Tuple +from typing import List, Optional, Tuple from urllib.parse import quote - +import requests from open_webui.env import ENABLE_FORWARD_USER_INFO_HEADERS, REQUESTS_VERIFY from open_webui.retrieval.models.base_reranker import BaseReranker from open_webui.utils.headers import include_user_info_headers diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 064e002f15..8c39fe90ca 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -1,16 +1,17 @@ -import logging -import os -from typing import Awaitable, Optional, Union +from __future__ import annotations -import requests -import aiohttp import asyncio import hashlib -from concurrent.futures import ThreadPoolExecutor -import time +import logging +import os import re - +import time +from concurrent.futures import ThreadPoolExecutor +from typing import Awaitable, Optional, Union from urllib.parse import quote + +import aiohttp +import requests from huggingface_hub import snapshot_download from langchain_classic.retrievers import ( ContextualCompressionRetriever, @@ -18,40 +19,33 @@ from langchain_classic.retrievers import ( ) from langchain_community.retrievers import BM25Retriever from langchain_core.documents import Document - -from open_webui.config import VECTOR_DB -from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT -from open_webui.retrieval.vector.factory import VECTOR_DB_CLIENT - - -from open_webui.models.users import UserModel -from open_webui.models.files import Files -from open_webui.models.knowledge import Knowledges - -from open_webui.models.chats import Chats -from open_webui.models.notes import Notes -from open_webui.models.access_grants import AccessGrants -from open_webui.utils.access_control.files import has_access_to_file - -from open_webui.retrieval.vector.main import GetResult -from open_webui.utils.headers import include_user_info_headers -from open_webui.utils.misc import get_message_list - -from open_webui.retrieval.web.utils import get_web_loader -from open_webui.retrieval.loaders.youtube import YoutubeLoader - - -from open_webui.env import ( - AIOHTTP_CLIENT_TIMEOUT, - OFFLINE_MODE, - ENABLE_FORWARD_USER_INFO_HEADERS, - AIOHTTP_CLIENT_SESSION_SSL, -) from open_webui.config import ( - RAG_EMBEDDING_QUERY_PREFIX, RAG_EMBEDDING_CONTENT_PREFIX, RAG_EMBEDDING_PREFIX_FIELD_NAME, + RAG_EMBEDDING_QUERY_PREFIX, + VECTOR_DB, ) +from open_webui.env import ( + AIOHTTP_CLIENT_ALLOW_REDIRECTS, + AIOHTTP_CLIENT_SESSION_SSL, + AIOHTTP_CLIENT_TIMEOUT, + ENABLE_FORWARD_USER_INFO_HEADERS, + OFFLINE_MODE, +) +from open_webui.models.access_grants import AccessGrants +from open_webui.models.chats import Chats +from open_webui.models.files import Files +from open_webui.models.knowledge import Knowledges +from open_webui.models.notes import Notes +from open_webui.models.users import UserModel +from open_webui.retrieval.loaders.youtube import YoutubeLoader +from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT +from open_webui.retrieval.vector.factory import VECTOR_DB_CLIENT +from open_webui.retrieval.vector.main import GetResult +from open_webui.retrieval.web.utils import get_web_loader +from open_webui.utils.access_control.files import has_access_to_file +from open_webui.utils.headers import include_user_info_headers +from open_webui.utils.misc import get_message_list log = logging.getLogger(__name__) @@ -182,8 +176,12 @@ def get_content_from_url(request, url: str) -> str: validate_url(url) # Streamed GET to check Content-Type without downloading the body. + # allow_redirects=False prevents redirect-based SSRF: validate_url() above is + # called on the originally-submitted URL only; following 3xx redirects without + # re-validation would let an attacker reach private IPs (RFC1918, loopback, + # cloud-metadata 169.254.169.254) via a public host that redirects internally. try: - response = requests.get(url, stream=True, timeout=30) + response = requests.get(url, stream=True, timeout=30, allow_redirects=AIOHTTP_CLIENT_ALLOW_REDIRECTS) response.raise_for_status() content_type = response.headers.get('Content-Type', '') except Exception: @@ -1118,7 +1116,7 @@ async def get_sources_from_items( hybrid_bm25_weight, hybrid_search, full_context=False, - user: Optional[UserModel] = None, + user: UserModel | None = None, ): log.debug(f'items: {items} {queries} {embedding_function} {reranking_function} {full_context}') @@ -1430,7 +1428,7 @@ class RerankCompressor(BaseDocumentCompressor): self, documents: Sequence[Document], query: str, - callbacks: Optional[Callbacks] = None, + callbacks: Callbacks | None = None, ) -> Sequence[Document]: """Compress retrieved documents given the query context. @@ -1449,7 +1447,7 @@ class RerankCompressor(BaseDocumentCompressor): self, documents: Sequence[Document], query: str, - callbacks: Optional[Callbacks] = None, + callbacks: Callbacks | None = None, ) -> Sequence[Document]: reranking = self.reranking_function is not None @@ -1457,13 +1455,12 @@ class RerankCompressor(BaseDocumentCompressor): if reranking: scores = await asyncio.to_thread(self.reranking_function, query, documents) else: - from sentence_transformers import util + from sentence_transformers import util as st_util query_embedding = await self.embedding_function(query, RAG_EMBEDDING_QUERY_PREFIX) - document_embedding = await self.embedding_function( - [doc.page_content for doc in documents], RAG_EMBEDDING_CONTENT_PREFIX - ) - scores = util.cos_sim(query_embedding, document_embedding)[0] + doc_texts = [doc.page_content for doc in documents] + document_embedding = await self.embedding_function(doc_texts, RAG_EMBEDDING_CONTENT_PREFIX) + scores = st_util.cos_sim(query_embedding, document_embedding)[0] if scores is not None: docs_with_scores = list( diff --git a/backend/open_webui/retrieval/vector/dbs/chroma.py b/backend/open_webui/retrieval/vector/dbs/chroma.py index 4ace732b2d..cd0a59eeaf 100755 --- a/backend/open_webui/retrieval/vector/dbs/chroma.py +++ b/backend/open_webui/retrieval/vector/dbs/chroma.py @@ -1,29 +1,27 @@ -import chromadb import logging -from chromadb import Settings -from chromadb.utils.batch_utils import create_batches - from typing import Optional -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) -from open_webui.retrieval.vector.utils import process_metadata - +import chromadb +from chromadb import Settings +from chromadb.utils.batch_utils import create_batches from open_webui.config import ( + CHROMA_CLIENT_AUTH_CREDENTIALS, + CHROMA_CLIENT_AUTH_PROVIDER, CHROMA_DATA_PATH, + CHROMA_DATABASE, + CHROMA_HTTP_HEADERS, CHROMA_HTTP_HOST, CHROMA_HTTP_PORT, - CHROMA_HTTP_HEADERS, CHROMA_HTTP_SSL, CHROMA_TENANT, - CHROMA_DATABASE, - CHROMA_CLIENT_AUTH_PROVIDER, - CHROMA_CLIENT_AUTH_CREDENTIALS, ) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) +from open_webui.retrieval.vector.utils import process_metadata log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/elasticsearch.py b/backend/open_webui/retrieval/vector/dbs/elasticsearch.py index 201a5e1706..da3e6e93c8 100644 --- a/backend/open_webui/retrieval/vector/dbs/elasticsearch.py +++ b/backend/open_webui/retrieval/vector/dbs/elasticsearch.py @@ -2,28 +2,28 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from elasticsearch import Elasticsearch, BadRequestError -from typing import Optional import ssl -from elasticsearch.helpers import bulk, scan +from typing import Optional -from open_webui.retrieval.vector.utils import process_metadata -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) +from elasticsearch import BadRequestError, Elasticsearch +from elasticsearch.helpers import bulk, scan from open_webui.config import ( - ELASTICSEARCH_URL, - ELASTICSEARCH_CA_CERTS, ELASTICSEARCH_API_KEY, - ELASTICSEARCH_USERNAME, - ELASTICSEARCH_PASSWORD, + ELASTICSEARCH_CA_CERTS, ELASTICSEARCH_CLOUD_ID, ELASTICSEARCH_INDEX_PREFIX, + ELASTICSEARCH_PASSWORD, + ELASTICSEARCH_URL, + ELASTICSEARCH_USERNAME, SSL_ASSERT_FINGERPRINT, ) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) +from open_webui.retrieval.vector.utils import process_metadata class ElasticsearchClient(VectorDBBase): diff --git a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py index 1cb3563382..a8cf62f7b1 100644 --- a/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py +++ b/backend/open_webui/retrieval/vector/dbs/mariadb_vector.py @@ -13,18 +13,15 @@ import sys from contextlib import contextmanager from typing import Any, Dict, List, Optional, Tuple -from sqlalchemy import create_engine -from sqlalchemy.pool import NullPool, QueuePool - from open_webui.config import ( MARIADB_VECTOR_DB_URL, MARIADB_VECTOR_DISTANCE_STRATEGY, MARIADB_VECTOR_INDEX_M, MARIADB_VECTOR_INITIALIZE_MAX_VECTOR_LENGTH, - MARIADB_VECTOR_POOL_SIZE, MARIADB_VECTOR_POOL_MAX_OVERFLOW, - MARIADB_VECTOR_POOL_TIMEOUT, MARIADB_VECTOR_POOL_RECYCLE, + MARIADB_VECTOR_POOL_SIZE, + MARIADB_VECTOR_POOL_TIMEOUT, ) from open_webui.retrieval.vector.main import ( GetResult, @@ -33,6 +30,8 @@ from open_webui.retrieval.vector.main import ( VectorItem, ) from open_webui.retrieval.vector.utils import process_metadata +from sqlalchemy import create_engine +from sqlalchemy.pool import NullPool, QueuePool log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/milvus.py b/backend/open_webui/retrieval/vector/dbs/milvus.py index 2f3d8f3890..9b356b1c69 100644 --- a/backend/open_webui/retrieval/vector/dbs/milvus.py +++ b/backend/open_webui/retrieval/vector/dbs/milvus.py @@ -2,33 +2,31 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from pymilvus import MilvusClient as Client -from pymilvus import FieldSchema, DataType -from pymilvus import connections, Collection - import json import logging from typing import Optional -from open_webui.retrieval.vector.utils import process_metadata -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) from open_webui.config import ( - MILVUS_URI, MILVUS_DB, - MILVUS_TOKEN, - MILVUS_INDEX_TYPE, - MILVUS_METRIC_TYPE, - MILVUS_HNSW_M, - MILVUS_HNSW_EFCONSTRUCTION, - MILVUS_IVF_FLAT_NLIST, MILVUS_DISKANN_MAX_DEGREE, MILVUS_DISKANN_SEARCH_LIST_SIZE, + MILVUS_HNSW_EFCONSTRUCTION, + MILVUS_HNSW_M, + MILVUS_INDEX_TYPE, + MILVUS_IVF_FLAT_NLIST, + MILVUS_METRIC_TYPE, + MILVUS_TOKEN, + MILVUS_URI, ) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) +from open_webui.retrieval.vector.utils import process_metadata +from pymilvus import Collection, DataType, FieldSchema, connections +from pymilvus import MilvusClient as Client log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py b/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py index 93b4a8cbc4..d43e2e61d4 100644 --- a/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py +++ b/backend/open_webui/retrieval/vector/dbs/milvus_multitenancy.py @@ -3,18 +3,18 @@ NOTE: This vector database integration is community-supported and maintained on """ import logging -from typing import Optional, Tuple, List, Dict, Any +from typing import Any, Dict, List, Optional, Tuple from open_webui.config import ( - MILVUS_URI, - MILVUS_TOKEN, - MILVUS_DB, MILVUS_COLLECTION_PREFIX, - MILVUS_INDEX_TYPE, - MILVUS_METRIC_TYPE, - MILVUS_HNSW_M, + MILVUS_DB, MILVUS_HNSW_EFCONSTRUCTION, + MILVUS_HNSW_M, + MILVUS_INDEX_TYPE, MILVUS_IVF_FLAT_NLIST, + MILVUS_METRIC_TYPE, + MILVUS_TOKEN, + MILVUS_URI, ) from open_webui.retrieval.vector.main import ( GetResult, @@ -23,12 +23,12 @@ from open_webui.retrieval.vector.main import ( VectorItem, ) from pymilvus import ( - connections, - utility, Collection, CollectionSchema, - FieldSchema, DataType, + FieldSchema, + connections, + utility, ) log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/opengauss.py b/backend/open_webui/retrieval/vector/dbs/opengauss.py index ac97cf01fa..1c9d35253c 100644 --- a/backend/open_webui/retrieval/vector/dbs/opengauss.py +++ b/backend/open_webui/retrieval/vector/dbs/opengauss.py @@ -2,37 +2,36 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from typing import Optional, List, Dict, Any +import json import logging import re -import json +from typing import Any, Dict, List, Optional + +from pgvector.sqlalchemy import Vector from sqlalchemy import ( - func, - literal, + Column, + Integer, + LargeBinary, + MetaData, + Table, + Text, cast, column, create_engine, - Column, - Integer, - MetaData, - LargeBinary, + func, + literal, select, text, - Text, - Table, values, ) -from sqlalchemy.sql import true -from sqlalchemy.pool import NullPool, QueuePool - -from sqlalchemy.orm import declarative_base, scoped_session, sessionmaker -from sqlalchemy.dialects.postgresql import JSONB, array -from pgvector.sqlalchemy import Vector -from sqlalchemy.ext.mutable import MutableDict -from sqlalchemy.exc import NoSuchTableError - -from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 from sqlalchemy.dialects import registry +from sqlalchemy.dialects.postgresql import JSONB, array +from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 +from sqlalchemy.exc import NoSuchTableError +from sqlalchemy.ext.mutable import MutableDict +from sqlalchemy.orm import declarative_base, scoped_session, sessionmaker +from sqlalchemy.pool import NullPool, QueuePool +from sqlalchemy.sql import true class OpenGaussDialect(PGDialect_psycopg2): @@ -56,23 +55,22 @@ class OpenGaussDialect(PGDialect_psycopg2): # Register dialect registry.register('opengauss', __name__, 'OpenGaussDialect') -from open_webui.retrieval.vector.utils import process_metadata -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) from open_webui.config import ( OPENGAUSS_DB_URL, OPENGAUSS_INITIALIZE_MAX_VECTOR_LENGTH, - OPENGAUSS_POOL_SIZE, OPENGAUSS_POOL_MAX_OVERFLOW, - OPENGAUSS_POOL_TIMEOUT, OPENGAUSS_POOL_RECYCLE, + OPENGAUSS_POOL_SIZE, + OPENGAUSS_POOL_TIMEOUT, ) - from open_webui.env import SRC_LOG_LEVELS +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) +from open_webui.retrieval.vector.utils import process_metadata VECTOR_LENGTH = OPENGAUSS_INITIALIZE_MAX_VECTOR_LENGTH Base = declarative_base() diff --git a/backend/open_webui/retrieval/vector/dbs/opensearch.py b/backend/open_webui/retrieval/vector/dbs/opensearch.py index a08dca7865..798802cd54 100644 --- a/backend/open_webui/retrieval/vector/dbs/opensearch.py +++ b/backend/open_webui/retrieval/vector/dbs/opensearch.py @@ -2,24 +2,24 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from opensearchpy import OpenSearch -from opensearchpy.helpers import bulk from typing import Optional -from open_webui.retrieval.vector.utils import process_metadata +from open_webui.config import ( + OPENSEARCH_CERT_VERIFY, + OPENSEARCH_PASSWORD, + OPENSEARCH_SSL, + OPENSEARCH_URI, + OPENSEARCH_USERNAME, +) from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, VectorDBBase, VectorItem, - SearchResult, - GetResult, -) -from open_webui.config import ( - OPENSEARCH_URI, - OPENSEARCH_SSL, - OPENSEARCH_CERT_VERIFY, - OPENSEARCH_USERNAME, - OPENSEARCH_PASSWORD, ) +from open_webui.retrieval.vector.utils import process_metadata +from opensearchpy import OpenSearch +from opensearchpy.helpers import bulk class OpenSearchClient(VectorDBBase): diff --git a/backend/open_webui/retrieval/vector/dbs/oracle23ai.py b/backend/open_webui/retrieval/vector/dbs/oracle23ai.py index 9a5bd638d9..b09eacb81d 100644 --- a/backend/open_webui/retrieval/vector/dbs/oracle23ai.py +++ b/backend/open_webui/retrieval/vector/dbs/oracle23ai.py @@ -28,34 +28,33 @@ ORACLE_DB_POOL_MAX = 10 ORACLE_DB_POOL_INCREMENT = 1 """ -from typing import Optional, List, Dict, Any, Union -from decimal import Decimal +import array +import json import logging import os import threading import time -import json -import array +from decimal import Decimal +from typing import Any, Dict, List, Optional, Union + import oracledb - -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) - from open_webui.config import ( + ORACLE_DB_DSN, + ORACLE_DB_PASSWORD, + ORACLE_DB_POOL_INCREMENT, + ORACLE_DB_POOL_MAX, + ORACLE_DB_POOL_MIN, ORACLE_DB_USE_WALLET, ORACLE_DB_USER, - ORACLE_DB_PASSWORD, - ORACLE_DB_DSN, + ORACLE_VECTOR_LENGTH, ORACLE_WALLET_DIR, ORACLE_WALLET_PASSWORD, - ORACLE_VECTOR_LENGTH, - ORACLE_DB_POOL_MIN, - ORACLE_DB_POOL_MAX, - ORACLE_DB_POOL_INCREMENT, +) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, ) log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/pgvector.py b/backend/open_webui/retrieval/vector/dbs/pgvector.py index 90e65b9ad0..861d49bc1b 100644 --- a/backend/open_webui/retrieval/vector/dbs/pgvector.py +++ b/backend/open_webui/retrieval/vector/dbs/pgvector.py @@ -1,56 +1,54 @@ -from typing import Optional, List, Dict, Any, Tuple -import logging import json +import logging +from typing import Any, Dict, List, Optional, Tuple + +from open_webui.config import ( + PGVECTOR_CREATE_EXTENSION, + PGVECTOR_DB_URL, + PGVECTOR_HNSW_EF_CONSTRUCTION, + PGVECTOR_HNSW_M, + PGVECTOR_INDEX_METHOD, + PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH, + PGVECTOR_IVFFLAT_LISTS, + PGVECTOR_PGCRYPTO, + PGVECTOR_PGCRYPTO_KEY, + PGVECTOR_POOL_MAX_OVERFLOW, + PGVECTOR_POOL_RECYCLE, + PGVECTOR_POOL_SIZE, + PGVECTOR_POOL_TIMEOUT, + PGVECTOR_USE_HALFVEC, +) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) +from open_webui.retrieval.vector.utils import process_metadata +from open_webui.utils.misc import sanitize_text_for_db +from pgvector.sqlalchemy import HALFVEC, Vector from sqlalchemy import ( - func, - literal, + Column, + Integer, + LargeBinary, + MetaData, + Table, + Text, cast, column, create_engine, - Column, - Integer, - MetaData, - LargeBinary, + func, + literal, select, text, - Text, - Table, values, ) -from sqlalchemy.sql import true -from sqlalchemy.pool import NullPool, QueuePool - -from sqlalchemy.orm import declarative_base, scoped_session, sessionmaker from sqlalchemy.dialects.postgresql import JSONB, array -from pgvector.sqlalchemy import Vector, HALFVEC -from sqlalchemy.ext.mutable import MutableDict from sqlalchemy.exc import NoSuchTableError - - -from open_webui.retrieval.vector.utils import process_metadata -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) -from open_webui.utils.misc import sanitize_text_for_db -from open_webui.config import ( - PGVECTOR_DB_URL, - PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH, - PGVECTOR_CREATE_EXTENSION, - PGVECTOR_PGCRYPTO, - PGVECTOR_PGCRYPTO_KEY, - PGVECTOR_POOL_SIZE, - PGVECTOR_POOL_MAX_OVERFLOW, - PGVECTOR_POOL_TIMEOUT, - PGVECTOR_POOL_RECYCLE, - PGVECTOR_INDEX_METHOD, - PGVECTOR_HNSW_M, - PGVECTOR_HNSW_EF_CONSTRUCTION, - PGVECTOR_IVFFLAT_LISTS, - PGVECTOR_USE_HALFVEC, -) +from sqlalchemy.ext.mutable import MutableDict +from sqlalchemy.orm import declarative_base, scoped_session, sessionmaker +from sqlalchemy.pool import NullPool, QueuePool +from sqlalchemy.sql import true VECTOR_LENGTH = PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH USE_HALFVEC = PGVECTOR_USE_HALFVEC diff --git a/backend/open_webui/retrieval/vector/dbs/pinecone.py b/backend/open_webui/retrieval/vector/dbs/pinecone.py index 6469ac9172..7e2b6e2dfa 100644 --- a/backend/open_webui/retrieval/vector/dbs/pinecone.py +++ b/backend/open_webui/retrieval/vector/dbs/pinecone.py @@ -2,9 +2,10 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from typing import Optional, List, Dict, Any, Union import logging import time # for measuring elapsed time +from typing import Any, Dict, List, Optional, Union + from pinecone import Pinecone, ServerlessSpec # Add gRPC support for better performance (Pinecone best practice) @@ -16,24 +17,23 @@ except ImportError: GRPC_AVAILABLE = False import asyncio # for async upserts -import functools # for partial binding in async tasks - import concurrent.futures # for parallel batch upserts +import functools # for partial binding in async tasks import random # for jitter in retry backoff -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) from open_webui.config import ( PINECONE_API_KEY, + PINECONE_CLOUD, + PINECONE_DIMENSION, PINECONE_ENVIRONMENT, PINECONE_INDEX_NAME, - PINECONE_DIMENSION, PINECONE_METRIC, - PINECONE_CLOUD, +) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, ) from open_webui.retrieval.vector.utils import process_metadata diff --git a/backend/open_webui/retrieval/vector/dbs/qdrant.py b/backend/open_webui/retrieval/vector/dbs/qdrant.py index f050bebeb5..acf4e61993 100644 --- a/backend/open_webui/retrieval/vector/dbs/qdrant.py +++ b/backend/open_webui/retrieval/vector/dbs/qdrant.py @@ -2,31 +2,30 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from typing import Optional import logging +from typing import Optional from urllib.parse import urlparse +from open_webui.config import ( + QDRANT_API_KEY, + QDRANT_COLLECTION_PREFIX, + QDRANT_GRPC_PORT, + QDRANT_HNSW_M, + QDRANT_ON_DISK, + QDRANT_PREFER_GRPC, + QDRANT_TIMEOUT, + QDRANT_URI, +) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) from qdrant_client import QdrantClient as Qclient from qdrant_client.http.models import PointStruct from qdrant_client.models import models -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) -from open_webui.config import ( - QDRANT_URI, - QDRANT_API_KEY, - QDRANT_ON_DISK, - QDRANT_GRPC_PORT, - QDRANT_PREFER_GRPC, - QDRANT_COLLECTION_PREFIX, - QDRANT_TIMEOUT, - QDRANT_HNSW_M, -) - NO_LIMIT = 999999999 log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py b/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py index c3c2ba41d0..15e72f1d16 100644 --- a/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py +++ b/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py @@ -3,19 +3,19 @@ NOTE: This vector database integration is community-supported and maintained on """ import logging -from typing import Optional, Tuple, List, Dict, Any +from typing import Any, Dict, List, Optional, Tuple from urllib.parse import urlparse import grpc from open_webui.config import ( QDRANT_API_KEY, + QDRANT_COLLECTION_PREFIX, QDRANT_GRPC_PORT, + QDRANT_HNSW_M, QDRANT_ON_DISK, QDRANT_PREFER_GRPC, - QDRANT_URI, - QDRANT_COLLECTION_PREFIX, QDRANT_TIMEOUT, - QDRANT_HNSW_M, + QDRANT_URI, ) from open_webui.retrieval.vector.main import ( GetResult, diff --git a/backend/open_webui/retrieval/vector/dbs/s3vector.py b/backend/open_webui/retrieval/vector/dbs/s3vector.py index 8877d206e6..e0b156931c 100644 --- a/backend/open_webui/retrieval/vector/dbs/s3vector.py +++ b/backend/open_webui/retrieval/vector/dbs/s3vector.py @@ -2,17 +2,18 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -from open_webui.retrieval.vector.utils import process_metadata +import logging +from typing import Any, Dict, List, Optional, Union + +import boto3 +from open_webui.config import S3_VECTOR_BUCKET_NAME, S3_VECTOR_REGION from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, GetResult, SearchResult, + VectorDBBase, + VectorItem, ) -from open_webui.config import S3_VECTOR_BUCKET_NAME, S3_VECTOR_REGION -from typing import List, Optional, Dict, Any, Union -import logging -import boto3 +from open_webui.retrieval.vector.utils import process_metadata log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/vector/dbs/weaviate.py b/backend/open_webui/retrieval/vector/dbs/weaviate.py index 2cf4c135c5..a896d8ed5e 100644 --- a/backend/open_webui/retrieval/vector/dbs/weaviate.py +++ b/backend/open_webui/retrieval/vector/dbs/weaviate.py @@ -2,28 +2,28 @@ NOTE: This vector database integration is community-supported and maintained on a best-effort basis. """ -import weaviate import re import uuid from typing import Any, Dict, List, Optional, Union -from open_webui.retrieval.vector.main import ( - VectorDBBase, - VectorItem, - SearchResult, - GetResult, -) -from open_webui.retrieval.vector.utils import process_metadata +import weaviate from open_webui.config import ( - WEAVIATE_HTTP_HOST, - WEAVIATE_GRPC_HOST, - WEAVIATE_HTTP_PORT, - WEAVIATE_GRPC_PORT, WEAVIATE_API_KEY, - WEAVIATE_HTTP_SECURE, + WEAVIATE_GRPC_HOST, + WEAVIATE_GRPC_PORT, WEAVIATE_GRPC_SECURE, + WEAVIATE_HTTP_HOST, + WEAVIATE_HTTP_PORT, + WEAVIATE_HTTP_SECURE, WEAVIATE_SKIP_INIT_CHECKS, ) +from open_webui.retrieval.vector.main import ( + GetResult, + SearchResult, + VectorDBBase, + VectorItem, +) +from open_webui.retrieval.vector.utils import process_metadata def _convert_uuids_to_strings(obj: Any) -> Any: diff --git a/backend/open_webui/retrieval/vector/factory.py b/backend/open_webui/retrieval/vector/factory.py index 8c0208fd4f..59ebb1c4e4 100644 --- a/backend/open_webui/retrieval/vector/factory.py +++ b/backend/open_webui/retrieval/vector/factory.py @@ -1,10 +1,10 @@ +from open_webui.config import ( + ENABLE_MILVUS_MULTITENANCY_MODE, + ENABLE_QDRANT_MULTITENANCY_MODE, + VECTOR_DB, +) from open_webui.retrieval.vector.main import VectorDBBase from open_webui.retrieval.vector.type import VectorType -from open_webui.config import ( - VECTOR_DB, - ENABLE_QDRANT_MULTITENANCY_MODE, - ENABLE_MILVUS_MULTITENANCY_MODE, -) class Vector: diff --git a/backend/open_webui/retrieval/vector/main.py b/backend/open_webui/retrieval/vector/main.py index f7904baa20..38ea699514 100644 --- a/backend/open_webui/retrieval/vector/main.py +++ b/backend/open_webui/retrieval/vector/main.py @@ -1,7 +1,8 @@ -from pydantic import BaseModel from abc import ABC, abstractmethod from typing import Any, Dict, List, Optional, Union +from pydantic import BaseModel + class VectorItem(BaseModel): id: str diff --git a/backend/open_webui/retrieval/web/azure.py b/backend/open_webui/retrieval/web/azure.py index 4f74ecc982..5ba57f11c5 100644 --- a/backend/open_webui/retrieval/web/azure.py +++ b/backend/open_webui/retrieval/web/azure.py @@ -1,5 +1,6 @@ import logging from typing import Optional + from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/web/bing.py b/backend/open_webui/retrieval/web/bing.py index b7cfea89de..b026302b4b 100644 --- a/backend/open_webui/retrieval/web/bing.py +++ b/backend/open_webui/retrieval/web/bing.py @@ -1,10 +1,11 @@ +import argparse import logging import os from pprint import pprint from typing import Optional + import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results -import argparse log = logging.getLogger(__name__) """ diff --git a/backend/open_webui/retrieval/web/bocha.py b/backend/open_webui/retrieval/web/bocha.py index 3557dcffb9..cb94646310 100644 --- a/backend/open_webui/retrieval/web/bocha.py +++ b/backend/open_webui/retrieval/web/bocha.py @@ -1,8 +1,8 @@ +import json import logging from typing import Optional import requests -import json from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/web/brave.py b/backend/open_webui/retrieval/web/brave.py index 9e663c2684..eb80094dbb 100644 --- a/backend/open_webui/retrieval/web/brave.py +++ b/backend/open_webui/retrieval/web/brave.py @@ -1,6 +1,7 @@ +from __future__ import annotations + import logging import time -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -8,7 +9,7 @@ from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) -def search_brave(api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None) -> list[SearchResult]: +def search_brave(api_key: str, query: str, count: int, filter_list: list[str | None] = None) -> list[SearchResult]: """Search using Brave's Search API and return the results as a list of SearchResult objects. Args: diff --git a/backend/open_webui/retrieval/web/brave_llm_context.py b/backend/open_webui/retrieval/web/brave_llm_context.py new file mode 100644 index 0000000000..ead410e7d4 --- /dev/null +++ b/backend/open_webui/retrieval/web/brave_llm_context.py @@ -0,0 +1,66 @@ +import logging +import time +from typing import Optional + +import requests +from open_webui.retrieval.web.main import SearchResult, get_filtered_results + +log = logging.getLogger(__name__) + + +def search_brave_llm_context( + api_key: str, + query: str, + count: int, + filter_list: Optional[list[str]] = None, + context_tokens: int = 8192, +) -> list[SearchResult]: + """Search using Brave's LLM Context API and return pre-extracted, relevance-scored + page content ready for LLM consumption. + + Uses /res/v1/llm/context instead of /res/v1/web/search. Same API key, same pricing. + Returns full extracted passages per URL rather than short snippets, eliminating + the need for post-search scraping. + + Args: + api_key (str): A Brave Search API key (same key as web search) + query (str): The query to search for + count (int): Maximum number of results to return + filter_list (list[str], optional): Domain filter list + context_tokens (int): Maximum total tokens to retrieve (1024–32768, default 8192) + """ + url = 'https://api.search.brave.com/res/v1/llm/context' + headers = { + 'Accept': 'application/json', + 'Accept-Encoding': 'gzip', + 'X-Subscription-Token': api_key, + } + params = { + 'q': query, + 'count': count, + 'maximum_number_of_tokens': context_tokens, + } + + response = requests.get(url, headers=headers, params=params) + + # Handle 429 rate limiting - same rate limits as web search + if response.status_code == 429: + log.info('Brave LLM Context API rate limited (429), retrying after 1 second...') + time.sleep(1) + response = requests.get(url, headers=headers, params=params) + + response.raise_for_status() + + json_response = response.json() + results = json_response.get('grounding', {}).get('generic', []) + if filter_list: + results = get_filtered_results(results, filter_list) + + return [ + SearchResult( + link=result['url'], + title=result.get('title'), + snippet='\n\n'.join(result.get('snippets', [])), + ) + for result in results[:count] + ] diff --git a/backend/open_webui/retrieval/web/duckduckgo.py b/backend/open_webui/retrieval/web/duckduckgo.py index da1c3f77ec..27d56f6934 100644 --- a/backend/open_webui/retrieval/web/duckduckgo.py +++ b/backend/open_webui/retrieval/web/duckduckgo.py @@ -1,9 +1,11 @@ -import logging -from typing import Optional +from __future__ import annotations + +import logging +import urllib.request -from open_webui.retrieval.web.main import SearchResult, get_filtered_results from ddgs import DDGS from ddgs.exceptions import RatelimitException +from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) @@ -11,9 +13,9 @@ log = logging.getLogger(__name__) def search_duckduckgo( query: str, count: int, - filter_list: Optional[list[str]] = None, - concurrent_requests: Optional[int] = None, - backend: Optional[str] = 'auto', + filter_list: list[str | None] = None, + concurrent_requests: int | None = None, + backend: str | None = 'auto', ) -> list[SearchResult]: """ Search using DuckDuckGo's Search API and return the results as a list of SearchResult objects. @@ -25,17 +27,25 @@ def search_duckduckgo( Returns: list[SearchResult]: A list of search results """ - # Use the DDGS context manager to create a DDGS object + # The ddgs library (primp-based) does not auto-detect proxy env vars. + # Resolve via stdlib getproxies() — same pattern as the other loaders. + env_proxies = urllib.request.getproxies() + proxy = env_proxies.get('https') or env_proxies.get('http') search_results = [] - with DDGS() as ddgs: + with DDGS(proxy=proxy) as ddgs: if concurrent_requests: ddgs.threads = concurrent_requests # Use the ddgs.text() method to perform the search try: - search_results = ddgs.text(query, safesearch='moderate', max_results=count, backend=backend) + kwargs = {'safesearch': 'moderate', 'max_results': count} + if backend and backend != 'auto': + kwargs['backend'] = backend + results = ddgs.text(query, **kwargs) + search_results = results if results is not None else [] except RatelimitException as e: log.error(f'RatelimitException: {e}') + search_results = [] if filter_list: search_results = get_filtered_results(search_results, filter_list) diff --git a/backend/open_webui/retrieval/web/external.py b/backend/open_webui/retrieval/web/external.py index 7f5a2bf2af..4db37cb645 100644 --- a/backend/open_webui/retrieval/web/external.py +++ b/backend/open_webui/retrieval/web/external.py @@ -1,14 +1,11 @@ import logging -from typing import Optional, List +from typing import List, Optional import requests - from fastapi import Request - - +from open_webui.env import FORWARD_SESSION_INFO_HEADER_CHAT_ID from open_webui.retrieval.web.main import SearchResult, get_filtered_results from open_webui.utils.headers import include_user_info_headers -from open_webui.env import FORWARD_SESSION_INFO_HEADER_CHAT_ID log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/web/google_pse.py b/backend/open_webui/retrieval/web/google_pse.py index bb0a852658..ec7b6d5af8 100644 --- a/backend/open_webui/retrieval/web/google_pse.py +++ b/backend/open_webui/retrieval/web/google_pse.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import logging -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -12,8 +13,8 @@ def search_google_pse( search_engine_id: str, query: str, count: int, - filter_list: Optional[list[str]] = None, - referer: Optional[str] = None, + filter_list: list[str | None] = None, + referer: str | None = None, ) -> list[SearchResult]: """Search using Google's Programmable Search Engine API and return the results as a list of SearchResult objects. Handles pagination for counts greater than 10. @@ -23,7 +24,7 @@ def search_google_pse( search_engine_id (str): A Programmable Search Engine ID query (str): The query to search for count (int): The number of results to return (max 100, as PSE max results per query is 10 and max page is 10) - filter_list (Optional[list[str]], optional): A list of keywords to filter out from results. Defaults to None. + filter_list (list[str | None], optional): A list of keywords to filter out from results. Defaults to None. Returns: list[SearchResult]: A list of SearchResult objects. diff --git a/backend/open_webui/retrieval/web/jina_search.py b/backend/open_webui/retrieval/web/jina_search.py index b3266c47d0..830beec702 100644 --- a/backend/open_webui/retrieval/web/jina_search.py +++ b/backend/open_webui/retrieval/web/jina_search.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import logging import requests @@ -17,9 +19,9 @@ def search_jina(api_key: str, query: str, count: int, base_url: str = '') -> lis base_url (str): Optional custom base URL for the Jina API Returns: - list[SearchResult]: A list of search results + A list of SearchResult objects. """ - jina_search_endpoint = base_url if base_url else 'https://s.jina.ai/' + jina_search_endpoint = base_url or 'https://s.jina.ai/' headers = { 'Accept': 'application/json', diff --git a/backend/open_webui/retrieval/web/main.py b/backend/open_webui/retrieval/web/main.py index 3a8fed52dd..a55c62c8b5 100644 --- a/backend/open_webui/retrieval/web/main.py +++ b/backend/open_webui/retrieval/web/main.py @@ -1,12 +1,11 @@ -import validators +from __future__ import annotations -from typing import Optional from urllib.parse import urlparse -from pydantic import BaseModel - +import validators from open_webui.retrieval.web.utils import resolve_hostname from open_webui.utils.misc import is_string_allowed +from pydantic import BaseModel def get_filtered_results(results, filter_list): @@ -42,5 +41,5 @@ def get_filtered_results(results, filter_list): class SearchResult(BaseModel): link: str - title: Optional[str] - snippet: Optional[str] + title: str | None + snippet: str | None diff --git a/backend/open_webui/retrieval/web/mojeek.py b/backend/open_webui/retrieval/web/mojeek.py index a094ef6fc8..da24c2a87c 100644 --- a/backend/open_webui/retrieval/web/mojeek.py +++ b/backend/open_webui/retrieval/web/mojeek.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import logging -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -7,7 +8,7 @@ from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) -def search_mojeek(api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None) -> list[SearchResult]: +def search_mojeek(api_key: str, query: str, count: int, filter_list: list[str | None] = None) -> list[SearchResult]: """Search using Mojeek's Search API and return the results as a list of SearchResult objects. Args: diff --git a/backend/open_webui/retrieval/web/perplexity.py b/backend/open_webui/retrieval/web/perplexity.py index 8b3a9d3b08..3794057ebc 100644 --- a/backend/open_webui/retrieval/web/perplexity.py +++ b/backend/open_webui/retrieval/web/perplexity.py @@ -1,7 +1,7 @@ import logging -from typing import Optional, Literal -import requests +from typing import Literal, Optional +import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results MODELS = Literal[ @@ -37,7 +37,7 @@ def search_perplexity( """ - # Handle PersistentConfig object + # Handle ConfigVar object if hasattr(api_key, '__str__'): api_key = str(api_key) diff --git a/backend/open_webui/retrieval/web/perplexity_search.py b/backend/open_webui/retrieval/web/perplexity_search.py index 9cbec049d9..dede51cadd 100644 --- a/backend/open_webui/retrieval/web/perplexity_search.py +++ b/backend/open_webui/retrieval/web/perplexity_search.py @@ -1,7 +1,7 @@ import logging -from typing import Optional, Literal -import requests +from typing import Literal, Optional +import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results from open_webui.utils.headers import include_user_info_headers @@ -28,7 +28,7 @@ def search_perplexity_search( """ - # Handle PersistentConfig object + # Handle ConfigVar object if hasattr(api_key, '__str__'): api_key = str(api_key) diff --git a/backend/open_webui/retrieval/web/searxng.py b/backend/open_webui/retrieval/web/searxng.py index 0335bea9a3..67ca8da64a 100644 --- a/backend/open_webui/retrieval/web/searxng.py +++ b/backend/open_webui/retrieval/web/searxng.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import logging -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -7,11 +8,11 @@ from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) -def search_searxng( +def search_searxng( # noqa: PLR0913 query_url: str, query: str, count: int, - filter_list: Optional[list[str]] = None, + filter_list: list[str | None] = None, **kwargs, ) -> list[SearchResult]: """ @@ -28,7 +29,7 @@ def search_searxng( language (str): Language filter for the search results; e.g., "all", "en-US", "es". Defaults to "all". safesearch (int): Safe search filter for safer web results; 0 = off, 1 = moderate, 2 = strict. Defaults to 1 (moderate). time_range (str): Time range for filtering results by date; e.g., "2023-04-05..today" or "all-time". Defaults to ''. - categories: (Optional[list[str]]): Specific categories within which the search should be performed, defaulting to an empty string if not provided. + categories: (list[str | None]): Specific categories within which the search should be performed, defaulting to an empty string if not provided. Returns: list[SearchResult]: A list of SearchResults sorted by relevance score in descending order. @@ -38,7 +39,7 @@ def search_searxng( """ # Default values for optional parameters are provided as empty strings or None when not specified. - language = kwargs.get('language', 'all') + language = kwargs.get('language', 'all').strip().rstrip(',') safesearch = kwargs.get('safesearch', '1') time_range = kwargs.get('time_range', '') categories = ''.join(kwargs.get('categories', [])) diff --git a/backend/open_webui/retrieval/web/serper.py b/backend/open_webui/retrieval/web/serper.py index 9f1a8e1b3a..91cb78d4f4 100644 --- a/backend/open_webui/retrieval/web/serper.py +++ b/backend/open_webui/retrieval/web/serper.py @@ -1,6 +1,7 @@ +from __future__ import annotations + import json import logging -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -8,7 +9,7 @@ from open_webui.retrieval.web.main import SearchResult, get_filtered_results log = logging.getLogger(__name__) -def search_serper(api_key: str, query: str, count: int, filter_list: Optional[list[str]] = None) -> list[SearchResult]: +def search_serper(api_key: str, query: str, count: int, filter_list: list[str | None] = None) -> list[SearchResult]: """Search using serper.dev's API and return the results as a list of SearchResult objects. Args: diff --git a/backend/open_webui/retrieval/web/serply.py b/backend/open_webui/retrieval/web/serply.py index f245392b75..c4909c14e0 100644 --- a/backend/open_webui/retrieval/web/serply.py +++ b/backend/open_webui/retrieval/web/serply.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import logging -from typing import Optional from urllib.parse import urlencode import requests @@ -16,7 +17,7 @@ def search_serply( limit: int = 10, device_type: str = 'desktop', proxy_location: str = 'US', - filter_list: Optional[list[str]] = None, + filter_list: list[str | None] = None, ) -> list[SearchResult]: """Search using serper.dev's API and return the results as a list of SearchResult objects. diff --git a/backend/open_webui/retrieval/web/serpstack.py b/backend/open_webui/retrieval/web/serpstack.py index 28a4956645..be034e1594 100644 --- a/backend/open_webui/retrieval/web/serpstack.py +++ b/backend/open_webui/retrieval/web/serpstack.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import logging -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -11,7 +12,7 @@ def search_serpstack( api_key: str, query: str, count: int, - filter_list: Optional[list[str]] = None, + filter_list: list[str | None] = None, https_enabled: bool = True, ) -> list[SearchResult]: """Search using serpstack.com's and return the results as a list of SearchResult objects. diff --git a/backend/open_webui/retrieval/web/sougou.py b/backend/open_webui/retrieval/web/sougou.py index b267374d79..3d12e2a57b 100644 --- a/backend/open_webui/retrieval/web/sougou.py +++ b/backend/open_webui/retrieval/web/sougou.py @@ -1,7 +1,6 @@ -import logging import json -from typing import Optional, List - +import logging +from typing import List, Optional from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -15,8 +14,8 @@ def search_sougou( count: int, filter_list: Optional[List[str]] = None, ) -> List[SearchResult]: - from tencentcloud.common.common_client import CommonClient from tencentcloud.common import credential + from tencentcloud.common.common_client import CommonClient from tencentcloud.common.exception.tencent_cloud_sdk_exception import ( TencentCloudSDKException, ) diff --git a/backend/open_webui/retrieval/web/tavily.py b/backend/open_webui/retrieval/web/tavily.py index 6b52bbb45b..419bebb05e 100644 --- a/backend/open_webui/retrieval/web/tavily.py +++ b/backend/open_webui/retrieval/web/tavily.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import logging -from typing import Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results @@ -11,7 +12,7 @@ def search_tavily( api_key: str, query: str, count: int, - filter_list: Optional[list[str]] = None, + filter_list: list[str | None] = None, # **kwargs, ) -> list[SearchResult]: """Search using Tavily's Search API and return the results as a list of SearchResult objects. @@ -22,7 +23,7 @@ def search_tavily( count (int): The maximum number of results to return Returns: - list[SearchResult]: A list of search results + A list of SearchResult objects. """ url = 'https://api.tavily.com/search' headers = { diff --git a/backend/open_webui/retrieval/web/testdata/bing.json b/backend/open_webui/retrieval/web/testdata/bing.json deleted file mode 100644 index 80324f3b40..0000000000 --- a/backend/open_webui/retrieval/web/testdata/bing.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "_type": "SearchResponse", - "queryContext": { - "originalQuery": "Top 10 international results" - }, - "webPages": { - "webSearchUrl": "https://www.bing.com/search?q=Top+10+international+results", - "totalEstimatedMatches": 687, - "value": [ - { - "id": "https://api.bing.microsoft.com/api/v7/#WebPages.0", - "name": "2024 Mexican Grand Prix - F1 results and latest standings ... - PlanetF1", - "url": "https://www.planetf1.com/news/f1-results-2024-mexican-grand-prix-race-standings", - "datePublished": "2024-10-27T00:00:00.0000000", - "datePublishedFreshnessText": "1 day ago", - "isFamilyFriendly": true, - "displayUrl": "https://www.planetf1.com/news/f1-results-2024-mexican-grand-prix-race-standings", - "snippet": "Nico Hulkenberg and Pierre Gasly completed the top 10. A full report of the Mexican Grand Prix is available at the bottom of this article. F1 results – 2024 Mexican Grand Prix", - "dateLastCrawled": "2024-10-28T07:15:00.0000000Z", - "cachedPageUrl": "https://cc.bingj.com/cache.aspx?q=Top+10+international+results&d=916492551782&mkt=en-US&setlang=en-US&w=zBsfaAPyF2tUrHFHr_vFFdUm8sng4g34", - "language": "en", - "isNavigational": false, - "noCache": false - }, - { - "id": "https://api.bing.microsoft.com/api/v7/#WebPages.1", - "name": "F1 Results Today: HUGE Verstappen penalties cause major title change", - "url": "https://www.gpfans.com/en/f1-news/1033512/f1-results-today-mexican-grand-prix-huge-max-verstappen-penalties-cause-major-title-change/", - "datePublished": "2024-10-27T00:00:00.0000000", - "datePublishedFreshnessText": "1 day ago", - "isFamilyFriendly": true, - "displayUrl": "https://www.gpfans.com/en/f1-news/1033512/f1-results-today-mexican-grand-prix-huge-max...", - "snippet": "Elsewhere, Mercedes duo Lewis Hamilton and George Russell came home in P4 and P5 respectively. Meanwhile, the surprise package of the day were Haas, with both Kevin Magnussen and Nico Hulkenberg finishing inside the points.. READ MORE: RB star issues apology after red flag CRASH at Mexican GP Mexican Grand Prix 2024 results. 1. Carlos Sainz [Ferrari] 2. Lando Norris [McLaren] - +4.705", - "dateLastCrawled": "2024-10-28T06:06:00.0000000Z", - "cachedPageUrl": "https://cc.bingj.com/cache.aspx?q=Top+10+international+results&d=2840656522642&mkt=en-US&setlang=en-US&w=-Tbkwxnq52jZCvG7l3CtgcwT1vwAjIUD", - "language": "en", - "isNavigational": false, - "noCache": false - }, - { - "id": "https://api.bing.microsoft.com/api/v7/#WebPages.2", - "name": "International Power Rankings: England flying, Kangaroos cruising, Fiji rise", - "url": "https://www.loverugbyleague.com/post/international-power-rankings-england-flying-kangaroos-cruising-fiji-rise", - "datePublished": "2024-10-28T00:00:00.0000000", - "datePublishedFreshnessText": "7 hours ago", - "isFamilyFriendly": true, - "displayUrl": "https://www.loverugbyleague.com/post/international-power-rankings-england-flying...", - "snippet": "LRL RECOMMENDS: England player ratings from first Test against Samoa as omnificent George Williams scores perfect 10. 2. Australia (Men) – SAME. The Kangaroos remain 2nd in our Power Rankings after their 22-10 win against New Zealand in Christchurch on Sunday. As was the case in their win against Tonga last week, Mal Meninga’s side weren ...", - "dateLastCrawled": "2024-10-28T07:09:00.0000000Z", - "cachedPageUrl": "https://cc.bingj.com/cache.aspx?q=Top+10+international+results&d=1535008462672&mkt=en-US&setlang=en-US&w=82ujhH4Kp0iuhCS7wh1xLUFYUeetaVVm", - "language": "en", - "isNavigational": false, - "noCache": false - } - ], - "someResultsRemoved": true - } -} diff --git a/backend/open_webui/retrieval/web/testdata/brave.json b/backend/open_webui/retrieval/web/testdata/brave.json deleted file mode 100644 index 0cc72109ef..0000000000 --- a/backend/open_webui/retrieval/web/testdata/brave.json +++ /dev/null @@ -1,998 +0,0 @@ -{ - "query": { - "original": "python", - "show_strict_warning": false, - "is_navigational": true, - "is_news_breaking": false, - "spellcheck_off": true, - "country": "us", - "bad_results": false, - "should_fallback": false, - "postal_code": "", - "city": "", - "header_country": "", - "more_results_available": true, - "state": "" - }, - "mixed": { - "type": "mixed", - "main": [ - { - "type": "web", - "index": 0, - "all": false - }, - { - "type": "web", - "index": 1, - "all": false - }, - { - "type": "news", - "all": true - }, - { - "type": "web", - "index": 2, - "all": false - }, - { - "type": "videos", - "all": true - }, - { - "type": "web", - "index": 3, - "all": false - }, - { - "type": "web", - "index": 4, - "all": false - }, - { - "type": "web", - "index": 5, - "all": false - }, - { - "type": "web", - "index": 6, - "all": false - }, - { - "type": "web", - "index": 7, - "all": false - }, - { - "type": "web", - "index": 8, - "all": false - }, - { - "type": "web", - "index": 9, - "all": false - }, - { - "type": "web", - "index": 10, - "all": false - }, - { - "type": "web", - "index": 11, - "all": false - }, - { - "type": "web", - "index": 12, - "all": false - }, - { - "type": "web", - "index": 13, - "all": false - }, - { - "type": "web", - "index": 14, - "all": false - }, - { - "type": "web", - "index": 15, - "all": false - }, - { - "type": "web", - "index": 16, - "all": false - }, - { - "type": "web", - "index": 17, - "all": false - }, - { - "type": "web", - "index": 18, - "all": false - }, - { - "type": "web", - "index": 19, - "all": false - } - ], - "top": [], - "side": [] - }, - "news": { - "type": "news", - "results": [ - { - "title": "Google lays off staff from Flutter, Dart and Python teams weeks before its developer conference | TechCrunch", - "url": "https://techcrunch.com/2024/05/01/google-lays-off-staff-from-flutter-dart-python-weeks-before-its-developer-conference/", - "is_source_local": false, - "is_source_both": false, - "description": "Google told TechCrunch that Flutter will have new updates to share at I/O this year.", - "page_age": "2024-05-02T17:40:05", - "family_friendly": true, - "meta_url": { - "scheme": "https", - "netloc": "techcrunch.com", - "hostname": "techcrunch.com", - "favicon": "https://imgs.search.brave.com/N6VSEVahheQOb7lqfb47dhUOB4XD-6sfQOP94sCe3Oo/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvZGI5Njk0Yzlk/YWM3ZWMwZjg1MTM1/NmIyMWEyNzBjZDZj/ZDQyNmFlNGU0NDRi/MDgyYjQwOGU0Y2Qy/ZWMwNWQ2ZC90ZWNo/Y3J1bmNoLmNvbS8", - "path": "› 2024 › 05 › 01 › google-lays-off-staff-from-flutter-dart-python-weeks-before-its-developer-conference" - }, - "breaking": false, - "thumbnail": { - "src": "https://imgs.search.brave.com/gCI5UG8muOEOZDAx9vpu6L6r6R00mD7jOF08-biFoyQ/rs:fit:200:200:1/g:ce/aHR0cHM6Ly90ZWNo/Y3J1bmNoLmNvbS93/cC1jb250ZW50L3Vw/bG9hZHMvMjAxOC8x/MS9HZXR0eUltYWdl/cy0xMDAyNDg0NzQ2/LmpwZz9yZXNpemU9/MTIwMCw4MDA" - }, - "age": "3 days ago", - "extra_snippets": [ - "Ahead of Google’s annual I/O developer conference in May, the tech giant has laid off staff across key teams like Flutter, Dart, Python and others, according to reports from affected employees shared on social media. Google confirmed the layoffs to TechCrunch, but not the specific teams, roles or how many people were let go.", - "In a separate post on Reddit, another commenter noted the Python team affected by the layoffs were those who managed the internal Python runtimes and toolchains and worked with OSS Python. Included in this group were “multiple current and former core devs and steering council members,” they said.", - "Meanwhile, others shared on Y Combinator’s Hacker News, where a Python team member detailed their specific duties on the technical front and noted that, for years, much of the work was done with fewer than 10 people. Another Hacker News commenter said their early years on the Python team were spent paying down internal technical debt accumulated from not having a strong Python strategy.", - "CNBC reports that a total of 200 people were let go across Google’s “Core” teams, which included those working on Python, app platforms, and other engineering roles. Some jobs were being shifted to India and Mexico, it said, citing internal documents." - ] - } - ], - "mutated_by_goggles": false - }, - "type": "search", - "videos": { - "type": "videos", - "results": [ - { - "type": "video_result", - "url": "https://www.youtube.com/watch?v=b093aqAZiPU", - "title": "👩‍💻 Python for Beginners Tutorial - YouTube", - "description": "In this step-by-step Python for beginner's tutorial, learn how you can get started programming in Python. In this video, I assume that you are completely new...", - "age": "March 25, 2021", - "page_age": "2021-03-25T10:00:08", - "video": {}, - "meta_url": { - "scheme": "https", - "netloc": "youtube.com", - "hostname": "www.youtube.com", - "favicon": "https://imgs.search.brave.com/Ux4Hee4evZhvjuTKwtapBycOGjGDci2Gvn2pbSzvbC0/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTkyZTZiMWU3/YzU3Nzc5YjExYzUy/N2VhZTIxOWNlYjM5/ZGVjN2MyZDY4Nzdh/ZDYzMTYxNmI5N2Rk/Y2Q3N2FkNy93d3cu/eW91dHViZS5jb20v", - "path": "› watch" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/tZI4Do4_EYcTCsD_MvE3Jx8FzjIXwIJ5ZuKhwiWTyZs/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9pLnl0/aW1nLmNvbS92aS9i/MDkzYXFBWmlQVS9t/YXhyZXNkZWZhdWx0/LmpwZw" - } - }, - { - "type": "video_result", - "url": "https://www.youtube.com/watch?v=rfscVS0vtbw", - "title": "Learn Python - Full Course for Beginners [Tutorial] - YouTube", - "description": "This course will give you a full introduction into all of the core concepts in python. Follow along with the videos and you'll be a python programmer in no t...", - "age": "July 11, 2018", - "page_age": "2018-07-11T18:00:42", - "video": {}, - "meta_url": { - "scheme": "https", - "netloc": "youtube.com", - "hostname": "www.youtube.com", - "favicon": "https://imgs.search.brave.com/Ux4Hee4evZhvjuTKwtapBycOGjGDci2Gvn2pbSzvbC0/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTkyZTZiMWU3/YzU3Nzc5YjExYzUy/N2VhZTIxOWNlYjM5/ZGVjN2MyZDY4Nzdh/ZDYzMTYxNmI5N2Rk/Y2Q3N2FkNy93d3cu/eW91dHViZS5jb20v", - "path": "› watch" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/65zkx_kPU_zJb-4nmvvY-q5-ZZwzceChz-N00V8cqvk/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9pLnl0/aW1nLmNvbS92aS9y/ZnNjVlMwdnRidy9t/YXhyZXNkZWZhdWx0/LmpwZw" - } - }, - { - "type": "video_result", - "url": "https://www.youtube.com/watch?v=_uQrJ0TkZlc", - "title": "Python Tutorial - Python Full Course for Beginners - YouTube", - "description": "Become a Python pro! 🚀 This comprehensive tutorial takes you from beginner to hero, covering the basics, machine learning, and web development projects.🚀 W...", - "age": "February 18, 2019", - "page_age": "2019-02-18T15:00:08", - "video": {}, - "meta_url": { - "scheme": "https", - "netloc": "youtube.com", - "hostname": "www.youtube.com", - "favicon": "https://imgs.search.brave.com/Ux4Hee4evZhvjuTKwtapBycOGjGDci2Gvn2pbSzvbC0/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTkyZTZiMWU3/YzU3Nzc5YjExYzUy/N2VhZTIxOWNlYjM5/ZGVjN2MyZDY4Nzdh/ZDYzMTYxNmI5N2Rk/Y2Q3N2FkNy93d3cu/eW91dHViZS5jb20v", - "path": "› watch" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/Djiv1pXLq1ClqBSE_86jQnEYR8bW8UJP6Cs7LrgyQzQ/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9pLnl0/aW1nLmNvbS92aS9f/dVFySjBUa1psYy9t/YXhyZXNkZWZhdWx0/LmpwZw" - } - }, - { - "type": "video_result", - "url": "https://www.youtube.com/watch?v=wRKgzC-MhIc", - "title": "[] and {} vs list() and dict(), which is better?", - "description": "Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.", - "video": {}, - "meta_url": { - "scheme": "https", - "netloc": "youtube.com", - "hostname": "www.youtube.com", - "favicon": "https://imgs.search.brave.com/Ux4Hee4evZhvjuTKwtapBycOGjGDci2Gvn2pbSzvbC0/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTkyZTZiMWU3/YzU3Nzc5YjExYzUy/N2VhZTIxOWNlYjM5/ZGVjN2MyZDY4Nzdh/ZDYzMTYxNmI5N2Rk/Y2Q3N2FkNy93d3cu/eW91dHViZS5jb20v", - "path": "› watch" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/Hw9ep2Pio13X1VZjRw_h9R2VH_XvZFOuGlQJVnVkeq0/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9pLnl0/aW1nLmNvbS92aS93/UktnekMtTWhJYy9o/cWRlZmF1bHQuanBn" - } - }, - { - "type": "video_result", - "url": "https://www.youtube.com/watch?v=LWdsF79H1Pg", - "title": "print() vs. return in Python Functions - YouTube", - "description": "In this video, you will learn the differences between the return statement and the print function when they are used inside Python functions. We will see an ...", - "age": "June 11, 2022", - "page_age": "2022-06-11T21:33:26", - "video": {}, - "meta_url": { - "scheme": "https", - "netloc": "youtube.com", - "hostname": "www.youtube.com", - "favicon": "https://imgs.search.brave.com/Ux4Hee4evZhvjuTKwtapBycOGjGDci2Gvn2pbSzvbC0/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTkyZTZiMWU3/YzU3Nzc5YjExYzUy/N2VhZTIxOWNlYjM5/ZGVjN2MyZDY4Nzdh/ZDYzMTYxNmI5N2Rk/Y2Q3N2FkNy93d3cu/eW91dHViZS5jb20v", - "path": "› watch" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/ebglnr5_jwHHpvon3WU-5hzt0eHdTZSVGg3Ts6R38xY/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9pLnl0/aW1nLmNvbS92aS9M/V2RzRjc5SDFQZy9t/YXhyZXNkZWZhdWx0/LmpwZw" - } - }, - { - "type": "video_result", - "url": "https://www.youtube.com/watch?v=AovxLr8jUH4", - "title": "Python Tutorial for Beginners 5 - Python print() and input() Function ...", - "description": "In this Video I am going to show How to use print() Function and input() Function in Python. In python The print() function is used to print the specified ...", - "age": "August 28, 2018", - "page_age": "2018-08-28T20:11:09", - "video": {}, - "meta_url": { - "scheme": "https", - "netloc": "youtube.com", - "hostname": "www.youtube.com", - "favicon": "https://imgs.search.brave.com/Ux4Hee4evZhvjuTKwtapBycOGjGDci2Gvn2pbSzvbC0/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTkyZTZiMWU3/YzU3Nzc5YjExYzUy/N2VhZTIxOWNlYjM5/ZGVjN2MyZDY4Nzdh/ZDYzMTYxNmI5N2Rk/Y2Q3N2FkNy93d3cu/eW91dHViZS5jb20v", - "path": "› watch" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/nCoLEcWkKtiecprWbS6nufwGCaSbPH7o0-sMeIkFmjI/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9pLnl0/aW1nLmNvbS92aS9B/b3Z4THI4alVINC9o/cWRlZmF1bHQuanBn" - } - } - ], - "mutated_by_goggles": false - }, - "web": { - "type": "search", - "results": [ - { - "title": "Welcome to Python.org", - "url": "https://www.python.org", - "is_source_local": false, - "is_source_both": false, - "description": "The official home of the Python Programming Language", - "page_age": "2023-09-09T15:55:05", - "profile": { - "name": "Python", - "url": "https://www.python.org", - "long_name": "python.org", - "img": "https://imgs.search.brave.com/vBaRH-v6oPS4csO4cdvuKhZ7-xDVvydin3oe3zXYxAI/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvNTJjMzZjNDBj/MmIzODgwMGUyOTRj/Y2E5MjM3YjRkYTZj/YWI1Yzk1NTlmYTgw/ZDBjNzM0MGMxZjQz/YWFjNTczYy93d3cu/cHl0aG9uLm9yZy8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "python.org", - "hostname": "www.python.org", - "favicon": "https://imgs.search.brave.com/vBaRH-v6oPS4csO4cdvuKhZ7-xDVvydin3oe3zXYxAI/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvNTJjMzZjNDBj/MmIzODgwMGUyOTRj/Y2E5MjM3YjRkYTZj/YWI1Yzk1NTlmYTgw/ZDBjNzM0MGMxZjQz/YWFjNTczYy93d3cu/cHl0aG9uLm9yZy8", - "path": "" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/GGfNfe5rxJ8QWEoxXniSLc0-POLU3qPyTIpuqPdbmXk/rs:fit:200:200:1/g:ce/aHR0cHM6Ly93d3cu/cHl0aG9uLm9yZy9z/dGF0aWMvb3Blbmdy/YXBoLWljb24tMjAw/eDIwMC5wbmc", - "original": "https://www.python.org/static/opengraph-icon-200x200.png", - "logo": false - }, - "age": "September 9, 2023", - "cluster_type": "generic", - "cluster": [ - { - "title": "Downloads", - "url": "https://www.python.org/downloads/", - "is_source_local": false, - "is_source_both": false, - "description": "The official home of the Python Programming Language", - "family_friendly": true - }, - { - "title": "Macos", - "url": "https://www.python.org/downloads/macos/", - "is_source_local": false, - "is_source_both": false, - "description": "The official home of the Python Programming Language", - "family_friendly": true - }, - { - "title": "Windows", - "url": "https://www.python.org/downloads/windows/", - "is_source_local": false, - "is_source_both": false, - "description": "The official home of the Python Programming Language", - "family_friendly": true - }, - { - "title": "Getting Started", - "url": "https://www.python.org/about/gettingstarted/", - "is_source_local": false, - "is_source_both": false, - "description": "The official home of the Python Programming Language", - "family_friendly": true - } - ], - "extra_snippets": [ - "Calculations are simple with Python, and expression syntax is straightforward: the operators +, -, * and / work as expected; parentheses () can be used for grouping. More about simple math functions in Python 3.", - "The core of extensible programming is defining functions. Python allows mandatory and optional arguments, keyword arguments, and even arbitrary argument lists. More about defining functions in Python 3", - "Lists (known as arrays in other languages) are one of the compound data types that Python understands. Lists can be indexed, sliced and manipulated with other built-in functions. More about lists in Python 3", - "# Python 3: Simple output (with Unicode) >>> print(\"Hello, I'm Python!\") Hello, I'm Python! # Input, assignment >>> name = input('What is your name?\\n') >>> print('Hi, %s.' % name) What is your name? Python Hi, Python." - ] - }, - { - "title": "Python (programming language) - Wikipedia", - "url": "https://en.wikipedia.org/wiki/Python_(programming_language)", - "is_source_local": false, - "is_source_both": false, - "description": "Python is a high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation. Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including structured (particularly procedural), ...", - "page_age": "2024-05-01T12:54:03", - "profile": { - "name": "Wikipedia", - "url": "https://en.wikipedia.org/wiki/Python_(programming_language)", - "long_name": "en.wikipedia.org", - "img": "https://imgs.search.brave.com/0kxnVOiqv-faZvOJc7zpym4Zin1CTs1f1svfNZSzmfU/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvNjQwNGZhZWY0/ZTQ1YWUzYzQ3MDUw/MmMzMGY3NTQ0ZjNj/NDUwMDk5ZTI3MWRk/NWYyNTM4N2UwOTE0/NTI3ZDQzNy9lbi53/aWtpcGVkaWEub3Jn/Lw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "en.wikipedia.org", - "hostname": "en.wikipedia.org", - "favicon": "https://imgs.search.brave.com/0kxnVOiqv-faZvOJc7zpym4Zin1CTs1f1svfNZSzmfU/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvNjQwNGZhZWY0/ZTQ1YWUzYzQ3MDUw/MmMzMGY3NTQ0ZjNj/NDUwMDk5ZTI3MWRk/NWYyNTM4N2UwOTE0/NTI3ZDQzNy9lbi53/aWtpcGVkaWEub3Jn/Lw", - "path": "› wiki › Python_(programming_language)" - }, - "age": "4 days ago", - "extra_snippets": [ - "Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including structured (particularly procedural), object-oriented and functional programming. It is often described as a \"batteries included\" language due to its comprehensive standard library.", - "Guido van Rossum began working on Python in the late 1980s as a successor to the ABC programming language and first released it in 1991 as Python 0.9.0. Python 2.0 was released in 2000. Python 3.0, released in 2008, was a major revision not completely backward-compatible with earlier versions. Python 2.7.18, released in 2020, was the last release of Python 2.", - "Python was invented in the late 1980s by Guido van Rossum at Centrum Wiskunde & Informatica (CWI) in the Netherlands as a successor to the ABC programming language, which was inspired by SETL, capable of exception handling and interfacing with the Amoeba operating system.", - "Python consistently ranks as one of the most popular programming languages, and has gained widespread use in the machine learning community." - ] - }, - { - "title": "Python Tutorial", - "url": "https://www.w3schools.com/python/", - "is_source_local": false, - "is_source_both": false, - "description": "W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.", - "page_age": "2017-12-07T00:00:00", - "profile": { - "name": "W3Schools", - "url": "https://www.w3schools.com/python/", - "long_name": "w3schools.com", - "img": "https://imgs.search.brave.com/JwO5r7z3HTBkU29vgNH_4rrSWLf2M4-8FMWNvbxrKX8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjVlMGVkZDVj/ZGMyZWRmMzAwODRi/ZDAwZGE4NWI3NmU4/MjRhNjEzOGFhZWY3/ZGViMjY1OWY2ZDYw/YTZiOGUyZS93d3cu/dzNzY2hvb2xzLmNv/bS8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "w3schools.com", - "hostname": "www.w3schools.com", - "favicon": "https://imgs.search.brave.com/JwO5r7z3HTBkU29vgNH_4rrSWLf2M4-8FMWNvbxrKX8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjVlMGVkZDVj/ZGMyZWRmMzAwODRi/ZDAwZGE4NWI3NmU4/MjRhNjEzOGFhZWY3/ZGViMjY1OWY2ZDYw/YTZiOGUyZS93d3cu/dzNzY2hvb2xzLmNv/bS8", - "path": "› python" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/EMfp8dodbJehmj0yCJh8317RHuaumsddnHI4bujvFcg/rs:fit:200:200:1/g:ce/aHR0cHM6Ly93d3cu/dzNzY2hvb2xzLmNv/bS9pbWFnZXMvdzNz/Y2hvb2xzX2xvZ29f/NDM2XzIucG5n", - "original": "https://www.w3schools.com/images/w3schools_logo_436_2.png", - "logo": true - }, - "age": "December 7, 2017", - "extra_snippets": [ - "Well organized and easy to understand Web building tutorials with lots of examples of how to use HTML, CSS, JavaScript, SQL, Python, PHP, Bootstrap, Java, XML and more.", - "HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE", - "Python Variables Variable Names Assign Multiple Values Output Variables Global Variables Variable Exercises Python Data Types Python Numbers Python Casting Python Strings", - "Python Strings Slicing Strings Modify Strings Concatenate Strings Format Strings Escape Characters String Methods String Exercises Python Booleans Python Operators Python Lists" - ] - }, - { - "title": "Online Python - IDE, Editor, Compiler, Interpreter", - "url": "https://www.online-python.com/", - "is_source_local": false, - "is_source_both": false, - "description": "Build and Run your Python code instantly. Online-Python is a quick and easy tool that helps you to build, compile, test your python programs.", - "profile": { - "name": "Online-python", - "url": "https://www.online-python.com/", - "long_name": "online-python.com", - "img": "https://imgs.search.brave.com/kfaEvapwHxSsRObO52-I-otYFPHpG1h7UXJyUqDM2Ec/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvZGYxODdjNWQ0/NjZjZTNiMjk5NDY1/MWI5MTgyYjU3Y2Q3/MTI3NGM5MjUzY2Fi/OGQ3MTQ4MmIxMTQx/ZTcxNWFhMC93d3cu/b25saW5lLXB5dGhv/bi5jb20v" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "online-python.com", - "hostname": "www.online-python.com", - "favicon": "https://imgs.search.brave.com/kfaEvapwHxSsRObO52-I-otYFPHpG1h7UXJyUqDM2Ec/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvZGYxODdjNWQ0/NjZjZTNiMjk5NDY1/MWI5MTgyYjU3Y2Q3/MTI3NGM5MjUzY2Fi/OGQ3MTQ4MmIxMTQx/ZTcxNWFhMC93d3cu/b25saW5lLXB5dGhv/bi5jb20v", - "path": "" - }, - "extra_snippets": [ - "Build, run, and share Python code online for free with the help of online-integrated python's development environment (IDE). It is one of the most efficient, dependable, and potent online compilers for the Python programming language. It is not necessary for you to bother about establishing a Python environment in your local.", - "It is one of the most efficient, dependable, and potent online compilers for the Python programming language. It is not necessary for you to bother about establishing a Python environment in your local. Now You can immediately execute the Python code in the web browser of your choice.", - "It is not necessary for you to bother about establishing a Python environment in your local. Now You can immediately execute the Python code in the web browser of your choice. Using this Python editor is simple and quick to get up and running with. Simply type in the programme, and then press the RUN button!", - "Now You can immediately execute the Python code in the web browser of your choice. Using this Python editor is simple and quick to get up and running with. Simply type in the programme, and then press the RUN button! The code can be saved online by choosing the SHARE option, which also gives you the ability to access your code from any location providing you have internet access." - ] - }, - { - "title": "Python · GitHub", - "url": "https://github.com/python", - "is_source_local": false, - "is_source_both": false, - "description": "Repositories related to the Python Programming language - Python", - "page_age": "2023-03-06T00:00:00", - "profile": { - "name": "GitHub", - "url": "https://github.com/python", - "long_name": "github.com", - "img": "https://imgs.search.brave.com/v8685zI4XInM0zxlNI2s7oE_2Sb-EL7lAy81WXbkQD8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYWQyNWM1NjA5/ZjZmZjNlYzI2MDNk/N2VkNmJhYjE2MzZl/MDY5ZTMxMDUzZmY1/NmU3NWIzNWVmMjk0/NTBjMjJjZi9naXRo/dWIuY29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "github.com", - "hostname": "github.com", - "favicon": "https://imgs.search.brave.com/v8685zI4XInM0zxlNI2s7oE_2Sb-EL7lAy81WXbkQD8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYWQyNWM1NjA5/ZjZmZjNlYzI2MDNk/N2VkNmJhYjE2MzZl/MDY5ZTMxMDUzZmY1/NmU3NWIzNWVmMjk0/NTBjMjJjZi9naXRo/dWIuY29tLw", - "path": "› python" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/POoaRfu_7gfp-D_O3qMNJrwDqJNbiDu1HuBpNJ_MpVQ/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9hdmF0/YXJzLmdpdGh1YnVz/ZXJjb250ZW50LmNv/bS91LzE1MjU5ODE_/cz0yMDAmYW1wO3Y9/NA", - "original": "https://avatars.githubusercontent.com/u/1525981?s=200&v=4", - "logo": false - }, - "age": "March 6, 2023", - "extra_snippets": ["Configuration for Python planets (e.g. http://planetpython.org)"] - }, - { - "title": "Online Python Compiler (Interpreter)", - "url": "https://www.programiz.com/python-programming/online-compiler/", - "is_source_local": false, - "is_source_both": false, - "description": "Write and run Python code using our online compiler (interpreter). You can use Python Shell like IDLE, and take inputs from the user in our Python compiler.", - "page_age": "2020-06-02T00:00:00", - "profile": { - "name": "Programiz", - "url": "https://www.programiz.com/python-programming/online-compiler/", - "long_name": "programiz.com", - "img": "https://imgs.search.brave.com/ozj4JFayZ3Fs5c9eTp7M5g12azQ_Hblgu4dpTuHRz6U/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvMGJlN2U1YjVi/Y2M3ZDU5OGMwMWNi/M2Q3YjhjOTM1ZTFk/Y2NkZjE4NGQwOGIx/MTQ4NjI2YmNhODVj/MzFkMmJhYy93d3cu/cHJvZ3JhbWl6LmNv/bS8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "programiz.com", - "hostname": "www.programiz.com", - "favicon": "https://imgs.search.brave.com/ozj4JFayZ3Fs5c9eTp7M5g12azQ_Hblgu4dpTuHRz6U/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvMGJlN2U1YjVi/Y2M3ZDU5OGMwMWNi/M2Q3YjhjOTM1ZTFk/Y2NkZjE4NGQwOGIx/MTQ4NjI2YmNhODVj/MzFkMmJhYy93d3cu/cHJvZ3JhbWl6LmNv/bS8", - "path": "› python-programming › online-compiler" - }, - "age": "June 2, 2020", - "extra_snippets": [ - "Python Online Compiler Online R Compiler SQL Online Editor Online HTML/CSS Editor Online Java Compiler C Online Compiler C++ Online Compiler C# Online Compiler JavaScript Online Compiler Online GoLang Compiler Online PHP Compiler Online Swift Compiler Online Rust Compiler", - "# Online Python compiler (interpreter) to run Python online. # Write Python 3 code in this online editor and run it. print(\"Try programiz.pro\")" - ] - }, - { - "title": "Python Developer", - "url": "https://twitter.com/Python_Dv/status/1786763460992544791", - "is_source_local": false, - "is_source_both": false, - "description": "Python Developer", - "page_age": "2024-05-04T14:30:03", - "profile": { - "name": "X", - "url": "https://twitter.com/Python_Dv/status/1786763460992544791", - "long_name": "twitter.com", - "img": "https://imgs.search.brave.com/Zq483bGX0GnSgym-1P7iyOyEDX3PkDZSNT8m56F862A/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvN2MxOTUxNzhj/OTY1ZTQ3N2I0MjJk/MTY5NGM0MTRlYWVi/MjU1YWE2NDUwYmQ2/YTA2MDFhMDlkZDEx/NTAzZGNiNi90d2l0/dGVyLmNvbS8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "twitter.com", - "hostname": "twitter.com", - "favicon": "https://imgs.search.brave.com/Zq483bGX0GnSgym-1P7iyOyEDX3PkDZSNT8m56F862A/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvN2MxOTUxNzhj/OTY1ZTQ3N2I0MjJk/MTY5NGM0MTRlYWVi/MjU1YWE2NDUwYmQ2/YTA2MDFhMDlkZDEx/NTAzZGNiNi90d2l0/dGVyLmNvbS8", - "path": "› Python_Dv › status › 1786763460992544791" - }, - "age": "20 hours ago" - }, - { - "title": "input table name? - python script - KNIME Extensions - KNIME Community Forum", - "url": "https://forum.knime.com/t/input-table-name-python-script/78978", - "is_source_local": false, - "is_source_both": false, - "description": "Hi, when running a python script node, I get the error seen on the screenshot Same happens with this code too: The script input is output from the csv reader node. How can I get the right name for that table? Best wishes, Dario", - "page_age": "2024-05-04T09:20:44", - "profile": { - "name": "Knime", - "url": "https://forum.knime.com/t/input-table-name-python-script/78978", - "long_name": "forum.knime.com", - "img": "https://imgs.search.brave.com/WQoOhAD5i6uEhJ-qXvlWMJwbGA52f2Ycc_ns36EK698/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTAxNzMxNjFl/MzJjNzU5NzRkOTMz/Mjg4NDU2OWUxM2Rj/YzVkOGM3MzIwNzI2/YTY1NzYxNzA1MDE5/NzQzOWU3NC9mb3J1/bS5rbmltZS5jb20v" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "article", - "meta_url": { - "scheme": "https", - "netloc": "forum.knime.com", - "hostname": "forum.knime.com", - "favicon": "https://imgs.search.brave.com/WQoOhAD5i6uEhJ-qXvlWMJwbGA52f2Ycc_ns36EK698/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTAxNzMxNjFl/MzJjNzU5NzRkOTMz/Mjg4NDU2OWUxM2Rj/YzVkOGM3MzIwNzI2/YTY1NzYxNzA1MDE5/NzQzOWU3NC9mb3J1/bS5rbmltZS5jb20v", - "path": " › knime extensions" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/DtEl38dcvuM1kGfhN0T5HfOrsMJcztWNyriLvtDJmKI/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9mb3J1/bS1jZG4ua25pbWUu/Y29tL3VwbG9hZHMv/ZGVmYXVsdC9vcmln/aW5hbC8zWC9lLzYv/ZTY0M2M2NzFlNzAz/MDg2MjkwMWY2YzJh/OWFjOWI5ZmEwM2M3/ZjMwZi5wbmc", - "original": "https://forum-cdn.knime.com/uploads/default/original/3X/e/6/e643c671e7030862901f6c2a9ac9b9fa03c7f30f.png", - "logo": false - }, - "age": "1 day ago", - "extra_snippets": [ - "Hi, when running a python script node, I get the error seen on the screenshot Same happens with this code too: The script input is output from the csv reader node. How can I get the right name for that table? …" - ] - }, - { - "title": "What does the Double Star operator mean in Python? - GeeksforGeeks", - "url": "https://www.geeksforgeeks.org/what-does-the-double-star-operator-mean-in-python/", - "is_source_local": false, - "is_source_both": false, - "description": "A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.", - "page_age": "2023-03-14T17:15:04", - "profile": { - "name": "GeeksforGeeks", - "url": "https://www.geeksforgeeks.org/what-does-the-double-star-operator-mean-in-python/", - "long_name": "geeksforgeeks.org", - "img": "https://imgs.search.brave.com/fhzcfv5xltx6-YBvJI9RZgS7xZo0dPNaASsrB8YOsCs/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjBhOGQ3MmNi/ZWE5N2EwMmZjYzA1/ZTI0ZTFhMGUyMTE0/MGM0ZTBmMWZlM2Y2/Yzk2ODMxZTRhYTBi/NDdjYTE0OS93d3cu/Z2Vla3Nmb3JnZWVr/cy5vcmcv" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "article", - "meta_url": { - "scheme": "https", - "netloc": "geeksforgeeks.org", - "hostname": "www.geeksforgeeks.org", - "favicon": "https://imgs.search.brave.com/fhzcfv5xltx6-YBvJI9RZgS7xZo0dPNaASsrB8YOsCs/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjBhOGQ3MmNi/ZWE5N2EwMmZjYzA1/ZTI0ZTFhMGUyMTE0/MGM0ZTBmMWZlM2Y2/Yzk2ODMxZTRhYTBi/NDdjYTE0OS93d3cu/Z2Vla3Nmb3JnZWVr/cy5vcmcv", - "path": "› what-does-the-double-star-operator-mean-in-python" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/GcR-j_dLbyHkbHEI3ffLMi6xpXGhF_2Z8POIoqtokhM/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9tZWRp/YS5nZWVrc2Zvcmdl/ZWtzLm9yZy93cC1j/b250ZW50L3VwbG9h/ZHMvZ2ZnXzIwMFgy/MDAtMTAweDEwMC5w/bmc", - "original": "https://media.geeksforgeeks.org/wp-content/uploads/gfg_200X200-100x100.png", - "logo": false - }, - "age": "March 14, 2023", - "extra_snippets": [ - "Difference between / vs. // operator in Python", - "Double Star or (**) is one of the Arithmetic Operator (Like +, -, *, **, /, //, %) in Python Language. It is also known as Power Operator.", - "The time complexity of the given Python program is O(n), where n is the number of key-value pairs in the input dictionary.", - "Inplace Operators in Python | Set 2 (ixor(), iand(), ipow(),…)" - ] - }, - { - "title": "r/Python", - "url": "https://www.reddit.com/r/Python/", - "is_source_local": false, - "is_source_both": false, - "description": "The official Python community for Reddit! Stay up to date with the latest news, packages, and meta information relating to the Python programming language. --- If you have questions or are new to Python use r/LearnPython", - "page_age": "2022-12-30T16:25:02", - "profile": { - "name": "Reddit", - "url": "https://www.reddit.com/r/Python/", - "long_name": "reddit.com", - "img": "https://imgs.search.brave.com/mAZYEK9Wi13WLDUge7XZ8YuDTwm6DP6gBjvz1GdYZVY/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvN2ZiNTU0M2Nj/MTFhZjRiYWViZDlk/MjJiMjBjMzFjMDRk/Y2IzYWI0MGI0MjVk/OGY5NzQzOGQ5NzQ5/NWJhMWI0NC93d3cu/cmVkZGl0LmNvbS8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "reddit.com", - "hostname": "www.reddit.com", - "favicon": "https://imgs.search.brave.com/mAZYEK9Wi13WLDUge7XZ8YuDTwm6DP6gBjvz1GdYZVY/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvN2ZiNTU0M2Nj/MTFhZjRiYWViZDlk/MjJiMjBjMzFjMDRk/Y2IzYWI0MGI0MjVk/OGY5NzQzOGQ5NzQ5/NWJhMWI0NC93d3cu/cmVkZGl0LmNvbS8", - "path": "› r › Python" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/zWd10t3zg34ciHiAB-K5WWK3h_H4LedeDot9BVX7Ydo/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9zdHls/ZXMucmVkZGl0bWVk/aWEuY29tL3Q1XzJx/aDB5L3N0eWxlcy9j/b21tdW5pdHlJY29u/X2NpZmVobDR4dDdu/YzEucG5n", - "original": "https://styles.redditmedia.com/t5_2qh0y/styles/communityIcon_cifehl4xt7nc1.png", - "logo": false - }, - "age": "December 30, 2022", - "extra_snippets": [ - "r/Python: The official Python community for Reddit! Stay up to date with the latest news, packages, and meta information relating to the Python…", - "By default, Python allows you to import and use anything, anywhere. Over time, this results in modules that were intended to be separate getting tightly coupled together, and domain boundaries breaking down. We experienced this first-hand at a unicorn startup, where the eng team paused development for over a year in an attempt to split up packages into independent services.", - "Hello r/Python! It's time to share what you've been working on! Whether it's a work-in-progress, a completed masterpiece, or just a rough idea, let us know what you're up to!", - "Whether it's your job, your hobby, or your passion project, all Python-related work is welcome here." - ] - }, - { - "title": "GitHub - python/cpython: The Python programming language", - "url": "https://github.com/python/cpython", - "is_source_local": false, - "is_source_both": false, - "description": "The Python programming language. Contribute to python/cpython development by creating an account on GitHub.", - "page_age": "2022-10-29T00:00:00", - "profile": { - "name": "GitHub", - "url": "https://github.com/python/cpython", - "long_name": "github.com", - "img": "https://imgs.search.brave.com/v8685zI4XInM0zxlNI2s7oE_2Sb-EL7lAy81WXbkQD8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYWQyNWM1NjA5/ZjZmZjNlYzI2MDNk/N2VkNmJhYjE2MzZl/MDY5ZTMxMDUzZmY1/NmU3NWIzNWVmMjk0/NTBjMjJjZi9naXRo/dWIuY29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "software", - "meta_url": { - "scheme": "https", - "netloc": "github.com", - "hostname": "github.com", - "favicon": "https://imgs.search.brave.com/v8685zI4XInM0zxlNI2s7oE_2Sb-EL7lAy81WXbkQD8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYWQyNWM1NjA5/ZjZmZjNlYzI2MDNk/N2VkNmJhYjE2MzZl/MDY5ZTMxMDUzZmY1/NmU3NWIzNWVmMjk0/NTBjMjJjZi9naXRo/dWIuY29tLw", - "path": "› python › cpython" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/BJbWFRUqgP-tKIyGK9ByXjuYjHO2mtYigUOEFNz_gXk/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9vcGVu/Z3JhcGguZ2l0aHVi/YXNzZXRzLmNvbS82/MTY5YmJkNTQ0YzAy/NDg0MGU4NDdjYTU1/YTU3ZGZmMDA2ZDAw/YWQ1NDIzOTFmYTQ3/YmJjODg3OWM0NWYw/MTZhL3B5dGhvbi9j/cHl0aG9u", - "original": "https://opengraph.githubassets.com/6169bbd544c024840e847ca55a57dff006d00ad542391fa47bbc8879c45f016a/python/cpython", - "logo": false - }, - "age": "October 29, 2022", - "extra_snippets": [ - "You can pass many options to the configure script; run ./configure --help to find out more. On macOS case-insensitive file systems and on Cygwin, the executable is called python.exe; elsewhere it's just python.", - "Building a complete Python installation requires the use of various additional third-party libraries, depending on your build platform and configure options. Not all standard library modules are buildable or usable on all platforms. Refer to the Install dependencies section of the Developer Guide for current detailed information on dependencies for various Linux distributions and macOS.", - "To get an optimized build of Python, configure --enable-optimizations before you run make. This sets the default make targets up to enable Profile Guided Optimization (PGO) and may be used to auto-enable Link Time Optimization (LTO) on some platforms. For more details, see the sections below.", - "Copyright © 2001-2024 Python Software Foundation. All rights reserved." - ] - }, - { - "title": "5. Data Structures — Python 3.12.3 documentation", - "url": "https://docs.python.org/3/tutorial/datastructures.html", - "is_source_local": false, - "is_source_both": false, - "description": "This chapter describes some things you’ve learned about already in more detail, and adds some new things as well. More on Lists: The list data type has some more methods. Here are all of the method...", - "page_age": "2023-07-04T00:00:00", - "profile": { - "name": "Python documentation", - "url": "https://docs.python.org/3/tutorial/datastructures.html", - "long_name": "docs.python.org", - "img": "https://imgs.search.brave.com/F5Ym7eSElhGdGUFKLRxDj9Z_tc180ldpeMvQ2Q6ARbA/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvMTUzOTFjOGVi/YTcyOTVmODA3ODIy/YjE2NzFjY2ViMjhl/NzRlY2JhYTc5YjNm/ZjhmODAyZWI2OGUw/ZjU4NDVlNy9kb2Nz/LnB5dGhvbi5vcmcv" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "docs.python.org", - "hostname": "docs.python.org", - "favicon": "https://imgs.search.brave.com/F5Ym7eSElhGdGUFKLRxDj9Z_tc180ldpeMvQ2Q6ARbA/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvMTUzOTFjOGVi/YTcyOTVmODA3ODIy/YjE2NzFjY2ViMjhl/NzRlY2JhYTc5YjNm/ZjhmODAyZWI2OGUw/ZjU4NDVlNy9kb2Nz/LnB5dGhvbi5vcmcv", - "path": "› 3 › tutorial › datastructures.html" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/Y7GrMRF8WorDIMLuOl97XC8ltYpoOCqNwWF2pQIIKls/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9kb2Nz/LnB5dGhvbi5vcmcv/My9fc3RhdGljL29n/LWltYWdlLnBuZw", - "original": "https://docs.python.org/3/_static/og-image.png", - "logo": false - }, - "age": "July 4, 2023", - "extra_snippets": [ - "You might have noticed that methods like insert, remove or sort that only modify the list have no return value printed – they return the default None. [1] This is a design principle for all mutable data structures in Python.", - "We saw that lists and strings have many common properties, such as indexing and slicing operations. They are two examples of sequence data types (see Sequence Types — list, tuple, range). Since Python is an evolving language, other sequence data types may be added. There is also another standard sequence data type: the tuple.", - "Python also includes a data type for sets. A set is an unordered collection with no duplicate elements. Basic uses include membership testing and eliminating duplicate entries. Set objects also support mathematical operations like union, intersection, difference, and symmetric difference.", - "Another useful data type built into Python is the dictionary (see Mapping Types — dict). Dictionaries are sometimes found in other languages as “associative memories” or “associative arrays”. Unlike sequences, which are indexed by a range of numbers, dictionaries are indexed by keys, which can be any immutable type; strings and numbers can always be keys." - ] - }, - { - "title": "Something wrong with python packages / AUR Issues, Discussion & PKGBUILD Requests / Arch Linux Forums", - "url": "https://bbs.archlinux.org/viewtopic.php?id=295466", - "is_source_local": false, - "is_source_both": false, - "description": "Big Python updates require Python packages to be rebuild. For some reason they didn't think a bump that made it necessary to rebuild half the official repo was a news post.", - "page_age": "2024-05-04T08:30:02", - "profile": { - "name": "Archlinux", - "url": "https://bbs.archlinux.org/viewtopic.php?id=295466", - "long_name": "bbs.archlinux.org", - "img": "https://imgs.search.brave.com/3au9oqkzSri_aLEec3jo-0bFgLuICkydrWfjFcC8lkI/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvNWNkODM1MWJl/ZmJhMzkzNzYzMDkz/NmEyMWMxNjI5MjNk/NGJmZjFhNTBlZDNl/Mzk5MzJjOGZkYjZl/MjNmY2IzNS9iYnMu/YXJjaGxpbnV4Lm9y/Zy8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "bbs.archlinux.org", - "hostname": "bbs.archlinux.org", - "favicon": "https://imgs.search.brave.com/3au9oqkzSri_aLEec3jo-0bFgLuICkydrWfjFcC8lkI/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvNWNkODM1MWJl/ZmJhMzkzNzYzMDkz/NmEyMWMxNjI5MjNk/NGJmZjFhNTBlZDNl/Mzk5MzJjOGZkYjZl/MjNmY2IzNS9iYnMu/YXJjaGxpbnV4Lm9y/Zy8", - "path": "› viewtopic.php" - }, - "age": "1 day ago", - "extra_snippets": [ - "Traceback (most recent call last): File \"/usr/lib/python3.12/importlib/metadata/__init__.py\", line 397, in from_name return next(cls.discover(name=name)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ StopIteration During handling of the above exception, another exception occurred: Traceback (most recent call last): File \"/usr/bin/informant\", line 33, in sys.exit(load_entry_point('informant==0.5.0', 'console_scripts', 'informant')()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File \"/usr/bin/informant\", line 22, in importlib_load_entry_point for entry_point in distribution(dis" - ] - }, - { - "title": "Introduction to Python", - "url": "https://www.w3schools.com/python/python_intro.asp", - "is_source_local": false, - "is_source_both": false, - "description": "W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.", - "profile": { - "name": "W3Schools", - "url": "https://www.w3schools.com/python/python_intro.asp", - "long_name": "w3schools.com", - "img": "https://imgs.search.brave.com/JwO5r7z3HTBkU29vgNH_4rrSWLf2M4-8FMWNvbxrKX8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjVlMGVkZDVj/ZGMyZWRmMzAwODRi/ZDAwZGE4NWI3NmU4/MjRhNjEzOGFhZWY3/ZGViMjY1OWY2ZDYw/YTZiOGUyZS93d3cu/dzNzY2hvb2xzLmNv/bS8" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "w3schools.com", - "hostname": "www.w3schools.com", - "favicon": "https://imgs.search.brave.com/JwO5r7z3HTBkU29vgNH_4rrSWLf2M4-8FMWNvbxrKX8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjVlMGVkZDVj/ZGMyZWRmMzAwODRi/ZDAwZGE4NWI3NmU4/MjRhNjEzOGFhZWY3/ZGViMjY1OWY2ZDYw/YTZiOGUyZS93d3cu/dzNzY2hvb2xzLmNv/bS8", - "path": "› python › python_intro.asp" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/EMfp8dodbJehmj0yCJh8317RHuaumsddnHI4bujvFcg/rs:fit:200:200:1/g:ce/aHR0cHM6Ly93d3cu/dzNzY2hvb2xzLmNv/bS9pbWFnZXMvdzNz/Y2hvb2xzX2xvZ29f/NDM2XzIucG5n", - "original": "https://www.w3schools.com/images/w3schools_logo_436_2.png", - "logo": true - }, - "extra_snippets": [ - "Well organized and easy to understand Web building tutorials with lots of examples of how to use HTML, CSS, JavaScript, SQL, Python, PHP, Bootstrap, Java, XML and more.", - "HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE", - "Python Variables Variable Names Assign Multiple Values Output Variables Global Variables Variable Exercises Python Data Types Python Numbers Python Casting Python Strings", - "Python Strings Slicing Strings Modify Strings Concatenate Strings Format Strings Escape Characters String Methods String Exercises Python Booleans Python Operators Python Lists" - ] - }, - { - "title": "bug: AUR package wants to use python but does not find any preset version · Issue #1740 · asdf-vm/asdf", - "url": "https://github.com/asdf-vm/asdf/issues/1740", - "is_source_local": false, - "is_source_both": false, - "description": "Describe the Bug I am not sure why this is happening, I am trying to install tlpui from AUR and it fails, here are some logs to help: ==> Making package: tlpui 2:1.6.5-1 (Mi 10 apr 2024 23:19:15 +0...", - "page_age": "2024-05-04T06:45:04", - "profile": { - "name": "GitHub", - "url": "https://github.com/asdf-vm/asdf/issues/1740", - "long_name": "github.com", - "img": "https://imgs.search.brave.com/v8685zI4XInM0zxlNI2s7oE_2Sb-EL7lAy81WXbkQD8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYWQyNWM1NjA5/ZjZmZjNlYzI2MDNk/N2VkNmJhYjE2MzZl/MDY5ZTMxMDUzZmY1/NmU3NWIzNWVmMjk0/NTBjMjJjZi9naXRo/dWIuY29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "software", - "meta_url": { - "scheme": "https", - "netloc": "github.com", - "hostname": "github.com", - "favicon": "https://imgs.search.brave.com/v8685zI4XInM0zxlNI2s7oE_2Sb-EL7lAy81WXbkQD8/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYWQyNWM1NjA5/ZjZmZjNlYzI2MDNk/N2VkNmJhYjE2MzZl/MDY5ZTMxMDUzZmY1/NmU3NWIzNWVmMjk0/NTBjMjJjZi9naXRo/dWIuY29tLw", - "path": "› asdf-vm › asdf › issues › 1740" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/KrLW5s_2n4jyP8XLbc3ZPVBaLD963tQgWzG9EWPZlQs/rs:fit:200:200:1/g:ce/aHR0cHM6Ly9vcGVu/Z3JhcGguZ2l0aHVi/YXNzZXRzLmNvbS81/MTE0ZTdkOGIwODM2/YmQ2MTY3NzQ1ZGI4/MmZjMGE3OGUyMjcw/MGFlY2ZjMWZkODBl/MDYzZTNiN2ZjOWNj/NzYyL2FzZGYtdm0v/YXNkZi9pc3N1ZXMv/MTc0MA", - "original": "https://opengraph.githubassets.com/5114e7d8b0836bd6167745db82fc0a78e22700aecfc1fd80e063e3b7fc9cc762/asdf-vm/asdf/issues/1740", - "logo": false - }, - "age": "1 day ago", - "extra_snippets": [ - "==> Starting build()... No preset version installed for command python Please install a version by running one of the following: asdf install python 3.8 or add one of the following versions in your config file at /home/ferret/.tool-versions python 3.11.0 python 3.12.1 python 3.12.3 ==> ERROR: A failure occurred in build(). Aborting...", - "-> error making: tlpui-exit status 4 -> Failed to install the following packages. Manual intervention is required: tlpui - exit status 4 ferret@FX505DT in ~ $ cat /home/ferret/.tool-versions nodejs 21.6.0 python 3.12.3 ferret@FX505DT in ~ $ python -V Python 3.12.3 ferret@FX505DT in ~ $ which python /home/ferret/.asdf/shims/python", - "Describe the Bug I am not sure why this is happening, I am trying to install tlpui from AUR and it fails, here are some logs to help: ==> Making package: tlpui 2:1.6.5-1 (Mi 10 apr 2024 23:19:15 +0300) ==> Retrieving sources... -> Found ..." - ] - }, - { - "title": "What are python.exe and python3.exe, and why do they appear to point to App Installer? | Windows 11 Forum", - "url": "https://www.elevenforum.com/t/what-are-python-exe-and-python3-exe-and-why-do-they-appear-to-point-to-app-installer.24886/", - "is_source_local": false, - "is_source_both": false, - "description": "I was looking at App execution aliases (Settings > Apps > Advanced app settings > App execution aliases) on my new computer -- my first Windows 11 computer. Why are python.exe and python3.exe listed as App Installer? I assume that App Installer refers to installation of Microsoft Store / UWP...", - "page_age": "2024-05-03T17:30:04", - "profile": { - "name": "Windows 11 Forum", - "url": "https://www.elevenforum.com/t/what-are-python-exe-and-python3-exe-and-why-do-they-appear-to-point-to-app-installer.24886/", - "long_name": "elevenforum.com", - "img": "https://imgs.search.brave.com/XVRAYMEj6Im8i7jV5RxeTwpiRPtY9IWg4wRIuh-WhEw/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvZjk5MDZkMDIw/M2U1OWIwNjM5Y2U1/M2U2NzNiNzVkNTA5/NzA5OTI1ZTFmOTc4/MzU3OTlhYzU5OTVi/ZGNjNTY4MS93d3cu/ZWxldmVuZm9ydW0u/Y29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "elevenforum.com", - "hostname": "www.elevenforum.com", - "favicon": "https://imgs.search.brave.com/XVRAYMEj6Im8i7jV5RxeTwpiRPtY9IWg4wRIuh-WhEw/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvZjk5MDZkMDIw/M2U1OWIwNjM5Y2U1/M2U2NzNiNzVkNTA5/NzA5OTI1ZTFmOTc4/MzU3OTlhYzU5OTVi/ZGNjNTY4MS93d3cu/ZWxldmVuZm9ydW0u/Y29tLw", - "path": " › windows support forums › apps and software" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/DVoFcE6d_-lx3BVGNS-RZK_lZzxQ8VhwZVf3AVqEJFA/rs:fit:200:200:1/g:ce/aHR0cHM6Ly93d3cu/ZWxldmVuZm9ydW0u/Y29tL2RhdGEvYXNz/ZXRzL2xvZ28vbWV0/YTEtMjAxLnBuZw", - "original": "https://www.elevenforum.com/data/assets/logo/meta1-201.png", - "logo": true - }, - "age": "2 days ago", - "extra_snippets": [ - "Why are python.exe and python3.exe listed as App Installer? I assume that App Installer refers to installation of Microsoft Store / UWP apps, but if that's the case, then why are they called python.exe and python3.exe? Or are python.exe and python3.exe simply serving as aliases / pointers pointing to App Installer, which is itself a Microsoft Store App?", - "Or are python.exe and python3.exe simply serving as aliases / pointers pointing to App Installer, which is itself a Microsoft Store App? I wish to soon install Python, along with an integrated development editor (IDE), on my machine, so that I can code in Python.", - "I wish to soon install Python, along with an integrated development editor (IDE), on my machine, so that I can code in Python. But is a Python interpreter already on my computer as suggested, if obliquely, by the presence of python.exe and python3.exe? I kind of doubt it." - ] - }, - { - "title": "How to Watermark Your Images Using Python OpenCV in ...", - "url": "https://medium.com/@daily_data_prep/how-to-watermark-your-images-using-python-opencv-in-bulk-e472085389a1", - "is_source_local": false, - "is_source_both": false, - "description": "Medium is an open platform where readers find dynamic thinking, and where expert and undiscovered voices can share their writing on any topic.", - "page_age": "2024-05-03T14:05:06", - "profile": { - "name": "Medium", - "url": "https://medium.com/@daily_data_prep/how-to-watermark-your-images-using-python-opencv-in-bulk-e472085389a1", - "long_name": "medium.com", - "img": "https://imgs.search.brave.com/qvE2kIQCiAsnPv2C6P9xM5J2VVWdm55g-A-2Q_yIJ0g/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTZhYmQ1N2Q4/NDg4ZDcyODIyMDZi/MzFmOWNhNjE3Y2E4/Y2YzMThjNjljNDIx/ZjllZmNhYTcwODhl/YTcwNDEzYy9tZWRp/dW0uY29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "medium.com", - "hostname": "medium.com", - "favicon": "https://imgs.search.brave.com/qvE2kIQCiAsnPv2C6P9xM5J2VVWdm55g-A-2Q_yIJ0g/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvOTZhYmQ1N2Q4/NDg4ZDcyODIyMDZi/MzFmOWNhNjE3Y2E4/Y2YzMThjNjljNDIx/ZjllZmNhYTcwODhl/YTcwNDEzYy9tZWRp/dW0uY29tLw", - "path": "› @daily_data_prep › how-to-watermark-your-images-using-python-opencv-in-bulk-e472085389a1" - }, - "age": "2 days ago" - }, - { - "title": "Increment and Decrement Operators in Python?", - "url": "https://www.tutorialspoint.com/increment-and-decrement-operators-in-python", - "is_source_local": false, - "is_source_both": false, - "description": "Increment and Decrement Operators in Python - Python does not have unary increment/decrement operator (++/--). Instead to increment a value, usea += 1to decrement a value, use −a -= 1Example>>> a = 0 >>> >>> #Increment >>> a +=1 >>> >>> #Decrement >>> a -= 1 >>> >>> #value of a >>> a 0Python ...", - "page_age": "2023-08-23T00:00:00", - "profile": { - "name": "Tutorialspoint", - "url": "https://www.tutorialspoint.com/increment-and-decrement-operators-in-python", - "long_name": "tutorialspoint.com", - "img": "https://imgs.search.brave.com/Wt8BSkivPlFwcU5yBtf7YzuvTuRExyd_502cdABCS5c/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjcyYjAzYmVl/ODU4MzZiMjJiYTFh/MjJhZDNmNWE4YzA5/MDgyYTZhMDg3NTYw/M2NiY2NiZTUxN2I5/MjU1MWFmMS93d3cu/dHV0b3JpYWxzcG9p/bnQuY29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "tutorialspoint.com", - "hostname": "www.tutorialspoint.com", - "favicon": "https://imgs.search.brave.com/Wt8BSkivPlFwcU5yBtf7YzuvTuRExyd_502cdABCS5c/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYjcyYjAzYmVl/ODU4MzZiMjJiYTFh/MjJhZDNmNWE4YzA5/MDgyYTZhMDg3NTYw/M2NiY2NiZTUxN2I5/MjU1MWFmMS93d3cu/dHV0b3JpYWxzcG9p/bnQuY29tLw", - "path": "› increment-and-decrement-operators-in-python" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/ddG5vyZGLVudvecEbQJPeG8tGuaZ7g3Xz6Gyjdl5WA8/rs:fit:200:200:1/g:ce/aHR0cHM6Ly93d3cu/dHV0b3JpYWxzcG9p/bnQuY29tL2ltYWdl/cy90cF9sb2dvXzQz/Ni5wbmc", - "original": "https://www.tutorialspoint.com/images/tp_logo_436.png", - "logo": true - }, - "age": "August 23, 2023", - "extra_snippets": [ - "Increment and Decrement Operators in Python - Python does not have unary increment/decrement operator (++/--). Instead to increment a value, usea += 1to decrement a value, use −a -= 1Example>>> a = 0 >>> >>> #Increment >>> a +=1 >>> >>> #Decrement >>> a -= 1 >>> >>> #value of a >>> a 0Python does not provide multiple ways to do the same thing", - "So what above statement means in python is: create an object of type int having value 1 and give the name a to it. The object is an instance of int having value 1 and the name a refers to it. The assigned name a and the object to which it refers are distinct.", - "Python does not provide multiple ways to do the same thing .", - "However, be careful if you are coming from a language like C, Python doesn’t have \"variables\" in the sense that C does, instead python uses names and objects and in python integers (int’s) are immutable." - ] - }, - { - "title": "Gumroad – How not to suck at Python / SideFX Houdini | CG Persia", - "url": "https://cgpersia.com/2024/05/gumroad-how-not-to-suck-at-python-sidefx-houdini-195370.html", - "is_source_local": false, - "is_source_both": false, - "description": "Info: This course is made for artists or TD (technical director) willing to learn Python to improve their workflows inside SideFX Houdini, get faster in production and develop all the tools you always wished you had.", - "page_age": "2024-05-03T08:35:03", - "profile": { - "name": "Cgpersia", - "url": "https://cgpersia.com/2024/05/gumroad-how-not-to-suck-at-python-sidefx-houdini-195370.html", - "long_name": "cgpersia.com", - "img": "https://imgs.search.brave.com/VjyaopAm-M9sWvM7n-KnGZ3T5swIOwwE80iF5QVqQPg/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYmE0MzQ4NmI2/NjFhMTA1ZDBiN2Iw/ZWNiNDUxNjUwYjdh/MGE5ZjQ0ZjIxNzll/NmVkZDE2YzYyMDBh/NDNiMDgwMy9jZ3Bl/cnNpYS5jb20v" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "cgpersia.com", - "hostname": "cgpersia.com", - "favicon": "https://imgs.search.brave.com/VjyaopAm-M9sWvM7n-KnGZ3T5swIOwwE80iF5QVqQPg/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvYmE0MzQ4NmI2/NjFhMTA1ZDBiN2Iw/ZWNiNDUxNjUwYjdh/MGE5ZjQ0ZjIxNzll/NmVkZDE2YzYyMDBh/NDNiMDgwMy9jZ3Bl/cnNpYS5jb20v", - "path": "› 2024 › 05 › gumroad-how-not-to-suck-at-python-sidefx-houdini-195370.html" - }, - "age": "2 days ago", - "extra_snippets": [ - "Posted in: 2D, CG Releases, Downloads, Learning, Tutorials, Videos. Tagged: Gumroad, Python, Sidefx. Leave a Comment", - "01 – Python – Fundamentals Get the Fundamentals of python before starting the fun stuff ! 02 – Python Construction Part02 digging further into python concepts 03 – Houdini – Python Basics Applying some basic python in Houdini and starting to make tools !", - "02 – Python Construction Part02 digging further into python concepts 03 – Houdini – Python Basics Applying some basic python in Houdini and starting to make tools ! 04 – Houdini – Python Intermediate Applying some more advanced python in Houdini to make tools ! 05 – Houdini – Python Expert Using QtDesigner in combinaison with Houdini Python/Pyside to create advanced tools." - ] - }, - { - "title": "How to install Python: The complete Python programmer’s guide", - "url": "https://www.pluralsight.com/resources/blog/software-development/python-installation-guide", - "is_source_local": false, - "is_source_both": false, - "description": "An easy guide on how set up your operating system so you can program in Python, and how to update or uninstall it. For Linux, Windows, and macOS.", - "page_age": "2024-05-02T07:30:02", - "profile": { - "name": "Pluralsight", - "url": "https://www.pluralsight.com/resources/blog/software-development/python-installation-guide", - "long_name": "pluralsight.com", - "img": "https://imgs.search.brave.com/zvwQNSVu9-jR2CRlNcsTzxjaXKPlXNuh-Jo9-0yA1OE/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvMTNkNWQyNjk3/M2Q0NzYyMmUyNDc3/ZjYwMWFlZDI5YTI4/ODhmYzc2MDkzMjAy/MjNkMWY1MDE3NTQw/MzI5NWVkZS93d3cu/cGx1cmFsc2lnaHQu/Y29tLw" - }, - "language": "en", - "family_friendly": true, - "type": "search_result", - "subtype": "generic", - "meta_url": { - "scheme": "https", - "netloc": "pluralsight.com", - "hostname": "www.pluralsight.com", - "favicon": "https://imgs.search.brave.com/zvwQNSVu9-jR2CRlNcsTzxjaXKPlXNuh-Jo9-0yA1OE/rs:fit:32:32:1/g:ce/aHR0cDovL2Zhdmlj/b25zLnNlYXJjaC5i/cmF2ZS5jb20vaWNv/bnMvMTNkNWQyNjk3/M2Q0NzYyMmUyNDc3/ZjYwMWFlZDI5YTI4/ODhmYzc2MDkzMjAy/MjNkMWY1MDE3NTQw/MzI5NWVkZS93d3cu/cGx1cmFsc2lnaHQu/Y29tLw", - "path": " › blog › blog" - }, - "thumbnail": { - "src": "https://imgs.search.brave.com/xrv5PHH2Bzmq2rcIYzk__8h5RqCj6kS3I6SGCNw5dZM/rs:fit:200:200:1/g:ce/aHR0cHM6Ly93d3cu/cGx1cmFsc2lnaHQu/Y29tL2NvbnRlbnQv/ZGFtL3BzL2ltYWdl/cy9yZXNvdXJjZS1j/ZW50ZXIvYmxvZy9o/ZWFkZXItaGVyby1p/bWFnZXMvUHl0aG9u/LndlYnA", - "original": "https://www.pluralsight.com/content/dam/ps/images/resource-center/blog/header-hero-images/Python.webp", - "logo": false - }, - "age": "3 days ago", - "extra_snippets": [ - "Whether it’s your first time programming or you’re a seasoned programmer, you’ll have to install or update Python every now and then --- or if necessary, uninstall it. In this article, you'll learn how to do just that.", - "Some systems come with Python, so to start off, we’ll first check to see if it’s installed on your system before we proceed. To do that, we’ll need to open a terminal. Since you might be new to programming, let’s go over how to open a terminal for Linux, Windows, and macOS.", - "Before we dive into setting up your system so you can program in Python, let’s talk terminal basics and benefits.", - "However, let’s focus on why we need it for working with Python. We use a terminal, or command line, to:" - ] - } - ], - "family_friendly": true - } -} diff --git a/backend/open_webui/retrieval/web/testdata/google_pse.json b/backend/open_webui/retrieval/web/testdata/google_pse.json deleted file mode 100644 index 15da9729cd..0000000000 --- a/backend/open_webui/retrieval/web/testdata/google_pse.json +++ /dev/null @@ -1,442 +0,0 @@ -{ - "kind": "customsearch#search", - "url": { - "type": "application/json", - "template": "https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json" - }, - "queries": { - "request": [ - { - "title": "Google Custom Search - lectures", - "totalResults": "2450000000", - "searchTerms": "lectures", - "count": 10, - "startIndex": 1, - "inputEncoding": "utf8", - "outputEncoding": "utf8", - "safe": "off", - "cx": "0473ef98502d44e18" - } - ], - "nextPage": [ - { - "title": "Google Custom Search - lectures", - "totalResults": "2450000000", - "searchTerms": "lectures", - "count": 10, - "startIndex": 11, - "inputEncoding": "utf8", - "outputEncoding": "utf8", - "safe": "off", - "cx": "0473ef98502d44e18" - } - ] - }, - "context": { - "title": "LLM Search" - }, - "searchInformation": { - "searchTime": 0.445959, - "formattedSearchTime": "0.45", - "totalResults": "2450000000", - "formattedTotalResults": "2,450,000,000" - }, - "items": [ - { - "kind": "customsearch#result", - "title": "The Feynman Lectures on Physics", - "htmlTitle": "The Feynman \u003cb\u003eLectures\u003c/b\u003e on Physics", - "link": "https://www.feynmanlectures.caltech.edu/", - "displayLink": "www.feynmanlectures.caltech.edu", - "snippet": "This edition has been designed for ease of reading on devices of any size or shape; text, figures and equations can all be zoomed without degradation.", - "htmlSnippet": "This edition has been designed for ease of reading on devices of any size or shape; text, figures and equations can all be zoomed without degradation.", - "cacheId": "CyXMWYWs9UEJ", - "formattedUrl": "https://www.feynmanlectures.caltech.edu/", - "htmlFormattedUrl": "https://www.feynman\u003cb\u003electures\u003c/b\u003e.caltech.edu/", - "pagemap": { - "metatags": [ - { - "viewport": "width=device-width, initial-scale=1.0" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Video Lectures", - "htmlTitle": "Video \u003cb\u003eLectures\u003c/b\u003e", - "link": "https://www.reddit.com/r/lectures/", - "displayLink": "www.reddit.com", - "snippet": "r/lectures: This subreddit is all about video lectures, talks and interesting public speeches. The topics include mathematics, physics, computer…", - "htmlSnippet": "r/\u003cb\u003electures\u003c/b\u003e: This subreddit is all about video \u003cb\u003electures\u003c/b\u003e, talks and interesting public speeches. The topics include mathematics, physics, computer…", - "formattedUrl": "https://www.reddit.com/r/lectures/", - "htmlFormattedUrl": "https://www.reddit.com/r/\u003cb\u003electures\u003c/b\u003e/", - "pagemap": { - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTZtOjhfkgUKQbL3DZxe5F6OVsgeDNffleObjJ7n9RllKQTSsimax7VIaY&s", - "width": "192", - "height": "192" - } - ], - "metatags": [ - { - "og:image": "https://www.redditstatic.com/shreddit/assets/favicon/192x192.png", - "theme-color": "#000000", - "og:image:width": "256", - "og:type": "website", - "twitter:card": "summary", - "twitter:title": "r/lectures", - "og:site_name": "Reddit", - "og:title": "r/lectures", - "og:image:height": "256", - "bingbot": "noarchive", - "msapplication-navbutton-color": "#000000", - "og:description": "This subreddit is all about video lectures, talks and interesting public speeches.\n\nThe topics include mathematics, physics, computer science, programming, engineering, biology, medicine, economics, politics, social sciences, and any other subjects!", - "twitter:image": "https://www.redditstatic.com/shreddit/assets/favicon/192x192.png", - "apple-mobile-web-app-status-bar-style": "black", - "twitter:site": "@reddit", - "viewport": "width=device-width, initial-scale=1, viewport-fit=cover", - "apple-mobile-web-app-capable": "yes", - "og:ttl": "600", - "og:url": "https://www.reddit.com/r/lectures/" - } - ], - "cse_image": [ - { - "src": "https://www.redditstatic.com/shreddit/assets/favicon/192x192.png" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Lectures & Discussions | Flint Institute of Arts", - "htmlTitle": "\u003cb\u003eLectures\u003c/b\u003e & Discussions | Flint Institute of Arts", - "link": "https://flintarts.org/events/lectures", - "displayLink": "flintarts.org", - "snippet": "It will trace the intricate relationship between jewelry, attire, and the expression of personal identity, social hierarchy, and spiritual belief systems that ...", - "htmlSnippet": "It will trace the intricate relationship between jewelry, attire, and the expression of personal identity, social hierarchy, and spiritual belief systems that ...", - "cacheId": "jvpb9DxrfxoJ", - "formattedUrl": "https://flintarts.org/events/lectures", - "htmlFormattedUrl": "https://flintarts.org/events/\u003cb\u003electures\u003c/b\u003e", - "pagemap": { - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS23tMtAeNhJbOWdGxShYsmnyzFdzOC9Hb7lRykA9Pw72z1IlKTkjTdZw&s", - "width": "447", - "height": "113" - } - ], - "metatags": [ - { - "og:image": "https://flintarts.org/uploads/images/page-headers/_headerImage/nightshot.jpg", - "og:type": "website", - "viewport": "width=device-width, initial-scale=1", - "og:title": "Lectures & Discussions | Flint Institute of Arts", - "og:description": "The Flint Institute of Arts is the second largest art museum in Michigan and one of the largest museum art schools in the nation." - } - ], - "cse_image": [ - { - "src": "https://flintarts.org/uploads/images/page-headers/_headerImage/nightshot.jpg" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Mandel Lectures | Mandel Center for the Humanities ... - Waltham", - "htmlTitle": "Mandel \u003cb\u003eLectures\u003c/b\u003e | Mandel Center for the Humanities ... - Waltham", - "link": "https://www.brandeis.edu/mandel-center-humanities/mandel-lectures.html", - "displayLink": "www.brandeis.edu", - "snippet": "Past Lectures · Lecture 1: \"Invisible Music: The Sonic Idea of Black Revolution From Captivity to Reconstruction\" · Lecture 2: \"Solidarity in Sound: Grassroots ...", - "htmlSnippet": "Past \u003cb\u003eLectures\u003c/b\u003e · \u003cb\u003eLecture\u003c/b\u003e 1: "Invisible Music: The Sonic Idea of Black Revolution From Captivity to Reconstruction" · \u003cb\u003eLecture\u003c/b\u003e 2: "Solidarity in Sound: Grassroots ...", - "cacheId": "cQLOZr0kgEEJ", - "formattedUrl": "https://www.brandeis.edu/mandel-center-humanities/mandel-lectures.html", - "htmlFormattedUrl": "https://www.brandeis.edu/mandel-center-humanities/mandel-\u003cb\u003electures\u003c/b\u003e.html", - "pagemap": { - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQWlU7bcJ5pIHk7RBCk2QKE-48ejF7hyPV0pr-20_cBt2BGdfKtiYXBuyw&s", - "width": "275", - "height": "183" - } - ], - "metatags": [ - { - "og:image": "https://www.brandeis.edu/mandel-center-humanities/events/events-images/mlhzumba", - "twitter:card": "summary_large_image", - "viewport": "width=device-width,initial-scale=1,minimum-scale=1", - "og:title": "Mandel Lectures in the Humanities", - "og:url": "https://www.brandeis.edu/mandel-center-humanities/mandel-lectures.html", - "og:description": "Annual Lecture Series", - "twitter:image": "https://www.brandeis.edu/mandel-center-humanities/events/events-images/mlhzumba" - } - ], - "cse_image": [ - { - "src": "https://www.brandeis.edu/mandel-center-humanities/events/events-images/mlhzumba" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Brian Douglas - YouTube", - "htmlTitle": "Brian Douglas - YouTube", - "link": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "displayLink": "www.youtube.com", - "snippet": "Welcome to Control Systems Lectures! This collection of videos is intended to supplement a first year controls class, not replace it.", - "htmlSnippet": "Welcome to Control Systems \u003cb\u003eLectures\u003c/b\u003e! This collection of videos is intended to supplement a first year controls class, not replace it.", - "cacheId": "NEROyBHolL0J", - "formattedUrl": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "htmlFormattedUrl": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "pagemap": { - "hcard": [ - { - "fn": "Brian Douglas", - "url": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg" - } - ], - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR7G0CeCBz_wVTZgjnhEr2QbiKP7f3uYzKitZYn74Mi32cDmVxvsegJoLI&s", - "width": "225", - "height": "225" - } - ], - "imageobject": [ - { - "width": "900", - "url": "https://yt3.googleusercontent.com/ytc/AIdro_nLo68wetImbwGUYP3stve_iKmAEccjhqB-q4o79xdInN4=s900-c-k-c0x00ffffff-no-rj", - "height": "900" - } - ], - "person": [ - { - "name": "Brian Douglas", - "url": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg" - } - ], - "metatags": [ - { - "apple-itunes-app": "app-id=544007664, app-argument=https://m.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg?referring_app=com.apple.mobilesafari-smartbanner, affiliate-data=ct=smart_app_banner_polymer&pt=9008", - "og:image": "https://yt3.googleusercontent.com/ytc/AIdro_nLo68wetImbwGUYP3stve_iKmAEccjhqB-q4o79xdInN4=s900-c-k-c0x00ffffff-no-rj", - "twitter:app:url:iphone": "vnd.youtube://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "twitter:app:id:googleplay": "com.google.android.youtube", - "theme-color": "rgb(255, 255, 255)", - "og:image:width": "900", - "twitter:card": "summary", - "og:site_name": "YouTube", - "twitter:url": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "twitter:app:url:ipad": "vnd.youtube://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "al:android:package": "com.google.android.youtube", - "twitter:app:name:googleplay": "YouTube", - "al:ios:url": "vnd.youtube://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "twitter:app:id:iphone": "544007664", - "og:description": "Welcome to Control Systems Lectures! This collection of videos is intended to supplement a first year controls class, not replace it. My goal is to take specific concepts in controls and expand on them in order to provide an intuitive understanding which will ultimately make you a better controls engineer. \n\nI'm glad you made it to my channel and I hope you find it useful.\n\nShoot me a message at controlsystemlectures@gmail.com, leave a comment or question and I'll get back to you if I can. Don't forget to subscribe!\n \nTwitter: @BrianBDouglas for engineering tweets and announcement of new videos.\nWebpage: http://engineeringmedia.com\n\nHere is the hardware/software I use: http://www.youtube.com/watch?v=m-M5_mIyHe4\n\nHere's a list of my favorite references: http://bit.ly/2skvmWd\n\n--Brian", - "al:ios:app_store_id": "544007664", - "twitter:image": "https://yt3.googleusercontent.com/ytc/AIdro_nLo68wetImbwGUYP3stve_iKmAEccjhqB-q4o79xdInN4=s900-c-k-c0x00ffffff-no-rj", - "twitter:site": "@youtube", - "og:type": "profile", - "twitter:title": "Brian Douglas", - "al:ios:app_name": "YouTube", - "og:title": "Brian Douglas", - "og:image:height": "900", - "twitter:app:id:ipad": "544007664", - "al:web:url": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg?feature=applinks", - "al:android:url": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg?feature=applinks", - "fb:app_id": "87741124305", - "twitter:app:url:googleplay": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "twitter:app:name:ipad": "YouTube", - "viewport": "width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,", - "twitter:description": "Welcome to Control Systems Lectures! This collection of videos is intended to supplement a first year controls class, not replace it. My goal is to take specific concepts in controls and expand on them in order to provide an intuitive understanding which will ultimately make you a better controls engineer. \n\nI'm glad you made it to my channel and I hope you find it useful.\n\nShoot me a message at controlsystemlectures@gmail.com, leave a comment or question and I'll get back to you if I can. Don't forget to subscribe!\n \nTwitter: @BrianBDouglas for engineering tweets and announcement of new videos.\nWebpage: http://engineeringmedia.com\n\nHere is the hardware/software I use: http://www.youtube.com/watch?v=m-M5_mIyHe4\n\nHere's a list of my favorite references: http://bit.ly/2skvmWd\n\n--Brian", - "og:url": "https://www.youtube.com/channel/UCq0imsn84ShAe9PBOFnoIrg", - "al:android:app_name": "YouTube", - "twitter:app:name:iphone": "YouTube" - } - ], - "cse_image": [ - { - "src": "https://yt3.googleusercontent.com/ytc/AIdro_nLo68wetImbwGUYP3stve_iKmAEccjhqB-q4o79xdInN4=s900-c-k-c0x00ffffff-no-rj" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Lecture - Wikipedia", - "htmlTitle": "\u003cb\u003eLecture\u003c/b\u003e - Wikipedia", - "link": "https://en.wikipedia.org/wiki/Lecture", - "displayLink": "en.wikipedia.org", - "snippet": "Lecture ... For the academic rank, see Lecturer. A lecture (from Latin: lēctūra 'reading') is an oral presentation intended to present information or teach people ...", - "htmlSnippet": "\u003cb\u003eLecture\u003c/b\u003e ... For the academic rank, see \u003cb\u003eLecturer\u003c/b\u003e. A \u003cb\u003electure\u003c/b\u003e (from Latin: lēctūra 'reading') is an oral presentation intended to present information or teach people ...", - "cacheId": "d9Pjta02fmgJ", - "formattedUrl": "https://en.wikipedia.org/wiki/Lecture", - "htmlFormattedUrl": "https://en.wikipedia.org/wiki/Lecture", - "pagemap": { - "metatags": [ - { - "referrer": "origin", - "og:image": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/26/ADFA_Lecture_Theatres.jpg/1200px-ADFA_Lecture_Theatres.jpg", - "theme-color": "#eaecf0", - "og:image:width": "1200", - "og:type": "website", - "viewport": "width=device-width, initial-scale=1.0, user-scalable=yes, minimum-scale=0.25, maximum-scale=5.0", - "og:title": "Lecture - Wikipedia", - "og:image:height": "799", - "format-detection": "telephone=no" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Mount Wilson Observatory | Lectures", - "htmlTitle": "Mount Wilson Observatory | \u003cb\u003eLectures\u003c/b\u003e", - "link": "https://www.mtwilson.edu/lectures/", - "displayLink": "www.mtwilson.edu", - "snippet": "Talks & Telescopes: August 24, 2024 – Panel: The Triumph of Hubble ... Compelling talks followed by picnicking and convivial stargazing through both the big ...", - "htmlSnippet": "Talks & Telescopes: August 24, 2024 – Panel: The Triumph of Hubble ... Compelling talks followed by picnicking and convivial stargazing through both the big ...", - "cacheId": "wdXI0azqx5UJ", - "formattedUrl": "https://www.mtwilson.edu/lectures/", - "htmlFormattedUrl": "https://www.mtwilson.edu/\u003cb\u003electures\u003c/b\u003e/", - "pagemap": { - "metatags": [ - { - "viewport": "width=device-width,initial-scale=1,user-scalable=no" - } - ], - "webpage": [ - { - "image": "http://www.mtwilson.edu/wp-content/uploads/2016/09/Logo.jpg", - "url": "https://www.facebook.com/WilsonObs" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Lectures | NBER", - "htmlTitle": "\u003cb\u003eLectures\u003c/b\u003e | NBER", - "link": "https://www.nber.org/research/lectures", - "displayLink": "www.nber.org", - "snippet": "Results 1 - 50 of 354 ... Among featured events at the NBER Summer Institute are the Martin Feldstein Lecture, which examines a current issue involving economic ...", - "htmlSnippet": "Results 1 - 50 of 354 \u003cb\u003e...\u003c/b\u003e Among featured events at the NBER Summer Institute are the Martin Feldstein \u003cb\u003eLecture\u003c/b\u003e, which examines a current issue involving economic ...", - "cacheId": "CvvP3U3nb44J", - "formattedUrl": "https://www.nber.org/research/lectures", - "htmlFormattedUrl": "https://www.nber.org/research/\u003cb\u003electures\u003c/b\u003e", - "pagemap": { - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTmeViEZyV1YmFEFLhcA6WdgAG3v3RV6tB93ncyxSJ5JPst_p2aWrL7D1k&s", - "width": "310", - "height": "163" - } - ], - "metatags": [ - { - "og:image": "https://www.nber.org/sites/default/files/2022-06/NBER-FB-Share-Tile-1200.jpg", - "og:site_name": "NBER", - "handheldfriendly": "true", - "viewport": "width=device-width, initial-scale=1.0", - "og:title": "Lectures", - "mobileoptimized": "width", - "og:url": "https://www.nber.org/research/lectures" - } - ], - "cse_image": [ - { - "src": "https://www.nber.org/sites/default/files/2022-06/NBER-FB-Share-Tile-1200.jpg" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "STUDENTS CANNOT ACCESS RECORDED LECTURES ... - Solved", - "htmlTitle": "STUDENTS CANNOT ACCESS RECORDED LECTURES ... - Solved", - "link": "https://community.canvaslms.com/t5/Canvas-Question-Forum/STUDENTS-CANNOT-ACCESS-RECORDED-LECTURES/td-p/190358", - "displayLink": "community.canvaslms.com", - "snippet": "Mar 19, 2020 ... I believe the issue is that students were not invited. Are you trying to capture your screen? If not, there is an option to just record your web ...", - "htmlSnippet": "Mar 19, 2020 \u003cb\u003e...\u003c/b\u003e I believe the issue is that students were not invited. Are you trying to capture your screen? If not, there is an option to just record your web ...", - "cacheId": "wqrynQXX61sJ", - "formattedUrl": "https://community.canvaslms.com/t5/Canvas...LECTURES/td-p/190358", - "htmlFormattedUrl": "https://community.canvaslms.com/t5/Canvas...\u003cb\u003eLECTURES\u003c/b\u003e/td-p/190358", - "pagemap": { - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRUqXau3N8LfKgSD7OJOvV7xzGarLKRU-ckWXy1ZQ1p4CLPsedvLKmLMhk&s", - "width": "310", - "height": "163" - } - ], - "metatags": [ - { - "og:image": "https://community.canvaslms.com/html/@6A1FDD4D5FF35E4BBB4083A1022FA0DB/assets/CommunityPreview23.png", - "og:type": "article", - "article:section": "Canvas Question Forum", - "article:published_time": "2020-03-19T15:50:03.409Z", - "og:site_name": "Instructure Community", - "article:modified_time": "2020-03-19T13:55:53-07:00", - "viewport": "width=device-width, initial-scale=1.0, user-scalable=yes", - "og:title": "STUDENTS CANNOT ACCESS RECORDED LECTURES", - "og:url": "https://community.canvaslms.com/t5/Canvas-Question-Forum/STUDENTS-CANNOT-ACCESS-RECORDED-LECTURES/m-p/190358#M93667", - "og:description": "I can access and see my recorded lectures but my students can't. They have an error message when they try to open the recorded presentation or notes.", - "article:author": "https://community.canvaslms.com/t5/user/viewprofilepage/user-id/794287", - "twitter:image": "https://community.canvaslms.com/html/@6A1FDD4D5FF35E4BBB4083A1022FA0DB/assets/CommunityPreview23.png" - } - ], - "cse_image": [ - { - "src": "https://community.canvaslms.com/html/@6A1FDD4D5FF35E4BBB4083A1022FA0DB/assets/CommunityPreview23.png" - } - ] - } - }, - { - "kind": "customsearch#result", - "title": "Public Lecture Series - Sam Fox School of Design & Visual Arts", - "htmlTitle": "Public \u003cb\u003eLecture\u003c/b\u003e Series - Sam Fox School of Design & Visual Arts", - "link": "https://samfoxschool.wustl.edu/calendar/series/2-public-lecture-series", - "displayLink": "samfoxschool.wustl.edu", - "snippet": "The Sam Fox School's Spring 2024 Public Lecture Series highlights design and art as catalysts for change. Renowned speakers will delve into themes like ...", - "htmlSnippet": "The Sam Fox School's Spring 2024 Public \u003cb\u003eLecture\u003c/b\u003e Series highlights design and art as catalysts for change. Renowned speakers will delve into themes like ...", - "cacheId": "B-cgQG0j6tUJ", - "formattedUrl": "https://samfoxschool.wustl.edu/calendar/series/2-public-lecture-series", - "htmlFormattedUrl": "https://samfoxschool.wustl.edu/calendar/series/2-public-lecture-series", - "pagemap": { - "cse_thumbnail": [ - { - "src": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQSmHaGianm-64m-qauYjkPK_Q0JKWe-7yom4m1ogFYTmpWArA7k6dmk0sR&s", - "width": "307", - "height": "164" - } - ], - "website": [ - { - "name": "Public Lecture Series - Sam Fox School of Design & Visual Arts — Washington University in St. Louis" - } - ], - "metatags": [ - { - "og:image": "https://dvsp0hlm0xrn3.cloudfront.net/assets/default_og_image-44e73dee4b9d1e2c6a6295901371270c8ec5899eaed48ee8167a9b12f1b0f8b3.jpg", - "og:type": "website", - "og:site_name": "Sam Fox School of Design & Visual Arts — Washington University in St. Louis", - "viewport": "width=device-width, initial-scale=1.0", - "og:title": "Public Lecture Series - Sam Fox School of Design & Visual Arts — Washington University in St. Louis", - "csrf-token": "jBQsfZGY3RH8NVs0-KVDBYB-2N2kib4UYZHYdrShfTdLkvzfSvGeOaMrRKTRdYBPRKzdcGIuP7zwm9etqX_uvg", - "csrf-param": "authenticity_token", - "og:description": "The Sam Fox School's Spring 2024 Public Lecture Series highlights design and art as catalysts for change. Renowned speakers will delve into themes like social equity, resilient cities, and the impact of emerging technologies on contemporary life. Speakers include artists, architects, designers, and critics of the highest caliber, widely recognized for their research-based practices and multidisciplinary approaches to their fields." - } - ], - "cse_image": [ - { - "src": "https://dvsp0hlm0xrn3.cloudfront.net/assets/default_og_image-44e73dee4b9d1e2c6a6295901371270c8ec5899eaed48ee8167a9b12f1b0f8b3.jpg" - } - ] - } - } - ] -} diff --git a/backend/open_webui/retrieval/web/testdata/searchapi.json b/backend/open_webui/retrieval/web/testdata/searchapi.json deleted file mode 100644 index fa3d1c3d74..0000000000 --- a/backend/open_webui/retrieval/web/testdata/searchapi.json +++ /dev/null @@ -1,357 +0,0 @@ -{ - "search_metadata": { - "id": "search_VW19X7MebbAtdMwoQe68NbDz", - "status": "Success", - "created_at": "2024-08-27T13:43:20Z", - "request_time_taken": 0.6, - "parsing_time_taken": 0.72, - "total_time_taken": 1.32, - "request_url": "https://www.google.com/search?q=chatgpt&oq=chatgpt&gl=us&hl=en&ie=UTF-8", - "html_url": "https://www.searchapi.io/api/v1/searches/search_VW19X7MebbAtdMwoQe68NbDz.html", - "json_url": "https://www.searchapi.io/api/v1/searches/search_VW19X7MebbAtdMwoQe68NbDz" - }, - "search_parameters": { - "engine": "google", - "q": "chatgpt", - "device": "desktop", - "google_domain": "google.com", - "hl": "en", - "gl": "us" - }, - "search_information": { - "query_displayed": "chatgpt", - "total_results": 1010000000, - "time_taken_displayed": 0.37, - "detected_location": "United States" - }, - "knowledge_graph": { - "kgmid": "/g/11khcfz0y2", - "knowledge_graph_type": "Kp3 verticals", - "title": "ChatGPT", - "type": "Software", - "description": "ChatGPT is a chatbot and virtual assistant developed by OpenAI and launched on November 30, 2022. Based on large language models, it enables users to refine and steer a conversation towards a desired length, format, style, level of detail, and language.", - "source": { - "name": "Wikipedia", - "link": "https://en.wikipedia.org/wiki/ChatGPT" - }, - "developer": "OpenAI, Microsoft", - "developer_links": [ - { - "text": "OpenAI", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=OpenAI&si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgItjbuK5dmA2L3ta2Ero3Ypd_sib6W4Pr5sCi7O_W3yzdqxwyrjzsYeYOtNg2ogL1xVq9TKwgD48tL7rygfkRfNyy4k-R5yQgywoFukoCUths6NdRX69gl50cvd6dpZcMzVelCxT7mxXlRchl6XkueG326znDiZL-ODNOysdnCc4XoeAQUFtbaVjja6Vc7WkQF4X8rUdbDKPVU9WyLOV765d8Y777kMI7-nXGGyD7xXJX5E3HA%3D%3D&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAHoECD0QAg" - }, - { - "text": "Microsoft", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=Microsoft&si=ACC90nyvvWro6QmnyY1IfSdgk5wwjB1r8BGd_IWRjXqmKPQqm-SdjhIP74XAMBYys4zy1Z9yzXEom04F9Qy-tMOt2d-L6jIC5cXse6I528G870-4sF-DZYAPj0F1HoGTUOqpWuP7jbEPm3w_-mCH0wVgBHBGCgxRrCaUn8_k2-aga9V9JD6hkq2kM8zVmERCqCM8rqo3bNfbPdJ-baTq4w8Pkxdan3K--CfOtXX--lTjJtO6BnfG2RdpY_jBfy3uZZ7DeAE4-P4rvKuty6UL6le4dqqDt-kLQA%3D%3D&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAXoECD0QAw" - } - ], - "initial_release_date": "November 30, 2022", - "programming_language": "Python", - "programming_language_links": [ - { - "text": "Python", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=Python&si=ACC90nyvvWro6QmnyY1IfSdgk5wwjB1r8BGd_IWRjXqmKPQqmwbtPHPEcZi5JOYKaqe_iu1m4TVPotntrDVKbuXCkoFhx-K-Dp6PbewOILPFWjhDofHha-WRuSQCgY7LnBkzXtVH7pxiRdHONv3wpVsflGBg_EdTHCxOnyWt1nDgBmCjsfchXU7DKtJq159-V0-seE_cp7VV&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAHoECDYQAg" - } - ], - "engine": "GPT-4; GPT-4o; GPT-4o mini", - "engine_links": [ - { - "text": "GPT-4", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=GPT-4&stick=H4sIAAAAAAAAAONgVuLVT9c3NMy2TI_PNUtOX8TK6h4QomsCAKiBOxkZAAAA&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAHoECDUQAg" - }, - { - "text": "GPT-4o", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=GPT-4o&stick=H4sIAAAAAAAAAONgVuLVT9c3NCyryEg3rMooWMTK5h4QomuSDwC3NAfvGgAAAA&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAXoECDUQAw" - }, - { - "text": "GPT-4o", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=GPT-4o&stick=H4sIAAAAAAAAAONgVuLVT9c3NCyryEg3rMooWMTK5h4QomuSDwC3NAfvGgAAAA&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAnoECDUQBA" - } - ], - "license": "Proprietary", - "platform": "Cloud computing platforms", - "platform_links": [ - { - "text": "Cloud computing", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=Cloud+computing&stick=H4sIAAAAAAAAAONgVuLSz9U3MKqMt8w1XsTK75yTX5qikJyfW1BakpmXDgB-4JvxIAAAAA&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQmxMoAHoECDcQAg" - } - ], - "stable_release": "July 18, 2024; 40 days ago", - "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALoAAAC6CAMAAAAu0KfDAAAAaVBMVEX///8AAAD7+/uysrJ5eXmoqKiYmJhZWVn4+PiVlZXw8PDj4+P09PTr6+vNzc2vr6/V1dWMjIxmZmY7OzvExMSCgoIgICBMTEygoKBUVFQUFBQxMTG4uLhDQ0O+vr7b29snJydubm4LCwtts+PWAAAPGElEQVR4nM1d6YKiMAxWBKlcIocoooDv/5CrjjpNmrTlcNz82x2Oz5KmX46mi8VMIoI42ZbZ+VRfl9e6891108aRM9fjPyVOmHhZvVSl2hVp8G10Gom3uyMB+yldf0i+jZCRcOdfeeAPOfUr8W2YqoTZ3oD7IfXJ+zZSKE7Y2+B+SvMfKX24oWYmL8fL/2JvPM3cpKV2w2+DvkvgmiYnJefLt3EvFsl5BPC77L6tNNuRwG/Sf1VpxFqHrd53WoN5TL+HPNgxoPb9ZnspiiRJiqLx2CU2/9rqGpUkoNMhDQN50RRxeMlo7MV/hHxfxszlTUUY/y5ZOEIEaXJZeQfvkrRRJD4/fR0CuX/QUZTEPamfyCsr+D9VuUrC6KPQ1RlaHUxvTGgVUxWp9JLP8bQVft11Z2HsxKWioBJy6g8fMp6J8u0LOx0NXEvsd/SfAB/76DVH+3sLa+y3ydPOPmk38A373YB720HUoZx53Urg4+uD/diEh2EEedkdOHM7SpCia00iFM92mkriz7hwHeCj7bWlPY0hyMvrYS7kYQce7Frf14/B/ZBqJqWB60pmqS3hwcrvZqSbZbamwEKcW6ubxErnBea+65al2x9VpvDGPodbBTS9totNJBmr5P4hScM4iKIoiOMwLdbMb9xPxx4CG5HZ3OL0DPBrVqjBSEc0NPpmKvQLGAqL6RN4NO668thpEmwoIzrRSArgNJjtIjeEy2ylXceiA+YaN5nmVQXgWUZenTChjvxi/F7hocN3WdoEUkTRy49aGy4PSsZkrK04oULyltk4++6EG0ScrnoAYsvQlcyazB7wrSOiN6L1VMK3061GIs1p4Mchsy3BDxlqZsRlp+jdTXSWNmV8ObMXCKXFSjMsTHxxyS9f8ZMm2jFDbqfksmCFt6ZMNwl9hnyU7C0rxpuo4hFOTwCnem2tMoKLcN1oOn2Hw0VQzyOXlBg+z7ezMk7BfPibnOgFomWU/LweHZ5I4bhbsfdooyGqZ+rXxx41n+/e64TVZNEAGGeL+aIuCbJQQYAtt+on0zx7+CW3xutTveuukkbnzKxBxeRQFvyEpnFoDK67Qr1C+rpuMxX3TVLwSIOR2Zr8MUxgBKle+1Kv5CIpisTCZoCg2Vl7qRJTvEsuT3XsH12o35oZDGJR3u6qs8aoUS14um6iFoS25KtQ/u14sihU6WY/Ddnd+MUs697kNjtgfdH4CQrrufu1An62FbpHjVrvDHxDDoRdS8PcAwFaPsSphgXz9f3JzgDoe8OqJwq8Aug/EXg3sxzeVqIeI3db9XY99MzgwCdEsNq/6FTek/0tbkXFtGX/CipaQz+t9EMebshFt3Y13mcsKzFD/VL0wNN7AG2hl4almnBbXu/SzA/Z+NKenoOMnEQZ7KD7BrpC2ABJui2nNXJQhE65IuZ3lp5kBd3XmgonNGZkzikNPpYvohZUlCU6yl9mOvRwbRM03dFWXr6EoGARHJQKPGQy9ANill1PY89JlZdnyFp9C0xSofjqROgpZjl+G4XMjM0JjZBVuVS88wgm85H5nARdyQzsf/jNhQkznRWtkXlVr3wWmODq0V+10F9ZPRp6jIOm53fuLMKhqffIIlMla8RRsY7gk17xLxsNXQ2abmRYbUlHJrstANhKf8rx0gHsjwJutMIkuFg2Q2bZKRhf0pdVXvZlThg6sOmVok7jRl30yCB2BFcRDY29Pv5i1EF3ALNQF6wx0APM4zsuPlzSwYRl+RpCHXTgjqpzeAR0pRTj5PI0oaUDhMvTU+Vl6FjXZWRXRdNHQFcKYPQRMMEUWi2zh8rL5g9lUkHcRbU+g6EHO8Vkn3Z6Nhxvaa2p7x9Lng4Z1IlCfhPFiIdB90i6YkpXxkzgr96BehAXrqbyhNpTDGgAdKEW+7wfbSiOCo+0ytfyyrUBxgAEdU/UQ+2hc5mB55AZUnErbcTwIZA5xvIcwRxgEPRgg7yJHP3bqPIen3L/EcgL25z90xDomRo03cQxqltaVoaYZ6gvzkMhAUC9SBfRCnqHE83VwwSHyn8b/MBWVxDhQ7MOqDr5NCvoGOGbhTQYPFuJ+hRNNQeyf3JBdzUT9Fyu3IoPSOX3nh58wGXTsCMh20Y6TzYYOnYyUxzi8Q1WXrnhR5Cqg4AkHRMfCL1ScxlOgrTm6usDpXTmGMUchS6MOwI6lyVUUg6uQeWJSD9iMKKX/ka/dgD0nM/mC6zBV6PKK8QGUhgAnaCNg6AzkZSnqCqvDZTejJ/CKEF9wowKczSVcIsE2T1TbkBZ0sDrAXR64ttBr7cWFQwRrjjpDMn/Ffa8JZVx5B9GB4GtoB8tSy8ivOBc9dsicS5UJoiyXSfZlyX9skOOAic/t2oTrDjXIvm4cnApnwDdMjHtUMxWO71TuCacfq+dicNMgr7M1xp9Q+5L+f5GgDnSWYPPQ79nLPl74Fyt33QA6BJp2D8DPeuRsTnz2xxgru3toAIviax4/Qz0w6JBH+DKlqA4cG16aTvgX93fQV8TdPjMqTysoXgbQjmOXFOeL4COVXIKdMKh85nEK4wDvtYlMIHJxU1+Ps7TT4N+3w2BwNOVnAGw7i9yHsgqV1E3AiZxhgvIVOg3dotTBCQdATa8e/1vaboPjQzYNDQd+iJeo5GnWCCwJvUrhglKSciEMNqQfFr/XjQDdCX0pCQA7gJSO2+yBSg9GZRVUkLvgZkF+kIUQGuoWDwIi/gvSwRcADWr8bgRs/6unRP6AuUYqTvJ8hJYWM9UbihB8J+GBrNBl5WStHNAr99TsgeYmAILsUamIL/vDZ0NuqyTtP8h6/XbB4YFJRmHot0gn+W4fa8VfwAdxHVfhgKVCLA7GhwcQqyzF5I/gC57Fr/7NxLA4qiE0ku4BPkfQJfTu9c3YxHQsOq6FERY5f8MOigv+bXhqOK60nlcLRUR/AvoMs+UaCAq+tOWXFMJ8sFu9QjovXSJbMJRlEy/j0k0OD4yOJgxArqs1XJCDK5LN+Ohmat3wRHBoSGkEdDlS0BZqrLfb6MPZ6Y4QT4scDcCumwdXRB9VFJQuAgEI1G4wZBw6UToPRimQAms6kon7xLjEGLObxXDQeo5R/2GRN3uuTdkC2Ncv2idGhgBXWZoJRojKneWM6WTL2l9BMomITMOuuxoohwEk+A3dYHwsJU3psFGQpe/sCaZJwtdOvkrMa7G0CcfR0OXlQIpMp/lPhqMvFITokn5jocu3w790FBXGXE0JcgtE+3H10o2HHokPwdVC+jrIkwd6mzKG26+ycsCD4cu76rP4UgyhXtv6UzZQlNRSb4JpjBHeZaimIu5/ZtvUHl9Kc/DUk2ALisFtI2OzHuZuVUbVF5TQHX6YTjjoYPtVdA2Br30p/Vix2zGMyXI6bK196o8Hrr8RU/QwAAK09xLJ+lS//3WlCAnigXfC8No6LFsBXy40IAdwQ/bw5ZO6hPkBXZeS8mSjYa+krUAhcdC2R78GMJ4S6uuLkEe4sZwR/BDx0IH6ow5Xii/8mXDudLJPbexfY3LKVAHgbHQQaKxQwSPhM6XTi6JnUTigoDvXXzRSOgBMHl43BjoCyXT9hIfd4lL0NyoCTdrJHS45mA7AXatgEWfVXmwraLF+zd9aivsOOhwX4MSOAE+EhouMmp0k/PmpcnOQUkJ0anvUdB78GTlW4I5rKz43Eb35y7DAq8BXH/AUdChI5Gpm5NkekPsBW6Y6sNzGCmNRfiCujHQYS8EakuGzFCpYk2FGb5HGNmVo6ZJxAjo6IO7RKgKzGLyvUzpJJS9vqXKYOgx9APIXcqAr9PeqDD0dri/NtRv3xwKPUBvJNdCQFg5Zu6smM04P2LqH/w7Kyyh442Ge/Kx5vKShxDM8CVnQ62uXM1gB11JojD+gsxXzpr4RULvJOo2eu81Xsk4bKBHa/wizgDI5rPWRezEheAGpq0YiEJbQE975R0c24blJdrZFmAfvDO0VIlxbyUjdLFRFPPIf1bZDLGtEp7ilNLHrA3tfoju4QboolF9tFwTQQQv2JgSW+mr8Kwz7GEIGmJi4x8LtgCEK2L163SDCUqs9sY+Rk5zV999aWqpQvmJSn9M0AaCsmGGrpTgt/Idvt4S31vU6HNIbUl650rzU9NC3Zma8oCr52gOTbfJIJ5t6JHQmdqHCWBH66m4BdOJuj6rX0q/i01jW14C03hDmk6r4mCH742DYhnaE0ZseutCyjCpX2u7o0NQdNSVa4rwuINo2kAIdEjy0d3ShOLwPYXpTYVjCZJUls1LUa+148jzdpQI2FPOXAM2ZkPcTewbjqMsYTXi7AKHyGL+AGeD3IIxMB2xTZ0X9JDhPU9D5rSTfMcPA+3CdO6wjooxut++XepDxIEZcm0Ok8qonDaWJxn8Cm65pq3rwVIwRk6fOY5UffEbvadIiqp3hjzMryiVnE+p2VZHP9Ki6ysvGNdPUe3o2FspPKfkp9I010A82Z3SBjJV8xKG7N1N4gsdprma3Cc8vaadf0Zwj8zTBylW3Kpv7h8IjVpvsegPxH71efDCo07ouYtnMYYpKCSbfLIDnf/NCketGIkKrrv9tbfSWvC9LDiiETvTqivzkjaMgyASURCHbeIxinLvbm9HPiBtmuOcQh0h8nu3LMs+04XxjpYnPcJt1KY+A3aSakN0Btnbnh6EdnFOcxHeEms76mnF/uQgqG/dXEfHOLtxR6ic7L86WrlnPJGTa2+lk8r+/bhtN73hdaTESsTSIPWAI7IE/qozH5FH9RvlxVRoJYuDI8amAxgGi5MOOQ/U3hOPlO13sx7v9JSwN/XL+RXXjj4JpROzLho6Cfwa5+lYqWyOj01VNZx8WgwrUeGVloa+NE23eK0+abZDqWj0YbJ10eJflUTzpdzVffwIdwS9y0zLqE4cEUVtUjTbbXNJQiGEs0gIVaorjryGZGGW2trzb4Q5VqEvwhgU9wdhwkTztEekfFTY/sHHndc8Tmu9f6cNe2qVJkLzcUm1J93tO/0huQMOA/yAcGEMGzGf3fBZUXepWMqgCNWHpBl1mPW3TAuUdvgR4gMI8mdFXIYd3F4bqgr+VJQEvE76EQHRj8q6s1Kb/cDg95+I2Bopcu3bHF/8FUnWuDeyLP6u+YRTMZfE6aWkjGXXr5L/dcB/RURxu1q7WV5fl9f6VPW7bRIHs/Gsf2zY1viSH96vAAAAAElFTkSuQmCC" - }, - "organic_results": [ - { - "position": 1, - "title": "ChatGPT | OpenAI", - "link": "https://openai.com/chatgpt/", - "source": "OpenAI", - "domain": "openai.com", - "displayed_link": "https://openai.com › chatgpt", - "snippet": "ChatGPT helps you get answers, find inspiration and be more productive. It is free to use and easy to try. Just ask and ChatGPT can help with writing, ...", - "snippet_highlighted_words": ["ChatGPT", "ChatGPT"], - "sitelinks": { - "expanded": [ - { - "title": "Introducing ChatGPT", - "link": "https://openai.com/index/chatgpt/", - "snippet": "We've trained a model called ChatGPT which interacts in a ..." - }, - { - "title": "Download ChatGPT", - "link": "https://openai.com/chatgpt/download/", - "snippet": "Download ChatGPT Use ChatGPT your way. Talk to type or have a ..." - }, - { - "title": "Pricing", - "link": "https://openai.com/chatgpt/pricing/", - "snippet": "Pricing · $25per user / month billed annually · $30per user / month ..." - }, - { - "title": "“What is ChatGPT?” article", - "link": "https://help.openai.com/en/articles/6783457-what-is-chatgpt", - "snippet": "How does ChatGPT work? ChatGPT is fine-tuned from ..." - }, - { - "title": "For Teams", - "link": "https://openai.com/chatgpt/team/", - "snippet": "ChatGPT simplifies lead qualification and forecasting ..." - } - ] - }, - "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAAAAABWESUoAAABQElEQVR4Ac3PIYyDMBiG4VefPDtxEj0xM39qZl40mcPhMzONOjWNrqxA4UgmqklweBQKVfFdGhbSZZvfY5qmb35++DAbO4XQF7xjpN42s1oyXtlr2gN4SRpynnTaANtesy1tkOOR8aoAJ12J6ngmGkknCqn5gv0y8Jv03eYy+PEAu07jCQ66sDqqpohBCVb2PMtvSbeoxRJcLlIFVFKVBuOwBDdNxkzjEbKbVDwHvgZw8j+Qq2fVhhjkxB2g7JwqKJMRhUqo5Lol8OTxMbSsehXw45e9ao+J92EkGaFbBscxLqnbPRhYOVXr/53L+wTVaUDmNZ+tLNyDWgdWl3gxo7otHMYY5DYdwLc6gB18tVLBSVJD6qr6fsoBVt7wyCm4PxfiRyBTx5N8kCQP8DtrzysZrebG9ZLhnaILYbIbPss/4c/row+G/FAAAAAASUVORK5CYII=" - }, - { - "position": 2, - "title": "ChatGPT", - "link": "https://chatgpt.com/", - "source": "ChatGPT", - "domain": "chatgpt.com", - "displayed_link": "https://chatgpt.com", - "snippet": "ChatGPT helps you get answers, find inspiration and be more productive. It is free to use and easy to try. Just ask and ChatGPT can help with writing, learning,", - "snippet_highlighted_words": ["ChatGPT", "ChatGPT"], - "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAABGElEQVR4Aa3SIWzCUBSF4d8rDA6LnMfiMPjU18xiJjHPCxzBVePqaqsrK6sqK5qgnmjybzShzQKb4tjv3mvuwX/yHhya9i8cDgCXlziwKm99TnIM5RN+rlQvkO5Z97+wP1FpAbkadwwzWgAOW4L2rcppxoZLjc2i1xMEzZYzblMrbBILzpaQV0wYqUfcbNNk3+kZPibsaEek1oqjxj3DA6W8Y5uobs7kuggTphvNOKWq6/HQlQl70sF4oNaS2NNaMzxQ4Krt9rBPliMW82akubKqDFSuR9x9TiiF8QsybfnBLtDNePhQm3ifSOyAyhlvpKoZy0pzsuiM2kKSwlWNhKd/FiHsFsXtVrB5XbAAEHyN2jTv7+1TvgE1rn+XcUk3JAAAAABJRU5ErkJggg==" - }, - { - "position": 3, - "title": "OpenAI", - "link": "https://openai.com/", - "source": "OpenAI", - "domain": "openai.com", - "displayed_link": "https://openai.com", - "snippet": "ChatGPT on your desktop. Chat about email, screenshots, files, and anything on your screen. Chat about email, screenshots, files ...", - "snippet_highlighted_words": ["ChatGPT"], - "sitelinks": { - "inline": [ - { - "title": "ChatGPT", - "link": "https://openai.com/chatgpt/" - }, - { - "title": "Introducing ChatGPT", - "link": "https://openai.com/index/chatgpt/" - }, - { - "title": "Download ChatGPT", - "link": "https://openai.com/chatgpt/download/" - }, - { - "title": "ChatGPT for teams", - "link": "https://openai.com/chatgpt/team/" - } - ] - }, - "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAAAAABWESUoAAABQElEQVR4Ac3PIYyDMBiG4VefPDtxEj0xM39qZl40mcPhMzONOjWNrqxA4UgmqklweBQKVfFdGhbSZZvfY5qmb35++DAbO4XQF7xjpN42s1oyXtlr2gN4SRpynnTaANtesy1tkOOR8aoAJ12J6ngmGkknCqn5gv0y8Jv03eYy+PEAu07jCQ66sDqqpohBCVb2PMtvSbeoxRJcLlIFVFKVBuOwBDdNxkzjEbKbVDwHvgZw8j+Qq2fVhhjkxB2g7JwqKJMRhUqo5Lol8OTxMbSsehXw45e9ao+J92EkGaFbBscxLqnbPRhYOVXr/53L+wTVaUDmNZ+tLNyDWgdWl3gxo7otHMYY5DYdwLc6gB18tVLBSVJD6qr6fsoBVt7wyCm4PxfiRyBTx5N8kCQP8DtrzysZrebG9ZLhnaILYbIbPss/4c/row+G/FAAAAAASUVORK5CYII=" - }, - { - "position": 4, - "title": "ChatGPT - Apps on Google Play", - "link": "https://play.google.com/store/apps/details?id=com.openai.chatgpt&hl=en_US", - "source": "Google Play", - "domain": "play.google.com", - "displayed_link": "https://play.google.com › store › apps › details › id=com...", - "snippet": "With the official ChatGPT app, get instant answers and inspiration wherever you are. This app is free and brings you the newest model improvements from ...", - "snippet_highlighted_words": ["ChatGPT"], - "rich_snippet": { - "detected_extensions": { - "rating": 4.8, - "reviews": 3113820 - }, - "extensions": ["Rating: 4.8", "3,113,820 votes", "Free", "Android", "Business/Productivity"] - }, - "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADNklEQVR4AcXUA4wdURiG4VPbtu32mmvUtm3bts2gnNq2bbtBbSzn3n79M8nZrvdcZZO8yUTzPUMGIFmLOlBJTXhtqcPUUaoDxRwp16aObORuHcNpxmwnUjM5/uICam0PyKza2miJSmoGOlH0HlIGjwPUm9tOqrXdD6qt9RANEb39VEGPAXym/5YMK9ehxu5ahKgbH4I3m0rjdoDfBEj+EwDDyrUiiO9UR7ffAd8pMvzHAyJ3Ivr74R7AtD8SIRATURO1ttWBakuCCN4BqrDLAApRiAmAcflm1NilJUSwCAJqqcm8nBs7pRu4y+gCIAoRqdwJ07LtdCfUSSLUlEZqjBQbevwctVvX1QUA7zd8pkYIIfh41o2d0Xh7ICJOpAFOsic0ZHYBIIZQKynjaLQtCPLJVKCrRyQhaAjUYaqIMCBxxA5CqAgRRIjmUMapzBu7oHG0cZmPx2welU4AkARi6T7U3KWHanuAgshCV952hy/sJ1MmNs77Q5mcAHBEuIKwLD6Mmrv1yCS1QMftfsApJjLO+0A1cxjAEb5TwxRE/uX30PmkFrjAgJPRn7lQklMAXwL4TAtB8UVA927PIA8sBNxikC+mhHzMgwA+7j0tFEWXAN1GXkGksSzkMpXxdWBZ/L3LYLvMRBHfqLbCAD7uNT0MJRYDfYedQ4S5FOymonjvbcD7Slb86Fsa9psM9itJIuxUsPhLGG282BJg8ODjgL4QbKbieO+nxyc/NT55a/CughXfu5dLCrGGyir2GcYzPoTGYSiESFNJGtfhk69aSUH4qPG+YoKIc1Q58R+R+Hj8iJ5lYbuUArazKd/QkL9Tv2Lfqb9hpfGiSYzHh3hXxjv05/Di/e23GB8TB/Bxy4xw5YUbMfAwjRdJajw6Yun7KpaM37uWY/YbBDjpIICP023HxH47AV0ehJtLi4wfp0pR7H01M6OvwnGA/9Rf0v/xHTSeF2GWMviQ+PhzykoxJVcA1eZBKh5jvGxi47+oHnzULYCacyFN7is0Po9KRzG3Am7XbzopxFoeoZZyCY0foIrwIbcDZFPxzN+9qy2JZ/whZeADngJEP0k76gB1kOooOuwKIFn7B3LHHIJtp64TAAAAAElFTkSuQmCC", - "thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAFwAXAMBIgACEQEDEQH/xAAbAAABBQEBAAAAAAAAAAAAAAAAAgMEBQYBB//EADQQAAIBAwMDAgQEBAcAAAAAAAECAwAEEQUSIQYTMSJBFCMyUTNhgZFCUnHSFTRTVGJysf/EABkBAQADAQEAAAAAAAAAAAAAAAABAgMEBf/EACURAAICAAQFBQAAAAAAAAAAAAABAhEDEhMhIjFRUoFBYcHh8P/aAAwDAQACEQMRAD8A8sooorc8s0+l6ppbaRp1tqF3qNlNplxNNH8CvqnEgHh8jY4K43c8Grew6u0sx2UGoid4LWGwEfyEcxyRKwlbJ859PPuB7cVzo3pe21jpW9ke2jkvLh3W2nPcIhCBM5K8KctkL5cAiq/o/TkudMubmDT4b++F5FC0c8DzLbwMGJk7aEE+oBc+35VxT03m9vk64uaSLxuutNhuFltxMwWe0nkjW3C/EMgdJDksSDyjAknOwA481BseoOn9JtoILY3F40XxO6SSBkE3ciZQHXuHLZI3MNvHjxVje6Z05odvIur21msTXt1GQI5ZZWARCixSAjbgt5aqS+Syvun9FJttF0qW9inkmue1IvMcu0KuC2Mjzke3tVIxw5ck6+izc16ogw9RiebUZb+GKIS6K2m20VtGQkY3KVHJJxw3OTUrovqXT+m7aZ5rWe4uLi4jEoRwii3UHI5B3ZJOV4zgc1anpHSptJ0w28q3Dqly872MyyTXrJGj9uMcgEEsPGcAZGTWS6m0yPR9Xks4XkZBHG+2bHcjLIG2PjjcM4Nax0sS4L9RlJzjxMuX6pt7GwsbDR4I2WGK4tnuriI94QvMzAL6scoVzkHnPNUfUl7DqXUGo39tu7NzcvKm8YOCcjIqtoreOFGLtGcsSUlTCiiitDMKKKKAUruoIVmAJBIBxzXUZw2ULA4wSpxxXFXJp1Fz44pQboTtJ+piR/Wu7RgDJOPHNPrH9h+ppez/AJAUKOZFAIIKswKnKkHwfypDK2SSc5OSfvUwxk/Y006UolTsi0U4y5596boWCiiigCiilL5oBaj2qRGv7UzH71IHipM5sft0E1xFE0ixK7qpkbwgJxk/kK37QaN0wz20+LcveSJI17Zx3Us8KKgwFyBGjlnIb7Ac159BKYZ4pgquY3D7WGQ2DnB/Kt4uqaFrqqZjGiw3Bl7er3mwW0bnLrAEX5gGOFY/YBearKzTArfqUvV2i2mlJA9tHcW0jyvG1vcSrIXUYKyoygZRgft5BrNMM/1rQ9U6/barEttYxz9lby4ue5ORnMjcKij6UAA48kk5rO5qY3Rni1n4RiQc5phxzmpUnJqO3ihaLG6KKKFgpS+aTXV80A8nvV/0qmktqZm16VFsIYyzRszZlYkKFAX1H6t3A/h54rPKcGtBp+mG9jYW6WG+NYsLcSyK8pePecYYDjn9BRiMW5WWT2WiW+rW9vHcWVyqafKQ7XHyZrlWkCdxgRtBAU+QPHIzUqXTem7oRRteWlnc7i0ht70GH8SFSuXBPh3YHwNp+oc1XHprUBjNnpWSSAPjGOcDP+pjxSX6fu07bG303Y8ywlhJL6WL7PBbPk1XyaqL7S5TR+lBG8IvY3f6e82pQowy0ByM+n0q0wzyDtYecYhDSOmorSV/8UW5lNs5hBuo4w8mzcDjymGyu1/q8ik3fTEkd0sNqtjL3ACm8TKSTkY4c8cYz4JKjyRTMfTV60gR4NJjJGctcv8AoOH8nn9qjyS4vtMw58VHPipd2UKwSJGI+5HuKqSQDuYcZJPsPeoh8VcwSoRRRRQkKKKKAUDUxb3KqJbaCRlULuYNkgDA8EewA/SoVGaAnC6j/wBlbfs/91KF2i+LO3Hvxv8A7qghjXd1BbLCbUWnk7txDFLJ/PI0jN+5amjdRY/yVr+z/wB1Qy1czmlC2PXE5nZSURFVdqqg4AyT/wCkn9aYJozXKAKKKKAKKK7QFpHoVydCk1iXK2wC9rau7eS5Q5/lA2nk/dceeIkGn39yiPbWN3Mj52NFAzBsecEDnHvWv6mJXobTFHhfg88fVut3fn+ngY9sZzgYXply9j0dp93B+NbyzXClmYhnVJtmRnwp5AGBkknOTmmbY6NNZqMX8FeB4ozaXIeb8Jey2ZP+ox6v0rq2N42zbZ3LdyQxJiFjuceVHHLDB4816DDqD3g0SSeJGkkgGXDOCO8q274O70+hARjGGyacj6gur97dZooQLzUZ7GXZvHywJgNvq9LfPf1DngfnlmZKwY9TzcW1wySOtvMUjYI7CMkIxOACccHPsa7LZ3cIlM1pcRiFgkpeJl7bHwGyOCfsa9CXqK5srW+1OC3txcfFx3JBDFC8sy7sjdz+CmPcc85NNa/rVxFpms2sccOyxmis4S4MmUKxElwxIc/KXlgfJ+9TmZGjGuZidG05tV1KKxVzG82VVthbDAEjIHOOOT7eccUzf2c+n3b2l2mydApdc5xuUMB+xFWel302rdaWd/cduOa81OJn7Uaqql5BnC4x7++c+TkkmpnX57mq2U2MGWxRio8D5ki8Z5/hzySck1N7lHFZbMxRRRUmR//Z" - }, - { - "position": 5, - "title": "ChatGPT on the App Store - Apple", - "link": "https://apps.apple.com/us/app/chatgpt/id6448311069", - "source": "Apple", - "domain": "apps.apple.com", - "displayed_link": "https://apps.apple.com › app › chatgpt", - "snippet": "This official app is free, syncs your history across devices, and brings you the newest model improvements from OpenAI. With ChatGPT in your pocket ...", - "snippet_highlighted_words": ["ChatGPT"], - "rich_snippet": { - "detected_extensions": { - "rating": 4.9, - "reviews": 1026513 - }, - "extensions": ["Rating: 4.9", "1,026,513 reviews", "Free", "iOS", "Business/Productivity"] - }, - "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAC5UlEQVR4Aa1XQ3hkQRjc+ynX2OZtbfu+tm3b1nlt27a9O4qNS5xxbdd+cTKvXydT31fJoPuvmvf6/ejw86dBlX6CwwQXCq6t5cLaz/xV4+ld6F8r9NdgsCAjIwf5+UUoLCwBydf8jN+JNQbBddzjDQM+gocErRSyWm2QgWu4lntq9/q01UAfwYKCgmK43W6ognu4lzEE+6oamCboLC0tR3vBGIwlOF2vgZm5uQWoqamBXrhcLpw5cxZ79uxFKxCxrGBMxpYZ6Eu33KAXNDp+/AQEBgbzv8Y6Kxi7+e1ofuAKVS/7zp27KE7i6dNnem5HAbVaM3CYh0YF/PWRkdEUpxHoQe3BPNTcQJCgTc9pT0tLh8VigdPpBLFv3368evVKBC7A16/fkJmZKX06qCXo39jAej67Wnjx4iVGjBiJ0NBwBAeHYsCAgTh48BCuXLmCKVOmIioqBrwS4eGRGDduPMxmMzyBWtRsbMCglWSePXuOkJAwCuhmnz79YLVaPSUrGjDWGQhgCvWEyspKdOrURUk8JiYO799/0Exg1KQ2DQxjHveEO3fuKomTPBcyUJPaNLCQxcQTNm3arGzAYDBABmoK7UU0sE7rAC5dukxJPCgoRPy6DMhATWpLDWzbtl35Cty//0DBgOQW3LhxU9nAsGEj4HA4dN0CySHkwvy6bKfECRMmISsrS34IZY8hMXnyFAZV5rFjx6WPoa5E9PnzZ2XxpKQUlJaWaiUik1IqXrBgkZKB06fPwBOKiv4fwA3Ni5FdK3NVVFSgd+++usRnzJilXIzII7JynJOTAxaa7t17Yt68+bh37z6+fPmKCxcuYvToMejVqzdWrVrNMi0rx4cVGxIFKDQkCi2ZAhRaMklTavWqeF6epCltxuneasvLyurb8lmqg0lfLw4m/dozmh0RtBUV6R/NuJZ7avf6eGs4ZeIwMoVmZrYcTvkZv+MarlUZTlUZIDi8diRfX8uFtZ8FqMb7Bx+2VJbBTrlcAAAAAElFTkSuQmCC" - }, - { - "position": 6, - "title": "What is ChatGPT and why does it matter? Here's what you ...", - "link": "https://www.zdnet.com/article/what-is-chatgpt-and-why-does-it-matter-heres-everything-you-need-to-know/", - "source": "ZDNET", - "domain": "www.zdnet.com", - "displayed_link": "https://www.zdnet.com › ... › Artificial Intelligence", - "snippet": "ChatGPT is an AI chatbot with natural language processing (NLP) that allows you to have human-like conversations to complete various tasks. The ...", - "snippet_highlighted_words": ["ChatGPT"], - "date": "Jun 17, 2024", - "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAAMFBMVEXQ/0rQ/0vM+0oDAxDV/0yixjxlfCpTZiV/nDK75USTtTg7SR/F8Uiu1UAfJhhyjC65DF56AAAAAXRSTlP3Yz+/2QAAANRJREFUKJHdkkGSxCAIRaOAAore/7YDJNPVSVfPAeYtdPEK5FMex1/U8pV/JutMatwVH9JaouTH1ok3SWsEjWGNBXve5JQ5qS+XJLJB8V3iZK8AZhBEAb5JBVjNEFPaU65tIibR1saiZ2XgbzpDH1H2ZtWttB316SSpZ5TeWymNtSfK501X2wFWo23mVR7DE49f2VYrkdPONVaEXmq9JHVIGUQSl/ia1jxFyOYT2YeUletTIyJ5SEIf4WoLfJNCE73EhJKoJHv9hHjFyQNzeefp8jvHD3ZbC4DWezICAAAAAElFTkSuQmCC" - } - ], - "inline_images": { - "images": [ - { - "title": "upload.wikimedia.org/wikipedia/commons/e/ef/ChatGP...", - "source": { - "name": "en.wikipedia.org", - "link": "https://en.wikipedia.org/wiki/ChatGPT" - }, - "original": { - "link": "https://upload.wikimedia.org/wikipedia/commons/e/ef/ChatGPT-Logo.svg", - "height": 800, - "width": 800, - "size": "1KB" - }, - "thumbnail": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALoAAAC6CAMAAAAu0KfDAAAAaVBMVEX///8AAAD7+/uysrJ5eXmoqKiYmJhZWVn4+PiVlZXw8PDj4+P09PTr6+vNzc2vr6/V1dWMjIxmZmY7OzvExMSCgoIgICBMTEygoKBUVFQUFBQxMTG4uLhDQ0O+vr7b29snJydubm4LCwtts+PWAAAPGElEQVR4nM1d6YKiMAxWBKlcIocoooDv/5CrjjpNmrTlcNz82x2Oz5KmX46mi8VMIoI42ZbZ+VRfl9e6891108aRM9fjPyVOmHhZvVSl2hVp8G10Gom3uyMB+yldf0i+jZCRcOdfeeAPOfUr8W2YqoTZ3oD7IfXJ+zZSKE7Y2+B+SvMfKX24oWYmL8fL/2JvPM3cpKV2w2+DvkvgmiYnJefLt3EvFsl5BPC77L6tNNuRwG/Sf1VpxFqHrd53WoN5TL+HPNgxoPb9ZnspiiRJiqLx2CU2/9rqGpUkoNMhDQN50RRxeMlo7MV/hHxfxszlTUUY/y5ZOEIEaXJZeQfvkrRRJD4/fR0CuX/QUZTEPamfyCsr+D9VuUrC6KPQ1RlaHUxvTGgVUxWp9JLP8bQVft11Z2HsxKWioBJy6g8fMp6J8u0LOx0NXEvsd/SfAB/76DVH+3sLa+y3ydPOPmk38A373YB720HUoZx53Urg4+uD/diEh2EEedkdOHM7SpCia00iFM92mkriz7hwHeCj7bWlPY0hyMvrYS7kYQce7Frf14/B/ZBqJqWB60pmqS3hwcrvZqSbZbamwEKcW6ubxErnBea+65al2x9VpvDGPodbBTS9totNJBmr5P4hScM4iKIoiOMwLdbMb9xPxx4CG5HZ3OL0DPBrVqjBSEc0NPpmKvQLGAqL6RN4NO668thpEmwoIzrRSArgNJjtIjeEy2ylXceiA+YaN5nmVQXgWUZenTChjvxi/F7hocN3WdoEUkTRy49aGy4PSsZkrK04oULyltk4++6EG0ScrnoAYsvQlcyazB7wrSOiN6L1VMK3061GIs1p4Mchsy3BDxlqZsRlp+jdTXSWNmV8ObMXCKXFSjMsTHxxyS9f8ZMm2jFDbqfksmCFt6ZMNwl9hnyU7C0rxpuo4hFOTwCnem2tMoKLcN1oOn2Hw0VQzyOXlBg+z7ezMk7BfPibnOgFomWU/LweHZ5I4bhbsfdooyGqZ+rXxx41n+/e64TVZNEAGGeL+aIuCbJQQYAtt+on0zx7+CW3xutTveuukkbnzKxBxeRQFvyEpnFoDK67Qr1C+rpuMxX3TVLwSIOR2Zr8MUxgBKle+1Kv5CIpisTCZoCg2Vl7qRJTvEsuT3XsH12o35oZDGJR3u6qs8aoUS14um6iFoS25KtQ/u14sihU6WY/Ddnd+MUs697kNjtgfdH4CQrrufu1An62FbpHjVrvDHxDDoRdS8PcAwFaPsSphgXz9f3JzgDoe8OqJwq8Aug/EXg3sxzeVqIeI3db9XY99MzgwCdEsNq/6FTek/0tbkXFtGX/CipaQz+t9EMebshFt3Y13mcsKzFD/VL0wNN7AG2hl4almnBbXu/SzA/Z+NKenoOMnEQZ7KD7BrpC2ABJui2nNXJQhE65IuZ3lp5kBd3XmgonNGZkzikNPpYvohZUlCU6yl9mOvRwbRM03dFWXr6EoGARHJQKPGQy9ANill1PY89JlZdnyFp9C0xSofjqROgpZjl+G4XMjM0JjZBVuVS88wgm85H5nARdyQzsf/jNhQkznRWtkXlVr3wWmODq0V+10F9ZPRp6jIOm53fuLMKhqffIIlMla8RRsY7gk17xLxsNXQ2abmRYbUlHJrstANhKf8rx0gHsjwJutMIkuFg2Q2bZKRhf0pdVXvZlThg6sOmVok7jRl30yCB2BFcRDY29Pv5i1EF3ALNQF6wx0APM4zsuPlzSwYRl+RpCHXTgjqpzeAR0pRTj5PI0oaUDhMvTU+Vl6FjXZWRXRdNHQFcKYPQRMMEUWi2zh8rL5g9lUkHcRbU+g6EHO8Vkn3Z6Nhxvaa2p7x9Lng4Z1IlCfhPFiIdB90i6YkpXxkzgr96BehAXrqbyhNpTDGgAdKEW+7wfbSiOCo+0ytfyyrUBxgAEdU/UQ+2hc5mB55AZUnErbcTwIZA5xvIcwRxgEPRgg7yJHP3bqPIen3L/EcgL25z90xDomRo03cQxqltaVoaYZ6gvzkMhAUC9SBfRCnqHE83VwwSHyn8b/MBWVxDhQ7MOqDr5NCvoGOGbhTQYPFuJ+hRNNQeyf3JBdzUT9Fyu3IoPSOX3nh58wGXTsCMh20Y6TzYYOnYyUxzi8Q1WXrnhR5Cqg4AkHRMfCL1ScxlOgrTm6usDpXTmGMUchS6MOwI6lyVUUg6uQeWJSD9iMKKX/ka/dgD0nM/mC6zBV6PKK8QGUhgAnaCNg6AzkZSnqCqvDZTejJ/CKEF9wowKczSVcIsE2T1TbkBZ0sDrAXR64ttBr7cWFQwRrjjpDMn/Ffa8JZVx5B9GB4GtoB8tSy8ivOBc9dsicS5UJoiyXSfZlyX9skOOAic/t2oTrDjXIvm4cnApnwDdMjHtUMxWO71TuCacfq+dicNMgr7M1xp9Q+5L+f5GgDnSWYPPQ79nLPl74Fyt33QA6BJp2D8DPeuRsTnz2xxgru3toAIviax4/Qz0w6JBH+DKlqA4cG16aTvgX93fQV8TdPjMqTysoXgbQjmOXFOeL4COVXIKdMKh85nEK4wDvtYlMIHJxU1+Ps7TT4N+3w2BwNOVnAGw7i9yHsgqV1E3AiZxhgvIVOg3dotTBCQdATa8e/1vaboPjQzYNDQd+iJeo5GnWCCwJvUrhglKSciEMNqQfFr/XjQDdCX0pCQA7gJSO2+yBSg9GZRVUkLvgZkF+kIUQGuoWDwIi/gvSwRcADWr8bgRs/6unRP6AuUYqTvJ8hJYWM9UbihB8J+GBrNBl5WStHNAr99TsgeYmAILsUamIL/vDZ0NuqyTtP8h6/XbB4YFJRmHot0gn+W4fa8VfwAdxHVfhgKVCLA7GhwcQqyzF5I/gC57Fr/7NxLA4qiE0ku4BPkfQJfTu9c3YxHQsOq6FERY5f8MOigv+bXhqOK60nlcLRUR/AvoMs+UaCAq+tOWXFMJ8sFu9QjovXSJbMJRlEy/j0k0OD4yOJgxArqs1XJCDK5LN+Ohmat3wRHBoSGkEdDlS0BZqrLfb6MPZ6Y4QT4scDcCumwdXRB9VFJQuAgEI1G4wZBw6UToPRimQAms6kon7xLjEGLObxXDQeo5R/2GRN3uuTdkC2Ncv2idGhgBXWZoJRojKneWM6WTL2l9BMomITMOuuxoohwEk+A3dYHwsJU3psFGQpe/sCaZJwtdOvkrMa7G0CcfR0OXlQIpMp/lPhqMvFITokn5jocu3w790FBXGXE0JcgtE+3H10o2HHokPwdVC+jrIkwd6mzKG26+ycsCD4cu76rP4UgyhXtv6UzZQlNRSb4JpjBHeZaimIu5/ZtvUHl9Kc/DUk2ALisFtI2OzHuZuVUbVF5TQHX6YTjjoYPtVdA2Br30p/Vix2zGMyXI6bK196o8Hrr8RU/QwAAK09xLJ+lS//3WlCAnigXfC8No6LFsBXy40IAdwQ/bw5ZO6hPkBXZeS8mSjYa+krUAhcdC2R78GMJ4S6uuLkEe4sZwR/BDx0IH6ow5Xii/8mXDudLJPbexfY3LKVAHgbHQQaKxQwSPhM6XTi6JnUTigoDvXXzRSOgBMHl43BjoCyXT9hIfd4lL0NyoCTdrJHS45mA7AXatgEWfVXmwraLF+zd9aivsOOhwX4MSOAE+EhouMmp0k/PmpcnOQUkJ0anvUdB78GTlW4I5rKz43Eb35y7DAq8BXH/AUdChI5Gpm5NkekPsBW6Y6sNzGCmNRfiCujHQYS8EakuGzFCpYk2FGb5HGNmVo6ZJxAjo6IO7RKgKzGLyvUzpJJS9vqXKYOgx9APIXcqAr9PeqDD0dri/NtRv3xwKPUBvJNdCQFg5Zu6smM04P2LqH/w7Kyyh442Ge/Kx5vKShxDM8CVnQ62uXM1gB11JojD+gsxXzpr4RULvJOo2eu81Xsk4bKBHa/wizgDI5rPWRezEheAGpq0YiEJbQE975R0c24blJdrZFmAfvDO0VIlxbyUjdLFRFPPIf1bZDLGtEp7ilNLHrA3tfoju4QboolF9tFwTQQQv2JgSW+mr8Kwz7GEIGmJi4x8LtgCEK2L163SDCUqs9sY+Rk5zV999aWqpQvmJSn9M0AaCsmGGrpTgt/Idvt4S31vU6HNIbUl650rzU9NC3Zma8oCr52gOTbfJIJ5t6JHQmdqHCWBH66m4BdOJuj6rX0q/i01jW14C03hDmk6r4mCH742DYhnaE0ZseutCyjCpX2u7o0NQdNSVa4rwuINo2kAIdEjy0d3ShOLwPYXpTYVjCZJUls1LUa+148jzdpQI2FPOXAM2ZkPcTewbjqMsYTXi7AKHyGL+AGeD3IIxMB2xTZ0X9JDhPU9D5rSTfMcPA+3CdO6wjooxut++XepDxIEZcm0Ok8qonDaWJxn8Cm65pq3rwVIwRk6fOY5UffEbvadIiqp3hjzMryiVnE+p2VZHP9Ki6ysvGNdPUe3o2FspPKfkp9I010A82Z3SBjJV8xKG7N1N4gsdprma3Cc8vaadf0Zwj8zTBylW3Kpv7h8IjVpvsegPxH71efDCo07ouYtnMYYpKCSbfLIDnf/NCketGIkKrrv9tbfSWvC9LDiiETvTqivzkjaMgyASURCHbeIxinLvbm9HPiBtmuOcQh0h8nu3LMs+04XxjpYnPcJt1KY+A3aSakN0Btnbnh6EdnFOcxHeEms76mnF/uQgqG/dXEfHOLtxR6ic7L86WrlnPJGTa2+lk8r+/bhtN73hdaTESsTSIPWAI7IE/qozH5FH9RvlxVRoJYuDI8amAxgGi5MOOQ/U3hOPlO13sx7v9JSwN/XL+RXXjj4JpROzLho6Cfwa5+lYqWyOj01VNZx8WgwrUeGVloa+NE23eK0+abZDqWj0YbJ10eJflUTzpdzVffwIdwS9y0zLqE4cEUVtUjTbbXNJQiGEs0gIVaorjryGZGGW2trzb4Q5VqEvwhgU9wdhwkTztEekfFTY/sHHndc8Tmu9f6cNe2qVJkLzcUm1J93tO/0huQMOA/yAcGEMGzGf3fBZUXepWMqgCNWHpBl1mPW3TAuUdvgR4gMI8mdFXIYd3F4bqgr+VJQEvE76EQHRj8q6s1Kb/cDg95+I2Bopcu3bHF/8FUnWuDeyLP6u+YRTMZfE6aWkjGXXr5L/dcB/RURxu1q7WV5fl9f6VPW7bRIHs/Gsf2zY1viSH96vAAAAAElFTkSuQmCC" - }, - { - "title": "Introducing ChatGPT | OpenAI", - "source": { - "name": "OpenAI", - "link": "https://openai.com/index/chatgpt/" - }, - "original": { - "link": "https://images.ctfassets.net/kftzwdyauwt9/40in10B8KtAGrQvwRv5cop/8241bb17c283dced48ea034a41d7464a/chatgpt_diagram_light.png?w=3840&q=90&fm=webp", - "height": 1153, - "width": 1940, - "size": "93KB" - }, - "thumbnail": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABtCAMAAAAlHltpAAAAwFBMVEX////P6t38/Pz4+Pj09PTe8Ofr6+vw8PDJyczExMTk5OTY2NjMzMz1+vjM6dvV1dW7u7ve3t61tbWtra2lpaXg4OQAAACfn5/W7eGNjY3p9O+VlZV3d3fI4dSCgoJiYmKpvLO1yb9ra2tXV1dJSUmisqrB2MzR0ddBQUFrbXU0NDSPkJaIlo9venSQn5fb9+klKCZJUExZYl5+i4N3eIJQUVs5PEdARlOUlKWioa9YW2esrLk3PU7BwMkiKT6BgomhiaRPAAAOkElEQVR4nO1ci3bbNhKlAAQwgKnxjBmWsmI5kRPXjpPdJn2k7eb//2oHpB58SSalxGnPKWxRMs3BXAKDwZ0BqCw7upDjRZP0aeJZZhzWIfgxqtOBGU4IcdPlK+DEcIrazRHaM+mtzbk6QrICriAEa/R0+Qo4lTL6QO0R2jNGmVBHdXslQxiljgg6XZqstXNO2BHaTyjf2cZTc/MKRqsqQte176+//o8mGSftu6Cbt/XJwQattXFeq9peQsXmE6tU7O+MYCxEb3xU0ctgJUQ8eluClYHm1ke7T7bSrKWWBUhbcCm9jNLiG75kJDH4YIU0uSn3AmcSFcgQAS/lEquQNkgwylqw3gMOv0LKPeMH0fqwyBG+LfAYvQ0IOs8Ru8HbyUPhDgFXKJ8HlFIIFj/KcuFCIUtpZF7YuUv/C3uBU8Sdm9xDLhcuiduYW2lhEfJFrsocdJSFHlZPGSOEEsFwoKBrwherXuk3EzT9+xDwTJAkj1fhOCNECTzS9Gkti5XRA6bChMMLKFaQFLokzBQjwooEAq+hGT0wGBxHM2u54mqgp1slbq/DqCrEG85afVn7ZEX5I66iPTj1+sgSiiRJJR4keGP3NHi2yMuFl3M/L6O6dvMcXubF3JcF/ixMXOSxiMUwhkqzmdt5EXUBi6K4xv4tc/kyLopwvdhnYU3gIl4XKDMPZSzLIs7RWENRxqIIMA9zWdp5sPmeCiwoabhUAQSP3IJZGKmdwrFpJFgADSYOD4+6ry0Pkimv8DojrTPAU4UgwR32d7WNo2JrrDFGC5A4zgwi8EblORqLVQb7b2+LH1++sx8/QfVp0hVX0RqcidppZRwoUMbjm8EfCdxQMKCctsFzeMTwpqk+TbqycftygePJXnv/amHn87iwMF+8Qn+6mIcFvI45vtky5otwDA3cp/o06ZrqVIVWvxldf6LVKbDoqiOvT5JDTnGy6tOk/9E2/n3Kv8CfuvwL/BsU8myw/Fj/81HxH4bFn40EflD74fLsfFNmWLZ/nP84Dviw+Gz2wzjgbfFNDbPzHx4H/mK2Kcv7+3fvt381gG9ZL2neTA3r2UbjbLV6uNpKn++At3ln52Z22mezq8uO9pHA3z/M3i9nbdFac+QepMSAK3CwVgPyQgzdgLaBP6DqIeDIQjBe00YmKRvanKQB/N3Fh/+8u2yIpyBCMMGV4FoIxgTlXDFOQQjFG6IvVsvZuyHgyEu91kYjZIUvBA/GOoBOiz+8mN1f9oFToxXeKVIq5FY6ANdmAPjl/X8v3r172xLHYBmM93i/MSAVxpv23uRBY6xqDW3c8+X91WoI+MGyA37182onfj5k4wO1NbRjd93ctIFjjMeZIgwwWhSCc8YdtjgVPMWcjc56/35nZA3gQjptkH1qriwwAIZ/boncDvj72Yud+A44QUIrMfhQGMhoJ+Ue4Jezhu4N8IqVZSlIJpwwTgSe4DvRm9XN1dXyCg/4drPEw3LZMhVXJSSQNYNHQ5Ua7X1rp89m56vlcrVKgisUT9KryyZwa71Kxm25dLAH+Orn1f1qdXX/sFoPkxq4tXjLvspjRK6jt1HGuBO9vFo+oNIK/VV1WN60TaXipSkaFylSrzhoo8WvUCWCrwSX6cNVE3iG7YV9nnJCFasdBH5+ieUGf2bLZos7Zwg4rpmyDvs5FaX4VvQGJZaXeLy8XKYKzm9uWsCpUk6hoQgzkA14NkPpVC5vZrV4qqU5OEFzivEOViFMLyRfA8e7Xl5drlLzNYEfLC/Qfz9gk2OjLx+wux8esOOvmsCVjyCDDcEMhCjPZlcP99hPxQ2qXd3cr36+XN0vG8BZSnQZrCKitYiu+Bp46unKVpfL8cDPN6OjktgOj0aLcxzJGj2qGshhPJs1xTdvTVMRhGMNPDkF1rvzjfbmRLR1DYfLj7PB8qI1S04Xnzzlt8qLx3EjTRostc4R9G5YvOrqMezwgPiE0ksQPCWtJc+P1/SmV9koMXGX7y6Ej7CVnga8p318ORL43ZdPZ5vP4hf761Z6EnD62/TFmnV5/ntXdJxm+fl2m3qkX7582UpPa/Gzx6/ZU+gfvcrGqdQN82Swo+/ThsjRDY793IP0uAwDA+m3YrnGSKPwc+2v/+bBMpEAWtfsnDLGEqGpG28ScB0lHJs87K/hjtLMEbYaunK9sqyqg6jXPZCpDZsEd0i2J4DdFWWVkKYNYBRw6pAO7AWeYbgUeB68dmmtLpee24GWTSs99KgWFzILBVPQOvk1JiDFnMXQhUjuBHJ5ACEHAF4jzw4vj9HiM35x4TNodeRIr3LWCCP5jgLWplItADfTBUOVMgd5bhuraGRs6wudkeu3DunzdOD+9vOWLNDb4rYN3EifHE0qPh1UAOhVkdaiDEZXWzh//IYG5bhyGmN8JJeaO8dxHGjHjeIN98dMVrye/4TebTrwePvnVor9mn9qAafSSLRukB40hm5Oc4Duci55ZWlW5hjmvd2eo9lZivKD9D4EBxjFYQyo8dZDem8I2+yni4sLLltYxwGnoRFJqnLrm3bukGy2DJBsZziNYjzg/XB8a5w8S2EyVywNfSZSdJ+oPVOJ2TcuEyDLwqv2hphRflxxjO1qk7RoCqnHPdkCJ05wlwI3jBZBpBjQDKxDaxWsDG3tZ2gqhDBFGWcUQ/yMoYnwPiQusebORp5RLa6Ucaq2Oup0Arm2wdpUMDYHnFykDGjcIG3keR84KT2aRXsrw1mGguByn1JBEidlGaT2Q76e96aRccBBm7X/r+JqBM52wDPBFE6n1aQqhGCEiqF13YBmq9u2f5YpnCJU6k7hNMXOwhGihqYvknd3Tk3340zKLa4TucpZ2g5DKxSPrGBb2Tv1aO2H9l2cDNzakNKrEg6vmRN/ROj2XNFNyVLyZ13eVJt/pgHvTjlnGWicZtHf6H2bBihnhCUrzFjKU4mGG3tc3fNNefNm+/H5zquMLr2Yc0RgATHyKK2x6ACQEsF25E7SrLpxyMTQ7Y/O5aMiIsZ1Jgh6TEFFo88maX5+GnDy+1Tgypq0ZpBWDLhPmdkdl5ikuZen+tamosApQDqD9EUgl9GA/HOTpp2iuQ/lVK9ygupJV/dyBPUERI+pK3s64GnfUttYauDohTUDB84oCsoZZAUWu/fxCicA75H38cCJZcJk7ZmiBq65jBwplHWel947nFOQfTTmusau3Za+CcCHM1nIJQW6+LQAQwiStEyIvvUanr3FAEo2zWVzFU4NaSM3slONU3i1+7FJEHXi2lrinSHrbmy9PBm4WKiQI5v3XuTRh7RPNcTugho6og8XAZliFzhRCp0sQztRe6IxhZGNcCmuwU9IkTdVjwfO/hpkh4xXbBXjpkwZZPFaCNUlDxjxqTKGjDX/UQOPUoE3Hm934m6x8cD5b90z7RupMyLDdg9kjgGUM81k2LrFGRGMK41BzDTHcrKpKGlyJKvYcviGQ8ta6G/NdDr/8OEn14r8vrcf50aakFbwmUFLxAlKgulD0tY5097PPRF49+rRwIngvUl7imLobgP/9uywLiaYbvKw0uwkkgEwJuzJA7OIKlhAv0LrTxuNJ65IjAbOXC8fWbtDjN1T+G4HM5tZ9uXuT27uPv7PubvbX7S7u/u0dh9TVySOobVZSpfiYTDpSVp/9Ur55ROn+cdPCg+f0+Hl2uKeqMXDK070RTu3P0ozk3p9oNtDLf00g9PwPC9Je5L4zrR2M3Fsk1+kXyVBcgfKgG8/jnCS5knAlbUd13CWyWikMukxGB64SFujVOh64vmCZPAa5S+ayL8CcAI7PPXzV2zwyR/R86ZnGU4c0qUERRA27XXBEK2XQqEgXdXiLelpbqHLRTYrEr7gZR5sDBaQq4WY99PMQysSI22cafAxZ9OTntuyBzin3JGUSNNccZpSdK63updlL5FFxPaKxFkWNZIfT3FKVmnbibPaM4eEvu21/bVj5qcjvMoWeJcybmy8P3H19rgLBXm07X0lZ5n31rOAh6CiZU5JHAd4B52HEqocLxyxeLWtoEsuaxuXENLAx6jHCul8/cRZ916shPTIS8uAJ5As1evs8bLYan91pSvgSMp0WsDFl5K8WlLRHddAX1uSlSXi/9A4e5aeqGQCOTFnzIgqw68EGyAeIu919hTgvWc2189IjKjH2fWKRBMA2nhexjJYi28LXuQL8D7PfV88HpGtPVTqPVlpg2jQWhgm08NLw5dqHpMltxoumQrvjYahJ3nFcYn9daGqm8paL15p4OiBkwV7iaR+WLoIxoWideqp8iouhk6Prb0Ky+pHCGnG+xsPNyWluF3bCkYB1zj008vJ0PTkf/8UnBZgNUbjou2SJmiWAb3SonXqKYAbinF4WsNVvOkSJ2j2Od5zeUrM2Z1Px+XHTXrY0YDAaaCpOh0o3yLYj0RpiCZv72F4qphzqLJ0EOCNoR7DeK6dSHtzcQrpOBBIO9oDcbYZmD7FisSeUre4Q0qMPMFXcae1QSL4DsErIs/ky4zBdcPNfusViUOV7SCkvddkvShP+7wJjJUMef9Q0nOkrq9uKmkPtWNKpLVdJbhSUpi0H6OdxAQZooU2m//OmSyVvgIAXSVyI29zGzTGIdaa3LYoWV5gCPWqBbUmWQGUokpxgfesFU1v477742TgBFkZzURyLmklPn2oHrBgbd+XjKTD5itxDAJSBBRjETxEnfuy9AMhUK+4p1sD6klPEm8/K+72fa3DSNVjLjK3dzj1poO7vSPZ83SopSuSVX/fhko7TdKowLE9vMC97+H8o8oo4Lf+kzEf45/g5vkncB/D7brtalobvbGLvCx8ASEvdRl9HgZshah9xPGbAfefP2fEfv5M8XDLMnl7KxrAM8qIMBjK0LT4w4jBscEGV1V68dwJZZyRVptfdge+AdAMlln6IoTThsyU8hUGJ5U++rRKGOIRX0N0tOrTpOtgWRlhPCOcdAnONyzfNZA4SfVp0v8Cn676NOl/KvBTy/8BsqneOZjJbOsAAAAASUVORK5CYII=" - }, - { - "title": "What Is ChatGPT? Everything You Need to Know | TechTarget", - "source": { - "name": "TechTarget", - "link": "https://www.techtarget.com/whatis/definition/ChatGPT" - }, - "original": { - "link": "https://cdn.ttgtmedia.com/rms/onlineimages/chatgpt_screenshot-f_mobile.jpg", - "height": 252, - "width": 559, - "size": "12KB" - }, - "thumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAFwAzAMBIgACEQEDEQH/xAAcAAEAAgMBAQEAAAAAAAAAAAAAAwQBAgcIBgX/xABBEAABAgQCBAoGBwkBAAAAAAABAAIDBBESITETFEFRBQciNmF0gaGy0SMkMnGR8AZSVGKSscEVQkNEU3KCouEz/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAEDAv/EABsRAQACAgMAAAAAAAAAAAAAAAABEQJBEyFR/9oADAMBAAIRAxEAPwDmMJzGua6JB0gDiXC4tuFMq7FvEfBdDc2HLOa40tcYpNOynzVTwp2CxkNroLXFuZNRd0Lcz8scpUD/ACd5rpH51rli11cu5fp/tCU+xj8bvNYbPy7X3GXBF1aVNKUySh3LiN5hQutx/EugLn3Es+76DQ3NwBm4/jX3d7t6ipkUN7t6Xu3qD8v6RjhayD+x7rqu0ltnRT2u1X6TdkPRmCHWi68HPsVbhThaHwaIZjMivMS6mjAOWeZG9WNchAML4rWXtDmhxpgrpljEcmUxPfjJbPZNdLUpmWuz+PuWSJ63B0tXH913ZtWNbhUrp2U31CxrsE5TEM7PaCjVmk9X2pbH7rsO9bUm/rQMsqHP5oo9egCtZhmGeIWwnINK6wyn9wQbMbOXN0joFv7wa0+asqmJ2C6lJhhrliMUM7BH8xD/ABBBcRUxOQjSkdhqaDEJrsEgETDCD94ILiKprcM5RmYGhxQTkEkDTsqcsRigtooDEo4NL8TlgjYhcKgmnSEE6KG929L3b0EyKG929L3b0HkDaibUVQQ5IhyQegeJHmFB61H8a+9XwXEjzCg9aj+NfeooiIgrzkjKTwaJyXhxg2tt4rSua0miIdGMjNggMwrCuoAraqzbnAgMix2YZQoV1e4olRdohFLhc2ba4bfQHE9HetdNgQZlhycPVzln8VtpH3O9YmwTiGmBliMsMUue1xrMTZG7QfraisOmDUgTbWkF2BgHGmzsWNMQL9ba3AAky5zph+q2cYrWD1maJBpXQAn4UWXOeORrMy0jC7QZmvu6UGrYjza0zUK53s+rkCtUEyCQTNtpQV9XOa2D3gubrM0SRWur5dyGI4EERpugOWr16fq9iDR8UtFHzjeSaOpLkrbWKHGbZS3CkE49KzV5qNYmwbqD0GXdj71qYrqYzM20DGplqfm1AEY0I1xl2dTLmtKblu1zosQMhTLCa1oYOGGeKwHuMeG3WJoH6pg0DqZ40VxgLWAOcXEZk7UBgcGARHBzt4FFsiICIiAiIg8g7UTaiIIckRB6C4kGk/QGFT7XH8a++scvg+IzmDC63H8a6CoqKxyWOUqIIrHJY5SogiscmjO4KVEEVjkscpUQRWO6Esd0KVEEVjk0blKiCKx3QljlKiCKxyWOUqIIrHJY5SogiscljlKiDx1tRDnmE7QqgidoTtCD0JxGcwYXW4/jXQVz7iN5hQutx/GugqKIiICIiAiIgIiICIiAiIgIiICIiAiIgIiIPIkKNNNhQmQ4QcxsVzmcgGrqCvvw2LcxZkEuMlDx3yopl7lFCZGOjdDjNYXOIb6W20gZ9HvVh8KfcHF06x1uJ9caTls5W7BVEUzGjhphR5aFCNP6AaezBWODvo5wzwnK61wfwfEjy5cWh7XsFSMwAXAn4L858R8SmkiOfTAXEmitS3CvCUnA0EpwhNQIOJ0cOK5ranPAKTelh3jiM5gwqfao/jXQVz7iM5gwutx/GugoCIiAiIgIiICItHutpgTiBgg3RVROA/wY46NEcFnWxWmijYiv/mUFlFrDde0OoRXY4UK2QEREBERAREQEREHkBjZctbpIr2uLzfRlQ1v640UhgyVR6287/Qf9ViRlIMcyjYjT6WK8OIOwB1PyCscOcGS0jLh8APuMcs5Tq4Cvkqj8mO2CxwECI6I2mJcy0hRoiD0JxGcwYXW4/jXQVz7iM5gwutx/GugqKIiINIhOFBXL81m1qpPjRNO5t2AJwoFpp4to5QrX6oQfoWtS1qpse90MOL8SDsHksh78eX3DyQW7Wpa35KqGI8QwQ7Gh2BHOeGe33DyQW7W/JS1vyVUc54pyzj0DyS9+PL7h5ILdrfkpa1VL309vZuHklz6e3/qPJBbtalrVWufaTecxsHktQ593tn4DyQWYnJY4saHOAwBNKrZip3vuIv2DYPJSQXvMQAuqN1AgtIiICIiD/9k=" - }, - { - "title": "ChatGPT Tutorial - A Crash Course on Chat GPT for Beginners", - "source": { - "name": "YouTube", - "link": "https://m.youtube.com/watch?v=JTxsNm9IdYU" - }, - "original": { - "link": "https://i.ytimg.com/vi/JTxsNm9IdYU/maxresdefault.jpg", - "height": 720, - "width": 1280, - "size": "134KB" - }, - "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRIDD6PSH-o5_a4uY4vMZypbGD47mIWLL6VsTXNuADpOw&s" - }, - { - "title": "Introducing ChatGPT and Whisper APIs | OpenAI", - "source": { - "name": "OpenAI", - "link": "https://openai.com/index/introducing-chatgpt-and-whisper-apis/" - }, - "original": { - "link": "https://images.ctfassets.net/kftzwdyauwt9/44fefabe-41f8-4dbf-d80656c1f876/8dec20d14a894ae52ae07449452a89c5/introducing-chatgpt-and-whisper-apis.jpg?w=3840&q=90&fm=webp", - "height": 2048, - "width": 2048, - "size": "93KB" - }, - "thumbnail": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ_IQLO0924Gl1jYnj0yWaeKwSWj8tbTbk0Jc6cAvQv6A&s" - } - ] - }, - "inline_videos": [ - { - "position": 1, - "title": "2 MINUTES AGO: OpenAI Just Released the Most Powerful ...", - "link": "https://www.youtube.com/watch?v=7idowVzHZ9g", - "source": "YouTube", - "channel": "AI Uncovered", - "date": "1 day ago", - "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAFMAlAMBIgACEQEDEQH/xAAbAAABBQEBAAAAAAAAAAAAAAAAAgMEBQYHAf/EADgQAAEDAgQEAwYFBAIDAAAAAAECAwQAEQUGEiETMUFRFCKRBzJSYXGBFiNCobEVwdHwYsIzcpL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAkEQACAQMEAgIDAAAAAAAAAAAAAQIDERIEFCExQVEyUhMi8P/aAAwDAQACEQMRAD8A4hatfh0cQsneIt+ZNdUb90pNgPpe9ZK1b7GUpZyhggQk6lRUkC3cmrghNmGWfOSefWrPBITsyU220nU4s2HyqHIirYcSh4WVbUodq6N7PILDbfiVutF5z9OoXSKmbxRcVdmsy9lmPEZYWHEeLadQ5ckcwb2+lbDEcNYxXDXI0+CH2lo82koIHzBJqHChx1XdWVKIOrTq2va3L6Vo4jbQQOGAFWt9rk/3NTTlKxFVPLo4U1HeyvjsjBJQUWffjqXbds/4rF5qiJjYw7oACHPMK7D7ZMMUIcHFkjzRpAbWQP0L2/kiuVZqPHahyD7xBSa18CTuZu1FhS7V5ppFCKLUu1FqAG6LVYYThMrFpRYiBsFKdS3HXAhDabgXJPzIHck1rMTyFHjQnHhNfiFh7hKemMlTT3TiflhRaRflr5gg/KkBgrUGpEyK7ClvxJKdD7DimnE3vZSSQR6imKAE2ry1LtXhFIBs0V6edFADlq6zliO3jDGFYVOUlbsRJWCAf/Gi10knqL27WFcq03BHeuhZYmON4iiY2gFC4irrH6VFCwR63/f7VdpoaipQk/KMnmV0KxaQ5YFOvl/anYmHScQjeJRhxaQlN0rYQbk/QG/3t0NTsHjxpmKOonpCm1kix610nL2VsEhJ48dpSjzCFLNqzqSSfJpTi2uCg9mmMTfGjCZTjq9Q1ILir+Ujoe24NXftBxjEIuIogwn5qefkiAhSu+43pgltjPMF5ASHF3SQkAWFdDxHL0PGwhcgLStN9LrStKhfmL9qxU/CNZU18mcMxjHYy8NmwJQnmWWtSHVylqBIIO4OxFUmJL4mFM9w8f4NdazrkXDYOXcZmcZ+TKEVS0LeXq0afNYdq488rVhbXzdP8VvTfZhUK/TRal2pIUg7BSfWtDMTavLU62W9aC4RwyoX35jrWjcdyih2MpuM+pPHCXkOKc0qbsvzAhQOq5QLf8b9TQBGyXLjRcQlNzC1wpEUoSh5zhtqcSpK0BS/07p2PK9r7XrqOJ4uP6a/ILr8JbkNLwmLUXYsY2IToUkFJUoqAIbvq0m4AukczjO5W8JEEqOpuVpWX1qLpa1EHSLBVykG3Ig8ue9lrdym9FRHaW83dbxSTxVcG5c0KUNVjtwvdHRV6kZTZilR5+PYhMhpUGH5C3EahYm5uTbpc3Nul7VWkVqVOZRD7auG4I916kK4vFH5t03OrSRw9tt786J7uTlQJpgNSG5BQkx+KpZso2JSPNbbcEnnsR1FO4jKkV5anPKQSFCw570m6SbBQ9aAGiN6KcKd6KAJATWkyxP4ALDly2pKuXMG19vrVAE1Mgu8BwLtyJP7H/NUibnSM25djYXlmHLw0hxyyH+MOuqx/g03lXGy80QsgHqO1Ly8XsdyO0yErddgFUc6VAHQmykEi4vsSLC/u1jIji4GIutFZa1AlJIvY1nWjdXNKErNlw5GzJiGb+PhkY2bXqQ4SAlKQN73+9dxwkYgzhpVibjKpJUb8H3bdK4DgmISXpC+Ni05p5J8vBZuL9q6rluVOEUlzEVSo36eOyULH71y85HdJJU73K/2sY0uLlp+I0fzpygzf/gd1ftcfeuNSUcOJGa+qj+1bPPuKJxbHUx2llTUYlPy19fSw/esfiBCpFh7qEgCu5RsjznK/JZZAjMSs74IxKbS4yuWnUhYuFWBIB+4FTcbzJmnEyYWMKeELxSboVBS0kEL2GoIB/eq1nCXWsD/AKwh9xp9EkJabQhSV7AHWFdLX5j1vXuIZmx7EovhcQxiZJY1JVw3XCRcG4P2NSuehvjs6NIw/BEe0DNL7GLLdxAwZeuCYJSlv8oXs5qsbbdOtVfs3gt4LlV7Hp0Rh9jEZAiv8ZaUlqELh1xIO58xFwOib1lGW8VfQ7jjeJOmTKSUSFg/mELcDVib7hW//wA2pUjBZk6W1hkueVIgsjhiQkaWWiTewCiAAdI576vlV/ikYvU0le76EJexfImap8GBK4TzTvh1rLSF8RrUFJPmBG40m471Z+1nGsRmZpxLCZD6VQIUq8dkNIToOgdQLn3jzNUU9udMxxqLPmLdl3aYLrhuUGwGn56SbfanJECTPdenYrPUh9xpLzjklPmUpWqyTdQN7I6A/TuKDY3WgvJq8oSX8KyTBk4fIdgmXizzc2XHgJlOBKWroTpIO17epNTnGcUi5rxGevNjjHDwVmW7OXhDalllShZHCuACL3vz6VlMKGOYP4ZvBsYmRfGrQHEtakJBKAvVa5CrJ5nY7WqLMexFx/GXsQxqUuRwgh9RBX4loqSEgkq2SSUm1qX45Aq9N9P+6LjN2bWnxgb+F4orEMXw9x1xeJrw5EfZVtKOHuDbfnUjPWa8bfy5gEdcxJaxTCuJMSGGxxVcQi99O2wHK1Y7FMLXhojFxSjx29YBQBbl2Ub8/lUaRKkSW47ch9x1EZvhspUbhtF76R2FzSxsXGakrogqTvRTpG9FMZKCaUBagKR8Q9a91I+JPrTuSarDJMqB7PsTlwnVtOR57B1oNj5goH/p6VSz8YRinEXKCI8xl0J8SE+RwG+6kjkduY2+laRDkKFk6RgUh1BkyQZMgJWDoUQNCfqEpST8ya5vIbdYWWyUqSuytuRHT6VMmOJ1PJ2cWMJU23MYRu4ga0eZCwVDe49auM953bdirZwIfmqA1vkW0BVx5e58tcnixvCJZlNJIeT5hrKVJ325W++/7VdsxC/lSRjC30lbs9KeFsNKUoI1fcqT6VMUkVKWXJDgWSpxw7htBJJ6kmoqSOMlaxcagVD7082tKYjoCk3UpI59N6Z1J+JPrWhJuH5MdmGHw07LugLLigG0aCCT1KieXasJptT/AImVYNeJVwdGyL7W5elN3T3HrUQp4dl1KmdhPmta5ta1r16tS1qKlrUokWJUq5tXupPcetF09x61pczEWN73N73vQsrWSVrUonmVG96Xt3HrXm3cUXAQVLUEhS1kJFkgqJsOwpNj3PID7U5t3FFh8qLgIVqUEpUtRCRZIJuEj5Ugop2vDSGMFO9FOkb0UcAWwy5F7D0pwZdhgXUAB8xVO5jcsYopDDyXGS6EoSEixF+htepuaMQiKirhNuqL4WNQCdtuhP8AjtXbudPZ2gLF+ycMuQ+iU+lLGXInwj0qtyliDq1Ox5LwLTbadF7DTbaw/wB6VF/EU2JPkFRQ+2XCEpJ8oSD+m3y60bqhZPAMX7L38NxPgHpXv4aiXvoTf6UziuML/orUiEoMyHSk6SQVJTvew/3aoUDNS3ElmWhCDwyEvpvsq3Mj69qb1ND6CxZPcyvFUbpVoPyFM/h0Mq8yEOt9wLEVFy5mFDDLzeJuurULrStR1bW9369qaxnMAnwGjFU5FdS9uhLm5FtjcVD1FFq6hyPFlzDyjPkKKDhz4cYKhJQU2KEb6fryGwvXv4bifCn0qEvM6WUwklhtwuNpU6pKvcv2+fWokrHkRsdXLZU5IZU0EBsnSBy5fz9zRHUU49xuLFlwctRPhT6V5+GYnwj0qnnY6nEXIrjJei8F7zDXcKTtvtbfblTsPNYTPkeMKlRN+EEI8wsdvUd6vc0b/AMWWYyzE+FPpQcsRLck+lZ5OY5cfEX3m3i8yteyHL2032sOhtT+OZi8ayz4B2RH0qPERfSTysbj70t3Qt8B4P2XH4YifCn0rw5Yi/Cn0qtjZpkCE+X20KeSkFoi4B3A3/mohzDNkty9UgMktAtpTtZQKb2PzGo091Q+gsZF0csR+gTSDlljsKoVZhnKVHUXCCz71iQHf/YU/NzC/KhAIcLD6XQfyyRqTY/36UbnTc/oPGXsthldk9vWiq05slAJDbSOQvqvuaKe40n1DGRnlc6DubkkmiivKND0gWrznz3oooAdC1kC61GwsLnpSLUUVohBbY0miipGKVva9JtRRSYhaORpCqKKb6GAFOJSNNeUU4gB3NulJIsdq9opMBFza19qORoopAKtfnRRRQB//9k=" - }, - { - "position": 2, - "title": "OpenAI Secretly Released a NEW ChatGPT Model and It’s ...", - "link": "https://www.youtube.com/watch?v=uh4baKXL6K4", - "source": "YouTube", - "channel": "Unveiling AI News", - "date": "21 hours ago", - "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAFMAlAMBIgACEQEDEQH/xAAbAAABBQEBAAAAAAAAAAAAAAAGAAIDBAUBB//EADYQAAIBAwMCAwYFAwQDAAAAAAECAwAEEQUSIQYxE0FRFCIyYXGBQpGhscEjYnIHFlLwFTOC/8QAGgEAAgMBAQAAAAAAAAAAAAAAAgQAAQMFBv/EACkRAAICAQQBAQgDAAAAAAAAAAABAhEDBBIhMUFRBRMiMnGh0fAzYZH/2gAMAwEAAhEDEQA/APJJDU0EWxdxHvH9KjRd8yqe2c1eVUz75GcE4IOPvVisSuFmnbbCNi+cjfwPOro0SAKpuJp5GYZBDADFMaW4RhIjbSoGCF5+lQzXFyyLJk7QCBxwKzcmNRh6l9NLsYoxzOAT73vZ2/PtWXr+lXFmFmWRJrRvgdDyP8h5VH7dMMNubag4GfOprXVpFlXeVCtw4PIP1qk5BNR8GDSrYu1t0nYQhRGeVB8h6VWZUP4VrQAogkHI71Nv3L+9OdUHkBUR2jtjmoQaeK7mmkj1pZqFDs13NNzXQahKHU4VHkeop4PlUBZIlWI6rqyjuQPvViLnGKsykWVHFKur2pVZhZy0GZ2YjIRSTWtpVq093vlGQVzgeX3qvp8aRl1fksvPzq1FO8NyFQ4JA3DyrOY1iXJr2FkuqTMkUAeNfiHY961LHpcSPiVO3ljgfLFaX+nyNEJGdC2Rgue3/eaML24trRN8rxx57FiBSk2zpQS9Dzu+6QgEp8BAuTnFYOodMojf+sJx5DvXo8+rWk91EltLFK/Jbw2zxig3U+o7GS9KmRs84jA+GghKW7g1lGFcgBrVsbbw0f4kZ0J+QwR+9ZdG3VEcLWceoRHKOwV/kw4/Yj8qGJdqjLDj6U+ujnNU6NnoLwvatT8bZj2Ndu/Hf2iHt9s0Ua9eWqWfU+t6PLFa3630cMscWAVkWRx4ifJ1OT/cG9RQZ07pdvrV7NbyTeAqW7Sh9owCCAM/LmteDo6EK/tbXIljtopHijMakOzOpGWIGBt9aJRbFsmqxY3UnyEUmuy/7n1prvULgW9rokbwtAVLRuy2xYpnjcTnP3pt/NPd2hu+mZJJNYuLG1ZJiEW7kh3TiUjb+PcIgdvO0D50N2PSdpfoZIbmdI1M0bB9pKyqyhF4453Dt9qoDp6NuoItJFwy7YBJcuVzsOzewA88dqm1lLVYm2r67DZm1Q6fqH/iGH+4Rb2IvjbFQxk3T7s44zs8Pd8+/NZ/UGnNrWnXVlosFvc6hFfwyXcdoUCh2tkWRlxxs8UPkjgH5UO2mhadqonOk3VwxS2aURXCqhVwwABb4cEHPB4q1a9IJJqiWlzcPHELOKWWQbW2ySEAKMcEZPf0FTayS1eKN26oKdRmvbq7E3Rc1v4LancnUZEZPDP9TCGX1h2dvw/F51WsrrTLTQ5XvIra4tJNOWKYQKB7rahcAtGDyCBhl+goXTRNOOmNLLJereJdCyaPamwTEHz77cj61Yl6as/EaO3mvGaC8jtZ5niXw2ZmCttI5GNw796m1lPVY7oLbu0a0jjtun7nxtSigsUkn0/aZntNjbmhyfNthODn4c8ZoU6zt1t+oHxKsjSwxSyMqovvlBuyEJXdnvg4zmp7jpbTba7tYLiW+j9puTbojpHuzkAP/gc/WsS/itbe9lhsjMY42KkygAlgSD28qumgI6iGX5RL2pUl7UqgA57hormEICxLDgdznjFalxYXFjOBcJtZuQQQQR9RxWJLKYNQgm4/pujjPyOf4r2a70uG7hezigVLe3gz4oH485GP1/KsMsttHR0+NStmjpaBNJg8GP4YwQvqaFtZ0bVtWc3F47JHvwkCjOU+fzPpRhp06qiKQFAUDAq9K6CMkNxilV6j9eAV6K6Xj0yaW7kQqWO1UfnA+lDvVfS9rFrk0iRYE+JUOcDPmKM11SUQzzRWs08aDEaQ4y7feg3qXqK4lu7eG5szA4ALLkNtPOeRwfKri3douSXTMq/0uReltTjUDaoWYDPYq2Tj7bqCISJYSjeXH2r0m5vFktJYsZSSJlI9cggivOLeMRQ734JH6U1ibcbEsySlwR2t1PYtcCEgGaFoJMjPunGf2rVHU+pOreP7NcBoo4XE8AcMqElcg+eSeay7lOzj71CnB+tapsWljhLmSNW01nUhIbayESe0XUcqwxRhV8RSNoA7AZAqZoeoINUutXMEi3UFxiZ8AgO/G3b55zjAz3rP02ZLXU7O5lzshnSRsDJwGBOKMZurrIxs1tBK0rSxTOGUAOyuvz/4oPvV8eWL5VOM0sWO77/foZl6nU2Utn0+KFLlGtY4YERUGTuYAA+6xxnn0pA9WIY7CGJ4ZGhTa0JVS0cQ2j3wcYGeefOren6tp2mXLPbNdzpc3guJTJGAYwA3A55OW703TtZ03TYI7FDPJbLHPumkt1b3pNoA2ZwVGOcnmpuj6gSxZ1H+L7P9/Jlay+ueDctqEKxo10k8rJt4lKkL2PmM01+qNSkBz7MHdkeSRYFDSshDKWI7nIq9Lf6JPZXdlLczRpNNHKrwWKoAVUgjYDjzHNDLhRIwjJZATtJGCRUYeOEZqpw6/r6FuK+nTUhqAI9oE3jZxxuznt6ZrrStNK8r/E7Fmx6mqi1OlUaOKRaU8V2o1PFKrMqHX8W9NwHbg/SvQen+v9Pj6e8HU5ZE1CKPw8bCRNgYU5H65oGicSrg43eYqrPZ85i7elBKKkuRnHlcHwe0Wd0Lq0hni4EqBgD5ZqxNI7QHc+0fib0FB/RWpSSaH4UwO6zbw2/w/C37j/5oklmM0e2Mggjn6UjOO10dCGTdGyOPVLmS0C2emS+Go90uVTI9QM80Ma1c3nhqj6csabi3vSKzE/nRncQXE1qqRssYxgMPKgnWNN8CUFr1pWPbK4/mih2G5raZssjHTpnlG0tGw257ZGP5oRun3NsXsO/1rf1y4MVuIA2Xc+XoKH1QscDvTkVSOdOVsfF78RB8uKrlMHB8qvbQiY8hVZhuJNEDuGqM4rd6esDeXCxRwmWZyFjT1JrGjWiroy6Wy1a2uJDiNJV8QkZ9wnDfoTS+p+Q7PsRKWouraTr/AAK4Ok7DwzHMZHm8MHxrYo6FyiuFVce8u10y7Oi5YAH1G+qNBGmxLlTtkTfGzxGJxg4Ksp7EEHzI7EE16GIfBgilC3YggYiMowZZv6aoqnbu8b3UXbhV4zuweSLdfT2/hCyhlWV7Zn4TO2BTt/pD1wwY8cDdgUq4qNNHoIZZ5d0Zcpp3x1S+3g8wlXaxFMAqece+ajxXQj0eJytKbo4KlSmAU5aIyZODxXKaDxXagFFgqVOVODU0MhdirDnHepZI6jhikaZfCRnb0UVZjGYWf6fLMdUulWMtAYMSt5Kcjbn68/rRLc2E0Mu62baP+PlTdBiGn9OaaYlCrPPmdh+JyWXB+mBW867/AC7UrlXxD+GXwgdf6xqULm3KhPQt/FDmpXM+4vPNub5Uaa1bvcTLGF4HnjtWVL02kRFxqHNuoyEB5kPkPp61UOXQU5cGHf29vP0/psdxhblzLIr+ag7cZ+WAPzoc9me3ciZcN5fT5Vt6tO1xfAD4IxgAeX/eKsxFvZ9pOR5ZFN7aQlKdvgF5Pe4HambKJ1MUhxcW0cnzK811tL0+Ye4skJ9VbI/I1e0H3gMhMCrNrO8DZU/WtWTQZMZt545f7T7pP8frWdNZzQNtmiZD/cKCcFJUzbBrJ4JqcHTLttrl5a7/AGWeSHeMP4Tsu4ehweapXN7JLHs4C/Ko/CrnhVktPBeDo5PbuqyRcXLvsqMuTmm7KuGKmGOtqOX7y3ZV20sVYMdMK1CbhlKnYpVC7N5UV5kVhkFgDW94McERSJAi/KlSrSBzW+At6ekaPpU7Dx4xGCM8cetasBy7JxtC9sV2lWWXyO4W6RRviVKbSRuYg4rI1QYgcc/F60qVTH0iZHywQMaeOfdHxH96vxRJ4ZG3ilSrfwJ2yMxpub3R3rqoo8qVKrBseow3HFTFiwKNyvoe1KlVA2Dd2ipcyoi4UOQBUJA9KVKszdDSBTGA9KVKqDRGwFRMBSpVDSJGaVKlUCP/2Q==" - }, - { - "position": 3, - "title": "OpenAI's ChatGPT Does Research… And Breaks Itself!", - "link": "https://www.youtube.com/watch?v=iC-wRBsAhEs", - "source": "YouTube", - "channel": "Two Minute Papers", - "date": "2 days ago", - "image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAFMAlAMBIgACEQEDEQH/xAAcAAACAgMBAQAAAAAAAAAAAAAEBQMGAAECBwj/xAA+EAACAQMCBAMEBwYEBwAAAAABAgMABBEFEgYTITEiQVFhcZGhBxSBkrHB0RUjMjNCYhZScoNzgpOiwuHw/8QAGwEAAgMBAQEAAAAAAAAAAAAAAgQBAwUGAAf/xAAsEQACAgEDAgUDBAMAAAAAAAABAgADEQQhMRJBBRMiUZEUMkJxgcHRFVJh/9oADAMBAAIRAxEAPwCsoGA7CpEVicEYqYReA49KVcLcNrrPCfEGry313HNpUIeKKMjbIdpOGz18vKsjT1+bnBjdjdMtUMMkSqGBHTvW74MY+/lVd/w8q/R6eJWu7s3AvBbC3HVSCwGfXPWrA3AGkW93ZaJrHEl1bcQ3kQaOKGLfDGTnCsfPqCO65x5dK16mIG8TdczvQI2+uwHPXePxr2b93PbmOTBBGCDXz7BwVcpofEk8t3cftfQ7pYjbKw5cqHb4s9+oLEe4e2rZN9HPI4n03Sm1O75F1Zyzyy5GVaMqGA8sZdPnRs+YKpiWXVtOOnz+XKY+FvyoWMBuxBrx+4eKaRooruZld2EZzk7euCfsq2fQ8qniG7gvGaWPl7cFjjIJpivXZPSRFtR4KyoLQdj+/wA+0vG01mKf6lovKHNtQzIe69ytJmjwadSxXGRMW2l6mw0hxmtFaLtrdp5UjUdWOBTC80KWFC8TCVQOuO4+yvNYqnBM8tLupZRsIjK1rFTvESpA6Ejv6VHBbmONUZy5H9R7mizA6RjOd5xtruAYnjPtphbaXc3C7ooyV9ewqW60e4swkj7WXIyVPagNicZlqUWfdjaJp9Eiutd+v3CgrGPAD6+tb4k1KTTNNkngTc4GAPStcR65HprxQIMzSMAB6VDxbHv0RjjJIpGbQE8gvbu6vbl7iZ2Z2PU5rKbQaHcSJvOEyegNZVfmCNDT2EcRqQRG3THTzrX0Za/HofB3FTRahb2uptEjWSSOm+RwrY2q38XXHTBqG6iaUjaxBrjTuFrSTxSRgBcE4JGBkD19SKxabtPRX1AnJ5EZdLXbBG0eanxZLq/0Y51TUrafWY9RR1gYokhVXBB2Ljp7cUz1OXhzX+KtJ4vbiXT7O2gWKSezuJAs4eMlgoXueuB09Omc1ltwTojACeBnX/iMCPnUXEXAeiW1gs1skmSem5yfzprS6qu84QyqyspzBuCOL9MvvpE4ludQnhtdM1eIFGupBGDyiqoDnzKljin/APjmwuOHOIbuW7t11K2kvINPRpVDyxvgoUHcjO0f8tU3ROEdOur6GKRDtZgDgn9avMf0b8PyZ2hmwcEiRunzp0iUg5nhVpLy4Z9jpGyrtGe/2Vc/onVjq0rLnwqCce+rDrv0aWGm2s10h3JuyAScgfGj/o90e00m4Nyi/wA4FCMk9B1qAMHMse4sip2E9UiYMoHspRqWlGW6VoEAEn8XoDTOGZWAx06VKTt3OWJU+XpRq7IciL2VrauGgtjp0VtGAUVpAc78daG1KeWyYcoArID38jRSXqOTtIwDjrQOsTLM0caEHbknFWVgs+WlVxWuohNojZMmu7eyluZOXCwVz2LdhT2z0pOWHuM5P9PpRjCG1DTOyJEo6ZAG2rrNSMECK0aJshmk6BYkVFwAowBVY4u1vkW4SDDAyBCR65pPf65Nc67Fy5GWFiVCA9MVH9VF1ZOs7MMTluvc9aVTB3mlapT0mL+INJm1HVLV41GEALOewqXiC4/dxwA5XHWmd3eRW9vzLqQQxAeZ6mkvEKtfaUt1YMAAuV6dxUvkjaeoKq4LcRI80aNhnUH0JrKFsNKjltw902+UnqSa3VPkmOHXL7SRIx6L8abaNbm6uWtBtDTxMiEt/WPEv/copWq0fpzPFdRSRna6OGU+hHauRFgVgTxHCpIwJcIbO7EEcvIZkKg7o/EPlQPFFyg0+ODcOZ32nvTqRJGiGqaWziKYlpokPWN/6unpnv8AHsaovFcg1K/2uxklzgsp6gYrV0CJTewGcYz+o/5FrA1qiTcMZXVLYv0BbOTR1ldS2XE9xcLeMbOSQl0HUA1XdOE1ruVnZtgO0kYrvS5S9vnPdjWh4heaVDVyjTVdZw0vGp6iNZ0e4hiULMpyFJ/iANc8LoW0tjJECgYjcO6mkulIHSUOzYC5yKN0DUZYbF4IlyGDsW9Kq0Ore/qDdpOopFeMRsutpHNyUJO04z61ZBzJbH9ywLMK8hvtTa2k3Rgc1mPX0x7Ptoix4y1G16R3BA8wUU/lW/VpLLUDjAmLdrK6XKEEz0G4tZosGQEZ86YaZZhBzpMEnsPSqHHx9dSJsnWCQepUg01suNkmIh2pGzdh5H7aK3T3hNx8Sqi/TeZnJ/eXOWQL2NI+KZkfTo0H8bSqo9maHXVZZbWWdXQFThapWq8Wm6cxiIPErZVm7k+uB+FZ1hRB6pvaSi3UP6BxC9VENvqtkkJBKthqMvbyU21x9RTmXCHaAe2aqh1pWkDmJd4OQdgPWi4OIShYgJ4jlspjPwxVH1AAOOZoWeE3MROuKbeXUbG3iJHPQeMZ86MtbiKLRYrORxzQgXHqaBF8L7fJtCndggUs1SV0MLIcESDrSFPiFxvFbgRW/RisEdxGdlp11HEw8IBckVlF20VzLCr81uvsrdboVscTJNiA4zFSrR1iv75ffXSabJ5zQfeo20shHKpe5gAz18VfPnbI2nRgiHaNJe6Jqtzewy8+yuSGmsyMMGAxuU9s4H2/CncuicM8Vs95akC5U4kltn2SI396+vvFA7LVQCL2A59DVTvOFbqbWZtR0/VY7WRmyssUpRx7Mg9q1PD9a6Dy7/tHErKKW6kbBno0PDEMdtyJZ+euMBpIxux7SK6veE9Lu4QDFyJtoBmgwhJ9SOxqoWtxxdZLg8T2Nwo7C5twxH2rg06i4zGnaWv7Xlhu9SZ2CR2cbKrjyJznHfv8q2k1Wnt2BidiWA5JkUnD11o9vcyB4bqLYcu3gZR7c9PnVNs9WSxRWMmN2cAdc05u3uOIWMuuXciw947OBSEX0z6n2n5UHJw/ZyQLAMyRjtvGCPdij0aV/UM2DgxfUs/lYU7yr3V8PrsV2kUdyEYOYpBhX8WSp99LxdiSWRnEULu7PyUbpGCchR7BU+pwJZX8tpHnbEdoyaWT2MU8xlfuRg104BrQPWM7cTAHTY5S04yeYwa4WJeY4LIvVgPTzoyO8trnUTLpqTJaGQ8kTEb9oHnjp3zSK1sFguOaHOAMBc9Kc6ZY3uoTtHpygyxpv6vtwMgd/tosu6l29OxGIJWut+hfVvnP8S5QXnL0udGbxLE7Y+w1Q4tReKOa1a0jdZihW5Y9YsZyB78j/wC7WzUdOudL0UXWo9biX9zhD4PFkDr7B1qiXEIubZomOM4wfSuauyjYadr4anmVFlz2Px2jBXBqVtTZbb9nJYRs8kyyC7OdyoO6+mO/x92EA019uFxn/V0pnYQ/VLZYt24jJJ9tL4VN+Zq5t1GFYFcb5jvT54khZGciRjkD5U5fTrazjWfVG3OOqQg/jQGi6aZPq93G8Ql7KJUYqDuPXtim1zw5f3UjSS39m7HvmQ/pTWi0ulqIv1DAE8DM5rxvVW23NVplO3J/qJ7nWbhpTym5aDoFXyrKYHg6+JyLmz/6v/qsrc/yWk7WCcv9Bqf9DIFiizjmZPoJP0FbFuFPikY+zdj8qiAkJG4x7fRutTJjPdcegFYf0tA/AfE6HzXP5TsRR46Nj/cP6VJEFVsB8/7proSZx5++o3uYkYBpcN5KDk/CpXT0k7IPieZ3A5hgAVclEHtbLH8K6DIXGAGI7ELj8qEWbf8A1Ig9XcE/AfrU8EqIMfWQfbuA/CmlRV4EoLE8mGb2QFXTDAdtrAn4ipYH65xj4n8qCNzbxRl5LhFUf31pBcXy5PMt7U+WcSSe/wDyj5+6jGYBlf46hW/vbc2c9tzVBSYlwpU9MFie/u7+yj14e4alRQuozxuAASkwIJ9eqmpLqwh3AJDGqr2AUYFaSIKOiL92rQ7gYBlfQh3Ilf4s0y20W3gmsL+S65jlWVkHhGM56fpV14M02Cx0sTrMr3N3GjSElSE89o6+3vVe1eFXtJGZBlFJU47HFPOHbmOK2RRNGqFQR46lrLCvSTBFVYOQI/nEF5by2tzGGjOC8UoDKfQjyPXzrznjPSorLUrZ7KLlQTsBJyznDZ9M4GR28ulegyXcIjyLqLPoZBVT150uG8XLnRTnYJOo/wBPX5UtZX1jGI7pb2pfqBixdA0/cR+15VHkeUrf+QpNJbNFxCNNacywlwFmRcFlI/iAP2/A07i0+3u4edbeNB0JBOVPoR5VCdHCSiQSOHHY7u1UNQvtNGrxG8cvmW+wuY7GC3t4lVoIlIwRhjn1JyO/WiP2hFv6xgIR1zhjn7CtVmOJSuHLFvNg5U/EVJh0OUmyP8snX5j881eACMETMbqzkneWNmil8aSIinyMTfqfxrKrpuCOhRyf7WUj5kfhWVHlV+0jqb3gcSgkEjJ9tGRAZrVZQjeGdpxIeZLy36p3xUn1eA4zDGfeorVZRn7oH4yaO3gHaGP7ooqG3hJ6wx/dFarKsEAwJYo59YZZY1IhGY8Ljb8KblfD/E/3zWVlT3g9oDcIM92++aFaMerfeNZWUcAxTrWVMIVnAOcgMetXDSUURphQOg8qysqPeePaNJQNnYUjvANx6DvWVlRCEWrBENVs5OWpYzJnIyG6+Y7H7adcb6bZWuqMtvbRxqUDEKOmTWVlVNzGElZjgi3fy0+FF/V4cfyY/uitVleWFZODbw5/kx/dFZWVlFKp/9k=" - } - ], - "inline_videos_more_link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&tbm=vid&q=chatgpt&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ8ccDegQIIhAH", - "related_searches": [ - { - "query": "ChatGPT login", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+login&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhUEAE" - }, - { - "query": "ChatGPT free", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+free&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhXEAE" - }, - { - "query": "ChatGPT 4", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+4&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhREAE" - }, - { - "query": "ChatGPT app", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+app&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhQEAE" - }, - { - "query": "ChatGPT download", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+download&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhPEAE" - }, - { - "query": "ChatGPT OpenAI", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+OpenAI&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhOEAE" - }, - { - "query": "ChatGPT website", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+website&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhVEAE" - }, - { - "query": "ChatGPT free online", - "link": "https://www.google.com/search?sca_esv=acb05f42373aaad6&gl=us&hl=en&q=ChatGPT+free+online&sa=X&ved=2ahUKEwi17_rnppWIAxX2rokEHfAoEzYQ1QJ6BAhWEAE" - } - ], - "pagination": { - "current": 1, - "next": "https://www.google.com/search?q=chatgpt&oq=chatgpt&gl=us&hl=en&start=10&ie=UTF-8" - } -} diff --git a/backend/open_webui/retrieval/web/testdata/searxng.json b/backend/open_webui/retrieval/web/testdata/searxng.json deleted file mode 100644 index 0e6952baa8..0000000000 --- a/backend/open_webui/retrieval/web/testdata/searxng.json +++ /dev/null @@ -1,476 +0,0 @@ -{ - "query": "python", - "number_of_results": 116000000, - "results": [ - { - "url": "https://www.python.org/", - "title": "Welcome to Python.org", - "content": "Python is a versatile and powerful language that lets you work quickly and integrate systems more effectively. Learn how to get started, download the latest version, access documentation, find jobs, and join the Python community.", - "engine": "bing", - "parsed_url": ["https", "www.python.org", "/", "", "", ""], - "template": "default.html", - "engines": ["bing", "qwant", "duckduckgo"], - "positions": [1, 1, 1], - "score": 9.0, - "category": "general" - }, - { - "url": "https://wiki.nerdvpn.de/wiki/Python_(programming_language)", - "title": "Python (programming language) - Wikipedia", - "content": "Python is a high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation. Python is dynamically typed and garbage-collected. It supports multiple programming paradigms, including structured (particularly procedural), object-oriented and functional programming.", - "engine": "bing", - "parsed_url": ["https", "wiki.nerdvpn.de", "/wiki/Python_(programming_language)", "", "", ""], - "template": "default.html", - "engines": ["bing", "qwant", "duckduckgo"], - "positions": [4, 3, 2], - "score": 3.25, - "category": "general" - }, - { - "url": "https://docs.python.org/3/tutorial/index.html", - "title": "The Python Tutorial \u2014 Python 3.12.3 documentation", - "content": "3 days ago \u00b7 Python is an easy to learn, powerful programming language. It has efficient high-level data structures and a simple but effective approach to object-oriented programming. Python\u2019s elegant syntax and dynamic typing, together with its interpreted nature, make it an ideal language for scripting and rapid application development in many \u2026", - "engine": "bing", - "parsed_url": ["https", "docs.python.org", "/3/tutorial/index.html", "", "", ""], - "template": "default.html", - "engines": ["bing", "qwant", "duckduckgo"], - "positions": [5, 5, 3], - "score": 2.2, - "category": "general" - }, - { - "url": "https://www.python.org/downloads/", - "title": "Download Python | Python.org", - "content": "Python is a popular programming language for various purposes. Find the latest version of Python for different operating systems, download release notes, and learn about the development process.", - "engine": "bing", - "parsed_url": ["https", "www.python.org", "/downloads/", "", "", ""], - "template": "default.html", - "engines": ["bing", "duckduckgo"], - "positions": [2, 2], - "score": 2.0, - "category": "general" - }, - { - "url": "https://www.python.org/about/gettingstarted/", - "title": "Python For Beginners | Python.org", - "content": "Learn the basics of Python, a popular and easy-to-use programming language, from installing it to using it for various purposes. Find out how to access online documentation, tutorials, books, code samples, and more resources to help you get started with Python.", - "engine": "bing", - "parsed_url": ["https", "www.python.org", "/about/gettingstarted/", "", "", ""], - "template": "default.html", - "engines": ["bing", "qwant", "duckduckgo"], - "positions": [9, 4, 4], - "score": 1.8333333333333333, - "category": "general" - }, - { - "url": "https://www.python.org/shell/", - "title": "Welcome to Python.org", - "content": "Python is a versatile and easy-to-use programming language that lets you work quickly. Learn more about Python, download the latest version, access documentation, find jobs, and join the community.", - "engine": "bing", - "parsed_url": ["https", "www.python.org", "/shell/", "", "", ""], - "template": "default.html", - "engines": ["bing", "qwant", "duckduckgo"], - "positions": [3, 10, 8], - "score": 1.675, - "category": "general" - }, - { - "url": "https://realpython.com/", - "title": "Python Tutorials \u2013 Real Python", - "content": "Real Python offers comprehensive and up-to-date tutorials, books, and courses for Python developers of all skill levels. Whether you want to learn Python basics, web development, data science, machine learning, or more, you can find clear and practical guides and code examples here.", - "engine": "bing", - "parsed_url": ["https", "realpython.com", "/", "", "", ""], - "template": "default.html", - "engines": ["bing", "qwant", "duckduckgo"], - "positions": [6, 6, 5], - "score": 1.6, - "category": "general" - }, - { - "url": "https://wiki.nerdvpn.de/wiki/Python", - "title": "Python", - "content": "Topics referred to by the same term", - "engine": "wikipedia", - "parsed_url": ["https", "wiki.nerdvpn.de", "/wiki/Python", "", "", ""], - "template": "default.html", - "engines": ["wikipedia"], - "positions": [1], - "score": 1.0, - "category": "general" - }, - { - "title": "Online Python - IDE, Editor, Compiler, Interpreter", - "content": "Online Python IDE is a free online tool that lets you write, execute, and share Python code in the web browser. Learn about Python, its features, and its popularity as a general-purpose programming language for web development, data science, and more.", - "url": "https://www.online-python.com/", - "engine": "duckduckgo", - "parsed_url": ["https", "www.online-python.com", "/", "", "", ""], - "template": "default.html", - "engines": ["qwant", "duckduckgo"], - "positions": [8, 6], - "score": 0.5833333333333333, - "category": "general" - }, - { - "url": "https://micropython.org/", - "title": "MicroPython - Python for microcontrollers", - "content": "MicroPython is a full Python compiler and runtime that runs on the bare-metal. You get an interactive prompt (the REPL) to execute commands immediately, along ...", - "img_src": null, - "engine": "google", - "parsed_url": ["https", "micropython.org", "/", "", "", ""], - "template": "default.html", - "engines": ["google"], - "positions": [1], - "score": 1.0, - "category": "general" - }, - { - "url": "https://dictionary.cambridge.org/uk/dictionary/english/python", - "title": "PYTHON | \u0417\u043d\u0430\u0447\u0435\u043d\u043d\u044f \u0432 \u0430\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0456\u0439 \u043c\u043e\u0432\u0456 - Cambridge Dictionary", - "content": "Apr 17, 2024 \u2014 \u0412\u0438\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f PYTHON: 1. a very large snake that kills animals for food by wrapping itself around them and crushing them\u2026. \u0414\u0456\u0437\u043d\u0430\u0439\u0442\u0435\u0441\u044f \u0431\u0456\u043b\u044c\u0448\u0435.", - "img_src": null, - "engine": "google", - "parsed_url": [ - "https", - "dictionary.cambridge.org", - "/uk/dictionary/english/python", - "", - "", - "" - ], - "template": "default.html", - "engines": ["google"], - "positions": [2], - "score": 0.5, - "category": "general" - }, - { - "url": "https://www.codetoday.co.uk/code", - "title": "Web-based Python Editor (with Turtle graphics)", - "content": "Quick way of starting to write Python code, including drawing with Turtle, provided by CodeToday using Trinket.io Ideal for young children to start ...", - "img_src": null, - "engine": "google", - "parsed_url": ["https", "www.codetoday.co.uk", "/code", "", "", ""], - "template": "default.html", - "engines": ["google"], - "positions": [3], - "score": 0.3333333333333333, - "category": "general" - }, - { - "url": "https://snapcraft.io/docs/python-plugin", - "title": "The python plugin | Snapcraft documentation", - "content": "The python plugin can be used by either Python 2 or Python 3 based parts using a setup.py script for building the project, or using a package published to ...", - "img_src": null, - "engine": "google", - "parsed_url": ["https", "snapcraft.io", "/docs/python-plugin", "", "", ""], - "template": "default.html", - "engines": ["google"], - "positions": [4], - "score": 0.25, - "category": "general" - }, - { - "url": "https://www.developer-tech.com/categories/developer-languages/developer-languages-python/", - "title": "Latest Python Developer News", - "content": "Python's status as the primary language for AI and machine learning projects, from its extensive data-handling capabilities to its flexibility and ...", - "img_src": null, - "engine": "google", - "parsed_url": [ - "https", - "www.developer-tech.com", - "/categories/developer-languages/developer-languages-python/", - "", - "", - "" - ], - "template": "default.html", - "engines": ["google"], - "positions": [5], - "score": 0.2, - "category": "general" - }, - { - "url": "https://subjectguides.york.ac.uk/coding/python", - "title": "Coding: a Practical Guide - Python - Subject Guides", - "content": "Python is a coding language used for a wide range of things, including working with data, building systems and software, and even creating games.", - "img_src": null, - "engine": "google", - "parsed_url": ["https", "subjectguides.york.ac.uk", "/coding/python", "", "", ""], - "template": "default.html", - "engines": ["google"], - "positions": [6], - "score": 0.16666666666666666, - "category": "general" - }, - { - "url": "https://hub.salford.ac.uk/psytech/python/getting-started-python/", - "title": "Getting Started - Python - Salford PsyTech Home - The Hub", - "content": "Python in itself is a very friendly programming language, when we get to grips with writing code, once you grasp the logic, it will become very intuitive.", - "img_src": null, - "engine": "google", - "parsed_url": [ - "https", - "hub.salford.ac.uk", - "/psytech/python/getting-started-python/", - "", - "", - "" - ], - "template": "default.html", - "engines": ["google"], - "positions": [7], - "score": 0.14285714285714285, - "category": "general" - }, - { - "url": "https://snapcraft.io/docs/python-apps", - "title": "Python apps | Snapcraft documentation", - "content": "Snapcraft can be used to package and distribute Python applications in a way that enables convenient installation by users. The process of creating a snap ...", - "img_src": null, - "engine": "google", - "parsed_url": ["https", "snapcraft.io", "/docs/python-apps", "", "", ""], - "template": "default.html", - "engines": ["google"], - "positions": [8], - "score": 0.125, - "category": "general" - }, - { - "url": "https://anvil.works/", - "title": "Anvil | Build Web Apps with Nothing but Python", - "content": "Anvil is a free Python-based drag-and-drop web app builder.\u200eSign Up \u00b7 \u200eSign in \u00b7 \u200ePricing \u00b7 \u200eForum", - "img_src": null, - "engine": "google", - "parsed_url": ["https", "anvil.works", "/", "", "", ""], - "template": "default.html", - "engines": ["google"], - "positions": [9], - "score": 0.1111111111111111, - "category": "general" - }, - { - "url": "https://docs.python.org/", - "title": "Python 3.12.3 documentation", - "content": "3 days ago \u00b7 This is the official documentation for Python 3.12.3. Documentation sections: What's new in Python 3.12? Or all \"What's new\" documents since Python 2.0. Tutorial. Start here: a tour of Python's syntax and features. Library reference. Standard library and builtins. Language reference.", - "engine": "bing", - "parsed_url": ["https", "docs.python.org", "/", "", "", ""], - "template": "default.html", - "engines": ["bing", "duckduckgo"], - "positions": [7, 13], - "score": 0.43956043956043955, - "category": "general" - }, - { - "title": "How to Use Python: Your First Steps - Real Python", - "content": "Learn the basics of Python syntax, installation, error handling, and more in this tutorial. You'll also code your first Python program and test your knowledge with a quiz.", - "url": "https://realpython.com/python-first-steps/", - "engine": "duckduckgo", - "parsed_url": ["https", "realpython.com", "/python-first-steps/", "", "", ""], - "template": "default.html", - "engines": ["qwant", "duckduckgo"], - "positions": [14, 7], - "score": 0.42857142857142855, - "category": "general" - }, - { - "title": "The Python Tutorial \u2014 Python 3.11.8 documentation", - "content": "This tutorial introduces the reader informally to the basic concepts and features of the Python language and system. It helps to have a Python interpreter handy for hands-on experience, but all examples are self-contained, so the tutorial can be read off-line as well. For a description of standard objects and modules, see The Python Standard ...", - "url": "https://docs.python.org/3.11/tutorial/", - "engine": "duckduckgo", - "parsed_url": ["https", "docs.python.org", "/3.11/tutorial/", "", "", ""], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [7], - "score": 0.14285714285714285, - "category": "general" - }, - { - "url": "https://realpython.com/python-introduction/", - "title": "Introduction to Python 3 \u2013 Real Python", - "content": "Python programming language, including a brief history of the development of Python and reasons why you might select Python as your language of choice.", - "engine": "bing", - "parsed_url": ["https", "realpython.com", "/python-introduction/", "", "", ""], - "template": "default.html", - "engines": ["bing"], - "positions": [8], - "score": 0.125, - "category": "general" - }, - { - "title": "Our Documentation | Python.org", - "content": "Find online or download Python's documentation, tutorials, and guides for beginners and advanced users. Learn how to port from Python 2 to Python 3, contribute to Python, and access Python videos and books.", - "url": "https://www.python.org/doc/", - "engine": "duckduckgo", - "parsed_url": ["https", "www.python.org", "/doc/", "", "", ""], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [9], - "score": 0.1111111111111111, - "category": "general" - }, - { - "title": "Welcome to Python.org", - "url": "http://www.get-python.org/shell/", - "content": "The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers. Learn more. Become a Member Donate to the PSF.", - "engine": "qwant", - "parsed_url": ["http", "www.get-python.org", "/shell/", "", "", ""], - "template": "default.html", - "engines": ["qwant"], - "positions": [9], - "score": 0.1111111111111111, - "category": "general" - }, - { - "title": "About Python\u2122 | Python.org", - "content": "Python is a powerful, fast, and versatile programming language that runs on various platforms and is easy to learn. Learn how to get started, explore the applications, and join the community of Python programmers and users.", - "url": "https://www.python.org/about/", - "engine": "duckduckgo", - "parsed_url": ["https", "www.python.org", "/about/", "", "", ""], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [11], - "score": 0.09090909090909091, - "category": "general" - }, - { - "title": "Online Python Compiler (Interpreter) - Programiz", - "content": "Write and run Python code using this online tool. You can use Python Shell like IDLE, and take inputs from the user in our Python compiler.", - "url": "https://www.programiz.com/python-programming/online-compiler/", - "engine": "duckduckgo", - "parsed_url": [ - "https", - "www.programiz.com", - "/python-programming/online-compiler/", - "", - "", - "" - ], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [12], - "score": 0.08333333333333333, - "category": "general" - }, - { - "title": "Welcome to Python.org", - "content": "Python is a versatile and powerful language that lets you work quickly and integrate systems more effectively. Download the latest version, read the documentation, find jobs, events, success stories, and more on Python.org.", - "url": "https://www.python.org/?downloads", - "engine": "duckduckgo", - "parsed_url": ["https", "www.python.org", "/", "", "downloads", ""], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [15], - "score": 0.06666666666666667, - "category": "general" - }, - { - "url": "https://www.matillion.com/blog/the-importance-of-python-and-its-growing-influence-on-data-productivty-a-matillion-perspective", - "title": "The Importance of Python and its Growing Influence on ...", - "content": "Jan 30, 2024 \u2014 The synergy of low-code functionality with Python's versatility empowers data professionals to orchestrate complex transformations seamlessly.", - "img_src": null, - "engine": "google", - "parsed_url": [ - "https", - "www.matillion.com", - "/blog/the-importance-of-python-and-its-growing-influence-on-data-productivty-a-matillion-perspective", - "", - "", - "" - ], - "template": "default.html", - "engines": ["google"], - "positions": [10], - "score": 0.1, - "category": "general" - }, - { - "title": "BeginnersGuide - Python Wiki", - "content": "This is the program that reads Python programs and carries out their instructions; you need it before you can do any Python programming. Mac and Linux distributions may include an outdated version of Python (Python 2), but you should install an updated one (Python 3). See BeginnersGuide/Download for instructions to download the correct version ...", - "url": "https://wiki.python.org/moin/BeginnersGuide", - "engine": "duckduckgo", - "parsed_url": ["https", "wiki.python.org", "/moin/BeginnersGuide", "", "", ""], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [16], - "score": 0.0625, - "category": "general" - }, - { - "title": "Learn Python - Free Interactive Python Tutorial", - "content": "Learn Python from scratch or improve your skills with this website that offers tutorials, exercises, tests and certification. Explore topics such as basics, data science, advanced features and more with DataCamp.", - "url": "https://www.learnpython.org/", - "engine": "duckduckgo", - "parsed_url": ["https", "www.learnpython.org", "/", "", "", ""], - "template": "default.html", - "engines": ["duckduckgo"], - "positions": [17], - "score": 0.058823529411764705, - "category": "general" - } - ], - "answers": [], - "corrections": [], - "infoboxes": [ - { - "infobox": "Python", - "id": "https://en.wikipedia.org/wiki/Python_(programming_language)", - "content": "general-purpose programming language", - "img_src": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/.PY_file_recreation.png/500px-.PY_file_recreation.png", - "urls": [ - { - "title": "Official website", - "url": "https://www.python.org/", - "official": true - }, - { - "title": "Wikipedia (en)", - "url": "https://en.wikipedia.org/wiki/Python_(programming_language)" - }, - { - "title": "Wikidata", - "url": "http://www.wikidata.org/entity/Q28865" - } - ], - "attributes": [ - { - "label": "Inception", - "value": "Wednesday, February 20, 1991", - "entity": "P571" - }, - { - "label": "Developer", - "value": "Python Software Foundation, Guido van Rossum", - "entity": "P178" - }, - { - "label": "Copyright license", - "value": "Python Software Foundation License", - "entity": "P275" - }, - { - "label": "Programmed in", - "value": "C, Python", - "entity": "P277" - }, - { - "label": "Software version identifier", - "value": "3.12.3, 3.13.0a6", - "entity": "P348" - } - ], - "engine": "wikidata", - "engines": ["wikidata"] - } - ], - "suggestions": [ - "python turtle", - "micro python tutorial", - "python docs", - "python compiler", - "snapcraft python", - "micropython vs python", - "python online", - "python download" - ], - "unresponsive_engines": [] -} diff --git a/backend/open_webui/retrieval/web/testdata/serper.json b/backend/open_webui/retrieval/web/testdata/serper.json deleted file mode 100644 index b269eaf5b3..0000000000 --- a/backend/open_webui/retrieval/web/testdata/serper.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "searchParameters": { - "q": "apple inc", - "gl": "us", - "hl": "en", - "autocorrect": true, - "page": 1, - "type": "search" - }, - "knowledgeGraph": { - "title": "Apple", - "type": "Technology company", - "website": "http://www.apple.com/", - "imageUrl": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQwGQRv5TjjkycpctY66mOg_e2-npacrmjAb6_jAWhzlzkFE3OTjxyzbA&s=0", - "description": "Apple Inc. is an American multinational technology company specializing in consumer electronics, software and online services headquartered in Cupertino, California, United States.", - "descriptionSource": "Wikipedia", - "descriptionLink": "https://en.wikipedia.org/wiki/Apple_Inc.", - "attributes": { - "Headquarters": "Cupertino, CA", - "CEO": "Tim Cook (Aug 24, 2011–)", - "Founded": "April 1, 1976, Los Altos, CA", - "Sales": "1 (800) 692-7753", - "Products": "iPhone, Apple Watch, iPad, and more", - "Founders": "Steve Jobs, Steve Wozniak, and Ronald Wayne", - "Subsidiaries": "Apple Store, Beats Electronics, Beddit, and more" - } - }, - "organic": [ - { - "title": "Apple", - "link": "https://www.apple.com/", - "snippet": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...", - "sitelinks": [ - { - "title": "Support", - "link": "https://support.apple.com/" - }, - { - "title": "iPhone", - "link": "https://www.apple.com/iphone/" - }, - { - "title": "Apple makes business better.", - "link": "https://www.apple.com/business/" - }, - { - "title": "Mac", - "link": "https://www.apple.com/mac/" - } - ], - "position": 1 - }, - { - "title": "Apple Inc. - Wikipedia", - "link": "https://en.wikipedia.org/wiki/Apple_Inc.", - "snippet": "Apple Inc. is an American multinational technology company specializing in consumer electronics, software and online services headquartered in Cupertino, ...", - "attributes": { - "Products": "AirPods; Apple Watch; iPad; iPhone; Mac", - "Founders": "Steve Jobs; Steve Wozniak; Ronald Wayne", - "Founded": "April 1, 1976; 46 years ago in Los Altos, California, U.S", - "Industry": "Consumer electronics; Software services; Online services" - }, - "sitelinks": [ - { - "title": "History", - "link": "https://en.wikipedia.org/wiki/History_of_Apple_Inc." - }, - { - "title": "Timeline of Apple Inc. products", - "link": "https://en.wikipedia.org/wiki/Timeline_of_Apple_Inc._products" - }, - { - "title": "List of software by Apple Inc.", - "link": "https://en.wikipedia.org/wiki/List_of_software_by_Apple_Inc." - }, - { - "title": "Apple Store", - "link": "https://en.wikipedia.org/wiki/Apple_Store" - } - ], - "position": 2 - }, - { - "title": "Apple Inc. | History, Products, Headquarters, & Facts | Britannica", - "link": "https://www.britannica.com/topic/Apple-Inc", - "snippet": "Apple Inc., formerly Apple Computer, Inc., American manufacturer of personal computers, smartphones, tablet computers, computer peripherals, ...", - "date": "Aug 31, 2022", - "attributes": { - "Related People": "Steve Jobs Steve Wozniak Jony Ive Tim Cook Angela Ahrendts", - "Date": "1976 - present", - "Areas Of Involvement": "peripheral device" - }, - "position": 3 - }, - { - "title": "AAPL: Apple Inc Stock Price Quote - NASDAQ GS - Bloomberg.com", - "link": "https://www.bloomberg.com/quote/AAPL:US", - "snippet": "Stock analysis for Apple Inc (AAPL:NASDAQ GS) including stock price, stock chart, company news, key statistics, fundamentals and company profile.", - "position": 4 - }, - { - "title": "Apple Inc. (AAPL) Company Profile & Facts - Yahoo Finance", - "link": "https://finance.yahoo.com/quote/AAPL/profile/", - "snippet": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide. It also sells various related ...", - "position": 5 - }, - { - "title": "AAPL | Apple Inc. Stock Price & News - WSJ", - "link": "https://www.wsj.com/market-data/quotes/AAPL", - "snippet": "Apple, Inc. engages in the design, manufacture, and sale of smartphones, personal computers, tablets, wearables and accessories, and other varieties of ...", - "position": 6 - }, - { - "title": "Apple Inc Company Profile - Apple Inc Overview - GlobalData", - "link": "https://www.globaldata.com/company-profile/apple-inc/", - "snippet": "Apple Inc (Apple) designs, manufactures, and markets smartphones, tablets, personal computers (PCs), portable and wearable devices. The company also offers ...", - "position": 7 - }, - { - "title": "Apple Inc (AAPL) Stock Price & News - Google Finance", - "link": "https://www.google.com/finance/quote/AAPL:NASDAQ?hl=en", - "snippet": "Get the latest Apple Inc (AAPL) real-time quote, historical performance, charts, and other financial information to help you make more informed trading and ...", - "position": 8 - } - ], - "peopleAlsoAsk": [ - { - "question": "What does Apple Inc mean?", - "snippet": "Apple Inc., formerly Apple Computer, Inc., American manufacturer of personal\ncomputers, smartphones, tablet computers, computer peripherals, and computer\nsoftware. It was the first successful personal computer company and the\npopularizer of the graphical user interface.\nAug 31, 2022", - "title": "Apple Inc. | History, Products, Headquarters, & Facts | Britannica", - "link": "https://www.britannica.com/topic/Apple-Inc" - }, - { - "question": "Is Apple and Apple Inc same?", - "snippet": "Apple was founded as Apple Computer Company on April 1, 1976, by Steve Jobs,\nSteve Wozniak and Ronald Wayne to develop and sell Wozniak's Apple I personal\ncomputer. It was incorporated by Jobs and Wozniak as Apple Computer, Inc.", - "title": "Apple Inc. - Wikipedia", - "link": "https://en.wikipedia.org/wiki/Apple_Inc." - }, - { - "question": "Who owns Apple Inc?", - "snippet": "Apple Inc. is owned by two main institutional investors (Vanguard Group and\nBlackRock, Inc). While its major individual shareholders comprise people like\nArt Levinson, Tim Cook, Bruce Sewell, Al Gore, Johny Sroujli, and others.", - "title": "Who Owns Apple In 2022? - FourWeekMBA", - "link": "https://fourweekmba.com/who-owns-apple/" - }, - { - "question": "What products does Apple Inc offer?", - "snippet": "APPLE FOOTER\nStore.\nMac.\niPad.\niPhone.\nWatch.\nAirPods.\nTV & Home.\nAirTag.", - "title": "More items...", - "link": "https://www.apple.com/business/" - } - ], - "relatedSearches": [ - { - "query": "Who invented the iPhone" - }, - { - "query": "Apple Inc competitors" - }, - { - "query": "Apple iPad" - }, - { - "query": "iPhones" - }, - { - "query": "Apple Inc us" - }, - { - "query": "Apple company history" - }, - { - "query": "Apple Store" - }, - { - "query": "Apple customer service" - }, - { - "query": "Apple Watch" - }, - { - "query": "Apple Inc Industry" - }, - { - "query": "Apple Inc registered address" - }, - { - "query": "Apple Inc Bloomberg" - } - ] -} diff --git a/backend/open_webui/retrieval/web/testdata/serply.json b/backend/open_webui/retrieval/web/testdata/serply.json deleted file mode 100644 index 0fc2a31e4d..0000000000 --- a/backend/open_webui/retrieval/web/testdata/serply.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "ads": [], - "ads_count": 0, - "answers": [], - "results": [ - { - "title": "Apple", - "link": "https://www.apple.com/", - "description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...", - "additional_links": [ - { - "text": "AppleApplehttps://www.apple.com", - "href": "https://www.apple.com/" - } - ], - "cite": {}, - "subdomains": [ - { - "title": "Support", - "link": "https://support.apple.com/", - "description": "SupportContact - iPhone Support - Billing and Subscriptions - Apple Repair" - }, - { - "title": "Store", - "link": "https://www.apple.com/store", - "description": "StoreShop iPhone - Shop iPad - App Store - Shop Mac - ..." - }, - { - "title": "Mac", - "link": "https://www.apple.com/mac/", - "description": "MacMacBook Air - MacBook Pro - iMac - Compare Mac models - Mac mini" - }, - { - "title": "iPad", - "link": "https://www.apple.com/ipad/", - "description": "iPadShop iPad - iPad Pro - iPad Air - Compare iPad models - ..." - }, - { - "title": "Watch", - "link": "https://www.apple.com/watch/", - "description": "WatchShop Apple Watch - Series 9 - SE - Ultra 2 - Nike - Hermès - ..." - } - ], - "realPosition": 1 - }, - { - "title": "Apple", - "link": "https://www.apple.com/", - "description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...", - "additional_links": [ - { - "text": "AppleApplehttps://www.apple.com", - "href": "https://www.apple.com/" - } - ], - "cite": {}, - "realPosition": 2 - }, - { - "title": "Apple Inc.", - "link": "https://en.wikipedia.org/wiki/Apple_Inc.", - "description": "Apple Inc. (formerly Apple Computer, Inc.) is an American multinational corporation and technology company headquartered in Cupertino, California, ...", - "additional_links": [ - { - "text": "Apple Inc.Wikipediahttps://en.wikipedia.org › wiki › Apple_Inc", - "href": "https://en.wikipedia.org/wiki/Apple_Inc." - }, - { - "text": "", - "href": "https://en.wikipedia.org/wiki/Apple_Inc." - }, - { - "text": "History", - "href": "https://en.wikipedia.org/wiki/History_of_Apple_Inc." - }, - { - "text": "List of Apple products", - "href": "https://en.wikipedia.org/wiki/List_of_Apple_products" - }, - { - "text": "Litigation involving Apple Inc.", - "href": "https://en.wikipedia.org/wiki/Litigation_involving_Apple_Inc." - }, - { - "text": "Apple Park", - "href": "https://en.wikipedia.org/wiki/Apple_Park" - } - ], - "cite": { - "domain": "https://en.wikipedia.org › wiki › Apple_Inc", - "span": " › wiki › Apple_Inc" - }, - "realPosition": 3 - }, - { - "title": "Apple Inc. (AAPL) Company Profile & Facts", - "link": "https://finance.yahoo.com/quote/AAPL/profile/", - "description": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide. The company offers iPhone, a line ...", - "additional_links": [ - { - "text": "Apple Inc. (AAPL) Company Profile & FactsYahoo Financehttps://finance.yahoo.com › quote › AAPL › profile", - "href": "https://finance.yahoo.com/quote/AAPL/profile/" - } - ], - "cite": { - "domain": "https://finance.yahoo.com › quote › AAPL › profile", - "span": " › quote › AAPL › profile" - }, - "realPosition": 4 - }, - { - "title": "Apple Inc - Company Profile and News", - "link": "https://www.bloomberg.com/profile/company/AAPL:US", - "description": "Apple Inc. Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables and accessories, and sells a variety of related ...", - "additional_links": [ - { - "text": "Apple Inc - Company Profile and NewsBloomberghttps://www.bloomberg.com › company › AAPL:US", - "href": "https://www.bloomberg.com/profile/company/AAPL:US" - }, - { - "text": "", - "href": "https://www.bloomberg.com/profile/company/AAPL:US" - } - ], - "cite": { - "domain": "https://www.bloomberg.com › company › AAPL:US", - "span": " › company › AAPL:US" - }, - "realPosition": 5 - }, - { - "title": "Apple Inc. | History, Products, Headquarters, & Facts", - "link": "https://www.britannica.com/money/Apple-Inc", - "description": "May 22, 2024 — Apple Inc. is an American multinational technology company that revolutionized the technology sector through its innovation of computer ...", - "additional_links": [ - { - "text": "Apple Inc. | History, Products, Headquarters, & FactsBritannicahttps://www.britannica.com › money › Apple-Inc", - "href": "https://www.britannica.com/money/Apple-Inc" - }, - { - "text": "", - "href": "https://www.britannica.com/money/Apple-Inc" - } - ], - "cite": { - "domain": "https://www.britannica.com › money › Apple-Inc", - "span": " › money › Apple-Inc" - }, - "realPosition": 6 - } - ], - "shopping_ads": [], - "places": [ - { - "title": "Apple Inc." - }, - { - "title": "Apple Inc" - }, - { - "title": "Apple Inc" - } - ], - "related_searches": { - "images": [], - "text": [ - { - "title": "apple inc full form", - "link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+full+form&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhPEAE" - }, - { - "title": "apple company history", - "link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+company+history&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhOEAE" - }, - { - "title": "apple store", - "link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Store&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhQEAE" - }, - { - "title": "apple id", - "link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+id&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhSEAE" - }, - { - "title": "apple inc industry", - "link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+industry&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhREAE" - }, - { - "title": "apple login", - "link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+login&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhTEAE" - } - ] - }, - "image_results": [], - "carousel": [], - "total": 2450000000, - "knowledge_graph": "", - "related_questions": [ - "What does the Apple Inc do?", - "Why did Apple change to Apple Inc?", - "Who owns Apple Inc.?", - "What is Apple Inc best known for?" - ], - "carousel_count": 0, - "ts": 2.491065263748169, - "device_type": null -} diff --git a/backend/open_webui/retrieval/web/testdata/serpstack.json b/backend/open_webui/retrieval/web/testdata/serpstack.json deleted file mode 100644 index a82f689d8b..0000000000 --- a/backend/open_webui/retrieval/web/testdata/serpstack.json +++ /dev/null @@ -1,276 +0,0 @@ -{ - "request": { - "success": true, - "total_time_taken": 3.4, - "processed_timestamp": 1714968442, - "search_url": "http://www.google.com/search?q=mcdonalds\u0026gl=us\u0026hl=en\u0026safe=0\u0026num=10" - }, - "search_parameters": { - "engine": "google", - "type": "web", - "device": "desktop", - "auto_location": "1", - "google_domain": "google.com", - "gl": "us", - "hl": "en", - "safe": "0", - "news_type": "all", - "exclude_autocorrected_results": "0", - "images_color": "any", - "page": "1", - "num": "10", - "output": "json", - "csv_fields": "search_parameters.query,organic_results.position,organic_results.title,organic_results.url,organic_results.domain", - "query": "mcdonalds", - "action": "search", - "access_key": "aac48e007e15c532bb94ffb34532a4b2", - "error": {} - }, - "search_information": { - "total_results": 1170000000, - "time_taken_displayed": 0.49, - "detected_location": {}, - "did_you_mean": {}, - "no_results_for_original_query": false, - "showing_results_for": {} - }, - "organic_results": [ - { - "position": 1, - "title": "Our Full McDonald\u0027s Food Menu", - "snippet": "", - "prerender": false, - "cached_page_url": {}, - "related_pages_url": {}, - "url": "https://www.mcdonalds.com/us/en-us/full-menu.html", - "domain": "www.mcdonalds.com", - "displayed_url": "https://www.mcdonalds.com \u203a en-us \u203a full-menu" - }, - { - "position": 2, - "title": "McDonald\u0027s", - "snippet": "McDonald\u0027s is the world\u0027s largest fast food restaurant chain, serving over 69 million customers daily in over 100 countries in more than 40,000 outlets as of\u00a0...", - "prerender": false, - "cached_page_url": {}, - "related_pages_url": {}, - "url": "https://en.wikipedia.org/wiki/McDonald%27s", - "domain": "en.wikipedia.org", - "displayed_url": "https://en.wikipedia.org \u203a wiki \u203a McDonald\u0027s" - }, - { - "position": 3, - "title": "Restaurants Near Me: Nearby McDonald\u0027s Locations", - "snippet": "", - "prerender": false, - "cached_page_url": {}, - "related_pages_url": {}, - "url": "https://www.mcdonalds.com/us/en-us/restaurant-locator.html", - "domain": "www.mcdonalds.com", - "displayed_url": "https://www.mcdonalds.com \u203a en-us \u203a restaurant-locator" - }, - { - "position": 4, - "title": "Download the McDonald\u0027s App: Deals, Promotions \u0026 ...", - "snippet": "Download the McDonald\u0027s app for Mobile Order \u0026 Pay, exclusive deals and coupons, menu information and special promotions.", - "prerender": false, - "cached_page_url": {}, - "related_pages_url": {}, - "url": "https://www.mcdonalds.com/us/en-us/download-app.html", - "domain": "www.mcdonalds.com", - "displayed_url": "https://www.mcdonalds.com \u203a en-us \u203a download-app" - }, - { - "position": 5, - "title": "McDonald\u0027s Restaurant Careers in the US", - "snippet": "McDonald\u0027s restaurant jobs are one-of-a-kind \u2013 just like you. Restaurants are hiring across all levels, from Crew team to Management. Apply today!", - "prerender": false, - "cached_page_url": {}, - "related_pages_url": {}, - "url": "https://jobs.mchire.com/", - "domain": "jobs.mchire.com", - "displayed_url": "https://jobs.mchire.com" - } - ], - "inline_images": [ - { - "image_url": "https://serpstack-assets.apilayer.net/2418910010831954152.png", - "title": "" - } - ], - "local_results": [ - { - "position": 1, - "title": "McDonald\u0027s", - "coordinates": { - "latitude": 0, - "longitude": 0 - }, - "address": "", - "rating": 0, - "reviews": 0, - "type": "", - "price": {}, - "url": 0 - }, - { - "position": 2, - "title": "McDonald\u0027s", - "coordinates": { - "latitude": 0, - "longitude": 0 - }, - "address": "", - "rating": 0, - "reviews": 0, - "type": "", - "price": {}, - "url": 0 - }, - { - "position": 3, - "title": "McDonald\u0027s", - "coordinates": { - "latitude": 0, - "longitude": 0 - }, - "address": "", - "rating": 0, - "reviews": 0, - "type": "", - "price": {}, - "url": 0 - } - ], - "top_stories": [ - { - "block_position": 1, - "title": "Menu nutrition", - "url": "/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=mcdonald%27s+double+quarter+pounder+with+cheese\u0026stick=H4sIAAAAAAAAAONgFuLUz9U3ME-vLDBX4tVP1zc0TCsuNE0ytjTTUs5OttJPy89P0c9NzSuNLyjKL8tMSS2yAvNS80qKMlOLF7Hq5ian5Ocl5qSoFyuk5Jcm5aQqFJYmFpWkFikU5JfmATUolGeWZCgkZ6SmFqcCAM4ilJtxAAAA\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4Qri56BAh0EAM", - "source": "", - "uploaded": "", - "uploaded_utc": "2024-05-06T04:07:22.082Z" - }, - { - "block_position": 2, - "title": "Profiles", - "url": "https://www.instagram.com/McDonalds", - "source": "", - "uploaded": "", - "uploaded_utc": "2024-05-06T04:07:22.082Z" - }, - { - "block_position": 3, - "title": "People also search for", - "url": "/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026si=ACC90nzx_D3_zUKRnpAjmO0UBLNxnt7EyN4YYdru6U3bxLI-L5Wg8IL2sxPFxxcDEhVbocy-LJPZIvZySijw0ho2hfZ-KtV-sSEEJ9lw7JuEkXHDnRK5y4Dm8aqbiLwugbLbslwjG3hO_gpDTFZK2VoUGZPy2nrmOBCy0G3PoOfoiEtct2GSZlUz0uufG-xP8emtNzQKQpvjkAm5Zmi57iVZueiD62upz7-x2N3dAbwtm6FkInAPRw1yR91zuT7F3lEaPblTW3LaRwCDC0bvaRCh9x4N9zHgY1OOQa_rzts2jf5WpXcuw4Y%3D\u0026q=Burger+King\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4Qs9oBKAB6BAhzEAI", - "source": "", - "uploaded": "", - "uploaded_utc": "2024-05-06T04:07:22.082Z" - } - ], - "related_questions": [ - { - "question": "What\u0027s a number 7 at McDonald\u0027s?What\u0027s a number 7 at McDonald\u0027s?What\u0027s a number 7 at McDonald\u0027s?", - "answer": "", - "title": "", - "displayed_url": "" - }, - { - "question": "Why is McDonald\u0027s changing their name?Why is McDonald\u0027s changing their name?Why is McDonald\u0027s changing their name?", - "answer": "", - "title": "", - "displayed_url": "" - }, - { - "question": "What is the oldest still running Mcdonalds?What is the oldest still running Mcdonalds?What is the oldest still running Mcdonalds?", - "answer": "", - "title": "", - "displayed_url": "" - }, - { - "question": "Why is McDonald\u0027s now WcDonald\u0027s?Why is McDonald\u0027s now WcDonald\u0027s?Why is McDonald\u0027s now WcDonald\u0027s?", - "answer": "", - "title": "", - "displayed_url": "" - } - ], - "knowledge_graph": { - "title": "", - "type": "Fast-food restaurant company", - "image_urls": ["https://serpstack-assets.apilayer.net/2418910010831954152.png"], - "description": "McDonald\u0027s Corporation is an American multinational fast food chain, founded in 1940 as a restaurant operated by Richard and Maurice McDonald, in San Bernardino, California, United States.", - "source": { - "name": "Wikipedia", - "url": "https://en.wikipedia.org/wiki/McDonald\u0027s" - }, - "people_also_search_for": [], - "known_attributes": [ - { - "attribute": "kc:/business/business_operation:founder", - "link": "http://www.google.com/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=Ray+Kroc\u0026si=ACC90nzx_D3_zUKRnpAjmO0UBLNxnt7EyN4YYdru6U3bxLI-LxARWRdbk5SkoY2sDn5Qq7yOmqYGei6qZ7sfJhsjZXBPgjMlLbS7824rpJOm69GzqVWMdoNIZiFX2T4A2td14sZOn4a1BexZLtZXHU7NZdF6VsWbGMVuiSYtXdev7uaUjEJKumiwlqTAATTebOriYTEBuSzC\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4QmxMoAHoECHgQAg", - "name": "Founder: ", - "value": "Ray Kroc" - }, - { - "attribute": "kc:/organization/organization:ceo", - "link": "http://www.google.com/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=Chris+Kempczinski\u0026si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgKFbjdEFCDgxLbt57EDZGosYDGiZuq1AcBhA6IhTOSZxfVSySuGQ3VDwmmTA7Z93n3K3596jAuZH9VVv5h8PyvKJSuGuSsQWviJTl3eKj2UL1ZIWuDgkjyVMnC47rN7j0G9PlHRCCLdQF7VDQ1gubTiC4onXqLRBTbwAj6a--PD6Jv_NoA%3D%3D\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4QmxMoAHoECHUQAg", - "name": "CEO: ", - "value": "Chris Kempczinski (Nov 1, 2019\u2013)" - }, - { - "attribute": "kc:/business/employer:revenue", - "link": "", - "name": "Revenue: ", - "value": "25.49\u00a0billion USD (2023)" - }, - { - "attribute": "kc:/organization/organization:founded", - "link": "http://www.google.com/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=Des+Plaines\u0026si=ACC90nyvvWro6QmnyY1IfSdgk5wwjB1r8BGd_IWRjXqmKPQqm_yqLtI_DBi5PXGOtg_Z3qrzzEP6mcih1nN7h5A7v6OefnEJiC7a8dBR-v9LxlRubfyR6vlMr3fZ3TmVKWwz9FRpvZb1eYNt-RM7KIDKQlwGEIgINvzhxjUrv6uxSmceduzxd8W7Pkz71XGwxF0F8OlSzHlx\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4QmxMoAHoECG4QAg", - "name": "Founded: ", - "value": "April 15, 1955, Des Plaines, IL" - }, - { - "attribute": "kc:/organization/organization:headquarters", - "link": "http://www.google.com/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=Chicago\u0026si=ACC90nyvvWro6QmnyY1IfSdgk5wwjB1r8BGd_IWRjXqmKPQqm-46AEJ_kJbUIEvsvEEZqteiYJvXVXs2ScRNDvFFpjfeAaW3dxtpTGCgcsf5RMdi6IdzOdtjJMN3ZaFwqZOmdi7tC6r0Mh1O9bnP3HrVDB9hH02m7aA6f70dCAfTdpOFnGxDU6wVMAI5MxWBE3wTugtUDOK-\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4QmxMoAHoECHYQAg", - "name": "Headquarters: ", - "value": "Chicago, IL" - }, - { - "attribute": "kc:/organization/organization:president", - "link": "http://www.google.com/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=Chris+Kempczinski\u0026si=ACC90nwLLwns5sISZcdzuISy7t-NHozt8Cbt6G3WNQfC9ekAgKFbjdEFCDgxLbt57EDZGosYDGiZuq1AcBhA6IhTOSZxfVSySuGQ3VDwmmTA7Z93n3K3596jAuZH9VVv5h8PyvKJSuGuSsQWviJTl3eKj2UL1ZIWuDgkjyVMnC47rN7j0G9PlHRCCLdQF7VDQ1gubTiC4onXqLRBTbwAj6a--PD6Jv_NoA%3D%3D\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4QmxMoAHoECHEQAg", - "name": "President: ", - "value": "Chris Kempczinski" - } - ], - "website": "https://www.mcdonalds.com/us/en-us.html", - "profiles": [ - { - "name": "Instagram", - "url": "https://www.instagram.com/McDonalds" - }, - { - "name": "X (Twitter)", - "url": "https://twitter.com/McDonalds" - }, - { - "name": "Facebook", - "url": "https://www.facebook.com/McDonaldsUS" - }, - { - "name": "YouTube", - "url": "https://www.youtube.com/user/McDonaldsUS" - }, - { - "name": "Pinterest", - "url": "https://www.pinterest.com/mcdonalds" - } - ], - "founded": "April 15, 1955, Des Plaines, IL", - "headquarters": "Chicago, IL", - "founders": [ - { - "name": "Ray Kroc", - "link": "http://www.google.com/search?safe=0\u0026sca_esv=c9c7fd42856085e2\u0026sca_upv=1\u0026gl=us\u0026hl=en\u0026q=Ray+Kroc\u0026si=ACC90nzx_D3_zUKRnpAjmO0UBLNxnt7EyN4YYdru6U3bxLI-LxARWRdbk5SkoY2sDn5Qq7yOmqYGei6qZ7sfJhsjZXBPgjMlLbS7824rpJOm69GzqVWMdoNIZiFX2T4A2td14sZOn4a1BexZLtZXHU7NZdF6VsWbGMVuiSYtXdev7uaUjEJKumiwlqTAATTebOriYTEBuSzC\u0026sa=X\u0026ved=2ahUKEwjF55alk_iFAxXlamwGHbqgAs4QmxMoAHoECHgQAg" - } - ] - } -} diff --git a/backend/open_webui/retrieval/web/utils.py b/backend/open_webui/retrieval/web/utils.py index 6ee0e3781a..4f2743d169 100644 --- a/backend/open_webui/retrieval/web/utils.py +++ b/backend/open_webui/retrieval/web/utils.py @@ -5,8 +5,6 @@ import socket import ssl import urllib.parse import urllib.request - -import requests from datetime import datetime, time, timedelta from typing import ( Any, @@ -14,41 +12,41 @@ from typing import ( Dict, Iterator, List, + Literal, Optional, Sequence, Union, - Literal, ) -from fastapi.concurrency import run_in_threadpool import aiohttp import certifi +import requests import validators +from fastapi.concurrency import run_in_threadpool from langchain_community.document_loaders import PlaywrightURLLoader, WebBaseLoader from langchain_community.document_loaders.base import BaseLoader from langchain_core.documents import Document - -from open_webui.retrieval.loaders.tavily import TavilyLoader -from open_webui.retrieval.loaders.external_web import ExternalWebLoader -from open_webui.retrieval.web.firecrawl import scrape_firecrawl_url -from open_webui.constants import ERROR_MESSAGES from open_webui.config import ( ENABLE_RAG_LOCAL_WEB_FETCH, - PLAYWRIGHT_WS_URL, - PLAYWRIGHT_TIMEOUT, - WEB_LOADER_ENGINE, - WEB_LOADER_TIMEOUT, + EXTERNAL_WEB_LOADER_API_KEY, + EXTERNAL_WEB_LOADER_URL, FIRECRAWL_API_BASE_URL, FIRECRAWL_API_KEY, FIRECRAWL_TIMEOUT, + PLAYWRIGHT_TIMEOUT, + PLAYWRIGHT_WS_URL, TAVILY_API_KEY, TAVILY_EXTRACT_DEPTH, - EXTERNAL_WEB_LOADER_URL, - EXTERNAL_WEB_LOADER_API_KEY, WEB_FETCH_FILTER_LIST, + WEB_LOADER_ENGINE, + WEB_LOADER_TIMEOUT, ) +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import AIOHTTP_CLIENT_ALLOW_REDIRECTS, AIOHTTP_CLIENT_SESSION_SSL, USER_AGENT +from open_webui.retrieval.loaders.external_web import ExternalWebLoader +from open_webui.retrieval.loaders.tavily import TavilyLoader +from open_webui.retrieval.web.firecrawl import scrape_firecrawl_url from open_webui.utils.misc import is_string_allowed -from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL log = logging.getLogger(__name__) @@ -69,6 +67,14 @@ def validate_url(url: Union[str, Sequence[str]]): if isinstance(validators.url(url), validators.ValidationError): raise ValueError(ERROR_MESSAGES.INVALID_URL) + # Reject parser-confusing chars: urlparse and requests/aiohttp split + # on these differently, e.g. http://127.0.0.1\@1.1.1.1 → urlparse + # extracts 1.1.1.1 (public, passes filter) while requests connects + # to 127.0.0.1 (internal). Same shape with tab/CR/LF. + if any(ch in url for ch in ('\\', '\t', '\n', '\r')): + log.warning(f'Blocked URL with parser-confusing char: {url!r}') + raise ValueError(ERROR_MESSAGES.INVALID_URL) + parsed_url = urllib.parse.urlparse(url) # Protocol validation - only allow http/https @@ -486,6 +492,26 @@ class SafeWebBaseLoader(WebBaseLoader): super().__init__(*args, **kwargs) self.trust_env = trust_env + # Propagate USER_AGENT env var so that both the sync _scrape() and + # async _fetch() paths present a real UA instead of python-requests/2.x + # which gets blocked by Cloudflare, Wikipedia, and similar bot-detection. + # _fetch() forwards self.session.headers to the aiohttp session, so + # setting it here covers both code-paths. + if USER_AGENT: + self.session.headers['User-Agent'] = USER_AGENT + + # Prevent redirect-based SSRF on the synchronous _scrape() path. + # validate_url() is called once on the originally-submitted URL, but the + # parent WebBaseLoader's _scrape() invokes self.session.get(url, **self.requests_kwargs) + # which by default follows redirects. Without the override below, an attacker + # can submit a public URL that 302-redirects to an internal address (RFC1918, + # 127.0.0.1, 169.254.169.254, etc.) and the redirected target is fetched without + # re-validation. Matches the policy enforced on the async _fetch() path below. + self.requests_kwargs = { + **(self.requests_kwargs or {}), + 'allow_redirects': AIOHTTP_CLIENT_ALLOW_REDIRECTS, + } + async def _fetch(self, url: str, retries: int = 3, cooldown: int = 2, backoff: float = 1.5) -> str: async with aiohttp.ClientSession(trust_env=self.trust_env) as session: for i in range(retries): @@ -502,7 +528,6 @@ class SafeWebBaseLoader(WebBaseLoader): async with session.get( url, **(self.requests_kwargs | kwargs), - allow_redirects=False, ) as response: if self.raise_for_status: response.raise_for_status() diff --git a/backend/open_webui/retrieval/web/yacy.py b/backend/open_webui/retrieval/web/yacy.py index 32ca04f531..969acb7398 100644 --- a/backend/open_webui/retrieval/web/yacy.py +++ b/backend/open_webui/retrieval/web/yacy.py @@ -2,8 +2,8 @@ import logging from typing import Optional import requests -from requests.auth import HTTPDigestAuth from open_webui.retrieval.web.main import SearchResult, get_filtered_results +from requests.auth import HTTPDigestAuth log = logging.getLogger(__name__) diff --git a/backend/open_webui/retrieval/web/yandex.py b/backend/open_webui/retrieval/web/yandex.py index 352d2a3afb..d338db11a3 100644 --- a/backend/open_webui/retrieval/web/yandex.py +++ b/backend/open_webui/retrieval/web/yandex.py @@ -3,23 +3,22 @@ import io import json import logging import os -from typing import Optional, List - -import requests - -from fastapi import Request - -from open_webui.retrieval.web.main import SearchResult, get_filtered_results -from open_webui.utils.headers import include_user_info_headers -from open_webui.env import FORWARD_SESSION_INFO_HEADER_CHAT_ID - +from typing import List, Optional from xml.etree import ElementTree as ET from xml.etree.ElementTree import Element +import requests +from fastapi import Request +from open_webui.env import FORWARD_SESSION_INFO_HEADER_CHAT_ID +from open_webui.retrieval.web.main import SearchResult, get_filtered_results +from open_webui.utils.headers import include_user_info_headers + log = logging.getLogger(__name__) def xml_element_contents_to_string(element: Element) -> str: + if element is None: + return '' buffer = [element.text if element.text else ''] for child in element: @@ -120,8 +119,8 @@ def search_yandex( if __name__ == '__main__': - from starlette.datastructures import Headers from fastapi import FastAPI + from starlette.datastructures import Headers result = search_yandex( Request( diff --git a/backend/open_webui/retrieval/web/ydc.py b/backend/open_webui/retrieval/web/ydc.py index 21059d8b03..446fa5f16d 100644 --- a/backend/open_webui/retrieval/web/ydc.py +++ b/backend/open_webui/retrieval/web/ydc.py @@ -1,5 +1,5 @@ import logging -from typing import Optional, List +from typing import List, Optional import requests from open_webui.retrieval.web.main import SearchResult, get_filtered_results diff --git a/backend/open_webui/routers/analytics.py b/backend/open_webui/routers/analytics.py index fd045f79e7..fcef30342c 100644 --- a/backend/open_webui/routers/analytics.py +++ b/backend/open_webui/routers/analytics.py @@ -1,17 +1,17 @@ -from typing import Optional -from datetime import datetime, timedelta -from collections import defaultdict import logging -from fastapi import APIRouter, Depends, Query -from pydantic import BaseModel +from collections import defaultdict +from datetime import datetime, timedelta +from typing import Optional -from open_webui.models.chat_messages import ChatMessages, ChatMessageModel +from fastapi import APIRouter, Depends, Query +from open_webui.internal.db import get_async_session +from open_webui.models.chat_messages import ChatMessageModel, ChatMessages from open_webui.models.chats import Chats +from open_webui.models.feedbacks import Feedbacks from open_webui.models.groups import Groups from open_webui.models.users import Users -from open_webui.models.feedbacks import Feedbacks from open_webui.utils.auth import get_admin_user -from open_webui.internal.db import get_async_session +from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index c69be124e5..bba91c2d5a 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -1,22 +1,22 @@ +import asyncio +import base64 import hashlib +import html +import io import json import logging +import mimetypes import os import uuid -import html -import base64 -from pydub import AudioSegment -from pydub.silence import split_on_silence from concurrent.futures import ThreadPoolExecutor +from fnmatch import fnmatch from typing import Optional -from fnmatch import fnmatch -import aiohttp import aiofiles +import aiohttp import requests -import mimetypes - from fastapi import ( + APIRouter, Depends, FastAPI, File, @@ -25,38 +25,36 @@ from fastapi import ( Request, UploadFile, status, - APIRouter, ) from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse -from pydantic import BaseModel - - -from open_webui.utils.misc import strict_match_mime_type -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission -from open_webui.utils.headers import include_user_info_headers from open_webui.config import ( - WHISPER_MODEL_AUTO_UPDATE, - WHISPER_COMPUTE_TYPE, - WHISPER_MODEL_DIR, - WHISPER_VAD_FILTER, CACHE_DIR, - WHISPER_LANGUAGE, - WHISPER_MULTILINGUAL, ELEVENLABS_API_BASE_URL, + WHISPER_COMPUTE_TYPE, + WHISPER_LANGUAGE, + WHISPER_MODEL_AUTO_UPDATE, + WHISPER_MODEL_DIR, + WHISPER_MULTILINGUAL, + WHISPER_VAD_FILTER, ) - from open_webui.constants import ERROR_MESSAGES from open_webui.env import ( - ENV, AIOHTTP_CLIENT_SESSION_SSL, AIOHTTP_CLIENT_TIMEOUT, AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST, BYPASS_PYDUB_PREPROCESSING, DEVICE_TYPE, ENABLE_FORWARD_USER_INFO_HEADERS, + ENV, ) +from open_webui.utils.access_control import has_permission +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.headers import include_user_info_headers +from open_webui.utils.misc import strict_match_mime_type +from pydantic import BaseModel +from pydub import AudioSegment +from pydub.silence import split_on_silence router = APIRouter() @@ -127,6 +125,54 @@ def convert_audio_to_mp3(file_path): return None +def transcode_audio_to_mp3(audio_data: bytes, content_type_header: str, output_path: str) -> bool: + """ + Transcode audio bytes to MP3 if the Content-Type indicates a non-MP3 format. + + Handles raw PCM audio (e.g. Gemini-TTS via OpenRouter/LiteLLM) by parsing + optional rate/channels from the Content-Type params, defaulting to 24kHz, + 16-bit, mono. For other non-MP3 formats, uses pydub auto-detection. + + Returns True if transcoding was performed, False if the data is already MP3. + Respects BYPASS_PYDUB_PREPROCESSING — when set, writes raw bytes and logs a warning. + """ + mime_type = content_type_header.split(';')[0].strip().lower() + + if mime_type in ('audio/mpeg', 'audio/mp3'): + return False + + if BYPASS_PYDUB_PREPROCESSING: + log.warning( + f'TTS returned {mime_type} but BYPASS_PYDUB_PREPROCESSING is set; writing raw audio without transcoding' + ) + return False + + if mime_type in ('audio/pcm', 'audio/l16', 'audio/raw'): + # Parse optional rate/channels from Content-Type params, + # default: 24kHz, 16-bit, mono (standard for Gemini TTS). + ct_params = {} + for part in content_type_header.split(';')[1:]: + key_val = part.strip().split('=') + if len(key_val) == 2: + ct_params[key_val[0].strip().lower()] = key_val[1].strip() + + sample_rate = int(ct_params.get('rate', 24000)) + channels = int(ct_params.get('channels', 1)) + + audio_segment = AudioSegment.from_raw( + io.BytesIO(audio_data), + sample_width=2, + frame_rate=sample_rate, + channels=channels, + ) + else: + audio_segment = AudioSegment.from_file(io.BytesIO(audio_data)) + + audio_segment.export(str(output_path), format='mp3') + log.info(f'Transcoded {mime_type} audio to MP3: {output_path}') + return True + + def set_faster_whisper_model(model: str, auto_update: bool = False): whisper_model = None if model: @@ -178,6 +224,7 @@ class STTConfigForm(BaseModel): ENGINE: str MODEL: str SUPPORTED_CONTENT_TYPES: list[str] = [] + ALLOWED_EXTENSIONS: list[str] = [] WHISPER_MODEL: str DEEPGRAM_API_KEY: str AZURE_API_KEY: str @@ -219,6 +266,7 @@ async def get_audio_config(request: Request, user=Depends(get_admin_user)): 'ENGINE': request.app.state.config.STT_ENGINE, 'MODEL': request.app.state.config.STT_MODEL, 'SUPPORTED_CONTENT_TYPES': request.app.state.config.STT_SUPPORTED_CONTENT_TYPES, + 'ALLOWED_EXTENSIONS': request.app.state.config.STT_ALLOWED_EXTENSIONS, 'WHISPER_MODEL': request.app.state.config.WHISPER_MODEL, 'DEEPGRAM_API_KEY': request.app.state.config.DEEPGRAM_API_KEY, 'AZURE_API_KEY': request.app.state.config.AUDIO_STT_AZURE_API_KEY, @@ -254,6 +302,7 @@ async def update_audio_config(request: Request, form_data: AudioConfigUpdateForm request.app.state.config.STT_ENGINE = form_data.stt.ENGINE request.app.state.config.STT_MODEL = form_data.stt.MODEL request.app.state.config.STT_SUPPORTED_CONTENT_TYPES = form_data.stt.SUPPORTED_CONTENT_TYPES + request.app.state.config.STT_ALLOWED_EXTENSIONS = form_data.stt.ALLOWED_EXTENSIONS request.app.state.config.WHISPER_MODEL = form_data.stt.WHISPER_MODEL request.app.state.config.DEEPGRAM_API_KEY = form_data.stt.DEEPGRAM_API_KEY @@ -295,6 +344,7 @@ async def update_audio_config(request: Request, form_data: AudioConfigUpdateForm 'ENGINE': request.app.state.config.STT_ENGINE, 'MODEL': request.app.state.config.STT_MODEL, 'SUPPORTED_CONTENT_TYPES': request.app.state.config.STT_SUPPORTED_CONTENT_TYPES, + 'ALLOWED_EXTENSIONS': request.app.state.config.STT_ALLOWED_EXTENSIONS, 'WHISPER_MODEL': request.app.state.config.WHISPER_MODEL, 'DEEPGRAM_API_KEY': request.app.state.config.DEEPGRAM_API_KEY, 'AZURE_API_KEY': request.app.state.config.AUDIO_STT_AZURE_API_KEY, @@ -310,8 +360,8 @@ async def update_audio_config(request: Request, form_data: AudioConfigUpdateForm def load_speech_pipeline(request): - from transformers import pipeline from datasets import load_dataset + from transformers import pipeline if request.app.state.speech_synthesiser is None: request.app.state.speech_synthesiser = pipeline('text-to-speech', 'microsoft/speecht5_tts') @@ -387,8 +437,12 @@ async def speech(request: Request, user=Depends(get_verified_user)): r.raise_for_status() - async with aiofiles.open(file_path, 'wb') as f: - await f.write(await r.read()) + audio_data = await r.read() + content_type_header = r.headers.get('Content-Type', 'audio/mpeg') + + if not transcode_audio_to_mp3(audio_data, content_type_header, file_path): + async with aiofiles.open(file_path, 'wb') as f: + await f.write(audio_data) async with aiofiles.open(file_body_path, 'w') as f: await f.write(json.dumps(payload)) @@ -534,8 +588,8 @@ async def speech(request: Request, user=Depends(get_verified_user)): log.exception(e) raise HTTPException(status_code=400, detail='Invalid JSON payload') - import torch import soundfile as sf + import torch load_speech_pipeline(request) @@ -1107,6 +1161,11 @@ def transcribe(request: Request, file_path: str, metadata: Optional[dict] = None else: if is_audio_conversion_required(file_path): file_path = convert_audio_to_mp3(file_path) + if not file_path: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Audio conversion failed. The audio file may be corrupted or empty.', + ) try: file_path = compress_audio(file_path) @@ -1126,7 +1185,12 @@ def transcribe(request: Request, file_path: str, metadata: Optional[dict] = None results = [] try: - with ThreadPoolExecutor() as executor: + if getattr(request.app.state.config, 'STT_ENGINE', '') == '': + max_workers = 1 + else: + max_workers = None + + with ThreadPoolExecutor(max_workers=max_workers) as executor: # Submit tasks for each chunk_path futures = [ executor.submit(transcription_handler, request, chunk_path, metadata, user) @@ -1242,12 +1306,19 @@ async def transcription( try: safe_name = os.path.basename(file.filename) if file.filename else '' - ext = safe_name.rsplit('.', 1)[-1] if '.' in safe_name else '' + ext = safe_name.rsplit('.', 1)[-1].lower() if '.' in safe_name else '' + + allowed_extensions = getattr(request.app.state.config, 'STT_ALLOWED_EXTENSIONS', []) + if allowed_extensions and ext not in allowed_extensions: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Invalid audio file extension', + ) id = uuid.uuid4() filename = f'{id}.{ext}' - contents = file.file.read() + contents = await file.read() file_dir = os.path.join(CACHE_DIR, 'audio', 'transcriptions') os.makedirs(file_dir, exist_ok=True) @@ -1266,7 +1337,7 @@ async def transcription( if language: metadata = {'language': language} - result = transcribe(request, file_path, metadata, user) + result = await asyncio.to_thread(transcribe, request, file_path, metadata, user) return { **result, diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 6d2349f89f..b3a45a58f3 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -1,92 +1,86 @@ +from __future__ import annotations + import asyncio -import re -import uuid -import time import datetime import logging -from aiohttp import ClientSession +import re +import time import urllib +import uuid +from ssl import CERT_NONE, CERT_REQUIRED, PROTOCOL_TLS +from typing import List, Optional - +from aiohttp import ClientSession +from fastapi import APIRouter, Depends, HTTPException, Request, status +from fastapi.responses import JSONResponse, RedirectResponse, Response +from ldap3 import NONE, Connection, Server, Tls +from ldap3.utils.conv import escape_filter_chars +from open_webui.config import ( + ENABLE_LDAP, + ENABLE_OAUTH_SIGNUP, + ENABLE_PASSWORD_AUTH, + OAUTH_MERGE_ACCOUNTS_BY_EMAIL, + OAUTH_PROVIDERS, + OPENID_END_SESSION_ENDPOINT, + OPENID_PROVIDER_URL, +) +from open_webui.constants import ERROR_MESSAGES, WEBHOOK_MESSAGES +from open_webui.env import ( + AIOHTTP_CLIENT_SESSION_SSL, + ENABLE_INITIAL_ADMIN_SIGNUP, + ENABLE_OAUTH_TOKEN_EXCHANGE, + WEBUI_AUTH, + WEBUI_AUTH_COOKIE_SAME_SITE, + WEBUI_AUTH_COOKIE_SECURE, + WEBUI_AUTH_SIGNOUT_REDIRECT_URL, + WEBUI_AUTH_TRUSTED_EMAIL_HEADER, + WEBUI_AUTH_TRUSTED_GROUPS_HEADER, + WEBUI_AUTH_TRUSTED_NAME_HEADER, + WEBUI_AUTH_TRUSTED_ROLE_HEADER, +) +from open_webui.internal.db import get_async_session from open_webui.models.auths import ( AddUserForm, ApiKey, Auths, - Token, LdapForm, SigninForm, SigninResponse, SignupForm, + Token, UpdatePasswordForm, ) -from open_webui.models.users import ( - UserModel, - UserProfileImageResponse, - Users, - UpdateProfileForm, - UserStatus, -) from open_webui.models.groups import Groups from open_webui.models.oauth_sessions import OAuthSessions - -from open_webui.constants import ERROR_MESSAGES, WEBHOOK_MESSAGES -from open_webui.env import ( - WEBUI_AUTH, - WEBUI_AUTH_TRUSTED_EMAIL_HEADER, - WEBUI_AUTH_TRUSTED_NAME_HEADER, - WEBUI_AUTH_TRUSTED_GROUPS_HEADER, - WEBUI_AUTH_TRUSTED_ROLE_HEADER, - WEBUI_AUTH_COOKIE_SAME_SITE, - WEBUI_AUTH_COOKIE_SECURE, - WEBUI_AUTH_SIGNOUT_REDIRECT_URL, - ENABLE_INITIAL_ADMIN_SIGNUP, - ENABLE_OAUTH_TOKEN_EXCHANGE, - AIOHTTP_CLIENT_SESSION_SSL, +from open_webui.models.users import ( + UpdateProfileForm, + UserModel, + UserProfileImageResponse, + Users, + UserStatus, ) -from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi.responses import RedirectResponse, Response, JSONResponse -from open_webui.config import ( - OPENID_PROVIDER_URL, - OPENID_END_SESSION_ENDPOINT, - ENABLE_OAUTH_SIGNUP, - ENABLE_LDAP, - ENABLE_PASSWORD_AUTH, - OAUTH_PROVIDERS, - OAUTH_MERGE_ACCOUNTS_BY_EMAIL, -) -from open_webui.utils.oauth import auth_manager_config -from pydantic import BaseModel - -from open_webui.utils.misc import parse_duration, validate_email_format +from open_webui.utils.access_control import get_permissions, has_permission from open_webui.utils.auth import ( - validate_password, - verify_password, - decode_token, - invalidate_token, create_api_key, create_token, + decode_token, get_admin_user, - get_verified_user, get_current_user, - get_password_hash, get_http_authorization_cred, + get_password_hash, + get_verified_user, + invalidate_token, + validate_password, + verify_password, ) -from open_webui.internal.db import get_async_session -from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.utils.webhook import post_webhook -from open_webui.utils.access_control import get_permissions, has_permission from open_webui.utils.groups import apply_default_group_assignment - -from open_webui.utils.redis import get_redis_client +from open_webui.utils.misc import parse_duration, validate_email_format +from open_webui.utils.oauth import auth_manager_config from open_webui.utils.rate_limit import RateLimiter - - -from typing import Optional, List - -from ssl import CERT_NONE, CERT_REQUIRED, PROTOCOL_TLS - -from ldap3 import Server, Connection, NONE, Tls -from ldap3.utils.conv import escape_filter_chars +from open_webui.utils.redis import get_redis_client +from open_webui.utils.webhook import post_webhook +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession router = APIRouter() @@ -155,14 +149,14 @@ async def create_session_response( class SessionUserResponse(Token, UserProfileImageResponse): - expires_at: Optional[int] = None - permissions: Optional[dict] = None + expires_at: int | None = None + permissions: dict | None = None class SessionUserInfoResponse(SessionUserResponse, UserStatus): - bio: Optional[str] = None - gender: Optional[str] = None - date_of_birth: Optional[datetime.date] = None + bio: str | None = None + gender: str | None = None + date_of_birth: datetime.date | None = None @router.get('/', response_model=SessionUserInfoResponse) @@ -209,7 +203,7 @@ async def get_session_user( user_permissions = await get_permissions(user.id, request.app.state.config.USER_PERMISSIONS, db=db) - return { + response_data = { 'token': token, 'token_type': 'Bearer', 'expires_at': expires_at, @@ -227,6 +221,8 @@ async def get_session_user( 'permissions': user_permissions, } + return response_data + ############################ # Update Profile @@ -522,6 +518,18 @@ async def ldap_auth( db=db, ) + if request.app.state.config.WEBHOOK_URL: + await post_webhook( + request.app.state.WEBUI_NAME, + request.app.state.config.WEBHOOK_URL, + WEBHOOK_MESSAGES.USER_SIGNUP(user.name), + { + 'action': 'signup', + 'message': WEBHOOK_MESSAGES.USER_SIGNUP(user.name), + 'user': user.model_dump_json(exclude_none=True), + }, + ) + except HTTPException: raise except Exception as err: @@ -773,7 +781,7 @@ async def signup( raise HTTPException(500, detail='An internal error occurred during signup.') -@router.get('/signout') +@router.post('/signout') async def signout(request: Request, response: Response, db: AsyncSession = Depends(get_async_session)): # get auth token from headers or cookies token = None @@ -1019,7 +1027,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)): class AdminConfig(BaseModel): SHOW_ADMIN_DETAILS: bool - ADMIN_EMAIL: Optional[str] = None + ADMIN_EMAIL: str | None = None WEBUI_URL: str ENABLE_SIGNUP: bool ENABLE_API_KEYS: bool @@ -1031,9 +1039,9 @@ class AdminConfig(BaseModel): ENABLE_COMMUNITY_SHARING: bool ENABLE_MESSAGE_RATING: bool ENABLE_FOLDERS: bool - FOLDER_MAX_FILE_COUNT: Optional[int | str] = None - AUTOMATION_MAX_COUNT: Optional[int | str] = None - AUTOMATION_MIN_INTERVAL: Optional[int | str] = None + FOLDER_MAX_FILE_COUNT: int | str | None = None + AUTOMATION_MAX_COUNT: int | str | None = None + AUTOMATION_MIN_INTERVAL: int | str | None = None ENABLE_AUTOMATIONS: bool ENABLE_CHANNELS: bool ENABLE_CALENDAR: bool @@ -1041,9 +1049,9 @@ class AdminConfig(BaseModel): ENABLE_NOTES: bool ENABLE_USER_WEBHOOKS: bool ENABLE_USER_STATUS: bool - PENDING_USER_OVERLAY_TITLE: Optional[str] = None - PENDING_USER_OVERLAY_CONTENT: Optional[str] = None - RESPONSE_WATERMARK: Optional[str] = None + PENDING_USER_OVERLAY_TITLE: str | None = None + PENDING_USER_OVERLAY_CONTENT: str | None = None + RESPONSE_WATERMARK: str | None = None @router.post('/admin/config') @@ -1128,7 +1136,7 @@ async def update_admin_config(request: Request, form_data: AdminConfig, user=Dep class LdapServerConfig(BaseModel): label: str host: str - port: Optional[int] = None + port: int | None = None attribute_for_mail: str = 'mail' attribute_for_username: str = 'uid' app_dn: str @@ -1136,9 +1144,9 @@ class LdapServerConfig(BaseModel): search_base: str search_filters: str = '' use_tls: bool = True - certificate_path: Optional[str] = None + certificate_path: str | None = None validate_cert: bool = True - ciphers: Optional[str] = 'ALL' + ciphers: str | None = 'ALL' @router.get('/admin/config/ldap/server', response_model=LdapServerConfig) @@ -1211,7 +1219,7 @@ async def get_ldap_config(request: Request, user=Depends(get_admin_user)): class LdapConfigForm(BaseModel): - enable_ldap: Optional[bool] = None + enable_ldap: bool | None = None @router.post('/admin/config/ldap') diff --git a/backend/open_webui/routers/automations.py b/backend/open_webui/routers/automations.py index 4ff66feb97..fced12978a 100644 --- a/backend/open_webui/routers/automations.py +++ b/backend/open_webui/routers/automations.py @@ -1,30 +1,29 @@ import asyncio import logging - from typing import Optional -from fastapi import APIRouter, Depends, HTTPException, Request, status -from sqlalchemy.ext.asyncio import AsyncSession +from fastapi import APIRouter, Depends, HTTPException, Request, status +from open_webui.constants import ERROR_MESSAGES +from open_webui.internal.db import get_async_session from open_webui.models.automations import ( - Automations, - AutomationRuns, AutomationForm, + AutomationListResponse, AutomationModel, AutomationResponse, AutomationRunModel, - AutomationListResponse, + AutomationRuns, + Automations, ) -from open_webui.utils.automations import ( - validate_rrule, - next_run_ns, - next_n_runs_ns, - execute_automation, - rrule_interval_seconds, -) -from open_webui.utils.auth import get_verified_user, get_admin_user from open_webui.utils.access_control import has_permission -from open_webui.internal.db import get_async_session -from open_webui.constants import ERROR_MESSAGES +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.automations import ( + execute_automation, + next_n_runs_ns, + next_run_ns, + rrule_interval_seconds, + validate_rrule, +) +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/routers/calendar.py b/backend/open_webui/routers/calendar.py index c95888ebfa..6c567aa3a8 100644 --- a/backend/open_webui/routers/calendar.py +++ b/backend/open_webui/routers/calendar.py @@ -3,28 +3,27 @@ import time from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Request, status - +from open_webui.constants import ERROR_MESSAGES +from open_webui.models.access_grants import AccessGrants from open_webui.models.calendar import ( - Calendars, - CalendarEvents, CalendarEventAttendees, - CalendarForm, - CalendarUpdateForm, CalendarEventForm, - CalendarEventUpdateForm, - CalendarModel, - CalendarEventModel, - CalendarEventUserResponse, CalendarEventListResponse, + CalendarEventModel, + CalendarEvents, + CalendarEventUpdateForm, + CalendarEventUserResponse, + CalendarForm, + CalendarModel, + Calendars, + CalendarUpdateForm, RSVPForm, ) -from open_webui.models.access_grants import AccessGrants from open_webui.models.groups import Groups from open_webui.models.users import UserModel +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission from open_webui.utils.auth import get_verified_user -from open_webui.utils.access_control import has_permission from open_webui.utils.calendar import expand_recurring_event -from open_webui.constants import ERROR_MESSAGES log = logging.getLogger(__name__) @@ -112,6 +111,17 @@ async def get_calendars(request: Request, user: UserModel = Depends(get_verified async def create_calendar(request: Request, form_data: CalendarForm, user: UserModel = Depends(get_verified_user)): """Create a new user calendar.""" await check_calendar_permission(request, user) + # Strip public/user grants the requesting user is not permitted to assign + # (matches the channel/notes/models pattern). Without this, any verified user + # could create a calendar with `principal_id='*' permission='read'|'write'`, + # making their events readable or writable by any other verified user. + form_data.access_grants = await filter_allowed_access_grants( + request.app.state.config.USER_PERMISSIONS, + user.id, + user.role, + form_data.access_grants, + 'sharing.public_calendars', + ) return await Calendars.insert_new_calendar(user.id, form_data) @@ -177,7 +187,7 @@ async def get_events( cal_id_list is None or SCHEDULED_TASKS_CALENDAR_ID in cal_id_list ): try: - from open_webui.models.automations import Automations, AutomationRuns + from open_webui.models.automations import AutomationRuns, Automations # Future runs: expand RRULEs for active automations only active_automations = await Automations.get_active_by_user(user.id) @@ -350,6 +360,20 @@ async def update_calendar( if form_data.access_grants is not None and cal.user_id != user.id and user.role != 'admin': raise HTTPException(status_code=403, detail='Only owner can manage sharing') + # Strip public/user grants the requesting user is not permitted to assign + # (matches the channel/notes/models pattern). The owner-only check above + # only restricts WHO can set grants; this filter restricts WHICH grants + # they may set, so a non-admin owner cannot make their calendar + # publicly readable/writable without the corresponding sharing permission. + if form_data.access_grants is not None: + form_data.access_grants = await filter_allowed_access_grants( + request.app.state.config.USER_PERMISSIONS, + user.id, + user.role, + form_data.access_grants, + 'sharing.public_calendars', + ) + updated = await Calendars.update_calendar_by_id(calendar_id, form_data) if not updated: raise HTTPException(status_code=500, detail='Failed to update') diff --git a/backend/open_webui/routers/channels.py b/backend/open_webui/routers/channels.py index 487899fccf..68fc71fe5a 100644 --- a/backend/open_webui/routers/channels.py +++ b/backend/open_webui/routers/channels.py @@ -1,70 +1,58 @@ -import json -import logging import base64 import io +import json +import logging from typing import Optional - -from fastapi import APIRouter, Depends, HTTPException, Request, status, BackgroundTasks -from fastapi.responses import Response, StreamingResponse, FileResponse -from pydantic import BaseModel -from pydantic import field_validator - -from open_webui.socket.main import ( - emit_to_users, - enter_room_for_users, - sio, - get_user_ids_from_room, +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Request, status +from fastapi.responses import FileResponse, Response, StreamingResponse +from open_webui.config import ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import STATIC_DIR +from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants, has_public_read_access_grant, has_public_write_access_grant +from open_webui.models.channels import ( + ChannelForm, + ChannelModel, + ChannelResponse, + Channels, + ChannelWebhookForm, + ChannelWebhookModel, + CreateChannelForm, +) +from open_webui.models.groups import Groups +from open_webui.models.messages import ( + MessageForm, + MessageModel, + MessageResponse, + Messages, + MessageWithReactionsResponse, ) from open_webui.models.users import ( UserIdNameResponse, UserIdNameStatusResponse, UserListResponse, - UserModelResponse, - Users, UserModel, + UserModelResponse, UserNameResponse, + Users, ) - -from open_webui.models.groups import Groups -from open_webui.models.channels import ( - Channels, - ChannelModel, - ChannelForm, - ChannelResponse, - CreateChannelForm, - ChannelWebhookModel, - ChannelWebhookForm, +from open_webui.socket.main import ( + emit_to_users, + enter_room_for_users, + get_user_ids_from_room, + sio, ) -from open_webui.models.access_grants import AccessGrants, has_public_read_access_grant, has_public_write_access_grant -from open_webui.models.messages import ( - Messages, - MessageModel, - MessageResponse, - MessageWithReactionsResponse, - MessageForm, -) - - +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.channels import extract_mentions, replace_mentions from open_webui.utils.files import get_image_base64_from_file_id - -from open_webui.config import ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT -from open_webui.constants import ERROR_MESSAGES -from open_webui.env import STATIC_DIR - - from open_webui.utils.models import ( get_all_models, get_filtered_models, ) -from open_webui.utils.chat import generate_chat_completion - - -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants from open_webui.utils.webhook import post_webhook -from open_webui.utils.channels import extract_mentions, replace_mentions -from open_webui.internal.db import get_async_session +from pydantic import BaseModel, field_validator from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -979,57 +967,48 @@ async def model_response_handler(request, channel, message, user, db=None): ], ] + # Resolve model config (same helpers automations use) + from open_webui.utils.automations import ( + _resolve_model_features, + _resolve_model_filter_ids, + _resolve_model_tool_ids, + ) + + tool_ids = _resolve_model_tool_ids(request.app, model_id) + features = _resolve_model_features(request.app, model_id) + filter_ids = _resolve_model_filter_ids(request.app, model_id) + + # Build full form_data — same shape as frontend POST. + # The channel: prefix routes pipeline events to the + # channel emitter in socket/main.py instead of the + # default chat emitter. form_data = { 'model': model_id, 'messages': [ system_message, {'role': 'user', 'content': content}, ], - 'stream': False, + 'stream': True, + 'chat_id': f'channel:{channel.id}', + 'id': response_message.id, + 'session_id': f'channel:{channel.id}', + 'background_tasks': {}, } + if tool_ids: + form_data['tool_ids'] = tool_ids + if features: + form_data['features'] = features + if filter_ids: + form_data['filter_ids'] = filter_ids - res = await generate_chat_completion( - request, - form_data=form_data, - user=user, - ) + # Call the full chat completion pipeline — streaming, + # tools, filters, RAG — everything. The pipeline runs as + # an async task; the channel emitter handles progressive + # message updates via socket events. + await request.app.state.CHAT_COMPLETION_HANDLER(request, form_data, user=user) - if res: - if res.get('choices', []) and len(res['choices']) > 0: - await update_message_by_id( - request, - channel.id, - response_message.id, - MessageForm( - **{ - 'content': res['choices'][0]['message']['content'], - 'meta': { - 'done': True, - }, - } - ), - user, - db, - ) - elif res.get('error', None): - await update_message_by_id( - request, - channel.id, - response_message.id, - MessageForm( - **{ - 'content': f'Error: {res["error"]}', - 'meta': { - 'done': True, - }, - } - ), - user, - db, - ) except Exception as e: - log.info(e) - pass + log.exception(e) return True @@ -1256,7 +1235,8 @@ async def pin_channel_message( if not await Channels.is_user_channel_member(channel.id, user.id, db=db): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) else: - if user.role != 'admin' and not await channel_has_access(user.id, channel, permission='read', db=db): + # Pin/unpin mutates is_pinned/pinned_by/pinned_at — require write. + if user.role != 'admin' and not await channel_has_access(user.id, channel, permission='write', db=db): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) message = await Messages.get_message_by_id(message_id, db=db) @@ -1368,6 +1348,9 @@ async def update_message_by_id( if channel.type in ['group', 'dm']: if not await Channels.is_user_channel_member(channel.id, user.id, db=db): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) + # Membership is not authorship — block cross-member edits. + if user.role != 'admin' and message.user_id != user.id: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) else: if ( user.role != 'admin' @@ -1569,6 +1552,9 @@ async def delete_message_by_id( if channel.type in ['group', 'dm']: if not await Channels.is_user_channel_member(channel.id, user.id, db=db): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) + # Membership is not authorship — block cross-member deletes. + if user.role != 'admin' and message.user_id != user.id: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) else: if ( user.role != 'admin' diff --git a/backend/open_webui/routers/chats.py b/backend/open_webui/routers/chats.py index 7cf125f7c7..9344173807 100644 --- a/backend/open_webui/routers/chats.py +++ b/backend/open_webui/routers/chats.py @@ -1,42 +1,41 @@ +from __future__ import annotations + +import asyncio import json import logging from typing import Optional from uuid import uuid4 -from sqlalchemy.ext.asyncio import AsyncSession -import asyncio + +from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi.responses import StreamingResponse - - -from open_webui.utils.misc import get_message_list -from open_webui.socket.main import get_event_emitter -from open_webui.models.chats import ( - ChatForm, - ChatImportForm, - ChatUsageStatsListResponse, - ChatsImportForm, - ChatResponse, - Chats, - ChatTitleIdResponse, - ChatStatsExport, - AggregateChatStats, - ChatBody, - ChatHistoryStats, - MessageStats, -) -from open_webui.models.shared_chats import SharedChats, SharedChatResponse -from open_webui.models.access_grants import AccessGrants -from open_webui.models.tags import TagModel, Tags -from open_webui.models.folders import Folders -from open_webui.internal.db import get_async_session - from open_webui.config import ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT from open_webui.constants import ERROR_MESSAGES -from fastapi import APIRouter, Depends, HTTPException, Request, status -from pydantic import BaseModel - - +from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants +from open_webui.models.chats import ( + AggregateChatStats, + ChatBody, + ChatForm, + ChatHistoryStats, + ChatImportForm, + ChatResponse, + Chats, + ChatsImportForm, + ChatStatsExport, + ChatTitleIdResponse, + ChatUsageStatsListResponse, + MessageStats, +) +from open_webui.models.folders import Folders +from open_webui.models.shared_chats import SharedChatResponse, SharedChats +from open_webui.models.tags import TagModel, Tags +from open_webui.socket.main import get_event_emitter +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants +from open_webui.utils.middleware import serialize_output +from open_webui.utils.misc import get_message_list +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -53,9 +52,9 @@ router = APIRouter() @router.get('/list', response_model=list[ChatTitleIdResponse]) async def get_session_user_chat_list( user=Depends(get_verified_user), - page: Optional[int] = None, - include_pinned: Optional[bool] = False, - include_folders: Optional[bool] = False, + page: int | None = None, + include_pinned: bool | None = False, + include_folders: bool | None = False, db: AsyncSession = Depends(get_async_session), ): try: @@ -91,8 +90,8 @@ async def get_session_user_chat_list( @router.get('/stats/usage', response_model=ChatUsageStatsListResponse) async def get_session_user_chat_usage_stats( - items_per_page: Optional[int] = 50, - page: Optional[int] = 1, + items_per_page: int | None = 50, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -209,7 +208,7 @@ class ChatStatsExportList(BaseModel): page: int -def _process_chat_for_export(chat) -> Optional[ChatStatsExport]: +def _process_chat_for_export(chat) -> ChatStatsExport | None: try: def get_message_content_length(message): @@ -394,8 +393,8 @@ async def generate_chat_stats_jsonl_generator(user_id, filter): @router.get('/stats/export', response_model=ChatStatsExportList) async def export_chat_stats( request: Request, - updated_at: Optional[int] = None, - page: Optional[int] = 1, + updated_at: int | None = None, + page: int | None = 1, stream: bool = False, user=Depends(get_verified_user), ): @@ -437,7 +436,7 @@ async def export_chat_stats( ############################ -@router.get('/stats/export/{chat_id}', response_model=Optional[ChatStatsExport]) +@router.get('/stats/export/{chat_id}', response_model=ChatStatsExport | None) async def export_single_chat_stats( request: Request, chat_id: str, @@ -515,10 +514,10 @@ async def delete_all_user_chats( @router.get('/list/user/{user_id}', response_model=list[ChatTitleIdResponse]) async def get_user_chat_list_by_user_id( user_id: str, - page: Optional[int] = None, - query: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, + page: int | None = None, + query: str | None = None, + order_by: str | None = None, + direction: str | None = None, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session), ): @@ -552,12 +551,24 @@ async def get_user_chat_list_by_user_id( ############################ -@router.post('/new', response_model=Optional[ChatResponse]) +@router.post('/new', response_model=ChatResponse | None) async def create_new_chat( form_data: ChatForm, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): + # Reject a folder_id that doesn't belong to the caller. Without this the + # row is persisted with a dangling foreign reference — no read path + # surfaces it across users (all chat reads are user_id-filtered), but + # the row state is meaningless and downstream consumers shouldn't have + # to assume the column is clean. Also catches non-UUID / nonexistent IDs. + if form_data.folder_id is not None: + if not await Folders.get_folder_by_id_and_user_id(form_data.folder_id, user.id, db=db): + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + try: chat = await Chats.insert_new_chat(str(uuid4()), user.id, form_data, db=db) return ChatResponse(**chat.model_dump()) @@ -593,7 +604,7 @@ async def import_chats( @router.get('/search', response_model=list[ChatTitleIdResponse]) async def search_user_chats( text: str, - page: Optional[int] = None, + page: int | None = None, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -643,7 +654,7 @@ async def get_chats_by_folder_id( @router.get('/folder/{folder_id}/list') async def get_chat_list_by_folder_id( folder_id: str, - page: Optional[int] = 1, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -676,11 +687,46 @@ async def get_user_pinned_chats(user=Depends(get_verified_user), db: AsyncSessio # GetChats ############################ +CHAT_EXPORT_BATCH_SIZE = 100 -@router.get('/all', response_model=list[ChatResponse]) -async def get_user_chats(user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): - result = await Chats.get_chats_by_user_id(user.id, db=db) - return [ChatResponse(**chat.model_dump()) for chat in result.items] + +async def generate_chat_export_ndjson(user_id: str): + """ + Async generator that streams all user chats as NDJSON (one JSON object per line). + + Uses short-lived DB sessions per batch to avoid holding locks for the + entire duration, which is critical for SQLite environments. + """ + skip = 0 + + while True: + result = await Chats.get_chats_by_user_id( + user_id, + skip=skip, + limit=CHAT_EXPORT_BATCH_SIZE, + db=None, + ) + if not result.items: + break + + for chat in result.items: + try: + yield ChatResponse(**chat.model_dump()).model_dump_json() + '\n' + except Exception as e: + log.exception(f'Error serializing chat {chat.id}: {e}') + + if len(result.items) < CHAT_EXPORT_BATCH_SIZE: + break + + skip += CHAT_EXPORT_BATCH_SIZE + + +@router.get('/all') +async def get_user_chats(user=Depends(get_verified_user)): + return StreamingResponse( + generate_chat_export_ndjson(user.id), + media_type='application/x-ndjson', + ) ############################ @@ -730,10 +776,10 @@ async def get_all_user_chats_in_db(user=Depends(get_admin_user), db: AsyncSessio @router.get('/archived', response_model=list[ChatTitleIdResponse]) async def get_archived_session_user_chat_list( - page: Optional[int] = None, - query: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, + page: int | None = None, + query: str | None = None, + order_by: str | None = None, + direction: str | None = None, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -787,10 +833,10 @@ async def unarchive_all_chats(user=Depends(get_verified_user), db: AsyncSession @router.get('/shared', response_model=list[SharedChatResponse]) async def get_shared_session_user_chat_list( - page: Optional[int] = None, - query: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, + page: int | None = None, + query: str | None = None, + order_by: str | None = None, + direction: str | None = None, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -822,36 +868,38 @@ async def get_shared_session_user_chat_list( ############################ -@router.get('/share/{share_id}', response_model=Optional[ChatResponse]) +@router.get('/share/{share_id}', response_model=ChatResponse | None) async def get_shared_chat_by_id( share_id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): if user.role == 'pending': raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND) - if user.role == 'admin' and ENABLE_ADMIN_CHAT_ACCESS: + chat = await Chats.get_chat_by_share_id(share_id, db=db) + + # Fallback: admins can also access any chat directly by chat ID + if not chat and user.role == 'admin' and ENABLE_ADMIN_CHAT_ACCESS: chat = await Chats.get_chat_by_id(share_id, db=db) - else: - chat = await Chats.get_chat_by_share_id(share_id, db=db) if not chat: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.NOT_FOUND) - # Look up the original chat_id to check access grants - shared = await SharedChats.get_by_id(share_id, db=db) - if shared: - has_grant = await AccessGrants.has_access( - user_id=user.id, - resource_type='shared_chat', - resource_id=shared.chat_id, - permission='read', - db=db, - ) - if not has_grant: - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail=ERROR_MESSAGES.ACCESS_PROHIBITED, + # Look up the original chat_id to check access grants (admins bypass) + if user.role != 'admin' or not ENABLE_ADMIN_CHAT_ACCESS: + shared = await SharedChats.get_by_id(share_id, db=db) + if shared and shared.user_id != user.id: + has_grant = await AccessGrants.has_access( + user_id=user.id, + resource_type='shared_chat', + resource_id=shared.chat_id, + permission='read', + db=db, ) + if not has_grant: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail=ERROR_MESSAGES.ACCESS_PROHIBITED, + ) return ChatResponse(**chat.model_dump()) @@ -866,8 +914,8 @@ class TagForm(BaseModel): class TagFilterForm(TagForm): - skip: Optional[int] = 0 - limit: Optional[int] = 50 + skip: int | None = 0 + limit: int | None = 50 @router.post('/tags', response_model=list[ChatTitleIdResponse]) @@ -890,7 +938,7 @@ async def get_user_chat_list_by_tag_name( ############################ -@router.get('/{id}', response_model=Optional[ChatResponse]) +@router.get('/{id}', response_model=ChatResponse | None) async def get_chat_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) @@ -920,7 +968,7 @@ async def get_chat_by_id(id: str, user=Depends(get_verified_user), db: AsyncSess ############################ -@router.post('/{id}', response_model=Optional[ChatResponse]) +@router.post('/{id}', response_model=ChatResponse | None) async def update_chat_by_id( id: str, form_data: ChatForm, @@ -930,6 +978,14 @@ async def update_chat_by_id( chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if chat: updated_chat = {**chat.chat, **form_data.chat} + + # Re-derive content from output for assistant messages so that + # frontend edits to output items are always reflected in content. + # serialize_output() is the single source of truth for this conversion. + for msg in updated_chat.get('history', {}).get('messages', {}).values(): + if msg.get('role') == 'assistant' and msg.get('output'): + msg['content'] = serialize_output(msg['output']) + chat = await Chats.update_chat_by_id(id, updated_chat, db=db) return ChatResponse(**chat.model_dump()) else: @@ -946,7 +1002,7 @@ class MessageForm(BaseModel): content: str -@router.post('/{id}/messages/{message_id}', response_model=Optional[ChatResponse]) +@router.post('/{id}/messages/{message_id}', response_model=ChatResponse | None) async def update_chat_message_by_id( id: str, message_id: str, @@ -1008,7 +1064,7 @@ class EventForm(BaseModel): data: dict -@router.post('/{id}/messages/{message_id}/event', response_model=Optional[bool]) +@router.post('/{id}/messages/{message_id}/event', response_model=bool | None) async def send_chat_message_event_by_id( id: str, message_id: str, @@ -1096,7 +1152,7 @@ async def delete_chat_by_id( ############################ -@router.get('/{id}/pinned', response_model=Optional[bool]) +@router.get('/{id}/pinned', response_model=bool | None) async def get_pinned_status_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -1112,7 +1168,7 @@ async def get_pinned_status_by_id( ############################ -@router.post('/{id}/pin', response_model=Optional[ChatResponse]) +@router.post('/{id}/pin', response_model=ChatResponse | None) async def pin_chat_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if chat: @@ -1128,10 +1184,10 @@ async def pin_chat_by_id(id: str, user=Depends(get_verified_user), db: AsyncSess class CloneForm(BaseModel): - title: Optional[str] = None + title: str | None = None -@router.post('/{id}/clone', response_model=Optional[ChatResponse]) +@router.post('/{id}/clone', response_model=ChatResponse | None) async def clone_chat_by_id( form_data: CloneForm, id: str, @@ -1179,14 +1235,15 @@ async def clone_chat_by_id( ############################ -@router.post('/{id}/clone/shared', response_model=Optional[ChatResponse]) +@router.post('/{id}/clone/shared', response_model=ChatResponse | None) async def clone_shared_chat_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): - if user.role == 'admin': + chat = await Chats.get_chat_by_share_id(id, db=db) + + # Fallback: admins can also access any chat directly by chat ID + if not chat and user.role == 'admin' and ENABLE_ADMIN_CHAT_ACCESS: chat = await Chats.get_chat_by_id(id, db=db) - else: - chat = await Chats.get_chat_by_share_id(id, db=db) if not chat: raise HTTPException( @@ -1194,9 +1251,9 @@ async def clone_shared_chat_by_id( detail=ERROR_MESSAGES.NOT_FOUND, ) - # Enforce access grants + # Enforce access grants (owner and admins bypass) shared = await SharedChats.get_by_id(id, db=db) - if shared and user.role != 'admin': + if shared and user.role != 'admin' and shared.user_id != user.id: has_grant = await AccessGrants.has_access( user_id=user.id, resource_type='shared_chat', @@ -1247,7 +1304,7 @@ async def clone_shared_chat_by_id( ############################ -@router.post('/{id}/archive', response_model=Optional[ChatResponse]) +@router.post('/{id}/archive', response_model=ChatResponse | None) async def archive_chat_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if chat: @@ -1271,7 +1328,7 @@ async def archive_chat_by_id(id: str, user=Depends(get_verified_user), db: Async ############################ -@router.post('/{id}/share', response_model=Optional[ChatResponse]) +@router.post('/{id}/share', response_model=ChatResponse | None) async def share_chat_by_id( request: Request, id: str, @@ -1325,7 +1382,7 @@ async def share_chat_by_id( ############################ -@router.delete('/{id}/share', response_model=Optional[bool]) +@router.delete('/{id}/share', response_model=bool | None) async def delete_shared_chat_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -1357,7 +1414,7 @@ class ChatAccessGrantsForm(BaseModel): access_grants: list[dict] -@router.post('/shared/{id}/access/update', response_model=Optional[ChatResponse]) +@router.post('/shared/{id}/access/update', response_model=ChatResponse | None) async def update_shared_chat_access_by_id( request: Request, id: str, @@ -1365,19 +1422,16 @@ async def update_shared_chat_access_by_id( user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): - chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) + if user.role == 'admin': + chat = await Chats.get_chat_by_id(id, db=db) + else: + chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if not chat: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND, ) - if chat.user_id != user.id and user.role != 'admin': - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail=ERROR_MESSAGES.ACCESS_PROHIBITED, - ) - form_data.access_grants = await filter_allowed_access_grants( request.app.state.config.USER_PERMISSIONS, user.id, @@ -1402,19 +1456,16 @@ async def get_shared_chat_access_by_id( user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): - chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) + if user.role == 'admin': + chat = await Chats.get_chat_by_id(id, db=db) + else: + chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if not chat: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND, ) - if chat.user_id != user.id and user.role != 'admin': - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail=ERROR_MESSAGES.ACCESS_PROHIBITED, - ) - grants = await AccessGrants.get_grants_by_resource('shared_chat', id, db=db) return [ { @@ -1433,10 +1484,10 @@ async def get_shared_chat_access_by_id( class ChatFolderIdForm(BaseModel): - folder_id: Optional[str] = None + folder_id: str | None = None -@router.post('/{id}/folder', response_model=Optional[ChatResponse]) +@router.post('/{id}/folder', response_model=ChatResponse | None) async def update_chat_folder_id_by_id( id: str, form_data: ChatFolderIdForm, @@ -1445,6 +1496,15 @@ async def update_chat_folder_id_by_id( ): chat = await Chats.get_chat_by_id_and_user_id(id, user.id, db=db) if chat: + # Same ownership check as the create path — reject foreign / dangling + # folder_id values. None is allowed (moves the chat out of any folder). + if form_data.folder_id is not None: + if not await Folders.get_folder_by_id_and_user_id(form_data.folder_id, user.id, db=db): + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + chat = await Chats.update_chat_folder_id_by_id_and_user_id(id, user.id, form_data.folder_id, db=db) return ChatResponse(**chat.model_dump()) else: @@ -1530,7 +1590,7 @@ async def delete_tag_by_id_and_tag_name( ############################ -@router.delete('/{id}/tags/all', response_model=Optional[bool]) +@router.delete('/{id}/tags/all', response_model=bool | None) async def delete_all_tags_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): diff --git a/backend/open_webui/routers/configs.py b/backend/open_webui/routers/configs.py index 02b16d8e5b..c40131f41f 100644 --- a/backend/open_webui/routers/configs.py +++ b/backend/open_webui/routers/configs.py @@ -1,36 +1,34 @@ -import logging -import copy -from fastapi import APIRouter, Depends, Request, HTTPException -from pydantic import BaseModel, ConfigDict -import aiohttp +from __future__ import annotations +import copy +import logging from typing import Optional +import aiohttp +from fastapi import APIRouter, Depends, HTTPException, Request +from mcp.shared.auth import OAuthMetadata +from open_webui.config import BannerModel, async_save_config, get_config, save_config from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, AIOHTTP_CLIENT_TIMEOUT -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.config import get_config, save_config, async_save_config -from open_webui.config import BannerModel - -from open_webui.utils.tools import ( - get_tool_server_data, - get_tool_server_url, - set_tool_servers, - set_terminal_servers, -) -from open_webui.utils.mcp.client import MCPClient from open_webui.models.oauth_sessions import OAuthSessions - - +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.headers import get_custom_headers +from open_webui.utils.mcp.client import MCPClient from open_webui.utils.oauth import ( + OAuthClientInformationFull, + decrypt_data, + encrypt_data, get_discovery_urls, get_oauth_client_info_with_dynamic_client_registration, get_oauth_client_info_with_static_credentials, - encrypt_data, - decrypt_data, resolve_oauth_client_info, - OAuthClientInformationFull, ) -from mcp.shared.auth import OAuthMetadata +from open_webui.utils.tools import ( + get_tool_server_data, + get_tool_server_url, + set_terminal_servers, + set_tool_servers, +) +from pydantic import BaseModel, ConfigDict router = APIRouter() @@ -49,8 +47,9 @@ class ImportConfigForm(BaseModel): @router.post('/import', response_model=dict) -async def import_config(form_data: ImportConfigForm, user=Depends(get_admin_user)): +async def import_config(request: Request, form_data: ImportConfigForm, user=Depends(get_admin_user)): await async_save_config(form_data.config) + request.app.state.config._sync_to_redis() return get_config() @@ -100,15 +99,16 @@ async def set_connections_config( class OAuthClientRegistrationForm(BaseModel): url: str client_id: str - client_name: Optional[str] = None - client_secret: Optional[str] = None + client_name: str | None = None + client_secret: str | None = None + oauth_server_url: str | None = None @router.post('/oauth/clients/register') async def register_oauth_client( request: Request, form_data: OAuthClientRegistrationForm, - type: Optional[str] = None, + type: str | None = None, user=Depends(get_admin_user), ): try: @@ -116,18 +116,20 @@ async def register_oauth_client( if type: oauth_client_id = f'{type}:{form_data.client_id}' + oauth_server_url = form_data.oauth_server_url if form_data.oauth_server_url else form_data.url + if form_data.client_secret: # Static credentials: skip dynamic registration, build from provided credentials oauth_client_info = await get_oauth_client_info_with_static_credentials( request, oauth_client_id, - form_data.url, + oauth_server_url, oauth_client_id=form_data.client_id, oauth_client_secret=form_data.client_secret, ) else: oauth_client_info = await get_oauth_client_info_with_dynamic_client_registration( - request, oauth_client_id, form_data.url + request, oauth_client_id, oauth_server_url ) return { 'status': True, @@ -149,11 +151,12 @@ async def register_oauth_client( class ToolServerConnection(BaseModel): url: str path: str - type: Optional[str] = 'openapi' # openapi, mcp - auth_type: Optional[str] - headers: Optional[dict | str] = None - key: Optional[str] - config: Optional[dict] + type: str | None = 'openapi' # openapi, mcp + auth_type: str | None + headers: dict | str | None = None + key: str | None + config: dict | None + info: dict | None = None model_config = ConfigDict(extra='allow') @@ -219,23 +222,23 @@ async def set_tool_servers_config( class TerminalServerConnection(BaseModel): - id: Optional[str] = '' - name: Optional[str] = '' + id: str | None = '' + name: str | None = '' - enabled: Optional[bool] = True + enabled: bool | None = True url: str - path: Optional[str] = '/openapi.json' + path: str | None = '/openapi.json' - key: Optional[str] = '' - auth_type: Optional[str] = 'bearer' + key: str | None = '' + auth_type: str | None = 'bearer' - config: Optional[dict] = None + config: dict | None = None # Orchestrator policy fields - server_type: Optional[str] = None # "orchestrator", "terminal" - policy_id: Optional[str] = None - policy: Optional[dict] = None # cached policy data + server_type: str | None = None # "orchestrator", "terminal" + policy_id: str | None = None + policy: dict | None = None # cached policy data model_config = ConfigDict(extra='allow') @@ -319,8 +322,8 @@ async def verify_terminal_server_connection( class TerminalServerPolicyForm(BaseModel): url: str - key: Optional[str] = '' - auth_type: Optional[str] = 'bearer' + key: str | None = '' + auth_type: str | None = 'bearer' policy_id: str policy_data: dict @@ -368,7 +371,12 @@ async def verify_tool_servers_config(request: Request, form_data: ToolServerConn try: if form_data.type == 'mcp': if form_data.auth_type in ('oauth_2.1', 'oauth_2.1_static'): - discovery_urls = await get_discovery_urls(form_data.url) + oauth_server_url = ( + form_data.info.get('oauth_server_url') + if form_data.info and form_data.info.get('oauth_server_url') + else form_data.url + ) + discovery_urls = await get_discovery_urls(oauth_server_url) for discovery_url in discovery_urls: log.debug(f'Trying to fetch OAuth 2.1 discovery document from {discovery_url}') async with aiohttp.ClientSession( @@ -427,7 +435,8 @@ async def verify_tool_servers_config(request: Request, form_data: ToolServerConn if form_data.headers and isinstance(form_data.headers, dict): if headers is None: headers = {} - headers.update(form_data.headers) + custom_headers = get_custom_headers(form_data.headers, user) + headers.update(custom_headers) await client.connect(form_data.url, headers=headers) specs = await client.list_tool_specs() @@ -471,7 +480,8 @@ async def verify_tool_servers_config(request: Request, form_data: ToolServerConn if form_data.headers and isinstance(form_data.headers, dict): if headers is None: headers = {} - headers.update(form_data.headers) + custom_headers = get_custom_headers(form_data.headers, user) + headers.update(custom_headers) url = get_tool_server_url(form_data.url, form_data.path) return await get_tool_server_data(url, headers=headers) @@ -491,19 +501,19 @@ async def verify_tool_servers_config(request: Request, form_data: ToolServerConn class CodeInterpreterConfigForm(BaseModel): ENABLE_CODE_EXECUTION: bool CODE_EXECUTION_ENGINE: str - CODE_EXECUTION_JUPYTER_URL: Optional[str] - CODE_EXECUTION_JUPYTER_AUTH: Optional[str] - CODE_EXECUTION_JUPYTER_AUTH_TOKEN: Optional[str] - CODE_EXECUTION_JUPYTER_AUTH_PASSWORD: Optional[str] - CODE_EXECUTION_JUPYTER_TIMEOUT: Optional[int] + CODE_EXECUTION_JUPYTER_URL: str | None + CODE_EXECUTION_JUPYTER_AUTH: str | None + CODE_EXECUTION_JUPYTER_AUTH_TOKEN: str | None + CODE_EXECUTION_JUPYTER_AUTH_PASSWORD: str | None + CODE_EXECUTION_JUPYTER_TIMEOUT: int | None ENABLE_CODE_INTERPRETER: bool CODE_INTERPRETER_ENGINE: str - CODE_INTERPRETER_PROMPT_TEMPLATE: Optional[str] - CODE_INTERPRETER_JUPYTER_URL: Optional[str] - CODE_INTERPRETER_JUPYTER_AUTH: Optional[str] - CODE_INTERPRETER_JUPYTER_AUTH_TOKEN: Optional[str] - CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD: Optional[str] - CODE_INTERPRETER_JUPYTER_TIMEOUT: Optional[int] + CODE_INTERPRETER_PROMPT_TEMPLATE: str | None + CODE_INTERPRETER_JUPYTER_URL: str | None + CODE_INTERPRETER_JUPYTER_AUTH: str | None + CODE_INTERPRETER_JUPYTER_AUTH_TOKEN: str | None + CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD: str | None + CODE_INTERPRETER_JUPYTER_TIMEOUT: int | None @router.get('/code_execution', response_model=CodeInterpreterConfigForm) @@ -575,11 +585,11 @@ async def set_code_execution_config( # SetDefaultModels ############################ class ModelsConfigForm(BaseModel): - DEFAULT_MODELS: Optional[str] - DEFAULT_PINNED_MODELS: Optional[str] - MODEL_ORDER_LIST: Optional[list[str]] - DEFAULT_MODEL_METADATA: Optional[dict] = None - DEFAULT_MODEL_PARAMS: Optional[dict] = None + DEFAULT_MODELS: str | None + DEFAULT_PINNED_MODELS: str | None + MODEL_ORDER_LIST: list[str | None] + DEFAULT_MODEL_METADATA: dict | None = None + DEFAULT_MODEL_PARAMS: dict | None = None @router.get('/models/defaults') diff --git a/backend/open_webui/routers/evaluations.py b/backend/open_webui/routers/evaluations.py index 072c7fa732..cce9d591ee 100644 --- a/backend/open_webui/routers/evaluations.py +++ b/backend/open_webui/routers/evaluations.py @@ -1,26 +1,25 @@ -from typing import Optional import logging -from fastapi import APIRouter, Depends, HTTPException, status, Request -from fastapi.concurrency import run_in_threadpool -from pydantic import BaseModel +from typing import Optional -from open_webui.models.users import Users, UserModel +from fastapi import APIRouter, Depends, HTTPException, Request, status +from fastapi.concurrency import run_in_threadpool +from open_webui.constants import ERROR_MESSAGES +from open_webui.internal.db import get_async_session from open_webui.models.feedbacks import ( + FeedbackForm, FeedbackIdResponse, + FeedbackListResponse, FeedbackModel, FeedbackResponse, - FeedbackForm, + Feedbacks, FeedbackUserResponse, - FeedbackListResponse, LeaderboardFeedbackData, ModelHistoryEntry, ModelHistoryResponse, - Feedbacks, ) - -from open_webui.constants import ERROR_MESSAGES +from open_webui.models.users import UserModel, Users from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.internal.db import get_async_session +from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 7ca1c2e73f..3c838524e8 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -1,34 +1,31 @@ +import asyncio +import json import logging import os import uuid -import json from pathlib import Path from typing import Optional from urllib.parse import quote -import asyncio from fastapi import ( - BackgroundTasks, APIRouter, + BackgroundTasks, Depends, File, Form, HTTPException, + Query, Request, UploadFile, status, - Query, ) - from fastapi.responses import FileResponse, StreamingResponse -from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.internal.db import get_async_session, get_async_db_context - +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL, STORAGE_LOCAL_CACHE, STORAGE_PROVIDER, UPLOAD_DIR from open_webui.constants import ERROR_MESSAGES -from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT - +from open_webui.internal.db import get_async_db_context, get_async_session +from open_webui.models.access_grants import AccessGrants from open_webui.models.channels import Channels -from open_webui.models.users import Users +from open_webui.models.chats import Chats from open_webui.models.files import ( FileForm, FileListResponse, @@ -36,22 +33,17 @@ from open_webui.models.files import ( FileModelResponse, Files, ) -from open_webui.models.chats import Chats -from open_webui.models.knowledge import Knowledges from open_webui.models.groups import Groups -from open_webui.models.access_grants import AccessGrants - - -from open_webui.routers.retrieval import ProcessFileForm, process_file +from open_webui.models.knowledge import Knowledges +from open_webui.models.users import Users +from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT from open_webui.routers.audio import transcribe - +from open_webui.routers.retrieval import ProcessFileForm, process_file from open_webui.storage.provider import Storage - - -from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL, STORAGE_LOCAL_CACHE, STORAGE_PROVIDER, UPLOAD_DIR from open_webui.utils.auth import get_admin_user, get_verified_user from open_webui.utils.misc import strict_match_mime_type from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -120,32 +112,56 @@ async def process_uploaded_file( if _is_text_file(file_path): content_type = 'text/plain' - if content_type: - stt_supported_content_types = getattr(request.app.state.config, 'STT_SUPPORTED_CONTENT_TYPES', []) + stt_supported = getattr( + request.app.state.config, 'STT_SUPPORTED_CONTENT_TYPES', [] + ) - if strict_match_mime_type(stt_supported_content_types, content_type): - file_path_processed = await asyncio.to_thread(Storage.get_file, file_path) - result = transcribe(request, file_path_processed, file_metadata, user) + if content_type and strict_match_mime_type(stt_supported, content_type): + # Audio / STT-supported files → transcribe then index + file_path_processed = await asyncio.to_thread(Storage.get_file, file_path) + result = await asyncio.to_thread( + transcribe, + request, + file_path_processed, + file_metadata, + user, + ) + await process_file( + request, + ProcessFileForm(file_id=file_item.id, content=result.get('text', '')), + user=user, + db=db_session, + ) - await process_file( - request, - ProcessFileForm(file_id=file_item.id, content=result.get('text', '')), - user=user, - db=db_session, - ) - elif (not content_type.startswith(('image/', 'video/'))) or ( - request.app.state.config.CONTENT_EXTRACTION_ENGINE == 'external' - ): - await process_file( - request, - ProcessFileForm(file_id=file_item.id), - user=user, + elif ( + content_type + and content_type.startswith(('image/', 'video/')) + and request.app.state.config.CONTENT_EXTRACTION_ENGINE != 'external' + ): + # Media files without an external extraction engine + if content_type.startswith('video/'): + # Videos are stored as-is for downstream multimodal + # processing (Tools, vision models). Attempting text + # extraction causes "Timeout reached while detecting + # encoding" errors. + log.info(f'Video file detected ({content_type}), skipping text extraction') + await Files.update_file_data_by_id( + file_item.id, + {'status': 'completed'}, db=db_session, ) else: - raise Exception(f'File type {content_type} is not supported for processing') + raise Exception( + f'File type {content_type} is not supported for processing' + ) + else: - log.info(f'File type {file.content_type} is not provided, but trying to process anyway') + # Documents, or any file when an external engine is configured + if not content_type: + log.info( + f'File type {file.content_type} is not provided, ' + 'but trying to process anyway' + ) await process_file( request, ProcessFileForm(file_id=file_item.id), @@ -767,6 +783,46 @@ async def get_file_content_by_id( ) +############################ +# Rename File By Id +############################ + + +class FileRenameForm(BaseModel): + filename: str + + +@router.post('/{id}/rename') +async def rename_file_by_id( + id: str, + form_data: FileRenameForm, + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + file = await Files.get_file_by_id(id, db=db) + + if not file: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + + if file.user_id == user.id or user.role == 'admin' or await has_access_to_file(id, 'write', user, db=db): + result = await Files.update_file_name_by_id(id, form_data.filename, db=db) + if result: + return result + else: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=ERROR_MESSAGES.DEFAULT('Error renaming file'), + ) + else: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + + ############################ # Delete File By Id ############################ diff --git a/backend/open_webui/routers/folders.py b/backend/open_webui/routers/folders.py index ebd0c0cb17..8d77de4894 100644 --- a/backend/open_webui/routers/folders.py +++ b/backend/open_webui/routers/folders.py @@ -1,37 +1,29 @@ import logging +import mimetypes import os import shutil import uuid from pathlib import Path from typing import Optional -from pydantic import BaseModel -import mimetypes - - -from open_webui.models.folders import ( - FolderForm, - FolderUpdateForm, - FolderModel, - FolderNameIdResponse, - Folders, -) -from open_webui.models.chats import Chats -from open_webui.models.files import Files -from open_webui.models.knowledge import Knowledges - +from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile, status +from fastapi.responses import FileResponse, StreamingResponse from open_webui.config import UPLOAD_DIR from open_webui.constants import ERROR_MESSAGES from open_webui.internal.db import get_async_session -from sqlalchemy.ext.asyncio import AsyncSession - - -from fastapi import APIRouter, Depends, File, HTTPException, UploadFile, status, Request -from fastapi.responses import FileResponse, StreamingResponse - - -from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.models.chats import Chats +from open_webui.models.folders import ( + FolderForm, + FolderModel, + FolderNameIdResponse, + Folders, + FolderUpdateForm, +) from open_webui.utils.access_control import has_permission +from open_webui.utils.access_control.files import get_accessible_folder_files +from open_webui.utils.auth import get_admin_user, get_verified_user +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -75,20 +67,10 @@ async def get_folders( if folder.parent_id and not await Folders.get_folder_by_id_and_user_id(folder.parent_id, user.id, db=db): folder = await Folders.update_folder_parent_id_by_id_and_user_id(folder.id, user.id, None, db=db) - if folder.data: - if 'files' in folder.data: - valid_files = [] - for file in folder.data['files']: - if file.get('type') == 'file': - if await Files.check_access_by_user_id(file.get('id'), user.id, 'read', db=db): - valid_files.append(file) - elif file.get('type') == 'collection': - if await Knowledges.check_access_by_user_id(file.get('id'), user.id, 'read', db=db): - valid_files.append(file) - else: - valid_files.append(file) - - folder.data['files'] = valid_files + if folder.data and 'files' in folder.data: + accessible_files = await get_accessible_folder_files(folder.data['files'], user, db=db) + if len(accessible_files) != len(folder.data.get('files', [])): + folder.data['files'] = accessible_files await Folders.update_folder_by_id_and_user_id( folder.id, user.id, FolderUpdateForm(data=folder.data), db=db ) @@ -173,6 +155,16 @@ async def update_folder_name_by_id( detail=ERROR_MESSAGES.DEFAULT('Folder already exists'), ) + # Validate read access to every file/collection being attached. + # Folder files are consumed by chat middleware as RAG context. + if form_data.data and isinstance(form_data.data.get('files'), list): + accessible_files = await get_accessible_folder_files(form_data.data['files'], user, db=db) + if len(accessible_files) != len(form_data.data['files']): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=ERROR_MESSAGES.ACCESS_PROHIBITED, + ) + try: folder = await Folders.update_folder_by_id_and_user_id(id, user.id, form_data, db=db) return folder diff --git a/backend/open_webui/routers/functions.py b/backend/open_webui/routers/functions.py index f40cd1ab82..58ec93657e 100644 --- a/backend/open_webui/routers/functions.py +++ b/backend/open_webui/routers/functions.py @@ -1,32 +1,33 @@ -import os -import re +from __future__ import annotations import logging -import aiohttp +import os +import re from pathlib import Path from typing import Optional +import aiohttp +from fastapi import APIRouter, Depends, HTTPException, Request, status +from open_webui.config import CACHE_DIR +from open_webui.constants import ERROR_MESSAGES from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, AIOHTTP_CLIENT_TIMEOUT +from open_webui.internal.db import get_async_session from open_webui.models.functions import ( FunctionForm, FunctionModel, FunctionResponse, + Functions, FunctionUserResponse, FunctionWithValvesModel, - Functions, ) +from open_webui.utils.auth import get_admin_user, get_verified_user from open_webui.utils.plugin import ( + get_function_module_from_cache, load_function_module_by_id, replace_imports, - get_function_module_from_cache, resolve_valves_schema_options, ) -from open_webui.config import CACHE_DIR -from open_webui.constants import ERROR_MESSAGES -from fastapi import APIRouter, Depends, HTTPException, Request, status -from open_webui.utils.auth import get_admin_user, get_verified_user from pydantic import BaseModel, HttpUrl -from open_webui.internal.db import get_async_session from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -91,7 +92,7 @@ def github_url_to_raw_url(url: str) -> str: return url -@router.post('/load/url', response_model=Optional[dict]) +@router.post('/load/url', response_model=dict | None) async def load_function_from_url(request: Request, form_data: LoadUrlForm, user=Depends(get_admin_user)): # NOTE: This is NOT a SSRF vulnerability: # This endpoint is admin-only (see get_admin_user), meant for *trusted* internal use, @@ -179,7 +180,7 @@ async def sync_functions( ############################ -@router.post('/create', response_model=Optional[FunctionResponse]) +@router.post('/create', response_model=FunctionResponse | None) async def create_new_function( request: Request, form_data: FunctionForm, @@ -240,7 +241,7 @@ async def create_new_function( ############################ -@router.get('/id/{id}', response_model=Optional[FunctionModel]) +@router.get('/id/{id}', response_model=FunctionModel | None) async def get_function_by_id(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): function = await Functions.get_function_by_id(id, db=db) @@ -258,7 +259,7 @@ async def get_function_by_id(id: str, user=Depends(get_admin_user), db: AsyncSes ############################ -@router.post('/id/{id}/toggle', response_model=Optional[FunctionModel]) +@router.post('/id/{id}/toggle', response_model=FunctionModel | None) async def toggle_function_by_id(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): function = await Functions.get_function_by_id(id, db=db) if function: @@ -283,7 +284,7 @@ async def toggle_function_by_id(id: str, user=Depends(get_admin_user), db: Async ############################ -@router.post('/id/{id}/toggle/global', response_model=Optional[FunctionModel]) +@router.post('/id/{id}/toggle/global', response_model=FunctionModel | None) async def toggle_global_by_id(id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session)): function = await Functions.get_function_by_id(id, db=db) if function: @@ -308,7 +309,7 @@ async def toggle_global_by_id(id: str, user=Depends(get_admin_user), db: AsyncSe ############################ -@router.post('/id/{id}/update', response_model=Optional[FunctionModel]) +@router.post('/id/{id}/update', response_model=FunctionModel | None) async def update_function_by_id( request: Request, id: str, @@ -374,7 +375,7 @@ async def delete_function_by_id( ############################ -@router.get('/id/{id}/valves', response_model=Optional[dict]) +@router.get('/id/{id}/valves', response_model=dict | None) async def get_function_valves_by_id( id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session) ): @@ -400,7 +401,7 @@ async def get_function_valves_by_id( ############################ -@router.get('/id/{id}/valves/spec', response_model=Optional[dict]) +@router.get('/id/{id}/valves/spec', response_model=dict | None) async def get_function_valves_spec_by_id( request: Request, id: str, @@ -430,7 +431,7 @@ async def get_function_valves_spec_by_id( ############################ -@router.post('/id/{id}/valves/update', response_model=Optional[dict]) +@router.post('/id/{id}/valves/update', response_model=dict | None) async def update_function_valves_by_id( request: Request, id: str, @@ -476,7 +477,7 @@ async def update_function_valves_by_id( ############################ -@router.get('/id/{id}/valves/user', response_model=Optional[dict]) +@router.get('/id/{id}/valves/user', response_model=dict | None) async def get_function_user_valves_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -497,7 +498,7 @@ async def get_function_user_valves_by_id( ) -@router.get('/id/{id}/valves/user/spec', response_model=Optional[dict]) +@router.get('/id/{id}/valves/user/spec', response_model=dict | None) async def get_function_user_valves_spec_by_id( request: Request, id: str, @@ -522,7 +523,7 @@ async def get_function_user_valves_spec_by_id( ) -@router.post('/id/{id}/valves/user/update', response_model=Optional[dict]) +@router.post('/id/{id}/valves/user/update', response_model=dict | None) async def update_function_user_valves_by_id( request: Request, id: str, diff --git a/backend/open_webui/routers/groups.py b/backend/open_webui/routers/groups.py index c45690fc3a..3a06cb287c 100755 --- a/backend/open_webui/routers/groups.py +++ b/backend/open_webui/routers/groups.py @@ -1,26 +1,27 @@ +import logging import os from pathlib import Path from typing import Optional -import logging - -from open_webui.models.users import Users, UserInfoResponse -from open_webui.models.groups import ( - Groups, - GroupForm, - GroupInfoResponse, - GroupUpdateForm, - GroupResponse, - UserIdsForm, -) +from fastapi import APIRouter, Depends, HTTPException, Request, status from open_webui.config import CACHE_DIR from open_webui.constants import ERROR_MESSAGES -from fastapi import APIRouter, Depends, HTTPException, Request, status - from open_webui.internal.db import get_async_session -from sqlalchemy.ext.asyncio import AsyncSession - +from open_webui.models.access_grants import AccessGrants +from open_webui.models.groups import ( + GroupForm, + GroupInfoResponse, + GroupResponse, + Groups, + GroupUpdateForm, + UserIdsForm, +) +from open_webui.models.knowledge import Knowledges +from open_webui.models.models import Models +from open_webui.models.tools import Tools +from open_webui.models.users import UserInfoResponse, Users from open_webui.utils.auth import get_admin_user, get_verified_user +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -276,3 +277,88 @@ async def delete_group_by_id(id: str, user=Depends(get_admin_user), db: AsyncSes status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.DEFAULT(e), ) + + +############################ +# PreviewGroupAccess +############################ + + +@router.get('/id/{id}/preview') +async def preview_group_access( + id: str, + user=Depends(get_admin_user), + db: AsyncSession = Depends(get_async_session), +): + """Show what resources a group can access (preview audit).""" + group = await Groups.get_group_by_id(id, db=db) + if not group: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + + group_ids = {group.id} + + # Batch-check accessible resources using existing AccessGrants + all_models = await Models.get_all_models(db=db) + accessible_model_ids = await AccessGrants.get_accessible_resource_ids( + user_id='', + resource_type='model', + resource_ids=[m.id for m in all_models], + permission='read', + user_group_ids=group_ids, + db=db, + ) + + all_knowledge = await Knowledges.get_knowledge_bases(db=db) + accessible_knowledge_ids = await AccessGrants.get_accessible_resource_ids( + user_id='', + resource_type='knowledge', + resource_ids=[k.id for k in all_knowledge], + permission='read', + user_group_ids=group_ids, + db=db, + ) + + all_tools = await Tools.get_tools(defer_content=True, db=db) + accessible_tool_ids = await AccessGrants.get_accessible_resource_ids( + user_id='', + resource_type='tool', + resource_ids=[t.id for t in all_tools], + permission='read', + user_group_ids=group_ids, + db=db, + ) + + active_models = [m for m in all_models if m.is_active] + + return { + 'group': {'id': group.id, 'name': group.name}, + 'models': { + 'items': [ + {'id': m.id, 'name': m.name} + for m in active_models + if m.id in accessible_model_ids + ], + 'total': len(active_models), + }, + 'knowledge': { + 'items': [ + {'id': k.id, 'name': k.name} + for k in all_knowledge + if k.id in accessible_knowledge_ids + ], + 'total': len(all_knowledge), + }, + 'tools': { + 'items': [ + {'id': t.id, 'name': t.name} + for t in all_tools + if t.id in accessible_tool_ids + ], + 'total': len(all_tools), + }, + 'permissions': group.permissions or {}, + } + diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index 7ef4938b2e..4eced8cb0b 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -1,46 +1,45 @@ +from __future__ import annotations + import asyncio import base64 -import uuid import io import json import logging import mimetypes import re +import uuid from pathlib import Path from typing import Optional +from urllib.parse import quote, urlparse -from urllib.parse import quote import aiohttp - from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile from fastapi.responses import FileResponse - from open_webui.config import ( CACHE_DIR, IMAGE_AUTO_SIZE_MODELS_REGEX_PATTERN, IMAGE_URL_RESPONSE_MODELS_REGEX_PATTERN, ) from open_webui.constants import ERROR_MESSAGES -from open_webui.retrieval.web.utils import validate_url -from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, ENABLE_FORWARD_USER_INFO_HEADERS -from open_webui.utils.session_pool import get_session - -from open_webui.models.chats import Chats -from open_webui.routers.files import upload_file_handler, get_file_content_by_id -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission -from open_webui.utils.headers import include_user_info_headers +from open_webui.env import AIOHTTP_CLIENT_ALLOW_REDIRECTS, AIOHTTP_CLIENT_SESSION_SSL, ENABLE_FORWARD_USER_INFO_HEADERS from open_webui.internal.db import get_async_session -from sqlalchemy.ext.asyncio import AsyncSession +from open_webui.models.chats import Chats +from open_webui.retrieval.web.utils import validate_url +from open_webui.routers.files import get_file_content_by_id, upload_file_handler +from open_webui.utils.access_control import has_permission +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.headers import include_user_info_headers from open_webui.utils.images.comfyui import ( ComfyUICreateImageForm, ComfyUIEditImageForm, ComfyUIWorkflow, - comfyui_upload_image, comfyui_create_image, comfyui_edit_image, + comfyui_upload_image, ) +from open_webui.utils.session_pool import get_session from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -121,17 +120,17 @@ class ImagesConfig(BaseModel): IMAGE_GENERATION_ENGINE: str IMAGE_GENERATION_MODEL: str - IMAGE_SIZE: Optional[str] - IMAGE_STEPS: Optional[int] + IMAGE_SIZE: str | None + IMAGE_STEPS: int | None IMAGES_OPENAI_API_BASE_URL: str IMAGES_OPENAI_API_KEY: str IMAGES_OPENAI_API_VERSION: str - IMAGES_OPENAI_API_PARAMS: Optional[dict | str] + IMAGES_OPENAI_API_PARAMS: dict | str | None AUTOMATIC1111_BASE_URL: str - AUTOMATIC1111_API_AUTH: Optional[dict | str] - AUTOMATIC1111_PARAMS: Optional[dict | str] + AUTOMATIC1111_API_AUTH: dict | str | None + AUTOMATIC1111_PARAMS: dict | str | None COMFYUI_BASE_URL: str COMFYUI_API_KEY: str @@ -145,7 +144,7 @@ class ImagesConfig(BaseModel): ENABLE_IMAGE_EDIT: bool IMAGE_EDIT_ENGINE: str IMAGE_EDIT_MODEL: str - IMAGE_EDIT_SIZE: Optional[str] + IMAGE_EDIT_SIZE: str | None IMAGES_EDIT_OPENAI_API_BASE_URL: str IMAGES_EDIT_OPENAI_API_KEY: str @@ -428,20 +427,53 @@ async def get_models(request: Request, user=Depends(get_verified_user)): class CreateImageForm(BaseModel): - model: Optional[str] = None + model: str | None = None prompt: str - size: Optional[str] = None + size: str | None = None n: int = 1 - steps: Optional[int] = None - negative_prompt: Optional[str] = None + steps: int | None = None + negative_prompt: str | None = None GenerateImageForm = CreateImageForm # Alias for backward compatibility -async def get_image_data(data: str, headers=None): +def _is_same_origin(url: str, base_url: str) -> bool: + """Compare scheme + hostname + port of two URLs. + + Pure string-prefix matching (``startswith``) is vulnerable to + userinfo injection (``http://host:port@evil.com/``) and suffix + confusion (``http://host:portevil.com/``). Parsing both URLs + and comparing the three origin components eliminates those + attack vectors. + """ + def _default_port(scheme: str) -> int: + return 443 if scheme == 'https' else 80 + + parsed = urlparse(url) + trusted = urlparse(base_url) + return ( + parsed.scheme == trusted.scheme + and parsed.hostname == trusted.hostname + and (parsed.port or _default_port(parsed.scheme)) + == (trusted.port or _default_port(trusted.scheme)) + ) + + +async def get_image_data(data: str, headers=None, trusted_base_url: str | None = None): try: if data.startswith('http://') or data.startswith('https://'): + # Defense-in-depth: gate before fetch (mirrors load_url_image). + # For URLs originating from an admin-configured backend (e.g. + # ComfyUI on a private network), skip SSRF validation only when + # the URL shares the exact same origin (scheme + host + port) + # as the admin-configured base. This avoids both the global + # ENABLE_RAG_LOCAL_WEB_FETCH hammer and a blanket trust flag + # that would follow arbitrary redirects. + if trusted_base_url and _is_same_origin(data, trusted_base_url): + log.debug(f'Skipping URL validation for trusted backend: {data}') + else: + validate_url(data) session = await get_session() async with session.get( data, @@ -470,6 +502,8 @@ async def get_image_data(data: str, headers=None): async def upload_image(request, image_data, content_type, metadata, user, db=None): + if image_data is None or content_type is None: + raise ValueError('Failed to retrieve image data from the generation backend') image_format = mimetypes.guess_extension(content_type) file = UploadFile( file=io.BytesIO(image_data), @@ -526,7 +560,7 @@ async def generate_images(request: Request, form_data: CreateImageForm, user=Dep async def image_generations( request: Request, form_data: CreateImageForm, - metadata: Optional[dict] = None, + metadata: dict | None = None, user=None, ): # if IMAGE_SIZE = 'auto', default WidthxHeight to the 512x512 default @@ -708,7 +742,10 @@ async def image_generations( if request.app.state.config.COMFYUI_API_KEY: headers = {'Authorization': f'Bearer {request.app.state.config.COMFYUI_API_KEY}'} - image_data, content_type = await get_image_data(image['url'], headers) + image_data, content_type = await get_image_data( + image['url'], headers, + trusted_base_url=request.app.state.config.COMFYUI_BASE_URL, + ) _, url = await upload_image( request, image_data, @@ -774,18 +811,18 @@ async def image_generations( class EditImageForm(BaseModel): image: str | list[str] # base64-encoded image(s) or URL(s) prompt: str - model: Optional[str] = None - size: Optional[str] = None - n: Optional[int] = None - negative_prompt: Optional[str] = None - background: Optional[str] = None + model: str | None = None + size: str | None = None + n: int | None = None + negative_prompt: str | None = None + background: str | None = None @router.post('/edit') async def image_edits( request: Request, form_data: EditImageForm, - metadata: Optional[dict] = None, + metadata: dict | None = None, user=Depends(get_verified_user), ): size = None @@ -807,10 +844,16 @@ async def image_edits( return data if data.startswith('http://') or data.startswith('https://'): - # Validate URL to prevent SSRF attacks against local/private networks + # Validate URL to prevent SSRF attacks against local/private networks. + # allow_redirects=False prevents redirect-based SSRF: validate_url() is + # called only on the originally-submitted URL; following 3xx redirects + # without re-validation would let an attacker reach private IPs via a + # public host that redirects internally (e.g. cloud-metadata exfil). validate_url(data) session = await get_session() - async with session.get(data, ssl=AIOHTTP_CLIENT_SESSION_SSL) as r: + async with session.get( + data, ssl=AIOHTTP_CLIENT_SESSION_SSL, allow_redirects=AIOHTTP_CLIENT_ALLOW_REDIRECTS + ) as r: r.raise_for_status() image_data = base64.b64encode(await r.read()).decode('utf-8') @@ -1058,7 +1101,10 @@ async def image_edits( if request.app.state.config.IMAGES_EDIT_COMFYUI_API_KEY: headers = {'Authorization': f'Bearer {request.app.state.config.IMAGES_EDIT_COMFYUI_API_KEY}'} - image_data, content_type = await get_image_data(image_url, headers) + image_data, content_type = await get_image_data( + image_url, headers, + trusted_base_url=request.app.state.config.IMAGES_EDIT_COMFYUI_BASE_URL, + ) _, url = await upload_image( request, image_data, diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index f503169fc0..ccf99bde58 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -1,41 +1,42 @@ -from typing import List, Optional -from pydantic import BaseModel -from fastapi import APIRouter, Depends, HTTPException, status, Request, Query -from fastapi.responses import StreamingResponse +from __future__ import annotations -import logging import io +import logging import zipfile +from typing import List, Optional from urllib.parse import quote -from sqlalchemy.ext.asyncio import AsyncSession +from fastapi import APIRouter, Depends, HTTPException, Query, Request, status +from fastapi.responses import StreamingResponse +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL +from open_webui.constants import ERROR_MESSAGES from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants +from open_webui.models.files import FileMetadataResponse, FileModel, Files from open_webui.models.groups import Groups from open_webui.models.knowledge import ( + KnowledgeDirectoryForm, + KnowledgeDirectoryModel, KnowledgeFileListResponse, - Knowledges, KnowledgeForm, KnowledgeResponse, + Knowledges, KnowledgeUserResponse, ) -from open_webui.models.files import Files, FileModel, FileMetadataResponse +from open_webui.models.models import ModelForm, Models from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT from open_webui.routers.retrieval import ( - process_file, - ProcessFileForm, - process_files_batch, BatchProcessFilesForm, + ProcessFileForm, + process_file, + process_files_batch, ) from open_webui.storage.provider import Storage - -from open_webui.constants import ERROR_MESSAGES -from open_webui.utils.auth import get_verified_user, get_admin_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants -from open_webui.models.access_grants import AccessGrants - - -from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL -from open_webui.models.models import Models, ModelForm +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission +from open_webui.utils.access_control.files import has_access_to_file +from open_webui.utils.auth import get_admin_user, get_verified_user +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -99,7 +100,7 @@ async def remove_knowledge_base_metadata_embedding(knowledge_base_id: str) -> bo class KnowledgeAccessResponse(KnowledgeUserResponse): - write_access: Optional[bool] = False + write_access: bool | None = False class KnowledgeAccessListResponse(BaseModel): @@ -109,7 +110,7 @@ class KnowledgeAccessListResponse(BaseModel): @router.get('/', response_model=KnowledgeAccessListResponse) async def get_knowledge_bases( - page: Optional[int] = 1, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -158,9 +159,9 @@ async def get_knowledge_bases( @router.get('/search', response_model=KnowledgeAccessListResponse) async def search_knowledge_bases( - query: Optional[str] = None, - view_option: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + view_option: str | None = None, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -214,8 +215,8 @@ async def search_knowledge_bases( @router.get('/search/files', response_model=KnowledgeFileListResponse) async def search_knowledge_files( - query: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -241,7 +242,7 @@ async def search_knowledge_files( ############################ -@router.post('/create', response_model=Optional[KnowledgeResponse]) +@router.post('/create', response_model=KnowledgeResponse | None) async def create_new_knowledge( request: Request, form_data: KnowledgeForm, @@ -379,11 +380,11 @@ async def reindex_knowledge_base_metadata_embeddings( class KnowledgeFilesResponse(KnowledgeResponse): - files: Optional[list[FileMetadataResponse]] = None - write_access: Optional[bool] = False + files: list[FileMetadataResponse | None] = None + write_access: bool | None = False -@router.get('/{id}', response_model=Optional[KnowledgeFilesResponse]) +@router.get('/{id}', response_model=KnowledgeFilesResponse | None) async def get_knowledge_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): knowledge = await Knowledges.get_knowledge_by_id(id=id, db=db) @@ -430,7 +431,7 @@ async def get_knowledge_by_id(id: str, user=Depends(get_verified_user), db: Asyn ############################ -@router.post('/{id}/update', response_model=Optional[KnowledgeFilesResponse]) +@router.post('/{id}/update', response_model=KnowledgeFilesResponse | None) async def update_knowledge_by_id( request: Request, id: str, @@ -500,7 +501,7 @@ class KnowledgeAccessGrantsForm(BaseModel): access_grants: list[dict] -@router.post('/{id}/access/update', response_model=Optional[KnowledgeFilesResponse]) +@router.post('/{id}/access/update', response_model=KnowledgeFilesResponse | None) async def update_knowledge_access_by_id( request: Request, id: str, @@ -555,11 +556,12 @@ async def update_knowledge_access_by_id( @router.get('/{id}/files', response_model=KnowledgeFileListResponse) async def get_knowledge_files_by_id( id: str, - query: Optional[str] = None, - view_option: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + view_option: str | None = None, + order_by: str | None = None, + direction: str | None = None, + directory_id: str | None = Query(None, description='Filter by directory ID. Pass empty string for root.'), + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -600,6 +602,9 @@ async def get_knowledge_files_by_id( filter['order_by'] = order_by if direction: filter['direction'] = direction + # directory_id filtering: present in filter = scope to that directory (None = root) + if directory_id is not None: + filter['directory_id'] = directory_id if directory_id else None return await Knowledges.search_files_by_id(id, user.id, filter=filter, skip=skip, limit=limit, db=db) @@ -611,9 +616,10 @@ async def get_knowledge_files_by_id( class KnowledgeFileIdForm(BaseModel): file_id: str + directory_id: Optional[str] = None -@router.post('/{id}/file/add', response_model=Optional[KnowledgeFilesResponse]) +@router.post('/{id}/file/add', response_model=KnowledgeFilesResponse | None) async def add_file_to_knowledge_by_id( request: Request, id: str, @@ -656,6 +662,14 @@ async def add_file_to_knowledge_by_id( detail=ERROR_MESSAGES.FILE_NOT_PROCESSED, ) + # KB write-access alone is not enough — caller must also be able to read the file. + if file.user_id != user.id and user.role != 'admin': + if not await has_access_to_file(file.id, 'read', user, db=db): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=ERROR_MESSAGES.ACCESS_PROHIBITED, + ) + # Add content to the vector database try: await process_file( @@ -666,7 +680,13 @@ async def add_file_to_knowledge_by_id( ) # Add file to knowledge base - await Knowledges.add_file_to_knowledge_by_id(knowledge_id=id, file_id=form_data.file_id, user_id=user.id, db=db) + await Knowledges.add_file_to_knowledge_by_id( + knowledge_id=id, + file_id=form_data.file_id, + user_id=user.id, + directory_id=form_data.directory_id, + db=db, + ) except Exception as e: log.debug(e) raise HTTPException( @@ -686,7 +706,7 @@ async def add_file_to_knowledge_by_id( ) -@router.post('/{id}/file/update', response_model=Optional[KnowledgeFilesResponse]) +@router.post('/{id}/file/update', response_model=KnowledgeFilesResponse | None) async def update_file_from_knowledge_by_id( request: Request, id: str, @@ -765,7 +785,7 @@ async def update_file_from_knowledge_by_id( ############################ -@router.post('/{id}/file/remove', response_model=Optional[KnowledgeFilesResponse]) +@router.post('/{id}/file/remove', response_model=KnowledgeFilesResponse | None) async def remove_file_from_knowledge_by_id( id: str, form_data: KnowledgeFileIdForm, @@ -927,7 +947,7 @@ async def delete_knowledge_by_id( ############################ -@router.post('/{id}/reset', response_model=Optional[KnowledgeResponse]) +@router.post('/{id}/reset', response_model=KnowledgeResponse | None) async def reset_knowledge_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -969,7 +989,7 @@ async def reset_knowledge_by_id( ############################ -@router.post('/{id}/files/batch/add', response_model=Optional[KnowledgeFilesResponse]) +@router.post('/{id}/files/batch/add', response_model=KnowledgeFilesResponse | None) async def add_files_to_knowledge_batch( request: Request, id: str, @@ -1017,6 +1037,15 @@ async def add_files_to_knowledge_batch( detail=f'File {missing_ids[0]} not found', ) + # Per-file read-access check — same gate as the single-file endpoint. + if user.role != 'admin': + for file in files: + if file.user_id != user.id and not await has_access_to_file(file.id, 'read', user, db=db): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=ERROR_MESSAGES.ACCESS_PROHIBITED, + ) + # Process files try: result = await process_files_batch( @@ -1101,3 +1130,178 @@ async def export_knowledge_by_id(id: str, user=Depends(get_admin_user), db: Asyn media_type='application/zip', headers={'Content-Disposition': content_disposition}, ) + + +############################ +# Directory endpoints +############################ + + +class KnowledgeDirectoryCreateForm(BaseModel): + name: str + parent_id: Optional[str] = None + + +class KnowledgeDirectoryUpdateForm(BaseModel): + name: Optional[str] = None + parent_id: Optional[str] = '__unset__' + + +class KnowledgeFileMoveForm(BaseModel): + file_id: str + directory_id: Optional[str] = None + + +async def _verify_knowledge_write_access( + id: str, user, db: AsyncSession +): + """Verify the user has write access to the knowledge base. Returns the knowledge model.""" + knowledge = await Knowledges.get_knowledge_by_id(id=id, db=db) + if not knowledge: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + if ( + knowledge.user_id != user.id + and not await AccessGrants.has_access( + user_id=user.id, + resource_type='knowledge', + resource_id=knowledge.id, + permission='write', + db=db, + ) + and user.role != 'admin' + ): + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=ERROR_MESSAGES.ACCESS_PROHIBITED, + ) + return knowledge + + +@router.post('/{id}/dirs/create', response_model=KnowledgeDirectoryModel) +async def create_knowledge_directory( + id: str, + form_data: KnowledgeDirectoryCreateForm, + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + await _verify_knowledge_write_access(id, user, db) + + directory = await Knowledges.create_directory( + knowledge_id=id, + name=form_data.name, + user_id=user.id, + parent_id=form_data.parent_id, + db=db, + ) + if not directory: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Failed to create directory. A directory with this name may already exist at this level.', + ) + return directory + + +@router.post('/{id}/dirs/{dir_id}/update', response_model=KnowledgeDirectoryModel) +async def update_knowledge_directory( + id: str, + dir_id: str, + form_data: KnowledgeDirectoryUpdateForm, + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + await _verify_knowledge_write_access(id, user, db) + + # Verify directory belongs to this knowledge base + directory = await Knowledges.get_directory_by_id(dir_id, db=db) + if not directory or directory.knowledge_id != id: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + + result = await Knowledges.update_directory( + directory_id=dir_id, + name=form_data.name, + parent_id=form_data.parent_id, + db=db, + ) + if not result: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Failed to update directory. This may be caused by a naming conflict or circular move.', + ) + return result + + +@router.delete('/{id}/dirs/{dir_id}/delete') +async def delete_knowledge_directory( + id: str, + dir_id: str, + move_files: bool = Query(True, description='If true, move contained files to parent. If false, delete them.'), + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + await _verify_knowledge_write_access(id, user, db) + + # Verify directory belongs to this knowledge base + directory = await Knowledges.get_directory_by_id(dir_id, db=db) + if not directory or directory.knowledge_id != id: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + + success = await Knowledges.delete_directory( + directory_id=dir_id, + move_files_to_parent=move_files, + db=db, + ) + if not success: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail='Failed to delete directory.', + ) + return {'status': True} + + +@router.post('/{id}/file/move') +async def move_file_in_knowledge( + id: str, + form_data: KnowledgeFileMoveForm, + user=Depends(get_verified_user), + db: AsyncSession = Depends(get_async_session), +): + await _verify_knowledge_write_access(id, user, db) + + # Verify file belongs to this knowledge base + if not await Knowledges.has_file(knowledge_id=id, file_id=form_data.file_id, db=db): + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.NOT_FOUND, + ) + + # If target directory is set, verify it belongs to this knowledge base + if form_data.directory_id: + directory = await Knowledges.get_directory_by_id(form_data.directory_id, db=db) + if not directory or directory.knowledge_id != id: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail='Target directory not found.', + ) + + success = await Knowledges.move_file_to_directory( + knowledge_id=id, + file_id=form_data.file_id, + directory_id=form_data.directory_id, + db=db, + ) + if not success: + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail='Failed to move file.', + ) + return {'status': True} + diff --git a/backend/open_webui/routers/memories.py b/backend/open_webui/routers/memories.py index 6522118258..5108ab0e7c 100644 --- a/backend/open_webui/routers/memories.py +++ b/backend/open_webui/routers/memories.py @@ -1,17 +1,18 @@ -from fastapi import APIRouter, Depends, HTTPException, Request, status -from pydantic import BaseModel -import logging +from __future__ import annotations + import asyncio +import logging from typing import Optional +from fastapi import APIRouter, Depends, HTTPException, Request, status +from open_webui.constants import ERROR_MESSAGES +from open_webui.internal.db import get_async_session from open_webui.models.memories import Memories, MemoryModel from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT -from open_webui.utils.auth import get_verified_user -from open_webui.internal.db import get_async_session -from sqlalchemy.ext.asyncio import AsyncSession - from open_webui.utils.access_control import has_permission -from open_webui.constants import ERROR_MESSAGES +from open_webui.utils.auth import get_verified_user +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -56,10 +57,10 @@ class AddMemoryForm(BaseModel): class MemoryUpdateModel(BaseModel): - content: Optional[str] = None + content: str | None = None -@router.post('/add', response_model=Optional[MemoryModel]) +@router.post('/add', response_model=MemoryModel | None) async def add_memory( request: Request, form_data: AddMemoryForm, @@ -107,7 +108,7 @@ async def add_memory( class QueryMemoryForm(BaseModel): content: str - k: Optional[int] = 1 + k: int | None = 1 @router.post('/query') @@ -275,7 +276,7 @@ async def delete_memory_by_user_id( ############################ -@router.post('/{memory_id}/update', response_model=Optional[MemoryModel]) +@router.post('/{memory_id}/update', response_model=MemoryModel | None) async def update_memory_by_id( memory_id: str, request: Request, diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index 510a0d3d29..922d016a2e 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -1,43 +1,43 @@ -from typing import Optional -import io -import base64 -import json +from __future__ import annotations + import asyncio +import base64 +import io +import json import logging import posixpath +from typing import Optional from urllib.parse import unquote -from open_webui.models.groups import Groups -from open_webui.models.models import ( - ModelForm, - ModelMeta, - ModelModel, - ModelParams, - ModelResponse, - ModelListResponse, - ModelAccessListResponse, - ModelAccessResponse, - Models, -) -from open_webui.models.access_grants import AccessGrants - -from pydantic import BaseModel -from open_webui.constants import ERROR_MESSAGES from fastapi import ( APIRouter, Depends, HTTPException, Request, - status, Response, + status, ) from fastapi.responses import RedirectResponse, StreamingResponse - - -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import ENABLE_PROFILE_IMAGE_URL_FORWARDING from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants +from open_webui.models.groups import Groups +from open_webui.models.models import ( + ModelAccessListResponse, + ModelAccessResponse, + ModelForm, + ModelListResponse, + ModelMeta, + ModelModel, + ModelParams, + ModelResponse, + Models, +) +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission +from open_webui.utils.auth import get_admin_user, get_verified_user +from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -45,7 +45,7 @@ log = logging.getLogger(__name__) router = APIRouter() -def _safe_static_redirect_path(url: str) -> Optional[str]: +def _safe_static_redirect_path(url: str) -> str | None: """ If url is a same-origin static asset path, return a normalized path safe for RedirectResponse Location. Otherwise None (caller should fall back to default). @@ -89,12 +89,12 @@ PAGE_ITEM_COUNT = 30 @router.get('/list', response_model=ModelAccessListResponse) # do NOT use "/" as path, conflicts with main.py async def get_models( - query: Optional[str] = None, - view_option: Optional[str] = None, - tag: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + view_option: str | None = None, + tag: str | None = None, + order_by: str | None = None, + direction: str | None = None, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -191,7 +191,7 @@ async def get_model_tags(user=Depends(get_verified_user), db: AsyncSession = Dep ############################ -@router.post('/create', response_model=Optional[ModelModel]) +@router.post('/create', response_model=ModelModel | None) async def create_new_model( request: Request, form_data: ModelForm, @@ -408,34 +408,41 @@ class ModelIdForm(BaseModel): # Note: We're not using the typical url path param here, but instead using a query parameter to allow '/' in the id -@router.get('/model', response_model=Optional[ModelAccessResponse]) +@router.get('/model', response_model=ModelAccessResponse | None) async def get_model_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): model = await Models.get_model_by_id(id, db=db) if model: - if ( + write_access = ( (user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL) - or model.user_id == user.id + or user.id == model.user_id or await AccessGrants.has_access( user_id=user.id, resource_type='model', resource_id=model.id, - permission='read', + permission='write', db=db, ) + ) + + if write_access or await AccessGrants.has_access( + user_id=user.id, + resource_type='model', + resource_id=model.id, + permission='read', + db=db, ): + model_dict = model.model_dump() + # Strip params (system prompt and other admin-curated config) + # for read-only callers — matches the params strip already + # enforced on /api/models in utils/models.py. Owners, admins + # under BYPASS_ADMIN_ACCESS_CONTROL, and write-grant holders + # still receive the full object so the workspace edit UI keeps + # working for users who legitimately curate the model. + if not write_access: + model_dict['params'] = {} return ModelAccessResponse( - **model.model_dump(), - write_access=( - (user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL) - or user.id == model.user_id - or await AccessGrants.has_access( - user_id=user.id, - resource_type='model', - resource_id=model.id, - permission='write', - db=db, - ) - ), + **model_dict, + write_access=write_access, ) else: raise HTTPException( @@ -456,47 +463,67 @@ async def get_model_by_id(id: str, user=Depends(get_verified_user), db: AsyncSes @router.get('/model/profile/image') async def get_model_profile_image( + request: Request, id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): - model_meta = await Models.get_model_meta_by_id(id, db=db) + profile_image_url = None + updated_at = None + # First, check the database for regular models + model_meta = await Models.get_model_meta_by_id(id, db=db) if model_meta: meta, updated_at = model_meta profile_image_url = (meta or {}).get('profile_image_url') - if profile_image_url: - if profile_image_url.startswith('http'): + # Fallback: check arena models stored in config (not in the DB) + if not profile_image_url: + arena_models = getattr( + getattr(request.app.state, 'config', None), + 'EVALUATION_ARENA_MODELS', + [], + ) + for arena_model in arena_models: + if arena_model.get('id') == id: + profile_image_url = arena_model.get('meta', {}).get('profile_image_url') + break + + if profile_image_url: + if profile_image_url.startswith('http'): + if ENABLE_PROFILE_IMAGE_URL_FORWARDING: return Response( status_code=status.HTTP_302_FOUND, headers={'Location': profile_image_url}, ) - elif profile_image_url.startswith('data:image'): - try: - header, base64_data = profile_image_url.split(',', 1) - image_data = base64.b64decode(base64_data) - image_buffer = io.BytesIO(image_data) - media_type = header.split(';')[0].lstrip('data:') + # When forwarding is disabled, fall through to the + # default image to prevent client-side IP/UA/Referer + # leaks via 302 redirect to external origins. + elif profile_image_url.startswith('data:image'): + try: + header, base64_data = profile_image_url.split(',', 1) + image_data = base64.b64decode(base64_data) + image_buffer = io.BytesIO(image_data) + media_type = header.split(';')[0].lstrip('data:') - headers = {'Content-Disposition': 'inline'} - if updated_at: - headers['ETag'] = f'"{updated_at}"' + headers = {'Content-Disposition': 'inline'} + if updated_at: + headers['ETag'] = f'"{updated_at}"' - return StreamingResponse( - image_buffer, - media_type=media_type, - headers=headers, - ) - except Exception: - pass - else: - safe_static = _safe_static_redirect_path(profile_image_url) - if safe_static: - return RedirectResponse( - url=safe_static, - status_code=status.HTTP_302_FOUND, - ) + return StreamingResponse( + image_buffer, + media_type=media_type, + headers=headers, + ) + except Exception: + pass + else: + safe_static = _safe_static_redirect_path(profile_image_url) + if safe_static: + return RedirectResponse( + url=safe_static, + status_code=status.HTTP_302_FOUND, + ) return RedirectResponse( url='/static/favicon.png', @@ -509,7 +536,7 @@ async def get_model_profile_image( ############################ -@router.post('/model/toggle', response_model=Optional[ModelResponse]) +@router.post('/model/toggle', response_model=ModelResponse | None) async def toggle_model_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): model = await Models.get_model_by_id(id, db=db) if model: @@ -550,7 +577,7 @@ async def toggle_model_by_id(id: str, user=Depends(get_verified_user), db: Async ############################ -@router.post('/model/update', response_model=Optional[ModelModel]) +@router.post('/model/update', response_model=ModelModel | None) async def update_model_by_id( request: Request, form_data: ModelForm, @@ -599,11 +626,11 @@ async def update_model_by_id( class ModelAccessGrantsForm(BaseModel): id: str - name: Optional[str] = None + name: str | None = None access_grants: list[dict] -@router.post('/model/access/update', response_model=Optional[ModelModel]) +@router.post('/model/access/update', response_model=ModelModel | None) async def update_model_access_by_id( request: Request, form_data: ModelAccessGrantsForm, diff --git a/backend/open_webui/routers/notes.py b/backend/open_webui/routers/notes.py index 4fbdd09993..6dccc73f6d 100644 --- a/backend/open_webui/routers/notes.py +++ b/backend/open_webui/routers/notes.py @@ -2,39 +2,33 @@ import json import logging from typing import Optional - -from fastapi import APIRouter, Depends, HTTPException, Request, status, BackgroundTasks -from pydantic import BaseModel - -from open_webui.socket.main import sio - -from open_webui.models.groups import Groups -from open_webui.models.users import Users, UserResponse -from open_webui.models.notes import ( - NoteListResponse, - Notes, - NoteModel, - NoteForm, - NoteUserResponse, -) - +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Request, status from open_webui.config import ( BYPASS_ADMIN_ACCESS_CONTROL, ENABLE_ADMIN_CHAT_ACCESS, ENABLE_ADMIN_EXPORT, ) from open_webui.constants import ERROR_MESSAGES - - -from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants +from open_webui.models.groups import Groups +from open_webui.models.notes import ( + NoteForm, + NoteListResponse, + NoteModel, + Notes, + NoteUserResponse, +) +from open_webui.models.users import UserResponse, Users +from open_webui.socket.main import sio from open_webui.utils.access_control import ( + filter_allowed_access_grants, has_permission, has_public_read_access_grant, has_public_write_access_grant, - filter_allowed_access_grants, ) -from open_webui.models.access_grants import AccessGrants -from open_webui.internal.db import get_async_session +from open_webui.utils.auth import get_admin_user, get_verified_user +from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -92,10 +86,13 @@ async def get_notes( user_ids = list(set(note.user_id for note in notes)) users = {user.id: user for user in await Users.get_users_by_user_ids(user_ids, db=db)} + pinned_note_ids = await Notes.get_pinned_note_ids(user.id, db=db) + return [ NoteUserResponse( **{ **note.model_dump(), + 'is_pinned': note.id in pinned_note_ids, 'data': _truncate_note_data(note.data), 'user': UserResponse(**users[note.user_id].model_dump()), } @@ -135,6 +132,7 @@ async def get_pinned_notes( NoteUserResponse( **{ **note.model_dump(), + 'is_pinned': True, 'data': _truncate_note_data(note.data), 'user': UserResponse(**users[note.user_id].model_dump()), } @@ -190,7 +188,9 @@ async def search_notes( filter['user_id'] = user.id result = await Notes.search_notes(user.id, filter, skip=skip, limit=limit, db=db) + pinned_note_ids = await Notes.get_pinned_note_ids(user.id, db=db) for note in result.items: + note.is_pinned = note.id in pinned_note_ids note.data = _truncate_note_data(note.data) return result @@ -287,7 +287,11 @@ async def get_note_by_id( or has_public_write_access_grant(note.access_grants) ) - return NoteResponse(**note.model_dump(), write_access=write_access) + pinned_note_ids = await Notes.get_pinned_note_ids(user.id, db=db) + return NoteResponse( + **{**note.model_dump(), 'is_pinned': note.id in pinned_note_ids}, + write_access=write_access, + ) ############################ @@ -338,6 +342,9 @@ async def update_note_by_id( try: note = await Notes.update_note_by_id(id, form_data, db=db) + pinned_note_ids = await Notes.get_pinned_note_ids(user.id, db=db) + note.is_pinned = note.id in pinned_note_ids + await sio.emit( 'note-events', note.model_dump(), @@ -401,7 +408,10 @@ async def update_note_access_by_id( await AccessGrants.set_access_grants('note', id, form_data.access_grants, db=db) - return await Notes.get_note_by_id(id, db=db) + note = await Notes.get_note_by_id(id, db=db) + pinned_note_ids = await Notes.get_pinned_note_ids(user.id, db=db) + note.is_pinned = note.id in pinned_note_ids + return note ############################ @@ -440,7 +450,9 @@ async def pin_note_by_id( ): raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT()) - note = await Notes.toggle_note_pinned_by_id(id, db=db) + note = await Notes.toggle_note_pinned_by_id(id, user.id, db=db) + pinned_note_ids = await Notes.get_pinned_note_ids(user.id, db=db) + note.is_pinned = note.id in pinned_note_ids return note diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 8311fee5d4..d6348836e8 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -1,7 +1,8 @@ +from __future__ import annotations + # TODO: Implement a more intelligent load balancing mechanism for distributing requests among multiple backend instances. # Current implementation uses a simple round-robin approach (random.choice). Consider incorporating algorithms like weighted round-robin, # least connections, or least response time for better resource utilization and performance optimization. - import asyncio import json import logging @@ -10,70 +11,60 @@ import random import re import time from datetime import datetime - from typing import Optional, Union from urllib.parse import urlparse + import aiohttp from aiocache import cached - - -from open_webui.utils.headers import include_user_info_headers -from open_webui.models.chats import Chats -from open_webui.models.users import UserModel - -from open_webui.env import ( - ENABLE_FORWARD_USER_INFO_HEADERS, - FORWARD_SESSION_INFO_HEADER_CHAT_ID, -) - from fastapi import ( + APIRouter, Depends, FastAPI, File, HTTPException, Request, UploadFile, - APIRouter, ) from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import StreamingResponse -from pydantic import BaseModel, ConfigDict, validator - -from sqlalchemy.ext.asyncio import AsyncSession - +from open_webui.config import ( + UPLOAD_DIR, +) +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import ( + AIOHTTP_CLIENT_SESSION_SSL, + AIOHTTP_CLIENT_TIMEOUT, + AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST, + BYPASS_MODEL_ACCESS_CONTROL, + ENABLE_FORWARD_USER_INFO_HEADERS, + ENV, + FORWARD_SESSION_INFO_HEADER_CHAT_ID, + MODELS_CACHE_TTL, +) from open_webui.internal.db import get_async_session - - -from open_webui.models.models import Models from open_webui.models.access_grants import AccessGrants +from open_webui.models.chats import Chats from open_webui.models.groups import Groups +from open_webui.models.models import Models +from open_webui.models.users import UserModel from open_webui.utils.access_control import check_model_access +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.headers import include_user_info_headers from open_webui.utils.misc import ( calculate_sha256, ) -from open_webui.utils.session_pool import ( - cleanup_response, - get_session, - stream_wrapper, -) from open_webui.utils.payload import ( apply_model_params_to_body_ollama, apply_model_params_to_body_openai, apply_system_prompt_to_body, ) -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.config import ( - UPLOAD_DIR, +from open_webui.utils.session_pool import ( + cleanup_response, + get_session, + stream_wrapper, ) -from open_webui.env import ( - ENV, - MODELS_CACHE_TTL, - AIOHTTP_CLIENT_SESSION_SSL, - AIOHTTP_CLIENT_TIMEOUT, - AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST, - BYPASS_MODEL_ACCESS_CONTROL, -) -from open_webui.constants import ERROR_MESSAGES +from pydantic import BaseModel, ConfigDict, validator +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -126,12 +117,12 @@ async def send_request( url: str, method: str = 'POST', *, - payload: Optional[Union[str, bytes]] = None, - key: Optional[str] = None, + payload: Union[str, bytes | None] = None, + key: str | None = None, user: UserModel = None, stream: bool = False, - content_type: Optional[str] = None, - metadata: Optional[dict] = None, + content_type: str | None = None, + metadata: dict | None = None, ): r = None streaming = False @@ -225,7 +216,7 @@ async def get_status(): class ConnectionVerificationForm(BaseModel): url: str - key: Optional[str] = None + key: str | None = None @router.post('/verify') @@ -279,7 +270,7 @@ async def get_config(request: Request, user=Depends(get_admin_user)): class OllamaConfigForm(BaseModel): - ENABLE_OLLAMA_API: Optional[bool] = None + ENABLE_OLLAMA_API: bool | None = None OLLAMA_BASE_URLS: list[str] OLLAMA_API_CONFIGS: dict @@ -437,7 +428,7 @@ async def get_filtered_models(models, user, db=None): @router.get('/api/tags') @router.get('/api/tags/{url_idx}') -async def get_ollama_tags(request: Request, url_idx: Optional[int] = None, user=Depends(get_verified_user)): +async def get_ollama_tags(request: Request, url_idx: int | None = None, user=Depends(get_verified_user)): if not request.app.state.config.ENABLE_OLLAMA_API: raise HTTPException(status_code=503, detail=ERROR_MESSAGES.OLLAMA_API_DISABLED) @@ -514,7 +505,7 @@ async def get_ollama_loaded_models(request: Request, user=Depends(get_admin_user @router.get('/api/version') @router.get('/api/version/{url_idx}') -async def get_ollama_versions(request: Request, url_idx: Optional[int] = None): +async def get_ollama_versions(request: Request, url_idx: int | None = None): if request.app.state.config.ENABLE_OLLAMA_API: if url_idx is None: # returns lowest version @@ -560,7 +551,7 @@ async def get_ollama_versions(request: Request, url_idx: Optional[int] = None): class ModelNameForm(BaseModel): - model: Optional[str] = None + model: str | None = None model_config = ConfigDict( extra='allow', ) @@ -654,8 +645,8 @@ async def pull_model( class PushModelForm(BaseModel): model: str - insecure: Optional[bool] = None - stream: Optional[bool] = None + insecure: bool | None = None + stream: bool | None = None @router.delete('/api/push') @@ -663,7 +654,7 @@ class PushModelForm(BaseModel): async def push_model( request: Request, form_data: PushModelForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_admin_user), ): if not request.app.state.config.ENABLE_OLLAMA_API: @@ -694,9 +685,9 @@ async def push_model( class CreateModelForm(BaseModel): - model: Optional[str] = None - stream: Optional[bool] = None - path: Optional[str] = None + model: str | None = None + stream: bool | None = None + path: str | None = None model_config = ConfigDict(extra='allow') @@ -734,7 +725,7 @@ class CopyModelForm(BaseModel): async def copy_model( request: Request, form_data: CopyModelForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_admin_user), ): if not request.app.state.config.ENABLE_OLLAMA_API: @@ -769,7 +760,7 @@ async def copy_model( async def delete_model( request: Request, form_data: ModelNameForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_admin_user), ): if not request.app.state.config.ENABLE_OLLAMA_API: @@ -843,9 +834,9 @@ async def show_model_info(request: Request, form_data: ModelNameForm, user=Depen class GenerateEmbedForm(BaseModel): model: str input: list[str] | str - truncate: Optional[bool] = None - options: Optional[dict] = None - keep_alive: Optional[Union[int, str]] = None + truncate: bool | None = None + options: dict | None = None + keep_alive: Union[int, str | None] = None model_config = ConfigDict( extra='allow', @@ -857,7 +848,7 @@ class GenerateEmbedForm(BaseModel): async def embed( request: Request, form_data: GenerateEmbedForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): if not request.app.state.config.ENABLE_OLLAMA_API: @@ -907,8 +898,8 @@ async def embed( class GenerateEmbeddingsForm(BaseModel): model: str prompt: str - options: Optional[dict] = None - keep_alive: Optional[Union[int, str]] = None + options: dict | None = None + keep_alive: Union[int, str | None] = None @router.post('/api/embeddings') @@ -916,7 +907,7 @@ class GenerateEmbeddingsForm(BaseModel): async def embeddings( request: Request, form_data: GenerateEmbeddingsForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): if not request.app.state.config.ENABLE_OLLAMA_API: @@ -965,17 +956,17 @@ async def embeddings( class GenerateCompletionForm(BaseModel): model: str - prompt: Optional[str] = None - suffix: Optional[str] = None - images: Optional[list[str]] = None - format: Optional[Union[dict, str]] = None - options: Optional[dict] = None - system: Optional[str] = None - template: Optional[str] = None - context: Optional[list[int]] = None - stream: Optional[bool] = True - raw: Optional[bool] = None - keep_alive: Optional[Union[int, str]] = None + prompt: str | None = None + suffix: str | None = None + images: list[str | None] = None + format: Union[dict, str | None] = None + options: dict | None = None + system: str | None = None + template: str | None = None + context: list[int | None] = None + stream: bool | None = True + raw: bool | None = None + keep_alive: Union[int, str | None] = None @router.post('/api/generate') @@ -983,7 +974,7 @@ class GenerateCompletionForm(BaseModel): async def generate_completion( request: Request, form_data: GenerateCompletionForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): if not request.app.state.config.ENABLE_OLLAMA_API: @@ -1027,9 +1018,9 @@ async def generate_completion( class ChatMessage(BaseModel): role: str - content: Optional[str] = None - tool_calls: Optional[list[dict]] = None - images: Optional[list[str]] = None + content: str | None = None + tool_calls: list[dict | None] = None + images: list[str | None] = None model_config = ConfigDict(extra='allow') @@ -1046,18 +1037,18 @@ class ChatMessage(BaseModel): class GenerateChatCompletionForm(BaseModel): model: str messages: list[ChatMessage] - format: Optional[Union[dict, str]] = None - options: Optional[dict] = None - template: Optional[str] = None - stream: Optional[bool] = True - keep_alive: Optional[Union[int, str]] = None - tools: Optional[list[dict]] = None + format: Union[dict, str | None] = None + options: dict | None = None + template: str | None = None + stream: bool | None = True + keep_alive: Union[int, str | None] = None + tools: list[dict | None] = None model_config = ConfigDict( extra='allow', ) -async def get_ollama_url(request: Request, model: str, url_idx: Optional[int] = None): +async def get_ollama_url(request: Request, model: str, url_idx: int | None = None): if url_idx is None: models = request.app.state.OLLAMA_MODELS if model not in models: @@ -1075,7 +1066,7 @@ async def get_ollama_url(request: Request, model: str, url_idx: Optional[int] = async def generate_chat_completion( request: Request, form_data: dict, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), bypass_system_prompt: bool = False, ): @@ -1127,7 +1118,7 @@ async def generate_chat_completion( payload = apply_model_params_to_body_ollama(params, payload) if not bypass_system_prompt: - payload = apply_system_prompt_to_body(system, payload, metadata, user) + payload = await apply_system_prompt_to_body(system, payload, metadata, user) await check_model_access(user, model_info, bypass_filter) else: @@ -1162,7 +1153,7 @@ class OpenAIChatMessageContent(BaseModel): class OpenAIChatMessage(BaseModel): role: str - content: Union[Optional[str], list[OpenAIChatMessageContent]] + content: Union[str | None, list[OpenAIChatMessageContent]] model_config = ConfigDict(extra='allow') @@ -1186,7 +1177,7 @@ class OpenAICompletionForm(BaseModel): async def generate_openai_completion( request: Request, form_data: dict, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): # NOTE: We intentionally do NOT use Depends(get_async_session) here. @@ -1248,7 +1239,7 @@ async def generate_openai_completion( async def generate_openai_chat_completion( request: Request, form_data: dict, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): # NOTE: We intentionally do NOT use Depends(get_async_session) here. @@ -1282,7 +1273,7 @@ async def generate_openai_chat_completion( system = params.pop('system', None) payload = apply_model_params_to_body_openai(params, payload) - payload = apply_system_prompt_to_body(system, payload, metadata, user) + payload = await apply_system_prompt_to_body(system, payload, metadata, user) await check_model_access(user, model_info) else: @@ -1313,7 +1304,7 @@ async def generate_openai_chat_completion( async def generate_anthropic_messages( request: Request, form_data: dict, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): """ @@ -1371,7 +1362,7 @@ class ResponsesForm(BaseModel): async def generate_responses( request: Request, form_data: ResponsesForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), ): """ @@ -1422,7 +1413,7 @@ async def generate_responses( @router.get('/v1/models/{url_idx}') async def get_openai_models( request: Request, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -1565,7 +1556,7 @@ async def download_file_stream(ollama_url, file_url, file_path, file_name, chunk async def download_model( request: Request, form_data: UrlForm, - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_admin_user), ): allowed_hosts = ['https://huggingface.co/', 'https://github.com/'] @@ -1598,7 +1589,7 @@ async def download_model( async def upload_model( request: Request, file: UploadFile = File(...), - url_idx: Optional[int] = None, + url_idx: int | None = None, user=Depends(get_admin_user), ): if url_idx is None: diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index 6f8c0f81bf..900ebc6ad9 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import hashlib import json @@ -8,62 +10,52 @@ from urllib.parse import quote, urlparse import aiohttp from aiocache import cached - - from azure.identity import DefaultAzureCredential, get_bearer_token_provider - -from fastapi import Depends, HTTPException, Request, APIRouter, status +from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi.responses import ( FileResponse, - StreamingResponse, JSONResponse, PlainTextResponse, + StreamingResponse, ) -from pydantic import BaseModel, ConfigDict - -from sqlalchemy.ext.asyncio import AsyncSession - -from open_webui.internal.db import get_async_session - -from open_webui.models.models import Models -from open_webui.models.access_grants import AccessGrants -from open_webui.models.groups import Groups -from open_webui.utils.access_control import has_connection_access, check_model_access from open_webui.config import ( CACHE_DIR, ) +from open_webui.constants import ERROR_MESSAGES from open_webui.env import ( - MODELS_CACHE_TTL, AIOHTTP_CLIENT_SESSION_SSL, AIOHTTP_CLIENT_TIMEOUT, AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST, - ENABLE_FORWARD_USER_INFO_HEADERS, - FORWARD_SESSION_INFO_HEADER_CHAT_ID, BYPASS_MODEL_ACCESS_CONTROL, + ENABLE_FORWARD_USER_INFO_HEADERS, ENABLE_OPENAI_API_PASSTHROUGH, + FORWARD_SESSION_INFO_HEADER_CHAT_ID, + MODELS_CACHE_TTL, ) +from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants +from open_webui.models.groups import Groups +from open_webui.models.models import Models from open_webui.models.users import UserModel - -from open_webui.constants import ERROR_MESSAGES - - -from open_webui.utils.payload import ( - apply_model_params_to_body_openai, - apply_system_prompt_to_body, -) +from open_webui.utils.access_control import check_model_access, has_connection_access +from open_webui.utils.anthropic import get_anthropic_models, is_anthropic_url +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.headers import get_custom_headers, include_user_info_headers from open_webui.utils.misc import ( convert_logit_bias_input_to_json, stream_chunks_handler, ) +from open_webui.utils.payload import ( + apply_model_params_to_body_openai, + apply_system_prompt_to_body, +) from open_webui.utils.session_pool import ( cleanup_response, get_session, stream_wrapper, ) - -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.headers import include_user_info_headers -from open_webui.utils.anthropic import is_anthropic_url, get_anthropic_models +from pydantic import BaseModel, ConfigDict +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -160,7 +152,7 @@ async def get_headers_and_cookies( url, key=None, config=None, - metadata: Optional[dict] = None, + metadata: dict | None = None, user: UserModel = None, ): cookies = {} @@ -215,7 +207,8 @@ async def get_headers_and_cookies( headers['Authorization'] = f'Bearer {token}' if config.get('headers') and isinstance(config.get('headers'), dict): - headers = {**headers, **config.get('headers')} + custom_headers = get_custom_headers(config.get('headers'), user, metadata) + headers.update(custom_headers) return headers, cookies @@ -255,7 +248,7 @@ async def get_config(request: Request, user=Depends(get_admin_user)): class OpenAIConfigForm(BaseModel): - ENABLE_OPENAI_API: Optional[bool] = None + ENABLE_OPENAI_API: bool | None = None OPENAI_API_BASE_URLS: list[str] OPENAI_API_KEYS: list[str] OPENAI_API_CONFIGS: dict @@ -439,6 +432,7 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list: connection_type = api_config.get('connection_type', 'external') prefix_id = api_config.get('prefix_id', None) tags = api_config.get('tags', []) + provider = api_config.get('provider', '') model_list = response if isinstance(response, list) else response.get('data', []) if not isinstance(model_list, list): @@ -459,6 +453,9 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list: if connection_type: model['connection_type'] = connection_type + if provider: + model['provider'] = provider + log.debug(f'get_all_models:responses() {responses}') return responses @@ -542,15 +539,24 @@ async def get_all_models(request: Request, user: UserModel) -> dict[str, list]: continue if model_id and model_id not in models: - models[model_id] = { + merged = { **model, 'name': model.get('name', model_id), 'owned_by': 'openai', 'openai': model, 'connection_type': model.get('connection_type', 'external'), + 'provider': model.get('provider', ''), 'urlIdx': idx, } + # llama.cpp router mode: derive loaded state from + # the status object returned by GET /v1/models. + status = model.get('status') + if isinstance(status, dict) and 'value' in status: + merged['loaded'] = status['value'] in ('loaded', 'sleeping') + + models[model_id] = merged + return models models = get_merged_models(map(extract_data, responses)) @@ -562,7 +568,7 @@ async def get_all_models(request: Request, user: UserModel) -> dict[str, list]: @router.get('/models') @router.get('/models/{url_idx}') -async def get_models(request: Request, url_idx: Optional[int] = None, user=Depends(get_verified_user)): +async def get_models(request: Request, url_idx: int | None = None, user=Depends(get_verified_user)): if not request.app.state.config.ENABLE_OPENAI_API: raise HTTPException(status_code=503, detail='OpenAI API is disabled') @@ -654,7 +660,7 @@ class ConnectionVerificationForm(BaseModel): url: str key: str - config: Optional[dict] = None + config: dict | None = None @router.post('/verify') @@ -1077,7 +1083,7 @@ async def generate_chat_completion( payload = apply_model_params_to_body_openai(params, payload) if not bypass_system_prompt: - payload = apply_system_prompt_to_body(system, payload, metadata, user) + payload = await apply_system_prompt_to_body(system, payload, metadata, user) await check_model_access(user, model_info, bypass_filter) else: @@ -1345,20 +1351,20 @@ class ResponsesForm(BaseModel): model_config = ConfigDict(extra='allow') model: str - input: Optional[list | str] = None - instructions: Optional[str] = None - stream: Optional[bool] = None - temperature: Optional[float] = None - max_output_tokens: Optional[int] = None - top_p: Optional[float] = None - tools: Optional[list] = None - tool_choice: Optional[str | dict] = None - text: Optional[dict] = None - truncation: Optional[str] = None - metadata: Optional[dict] = None - store: Optional[bool] = None - reasoning: Optional[dict] = None - previous_response_id: Optional[str] = None + input: list | str | None = None + instructions: str | None = None + stream: bool | None = None + temperature: float | None = None + max_output_tokens: int | None = None + top_p: float | None = None + tools: list | None = None + tool_choice: str | dict | None = None + text: dict | None = None + truncation: str | None = None + metadata: dict | None = None + store: bool | None = None + reasoning: dict | None = None + previous_response_id: str | None = None @router.post('/responses') diff --git a/backend/open_webui/routers/pipelines.py b/backend/open_webui/routers/pipelines.py index 580fb42fb2..5e0d4dc199 100644 --- a/backend/open_webui/routers/pipelines.py +++ b/backend/open_webui/routers/pipelines.py @@ -1,4 +1,11 @@ +import logging +import os +import shutil +from typing import Optional + +import aiohttp from fastapi import ( + APIRouter, Depends, FastAPI, File, @@ -7,24 +14,14 @@ from fastapi import ( Request, UploadFile, status, - APIRouter, ) -import aiohttp -import os -import logging -import shutil -from pydantic import BaseModel -from starlette.responses import FileResponse -from typing import Optional - -from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL from open_webui.config import CACHE_DIR from open_webui.constants import ERROR_MESSAGES - - +from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL from open_webui.routers.openai import get_all_models_responses - from open_webui.utils.auth import get_admin_user +from pydantic import BaseModel +from starlette.responses import FileResponse log = logging.getLogger(__name__) diff --git a/backend/open_webui/routers/prompts.py b/backend/open_webui/routers/prompts.py index 11901fc5a7..f027dc48c6 100644 --- a/backend/open_webui/routers/prompts.py +++ b/backend/open_webui/routers/prompts.py @@ -1,14 +1,11 @@ -from typing import Optional -from fastapi import APIRouter, Depends, HTTPException, status, Request +from __future__ import annotations -from open_webui.models.prompts import ( - PromptForm, - PromptUserResponse, - PromptAccessResponse, - PromptAccessListResponse, - PromptModel, - Prompts, -) +from typing import Optional + +from fastapi import APIRouter, Depends, HTTPException, Request, status +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL +from open_webui.constants import ERROR_MESSAGES +from open_webui.internal.db import get_async_session from open_webui.models.access_grants import AccessGrants from open_webui.models.groups import Groups from open_webui.models.prompt_history import ( @@ -16,13 +13,18 @@ from open_webui.models.prompt_history import ( PromptHistoryModel, PromptHistoryResponse, ) -from open_webui.constants import ERROR_MESSAGES +from open_webui.models.prompts import ( + PromptAccessListResponse, + PromptAccessResponse, + PromptForm, + PromptModel, + Prompts, + PromptUserResponse, +) +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants -from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL -from open_webui.internal.db import get_async_session -from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession class PromptVersionUpdateForm(BaseModel): @@ -32,7 +34,7 @@ class PromptVersionUpdateForm(BaseModel): class PromptMetadataForm(BaseModel): name: str command: str - tags: Optional[list[str]] = None + tags: list[str | None] = None router = APIRouter() @@ -61,23 +63,17 @@ async def get_prompts(user=Depends(get_verified_user), db: AsyncSession = Depend async def get_prompt_tags(user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): if user.role == 'admin' and BYPASS_ADMIN_ACCESS_CONTROL: return await Prompts.get_tags(db=db) - else: - prompts = await Prompts.get_prompts_by_user_id(user.id, 'read', db=db) - tags = set() - for prompt in prompts: - if prompt.tags: - tags.update(prompt.tags) - return sorted(list(tags)) + return await Prompts.get_tags_by_user_id(user.id, db=db) @router.get('/list', response_model=PromptAccessListResponse) async def get_prompt_list( - query: Optional[str] = None, - view_option: Optional[str] = None, - tag: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + view_option: str | None = None, + tag: str | None = None, + order_by: str | None = None, + direction: str | None = None, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -142,7 +138,7 @@ async def get_prompt_list( ############################ -@router.post('/create', response_model=Optional[PromptModel]) +@router.post('/create', response_model=PromptModel | None) async def create_new_prompt( request: Request, form_data: PromptForm, @@ -197,7 +193,7 @@ async def create_new_prompt( ############################ -@router.get('/command/{command}', response_model=Optional[PromptAccessResponse]) +@router.get('/command/{command}', response_model=PromptAccessResponse | None) async def get_prompt_by_command( command: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -241,7 +237,7 @@ async def get_prompt_by_command( ############################ -@router.get('/id/{prompt_id}', response_model=Optional[PromptAccessResponse]) +@router.get('/id/{prompt_id}', response_model=PromptAccessResponse | None) async def get_prompt_by_id( prompt_id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -285,7 +281,7 @@ async def get_prompt_by_id( ############################ -@router.post('/id/{prompt_id}/update', response_model=Optional[PromptModel]) +@router.post('/id/{prompt_id}/update', response_model=PromptModel | None) async def update_prompt_by_id( request: Request, prompt_id: str, @@ -351,7 +347,7 @@ async def update_prompt_by_id( ############################ -@router.post('/id/{prompt_id}/update/meta', response_model=Optional[PromptModel]) +@router.post('/id/{prompt_id}/update/meta', response_model=PromptModel | None) async def update_prompt_metadata( prompt_id: str, form_data: PromptMetadataForm, @@ -404,7 +400,7 @@ async def update_prompt_metadata( ) -@router.post('/id/{prompt_id}/update/version', response_model=Optional[PromptModel]) +@router.post('/id/{prompt_id}/update/version', response_model=PromptModel | None) async def set_prompt_version( prompt_id: str, form_data: PromptVersionUpdateForm, @@ -453,7 +449,7 @@ class PromptAccessGrantsForm(BaseModel): access_grants: list[dict] -@router.post('/id/{prompt_id}/access/update', response_model=Optional[PromptModel]) +@router.post('/id/{prompt_id}/access/update', response_model=PromptModel | None) async def update_prompt_access_by_id( request: Request, prompt_id: str, @@ -502,7 +498,7 @@ async def update_prompt_access_by_id( ############################ -@router.post('/id/{prompt_id}/toggle', response_model=Optional[PromptModel]) +@router.post('/id/{prompt_id}/toggle', response_model=PromptModel | None) async def toggle_prompt_active( prompt_id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 26f77ce1cb..9702874427 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1,129 +1,122 @@ +from __future__ import annotations + +import asyncio import json import logging import mimetypes import os -import shutil -import asyncio - import re +import shutil import uuid from datetime import datetime from pathlib import Path -from typing import Iterator, List, Optional, Sequence, Union +from typing import Iterator, Optional, Sequence, Union +import tiktoken from fastapi import ( + APIRouter, Depends, FastAPI, - Query, File, Form, HTTPException, - UploadFile, + Query, Request, + UploadFile, status, - APIRouter, ) -from fastapi.middleware.cors import CORSMiddleware from fastapi.concurrency import run_in_threadpool -from pydantic import BaseModel -import tiktoken - - +from fastapi.middleware.cors import CORSMiddleware +from langchain_core.documents import Document from langchain_text_splitters import ( + MarkdownHeaderTextSplitter, RecursiveCharacterTextSplitter, TokenTextSplitter, - MarkdownHeaderTextSplitter, ) -from langchain_core.documents import Document - -from open_webui.models.files import FileModel, FileUpdateForm, Files -from open_webui.utils.access_control.files import has_access_to_file -from open_webui.models.knowledge import Knowledges -from open_webui.storage.provider import Storage -from open_webui.internal.db import get_async_db, get_async_session -from sqlalchemy.ext.asyncio import AsyncSession - - -from open_webui.retrieval.vector.factory import VECTOR_DB_CLIENT -from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT - -# Document loaders - -from open_webui.retrieval.loaders.youtube import YoutubeLoader - -# Web search engines -from open_webui.retrieval.web.main import SearchResult -from open_webui.retrieval.web.utils import get_web_loader -from open_webui.retrieval.web.ollama import search_ollama_cloud -from open_webui.retrieval.web.perplexity_search import search_perplexity_search -from open_webui.retrieval.web.brave import search_brave -from open_webui.retrieval.web.kagi import search_kagi -from open_webui.retrieval.web.mojeek import search_mojeek -from open_webui.retrieval.web.bocha import search_bocha -from open_webui.retrieval.web.duckduckgo import search_duckduckgo -from open_webui.retrieval.web.google_pse import search_google_pse -from open_webui.retrieval.web.jina_search import search_jina -from open_webui.retrieval.web.searchapi import search_searchapi -from open_webui.retrieval.web.serpapi import search_serpapi -from open_webui.retrieval.web.searxng import search_searxng -from open_webui.retrieval.web.yacy import search_yacy -from open_webui.retrieval.web.serper import search_serper -from open_webui.retrieval.web.serply import search_serply -from open_webui.retrieval.web.serpstack import search_serpstack -from open_webui.retrieval.web.tavily import search_tavily -from open_webui.retrieval.web.bing import search_bing -from open_webui.retrieval.web.azure import search_azure -from open_webui.retrieval.web.exa import search_exa -from open_webui.retrieval.web.perplexity import search_perplexity -from open_webui.retrieval.web.sougou import search_sougou -from open_webui.retrieval.web.firecrawl import search_firecrawl -from open_webui.retrieval.web.external import search_external -from open_webui.retrieval.web.yandex import search_yandex -from open_webui.retrieval.web.ydc import search_youcom - -from open_webui.retrieval.utils import ( - build_loader_from_config, - filter_accessible_collections, - get_content_from_url, - get_embedding_function, - get_reranking_function, - get_model_path, - query_collection, - query_collection_with_hybrid_search, - query_doc, - query_doc_with_hybrid_search, -) -from open_webui.retrieval.vector.utils import filter_metadata -from open_webui.utils.misc import ( - calculate_sha256_string, - sanitize_text_for_db, -) -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission - from open_webui.config import ( + DEFAULT_LOCALE, ENV, + RAG_EMBEDDING_CONTENT_PREFIX, RAG_EMBEDDING_MODEL_AUTO_UPDATE, RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE, + RAG_EMBEDDING_QUERY_PREFIX, RAG_RERANKING_MODEL_AUTO_UPDATE, RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, UPLOAD_DIR, - DEFAULT_LOCALE, - RAG_EMBEDDING_CONTENT_PREFIX, - RAG_EMBEDDING_QUERY_PREFIX, ) +from open_webui.constants import ERROR_MESSAGES from open_webui.env import ( DEVICE_TYPE, DOCKER, RAG_EMBEDDING_TIMEOUT, SENTENCE_TRANSFORMERS_BACKEND, - SENTENCE_TRANSFORMERS_MODEL_KWARGS, SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND, SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS, SENTENCE_TRANSFORMERS_CROSS_ENCODER_SIGMOID_ACTIVATION_FUNCTION, + SENTENCE_TRANSFORMERS_MODEL_KWARGS, ) +from open_webui.internal.db import get_async_db, get_async_session +from open_webui.models.files import FileModel, Files, FileUpdateForm +from open_webui.models.knowledge import Knowledges -from open_webui.constants import ERROR_MESSAGES +# Document loaders +from open_webui.retrieval.loaders.youtube import YoutubeLoader +from open_webui.retrieval.utils import ( + build_loader_from_config, + filter_accessible_collections, + get_content_from_url, + get_embedding_function, + get_model_path, + get_reranking_function, + query_collection, + query_collection_with_hybrid_search, + query_doc, + query_doc_with_hybrid_search, +) +from open_webui.retrieval.vector.async_client import ASYNC_VECTOR_DB_CLIENT +from open_webui.retrieval.vector.factory import VECTOR_DB_CLIENT +from open_webui.retrieval.vector.utils import filter_metadata +from open_webui.retrieval.web.azure import search_azure +from open_webui.retrieval.web.bing import search_bing +from open_webui.retrieval.web.bocha import search_bocha +from open_webui.retrieval.web.brave import search_brave +from open_webui.retrieval.web.brave_llm_context import search_brave_llm_context +from open_webui.retrieval.web.duckduckgo import search_duckduckgo +from open_webui.retrieval.web.exa import search_exa +from open_webui.retrieval.web.external import search_external +from open_webui.retrieval.web.firecrawl import search_firecrawl +from open_webui.retrieval.web.google_pse import search_google_pse +from open_webui.retrieval.web.jina_search import search_jina +from open_webui.retrieval.web.kagi import search_kagi + +# Web search engines +from open_webui.retrieval.web.main import SearchResult +from open_webui.retrieval.web.mojeek import search_mojeek +from open_webui.retrieval.web.ollama import search_ollama_cloud +from open_webui.retrieval.web.perplexity import search_perplexity +from open_webui.retrieval.web.perplexity_search import search_perplexity_search +from open_webui.retrieval.web.searchapi import search_searchapi +from open_webui.retrieval.web.searxng import search_searxng +from open_webui.retrieval.web.serpapi import search_serpapi +from open_webui.retrieval.web.serper import search_serper +from open_webui.retrieval.web.serply import search_serply +from open_webui.retrieval.web.serpstack import search_serpstack +from open_webui.retrieval.web.sougou import search_sougou +from open_webui.retrieval.web.tavily import search_tavily +from open_webui.retrieval.web.utils import get_web_loader +from open_webui.retrieval.web.yacy import search_yacy +from open_webui.retrieval.web.yandex import search_yandex +from open_webui.retrieval.web.ydc import search_youcom +from open_webui.storage.provider import Storage +from open_webui.utils.access_control import has_permission +from open_webui.utils.access_control.files import has_access_to_file +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.misc import ( + calculate_sha256_string, + sanitize_text_for_db, +) +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -161,7 +154,7 @@ def get_ef( def get_rf( engine: str = '', - reranking_model: Optional[str] = None, + reranking_model: str | None = None, external_reranker_url: str = '', external_reranker_api_key: str = '', external_reranker_timeout: str = '', @@ -248,7 +241,7 @@ router = APIRouter() class CollectionNameForm(BaseModel): - collection_name: Optional[str] = None + collection_name: str | None = None class ProcessUrlForm(CollectionNameForm): @@ -256,23 +249,7 @@ class ProcessUrlForm(CollectionNameForm): class SearchForm(BaseModel): - queries: List[str] - - -@router.get('/') -async def get_status(request: Request): - return { - 'status': True, - 'CHUNK_SIZE': request.app.state.config.CHUNK_SIZE, - 'CHUNK_OVERLAP': request.app.state.config.CHUNK_OVERLAP, - 'RAG_TEMPLATE': request.app.state.config.RAG_TEMPLATE, - 'RAG_EMBEDDING_ENGINE': request.app.state.config.RAG_EMBEDDING_ENGINE, - 'RAG_EMBEDDING_MODEL': request.app.state.config.RAG_EMBEDDING_MODEL, - 'RAG_RERANKING_MODEL': request.app.state.config.RAG_RERANKING_MODEL, - 'RAG_EMBEDDING_BATCH_SIZE': request.app.state.config.RAG_EMBEDDING_BATCH_SIZE, - 'ENABLE_ASYNC_EMBEDDING': request.app.state.config.ENABLE_ASYNC_EMBEDDING, - 'RAG_EMBEDDING_CONCURRENT_REQUESTS': request.app.state.config.RAG_EMBEDDING_CONCURRENT_REQUESTS, - } + queries: list[str] @router.get('/embedding') @@ -317,14 +294,14 @@ class AzureOpenAIConfigForm(BaseModel): class EmbeddingModelUpdateForm(BaseModel): - openai_config: Optional[OpenAIConfigForm] = None - ollama_config: Optional[OllamaConfigForm] = None - azure_openai_config: Optional[AzureOpenAIConfigForm] = None + openai_config: OpenAIConfigForm | None = None + ollama_config: OllamaConfigForm | None = None + azure_openai_config: AzureOpenAIConfigForm | None = None RAG_EMBEDDING_ENGINE: str RAG_EMBEDDING_MODEL: str - RAG_EMBEDDING_BATCH_SIZE: Optional[int] = 1 - ENABLE_ASYNC_EMBEDDING: Optional[bool] = True - RAG_EMBEDDING_CONCURRENT_REQUESTS: Optional[int] = 0 + RAG_EMBEDDING_BATCH_SIZE: int | None = 1 + ENABLE_ASYNC_EMBEDDING: bool | None = True + RAG_EMBEDDING_CONCURRENT_REQUESTS: int | None = 0 def unload_embedding_model(request: Request): @@ -350,7 +327,7 @@ async def update_embedding_config(request: Request, form_data: EmbeddingModelUpd unload_embedding_model(request) try: request.app.state.config.RAG_EMBEDDING_ENGINE = form_data.RAG_EMBEDDING_ENGINE - request.app.state.config.RAG_EMBEDDING_MODEL = form_data.RAG_EMBEDDING_MODEL + request.app.state.config.RAG_EMBEDDING_MODEL = form_data.RAG_EMBEDDING_MODEL.strip() request.app.state.config.RAG_EMBEDDING_BATCH_SIZE = form_data.RAG_EMBEDDING_BATCH_SIZE request.app.state.config.ENABLE_ASYNC_EMBEDDING = form_data.ENABLE_ASYNC_EMBEDDING request.app.state.config.RAG_EMBEDDING_CONCURRENT_REQUESTS = form_data.RAG_EMBEDDING_CONCURRENT_REQUESTS @@ -534,6 +511,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): 'GOOGLE_PSE_API_KEY': request.app.state.config.GOOGLE_PSE_API_KEY, 'GOOGLE_PSE_ENGINE_ID': request.app.state.config.GOOGLE_PSE_ENGINE_ID, 'BRAVE_SEARCH_API_KEY': request.app.state.config.BRAVE_SEARCH_API_KEY, + 'BRAVE_SEARCH_CONTEXT_TOKENS': request.app.state.config.BRAVE_SEARCH_CONTEXT_TOKENS, 'KAGI_SEARCH_API_KEY': request.app.state.config.KAGI_SEARCH_API_KEY, 'MOJEEK_SEARCH_API_KEY': request.app.state.config.MOJEEK_SEARCH_API_KEY, 'BOCHA_SEARCH_API_KEY': request.app.state.config.BOCHA_SEARCH_API_KEY, @@ -583,154 +561,155 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): class WebConfig(BaseModel): - ENABLE_WEB_SEARCH: Optional[bool] = None - WEB_SEARCH_ENGINE: Optional[str] = None - WEB_SEARCH_TRUST_ENV: Optional[bool] = None - WEB_SEARCH_RESULT_COUNT: Optional[int] = None - WEB_SEARCH_CONCURRENT_REQUESTS: Optional[int] = None - WEB_SEARCH_DOMAIN_FILTER_LIST: Optional[List[str]] = [] - WEB_FETCH_MAX_CONTENT_LENGTH: Optional[int] = None - WEB_LOADER_CONCURRENT_REQUESTS: Optional[int] = None - BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL: Optional[bool] = None - BYPASS_WEB_SEARCH_WEB_LOADER: Optional[bool] = None - OLLAMA_CLOUD_WEB_SEARCH_API_KEY: Optional[str] = None - SEARXNG_QUERY_URL: Optional[str] = None - SEARXNG_LANGUAGE: Optional[str] = None - YACY_QUERY_URL: Optional[str] = None - YACY_USERNAME: Optional[str] = None - YACY_PASSWORD: Optional[str] = None - GOOGLE_PSE_API_KEY: Optional[str] = None - GOOGLE_PSE_ENGINE_ID: Optional[str] = None - BRAVE_SEARCH_API_KEY: Optional[str] = None - KAGI_SEARCH_API_KEY: Optional[str] = None - MOJEEK_SEARCH_API_KEY: Optional[str] = None - BOCHA_SEARCH_API_KEY: Optional[str] = None - SERPSTACK_API_KEY: Optional[str] = None - SERPSTACK_HTTPS: Optional[bool] = None - SERPER_API_KEY: Optional[str] = None - SERPLY_API_KEY: Optional[str] = None - DDGS_BACKEND: Optional[str] = None - TAVILY_API_KEY: Optional[str] = None - SEARCHAPI_API_KEY: Optional[str] = None - SEARCHAPI_ENGINE: Optional[str] = None - SERPAPI_API_KEY: Optional[str] = None - SERPAPI_ENGINE: Optional[str] = None - JINA_API_KEY: Optional[str] = None - JINA_API_BASE_URL: Optional[str] = None - BING_SEARCH_V7_ENDPOINT: Optional[str] = None - BING_SEARCH_V7_SUBSCRIPTION_KEY: Optional[str] = None - EXA_API_KEY: Optional[str] = None - PERPLEXITY_API_KEY: Optional[str] = None - PERPLEXITY_MODEL: Optional[str] = None - PERPLEXITY_SEARCH_CONTEXT_USAGE: Optional[str] = None - PERPLEXITY_SEARCH_API_URL: Optional[str] = None - SOUGOU_API_SID: Optional[str] = None - SOUGOU_API_SK: Optional[str] = None - WEB_LOADER_ENGINE: Optional[str] = None - WEB_LOADER_TIMEOUT: Optional[str] = None - ENABLE_WEB_LOADER_SSL_VERIFICATION: Optional[bool] = None - PLAYWRIGHT_WS_URL: Optional[str] = None - PLAYWRIGHT_TIMEOUT: Optional[int] = None - FIRECRAWL_API_KEY: Optional[str] = None - FIRECRAWL_API_BASE_URL: Optional[str] = None - FIRECRAWL_TIMEOUT: Optional[str] = None - TAVILY_EXTRACT_DEPTH: Optional[str] = None - EXTERNAL_WEB_SEARCH_URL: Optional[str] = None - EXTERNAL_WEB_SEARCH_API_KEY: Optional[str] = None - EXTERNAL_WEB_LOADER_URL: Optional[str] = None - EXTERNAL_WEB_LOADER_API_KEY: Optional[str] = None - YOUTUBE_LOADER_LANGUAGE: Optional[List[str]] = None - YOUTUBE_LOADER_PROXY_URL: Optional[str] = None - YOUTUBE_LOADER_TRANSLATION: Optional[str] = None - YANDEX_WEB_SEARCH_URL: Optional[str] = None - YANDEX_WEB_SEARCH_API_KEY: Optional[str] = None - YANDEX_WEB_SEARCH_CONFIG: Optional[str] = None - YOUCOM_API_KEY: Optional[str] = None + ENABLE_WEB_SEARCH: bool | None = None + WEB_SEARCH_ENGINE: str | None = None + WEB_SEARCH_TRUST_ENV: bool | None = None + WEB_SEARCH_RESULT_COUNT: int | None = None + WEB_SEARCH_CONCURRENT_REQUESTS: int | None = None + WEB_SEARCH_DOMAIN_FILTER_LIST: list[str | None] = [] + WEB_FETCH_MAX_CONTENT_LENGTH: int | None = None + WEB_LOADER_CONCURRENT_REQUESTS: int | None = None + BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL: bool | None = None + BYPASS_WEB_SEARCH_WEB_LOADER: bool | None = None + OLLAMA_CLOUD_WEB_SEARCH_API_KEY: str | None = None + SEARXNG_QUERY_URL: str | None = None + SEARXNG_LANGUAGE: str | None = None + YACY_QUERY_URL: str | None = None + YACY_USERNAME: str | None = None + YACY_PASSWORD: str | None = None + GOOGLE_PSE_API_KEY: str | None = None + GOOGLE_PSE_ENGINE_ID: str | None = None + BRAVE_SEARCH_API_KEY: str | None = None + BRAVE_SEARCH_CONTEXT_TOKENS: int | None = None + KAGI_SEARCH_API_KEY: str | None = None + MOJEEK_SEARCH_API_KEY: str | None = None + BOCHA_SEARCH_API_KEY: str | None = None + SERPSTACK_API_KEY: str | None = None + SERPSTACK_HTTPS: bool | None = None + SERPER_API_KEY: str | None = None + SERPLY_API_KEY: str | None = None + DDGS_BACKEND: str | None = None + TAVILY_API_KEY: str | None = None + SEARCHAPI_API_KEY: str | None = None + SEARCHAPI_ENGINE: str | None = None + SERPAPI_API_KEY: str | None = None + SERPAPI_ENGINE: str | None = None + JINA_API_KEY: str | None = None + JINA_API_BASE_URL: str | None = None + BING_SEARCH_V7_ENDPOINT: str | None = None + BING_SEARCH_V7_SUBSCRIPTION_KEY: str | None = None + EXA_API_KEY: str | None = None + PERPLEXITY_API_KEY: str | None = None + PERPLEXITY_MODEL: str | None = None + PERPLEXITY_SEARCH_CONTEXT_USAGE: str | None = None + PERPLEXITY_SEARCH_API_URL: str | None = None + SOUGOU_API_SID: str | None = None + SOUGOU_API_SK: str | None = None + WEB_LOADER_ENGINE: str | None = None + WEB_LOADER_TIMEOUT: str | None = None + ENABLE_WEB_LOADER_SSL_VERIFICATION: bool | None = None + PLAYWRIGHT_WS_URL: str | None = None + PLAYWRIGHT_TIMEOUT: int | None = None + FIRECRAWL_API_KEY: str | None = None + FIRECRAWL_API_BASE_URL: str | None = None + FIRECRAWL_TIMEOUT: str | None = None + TAVILY_EXTRACT_DEPTH: str | None = None + EXTERNAL_WEB_SEARCH_URL: str | None = None + EXTERNAL_WEB_SEARCH_API_KEY: str | None = None + EXTERNAL_WEB_LOADER_URL: str | None = None + EXTERNAL_WEB_LOADER_API_KEY: str | None = None + YOUTUBE_LOADER_LANGUAGE: list[str | None] = None + YOUTUBE_LOADER_PROXY_URL: str | None = None + YOUTUBE_LOADER_TRANSLATION: str | None = None + YANDEX_WEB_SEARCH_URL: str | None = None + YANDEX_WEB_SEARCH_API_KEY: str | None = None + YANDEX_WEB_SEARCH_CONFIG: str | None = None + YOUCOM_API_KEY: str | None = None class ConfigForm(BaseModel): # RAG settings - RAG_TEMPLATE: Optional[str] = None - TOP_K: Optional[int] = None - BYPASS_EMBEDDING_AND_RETRIEVAL: Optional[bool] = None - RAG_FULL_CONTEXT: Optional[bool] = None + RAG_TEMPLATE: str | None = None + TOP_K: int | None = None + BYPASS_EMBEDDING_AND_RETRIEVAL: bool | None = None + RAG_FULL_CONTEXT: bool | None = None # Hybrid search settings - ENABLE_RAG_HYBRID_SEARCH: Optional[bool] = None - ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS: Optional[bool] = None - TOP_K_RERANKER: Optional[int] = None - RELEVANCE_THRESHOLD: Optional[float] = None - HYBRID_BM25_WEIGHT: Optional[float] = None + ENABLE_RAG_HYBRID_SEARCH: bool | None = None + ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS: bool | None = None + TOP_K_RERANKER: int | None = None + RELEVANCE_THRESHOLD: float | None = None + HYBRID_BM25_WEIGHT: float | None = None # Content extraction settings - CONTENT_EXTRACTION_ENGINE: Optional[str] = None - PDF_EXTRACT_IMAGES: Optional[bool] = None - PDF_LOADER_MODE: Optional[str] = None + CONTENT_EXTRACTION_ENGINE: str | None = None + PDF_EXTRACT_IMAGES: bool | None = None + PDF_LOADER_MODE: str | None = None - DATALAB_MARKER_API_KEY: Optional[str] = None - DATALAB_MARKER_API_BASE_URL: Optional[str] = None - DATALAB_MARKER_ADDITIONAL_CONFIG: Optional[str] = None - DATALAB_MARKER_SKIP_CACHE: Optional[bool] = None - DATALAB_MARKER_FORCE_OCR: Optional[bool] = None - DATALAB_MARKER_PAGINATE: Optional[bool] = None - DATALAB_MARKER_STRIP_EXISTING_OCR: Optional[bool] = None - DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION: Optional[bool] = None - DATALAB_MARKER_FORMAT_LINES: Optional[bool] = None - DATALAB_MARKER_USE_LLM: Optional[bool] = None - DATALAB_MARKER_OUTPUT_FORMAT: Optional[str] = None + DATALAB_MARKER_API_KEY: str | None = None + DATALAB_MARKER_API_BASE_URL: str | None = None + DATALAB_MARKER_ADDITIONAL_CONFIG: str | None = None + DATALAB_MARKER_SKIP_CACHE: bool | None = None + DATALAB_MARKER_FORCE_OCR: bool | None = None + DATALAB_MARKER_PAGINATE: bool | None = None + DATALAB_MARKER_STRIP_EXISTING_OCR: bool | None = None + DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION: bool | None = None + DATALAB_MARKER_FORMAT_LINES: bool | None = None + DATALAB_MARKER_USE_LLM: bool | None = None + DATALAB_MARKER_OUTPUT_FORMAT: str | None = None - EXTERNAL_DOCUMENT_LOADER_URL: Optional[str] = None - EXTERNAL_DOCUMENT_LOADER_API_KEY: Optional[str] = None + EXTERNAL_DOCUMENT_LOADER_URL: str | None = None + EXTERNAL_DOCUMENT_LOADER_API_KEY: str | None = None - TIKA_SERVER_URL: Optional[str] = None - DOCLING_SERVER_URL: Optional[str] = None - DOCLING_API_KEY: Optional[str] = None - DOCLING_PARAMS: Optional[dict] = None - DOCUMENT_INTELLIGENCE_ENDPOINT: Optional[str] = None - DOCUMENT_INTELLIGENCE_KEY: Optional[str] = None - DOCUMENT_INTELLIGENCE_MODEL: Optional[str] = None - MISTRAL_OCR_API_BASE_URL: Optional[str] = None - MISTRAL_OCR_API_KEY: Optional[str] = None + TIKA_SERVER_URL: str | None = None + DOCLING_SERVER_URL: str | None = None + DOCLING_API_KEY: str | None = None + DOCLING_PARAMS: dict | None = None + DOCUMENT_INTELLIGENCE_ENDPOINT: str | None = None + DOCUMENT_INTELLIGENCE_KEY: str | None = None + DOCUMENT_INTELLIGENCE_MODEL: str | None = None + MISTRAL_OCR_API_BASE_URL: str | None = None + MISTRAL_OCR_API_KEY: str | None = None MISTRAL_OCR_USE_BASE64: Optional[bool] = None MISTRAL_OCR_MODEL: Optional[str] = None - PADDLEOCR_VL_BASE_URL: Optional[str] = None - PADDLEOCR_VL_TOKEN: Optional[str] = None + PADDLEOCR_VL_BASE_URL: str | None = None + PADDLEOCR_VL_TOKEN: str | None = None # MinerU settings - MINERU_API_MODE: Optional[str] = None - MINERU_API_URL: Optional[str] = None - MINERU_API_KEY: Optional[str] = None - MINERU_API_TIMEOUT: Optional[str] = None - MINERU_PARAMS: Optional[dict] = None + MINERU_API_MODE: str | None = None + MINERU_API_URL: str | None = None + MINERU_API_KEY: str | None = None + MINERU_API_TIMEOUT: str | None = None + MINERU_PARAMS: dict | None = None # Reranking settings - RAG_RERANKING_MODEL: Optional[str] = None - RAG_RERANKING_ENGINE: Optional[str] = None - RAG_RERANKING_BATCH_SIZE: Optional[int] = None - RAG_EXTERNAL_RERANKER_URL: Optional[str] = None - RAG_EXTERNAL_RERANKER_API_KEY: Optional[str] = None - RAG_EXTERNAL_RERANKER_TIMEOUT: Optional[str] = None + RAG_RERANKING_MODEL: str | None = None + RAG_RERANKING_ENGINE: str | None = None + RAG_RERANKING_BATCH_SIZE: int | None = None + RAG_EXTERNAL_RERANKER_URL: str | None = None + RAG_EXTERNAL_RERANKER_API_KEY: str | None = None + RAG_EXTERNAL_RERANKER_TIMEOUT: str | None = None # Chunking settings - TEXT_SPLITTER: Optional[str] = None - ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER: Optional[bool] = None - CHUNK_SIZE: Optional[int] = None - CHUNK_MIN_SIZE_TARGET: Optional[int] = None - CHUNK_OVERLAP: Optional[int] = None + TEXT_SPLITTER: str | None = None + ENABLE_MARKDOWN_HEADER_TEXT_SPLITTER: bool | None = None + CHUNK_SIZE: int | None = None + CHUNK_MIN_SIZE_TARGET: int | None = None + CHUNK_OVERLAP: int | None = None # File upload settings - FILE_MAX_SIZE: Optional[Union[int, str]] = None - FILE_MAX_COUNT: Optional[Union[int, str]] = None - FILE_IMAGE_COMPRESSION_WIDTH: Optional[Union[int, str]] = None - FILE_IMAGE_COMPRESSION_HEIGHT: Optional[Union[int, str]] = None - ALLOWED_FILE_EXTENSIONS: Optional[List[str]] = None + FILE_MAX_SIZE: Union[int, str | None] = None + FILE_MAX_COUNT: Union[int, str | None] = None + FILE_IMAGE_COMPRESSION_WIDTH: Union[int, str | None] = None + FILE_IMAGE_COMPRESSION_HEIGHT: Union[int, str | None] = None + ALLOWED_FILE_EXTENSIONS: list[str | None] = None # Integration settings - ENABLE_GOOGLE_DRIVE_INTEGRATION: Optional[bool] = None - ENABLE_ONEDRIVE_INTEGRATION: Optional[bool] = None + ENABLE_GOOGLE_DRIVE_INTEGRATION: bool | None = None + ENABLE_ONEDRIVE_INTEGRATION: bool | None = None # Web search settings - web: Optional[WebConfig] = None + web: WebConfig | None = None @router.post('/config/update') @@ -1097,6 +1076,8 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend request.app.state.config.GOOGLE_PSE_API_KEY = form_data.web.GOOGLE_PSE_API_KEY request.app.state.config.GOOGLE_PSE_ENGINE_ID = form_data.web.GOOGLE_PSE_ENGINE_ID request.app.state.config.BRAVE_SEARCH_API_KEY = form_data.web.BRAVE_SEARCH_API_KEY + if form_data.web.BRAVE_SEARCH_CONTEXT_TOKENS is not None: + request.app.state.config.BRAVE_SEARCH_CONTEXT_TOKENS = form_data.web.BRAVE_SEARCH_CONTEXT_TOKENS request.app.state.config.KAGI_SEARCH_API_KEY = form_data.web.KAGI_SEARCH_API_KEY request.app.state.config.MOJEEK_SEARCH_API_KEY = form_data.web.MOJEEK_SEARCH_API_KEY request.app.state.config.BOCHA_SEARCH_API_KEY = form_data.web.BOCHA_SEARCH_API_KEY @@ -1235,6 +1216,7 @@ async def update_rag_config(request: Request, form_data: ConfigForm, user=Depend 'GOOGLE_PSE_API_KEY': request.app.state.config.GOOGLE_PSE_API_KEY, 'GOOGLE_PSE_ENGINE_ID': request.app.state.config.GOOGLE_PSE_ENGINE_ID, 'BRAVE_SEARCH_API_KEY': request.app.state.config.BRAVE_SEARCH_API_KEY, + 'BRAVE_SEARCH_CONTEXT_TOKENS': request.app.state.config.BRAVE_SEARCH_CONTEXT_TOKENS, 'KAGI_SEARCH_API_KEY': request.app.state.config.KAGI_SEARCH_API_KEY, 'MOJEEK_SEARCH_API_KEY': request.app.state.config.MOJEEK_SEARCH_API_KEY, 'BOCHA_SEARCH_API_KEY': request.app.state.config.BOCHA_SEARCH_API_KEY, @@ -1370,7 +1352,7 @@ def save_docs_to_vector_db( request: Request, docs, collection_name, - metadata: Optional[dict] = None, + metadata: dict | None = None, overwrite: bool = False, split: bool = True, add: bool = False, @@ -1568,8 +1550,8 @@ def save_docs_to_vector_db( class ProcessFileForm(BaseModel): file_id: str - content: Optional[str] = None - collection_name: Optional[str] = None + content: str | None = None + collection_name: str | None = None @router.post('/process/file') @@ -1596,6 +1578,8 @@ async def process_file( if collection_name is None: collection_name = f'file-{file.id}' + else: + await _validate_collection_access([collection_name], user, access_type='write') if form_data.content: # Update the content in the file @@ -1794,7 +1778,7 @@ async def process_file( class ProcessTextForm(BaseModel): name: str content: str - collection_name: Optional[str] = None + collection_name: str | None = None @router.post('/process/text') @@ -1982,6 +1966,17 @@ def search_web(request: Request, engine: str, query: str, user=None) -> list[Sea ) else: raise Exception('No BRAVE_SEARCH_API_KEY found in environment variables') + elif engine == 'brave_llm_context': + if request.app.state.config.BRAVE_SEARCH_API_KEY: + return search_brave_llm_context( + request.app.state.config.BRAVE_SEARCH_API_KEY, + query, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.BRAVE_SEARCH_CONTEXT_TOKENS, + ) + else: + raise Exception('No BRAVE_SEARCH_API_KEY found in environment variables') elif engine == 'kagi': if request.app.state.config.KAGI_SEARCH_API_KEY: return search_kagi( @@ -2373,10 +2368,10 @@ async def _validate_collection_access(collection_names: list[str], user, access_ class QueryDocForm(BaseModel): collection_name: str query: str - k: Optional[int] = None - k_reranker: Optional[int] = None - r: Optional[float] = None - hybrid: Optional[bool] = None + k: int | None = None + k_reranker: int | None = None + r: float | None = None + hybrid: bool | None = None @router.post('/query/doc') @@ -2439,12 +2434,12 @@ async def query_doc_handler( class QueryCollectionsForm(BaseModel): collection_names: list[str] query: str - k: Optional[int] = None - k_reranker: Optional[int] = None - r: Optional[float] = None - hybrid: Optional[bool] = None - hybrid_bm25_weight: Optional[float] = None - enable_enriched_texts: Optional[bool] = None + k: int | None = None + k_reranker: int | None = None + r: float | None = None + hybrid: bool | None = None + hybrid_bm25_weight: float | None = None + enable_enriched_texts: bool | None = None @router.post('/query/collection') @@ -2597,24 +2592,24 @@ async def reset_upload_dir(user=Depends(get_admin_user)) -> bool: if ENV == 'dev': @router.get('/ef/{text}') - async def get_embeddings(request: Request, text: Optional[str] = 'Hello World!'): + async def get_embeddings(request: Request, text: str | None = 'Hello World!'): return {'result': await request.app.state.EMBEDDING_FUNCTION(text, prefix=RAG_EMBEDDING_QUERY_PREFIX)} class BatchProcessFilesForm(BaseModel): - files: List[FileModel] + files: list[FileModel] collection_name: str class BatchProcessFilesResult(BaseModel): file_id: str status: str - error: Optional[str] = None + error: str | None = None class BatchProcessFilesResponse(BaseModel): - results: List[BatchProcessFilesResult] - errors: List[BatchProcessFilesResult] + results: list[BatchProcessFilesResult] + errors: list[BatchProcessFilesResult] @router.post('/process/files/batch') @@ -2635,12 +2630,15 @@ async def process_files_batch( collection_name = form_data.collection_name - file_results: List[BatchProcessFilesResult] = [] - file_errors: List[BatchProcessFilesResult] = [] - file_updates: List[FileUpdateForm] = [] + if collection_name: + await _validate_collection_access([collection_name], user, access_type='write') + + file_results: list[BatchProcessFilesResult] = [] + file_errors: list[BatchProcessFilesResult] = [] + file_updates: list[FileUpdateForm] = [] # Prepare all documents first - all_docs: List[Document] = [] + all_docs: list[Document] = [] for file in form_data.files: try: @@ -2666,7 +2664,7 @@ async def process_files_batch( continue text_content = file.data.get('content', '') - docs: List[Document] = [ + docs: list[Document] = [ Document( page_content=text_content.replace('
', '\n'), metadata={ diff --git a/backend/open_webui/routers/scim.py b/backend/open_webui/routers/scim.py index 75f45bcaf9..9292523adc 100644 --- a/backend/open_webui/routers/scim.py +++ b/backend/open_webui/routers/scim.py @@ -7,31 +7,27 @@ NOTE: This is an experimental implementation and may not fully comply with SCIM import hmac import logging -import uuid import time -from typing import Optional, List, Dict, Any +import uuid from datetime import datetime, timezone +from typing import Any, Dict, List, Optional -from fastapi import APIRouter, Depends, HTTPException, Request, Query, Header, status +from fastapi import APIRouter, Depends, Header, HTTPException, Query, Request, status from fastapi.responses import JSONResponse -from pydantic import BaseModel, Field, ConfigDict - -from open_webui.models.users import Users, UserModel -from open_webui.models.groups import Groups, GroupModel +from open_webui.config import OAUTH_PROVIDERS +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import SCIM_AUTH_PROVIDER +from open_webui.internal.db import get_async_session +from open_webui.models.groups import GroupModel, Groups +from open_webui.models.users import UserModel, Users from open_webui.utils.auth import ( + decode_token, get_admin_user, get_current_user, - decode_token, get_verified_user, ) -from open_webui.constants import ERROR_MESSAGES - -from open_webui.config import OAUTH_PROVIDERS -from open_webui.env import SCIM_AUTH_PROVIDER - - +from pydantic import BaseModel, ConfigDict, Field from sqlalchemy.ext.asyncio import AsyncSession -from open_webui.internal.db import get_async_session log = logging.getLogger(__name__) @@ -263,7 +259,7 @@ def get_scim_auth(request: Request, authorization: Optional[str] = Header(None)) enable_scim = getattr(request.app.state, 'ENABLE_SCIM', False) log.info(f'SCIM auth check - raw ENABLE_SCIM: {enable_scim}, type: {type(enable_scim)}') - # Handle both PersistentConfig and direct value + # Handle both ConfigVar and direct value if hasattr(enable_scim, 'value'): enable_scim = enable_scim.value @@ -275,7 +271,7 @@ def get_scim_auth(request: Request, authorization: Optional[str] = Header(None)) # Verify the SCIM token scim_token = getattr(request.app.state, 'SCIM_TOKEN', None) - # Handle both PersistentConfig and direct value + # Handle both ConfigVar and direct value if hasattr(scim_token, 'value'): scim_token = scim_token.value log.debug(f'SCIM token configured: {bool(scim_token)}') diff --git a/backend/open_webui/routers/skills.py b/backend/open_webui/routers/skills.py index 490d1706d5..55aa351ff0 100644 --- a/backend/open_webui/routers/skills.py +++ b/backend/open_webui/routers/skills.py @@ -1,28 +1,25 @@ import logging from typing import Optional -from open_webui.models.groups import Groups -from pydantic import BaseModel - from fastapi import APIRouter, Depends, HTTPException, Request, status -from sqlalchemy.ext.asyncio import AsyncSession - +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL +from open_webui.constants import ERROR_MESSAGES from open_webui.internal.db import get_async_session +from open_webui.models.access_grants import AccessGrants +from open_webui.models.groups import Groups from open_webui.models.skills import ( + SkillAccessListResponse, + SkillAccessResponse, SkillForm, SkillModel, SkillResponse, - SkillUserResponse, - SkillAccessResponse, - SkillAccessListResponse, Skills, + SkillUserResponse, ) -from open_webui.models.access_grants import AccessGrants +from open_webui.utils.access_control import filter_allowed_access_grants, has_permission from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import has_permission, filter_allowed_access_grants - -from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL -from open_webui.constants import ERROR_MESSAGES +from pydantic import BaseModel +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -176,6 +173,19 @@ async def create_new_skill( detail=ERROR_MESSAGES.ID_TAKEN, ) + # Strip public/user grants the requesting user is not permitted to assign + # (matches the channel/notes/calendar pattern). Without this, a user with + # workspace.skills permission could attach principal_id='*' read/write + # grants in the create payload, bypassing the sharing.public_skills gate + # that the dedicated /access/update endpoint already enforces. + form_data.access_grants = await filter_allowed_access_grants( + request.app.state.config.USER_PERMISSIONS, + user.id, + user.role, + form_data.access_grants, + 'sharing.public_skills', + ) + try: skill = await Skills.insert_new_skill(user.id, form_data, db=db) if skill: @@ -276,6 +286,19 @@ async def update_skill_by_id( detail=ERROR_MESSAGES.UNAUTHORIZED, ) + # Strip public/user grants the requesting user is not permitted to assign + # (matches the channel/notes/calendar pattern). The access check above only + # restricts WHO can write to the skill; this filter restricts WHICH grants + # they may set, so a non-admin owner cannot make their own skill publicly + # readable/writable without sharing.public_skills permission. + form_data.access_grants = await filter_allowed_access_grants( + request.app.state.config.USER_PERMISSIONS, + user.id, + user.role, + form_data.access_grants, + 'sharing.public_skills', + ) + try: updated = { **form_data.model_dump(exclude={'id'}), diff --git a/backend/open_webui/routers/tasks.py b/backend/open_webui/routers/tasks.py index b921f7b3e6..0e88f8594a 100644 --- a/backend/open_webui/routers/tasks.py +++ b/backend/open_webui/routers/tasks.py @@ -1,40 +1,36 @@ -from fastapi import APIRouter, Depends, HTTPException, Response, status, Request -from fastapi.responses import JSONResponse, RedirectResponse - -from pydantic import BaseModel -from typing import Optional import logging import re +from typing import Optional -from open_webui.utils.chat import generate_chat_completion -from open_webui.utils.task import ( - title_generation_template, - follow_up_generation_template, - query_generation_template, - image_prompt_generation_template, - autocomplete_generation_template, - tags_generation_template, - emoji_generation_template, - moa_response_generation_template, -) -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.constants import ERROR_MESSAGES, TASKS - -from open_webui.routers.pipelines import process_pipeline_inlet_filter - -from open_webui.utils.task import get_task_model_id - +from fastapi import APIRouter, Depends, HTTPException, Request, Response, status +from fastapi.responses import JSONResponse, RedirectResponse from open_webui.config import ( - DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE, - DEFAULT_FOLLOW_UP_GENERATION_PROMPT_TEMPLATE, - DEFAULT_TAGS_GENERATION_PROMPT_TEMPLATE, - DEFAULT_IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, - DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE, DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE, + DEFAULT_FOLLOW_UP_GENERATION_PROMPT_TEMPLATE, + DEFAULT_IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, DEFAULT_MOA_GENERATION_PROMPT_TEMPLATE, + DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE, + DEFAULT_TAGS_GENERATION_PROMPT_TEMPLATE, + DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE, DEFAULT_VOICE_MODE_PROMPT_TEMPLATE, ) +from open_webui.constants import ERROR_MESSAGES, TASKS +from open_webui.routers.pipelines import process_pipeline_inlet_filter +from open_webui.utils.auth import get_admin_user, get_verified_user +from open_webui.utils.chat import generate_chat_completion +from open_webui.utils.task import ( + autocomplete_generation_template, + emoji_generation_template, + follow_up_generation_template, + get_task_model_id, + image_prompt_generation_template, + moa_response_generation_template, + query_generation_template, + tags_generation_template, + title_generation_template, +) +from pydantic import BaseModel log = logging.getLogger(__name__) @@ -79,6 +75,7 @@ async def get_task_config(request: Request, user=Depends(get_verified_user)): 'ENABLE_RETRIEVAL_QUERY_GENERATION': request.app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION, 'QUERY_GENERATION_PROMPT_TEMPLATE': request.app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE, 'TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE': request.app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + 'ENABLE_VOICE_MODE_PROMPT': request.app.state.config.ENABLE_VOICE_MODE_PROMPT, 'VOICE_MODE_PROMPT_TEMPLATE': request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE, } @@ -99,6 +96,7 @@ class TaskConfigForm(BaseModel): ENABLE_RETRIEVAL_QUERY_GENERATION: bool QUERY_GENERATION_PROMPT_TEMPLATE: str TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: str + ENABLE_VOICE_MODE_PROMPT: bool VOICE_MODE_PROMPT_TEMPLATE: Optional[str] @@ -127,6 +125,7 @@ async def update_task_config(request: Request, form_data: TaskConfigForm, user=D request.app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE = form_data.QUERY_GENERATION_PROMPT_TEMPLATE request.app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = form_data.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE + request.app.state.config.ENABLE_VOICE_MODE_PROMPT = form_data.ENABLE_VOICE_MODE_PROMPT request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE = form_data.VOICE_MODE_PROMPT_TEMPLATE return { @@ -145,6 +144,7 @@ async def update_task_config(request: Request, form_data: TaskConfigForm, user=D 'ENABLE_RETRIEVAL_QUERY_GENERATION': request.app.state.config.ENABLE_RETRIEVAL_QUERY_GENERATION, 'QUERY_GENERATION_PROMPT_TEMPLATE': request.app.state.config.QUERY_GENERATION_PROMPT_TEMPLATE, 'TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE': request.app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + 'ENABLE_VOICE_MODE_PROMPT': request.app.state.config.ENABLE_VOICE_MODE_PROMPT, 'VOICE_MODE_PROMPT_TEMPLATE': request.app.state.config.VOICE_MODE_PROMPT_TEMPLATE, } @@ -159,12 +159,18 @@ async def generate_title(request: Request, form_data: dict, user=Depends(get_ver if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: models = request.app.state.MODELS model_id = form_data['model'] + if not model_id: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='No model specified for title generation. Please ensure a model is selected for this chat.', + ) if model_id not in models: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, @@ -187,7 +193,7 @@ async def generate_title(request: Request, form_data: dict, user=Depends(get_ver else: template = DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE - content = title_generation_template(template, form_data['messages'], user) + content = await title_generation_template(template, form_data['messages'], user) max_tokens = models[task_model_id].get('info', {}).get('params', {}).get('max_tokens', 1000) @@ -236,6 +242,7 @@ async def generate_follow_ups(request: Request, form_data: dict, user=Depends(ge if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: @@ -264,7 +271,7 @@ async def generate_follow_ups(request: Request, form_data: dict, user=Depends(ge else: template = DEFAULT_FOLLOW_UP_GENERATION_PROMPT_TEMPLATE - content = follow_up_generation_template(template, form_data['messages'], user) + content = await follow_up_generation_template(template, form_data['messages'], user) payload = { 'model': task_model_id, @@ -304,6 +311,7 @@ async def generate_chat_tags(request: Request, form_data: dict, user=Depends(get if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: @@ -332,7 +340,7 @@ async def generate_chat_tags(request: Request, form_data: dict, user=Depends(get else: template = DEFAULT_TAGS_GENERATION_PROMPT_TEMPLATE - content = tags_generation_template(template, form_data['messages'], user) + content = await tags_generation_template(template, form_data['messages'], user) payload = { 'model': task_model_id, @@ -366,6 +374,7 @@ async def generate_chat_tags(request: Request, form_data: dict, user=Depends(get async def generate_image_prompt(request: Request, form_data: dict, user=Depends(get_verified_user)): if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: @@ -394,7 +403,7 @@ async def generate_image_prompt(request: Request, form_data: dict, user=Depends( else: template = DEFAULT_IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE - content = image_prompt_generation_template(template, form_data['messages'], user) + content = await image_prompt_generation_template(template, form_data['messages'], user) payload = { 'model': task_model_id, @@ -446,6 +455,7 @@ async def generate_queries(request: Request, form_data: dict, user=Depends(get_v if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: @@ -474,7 +484,7 @@ async def generate_queries(request: Request, form_data: dict, user=Depends(get_v else: template = DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE - content = query_generation_template(template, form_data['messages'], user) + content = await query_generation_template(template, form_data['messages'], user) payload = { 'model': task_model_id, @@ -524,6 +534,7 @@ async def generate_autocompletion(request: Request, form_data: dict, user=Depend if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: @@ -552,7 +563,7 @@ async def generate_autocompletion(request: Request, form_data: dict, user=Depend else: template = DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE - content = autocomplete_generation_template(template, prompt, messages, type, user) + content = await autocomplete_generation_template(template, prompt, messages, type, user) payload = { 'model': task_model_id, @@ -586,6 +597,7 @@ async def generate_autocompletion(request: Request, form_data: dict, user=Depend async def generate_emoji(request: Request, form_data: dict, user=Depends(get_verified_user)): if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: @@ -611,7 +623,7 @@ async def generate_emoji(request: Request, form_data: dict, user=Depends(get_ver template = DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE - content = emoji_generation_template(template, form_data['prompt'], user) + content = await emoji_generation_template(template, form_data['prompt'], user) payload = { 'model': task_model_id, @@ -651,6 +663,7 @@ async def generate_emoji(request: Request, form_data: dict, user=Depends(get_ver async def generate_moa_response(request: Request, form_data: dict, user=Depends(get_verified_user)): if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'): models = { + **request.app.state.MODELS, request.state.model['id']: request.state.model, } else: diff --git a/backend/open_webui/routers/terminals.py b/backend/open_webui/routers/terminals.py index 003db06968..d2ef5f0ea3 100644 --- a/backend/open_webui/routers/terminals.py +++ b/backend/open_webui/routers/terminals.py @@ -12,13 +12,13 @@ from urllib.parse import unquote import aiohttp from fastapi import APIRouter, Depends, Request, Response, WebSocket from fastapi.responses import JSONResponse, StreamingResponse -from starlette.background import BackgroundTask - -from open_webui.utils.auth import get_verified_user -from open_webui.utils.access_control import has_connection_access +from open_webui.config import TERMINAL_PROXY_HEADERS from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL from open_webui.models.groups import Groups from open_webui.models.users import Users +from open_webui.utils.access_control import has_connection_access +from open_webui.utils.auth import get_verified_user +from starlette.background import BackgroundTask log = logging.getLogger(__name__) @@ -151,6 +151,8 @@ async def proxy_terminal( for key, value in upstream_response.headers.items() if key.lower() not in STRIPPED_RESPONSE_HEADERS } + if TERMINAL_PROXY_HEADERS: + filtered_headers.update(TERMINAL_PROXY_HEADERS) # Stream binary responses directly if any(t in upstream_content_type for t in STREAMING_CONTENT_TYPES): @@ -196,6 +198,7 @@ async def _resolve_authenticated_connection(ws: WebSocket, server_id: str): """ import asyncio import json + from open_webui.utils.auth import decode_token # First-message authentication diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index 04d845c3de..43719ae514 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -1,44 +1,43 @@ +from __future__ import annotations + import logging +import re +import time from pathlib import Path from typing import Optional -import time -import re + import aiohttp -from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, AIOHTTP_CLIENT_TIMEOUT -from open_webui.models.groups import Groups -from pydantic import BaseModel, HttpUrl from fastapi import APIRouter, Depends, HTTPException, Request, status -from sqlalchemy.ext.asyncio import AsyncSession +from open_webui.config import BYPASS_ADMIN_ACCESS_CONTROL, CACHE_DIR +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, AIOHTTP_CLIENT_TIMEOUT from open_webui.internal.db import get_async_session - - +from open_webui.models.access_grants import AccessGrants +from open_webui.models.groups import Groups from open_webui.models.oauth_sessions import OAuthSessions from open_webui.models.tools import ( + ToolAccessResponse, ToolForm, ToolModel, ToolResponse, - ToolUserResponse, - ToolAccessResponse, Tools, + ToolUserResponse, ) -from open_webui.models.access_grants import AccessGrants +from open_webui.utils.access_control import ( + filter_allowed_access_grants, + has_access, + has_permission, +) +from open_webui.utils.auth import get_admin_user, get_verified_user from open_webui.utils.plugin import ( + get_tool_module_from_cache, load_tool_module_by_id, replace_imports, - get_tool_module_from_cache, resolve_valves_schema_options, ) -from open_webui.utils.tools import get_tool_specs -from open_webui.utils.auth import get_admin_user, get_verified_user -from open_webui.utils.access_control import ( - has_permission, - has_access, - filter_allowed_access_grants, -) -from open_webui.utils.tools import get_tool_servers - -from open_webui.config import CACHE_DIR, BYPASS_ADMIN_ACCESS_CONTROL -from open_webui.constants import ERROR_MESSAGES +from open_webui.utils.tools import get_tool_servers, get_tool_specs +from pydantic import BaseModel, HttpUrl +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -248,7 +247,7 @@ def github_url_to_raw_url(url: str) -> str: return url -@router.post('/load/url', response_model=Optional[dict]) +@router.post('/load/url', response_model=dict | None) async def load_tool_from_url(request: Request, form_data: LoadUrlForm, user=Depends(get_admin_user)): # NOTE: This is NOT a SSRF vulnerability: # This endpoint is admin-only (see get_admin_user), meant for *trusted* internal use, @@ -323,7 +322,7 @@ async def export_tools( ############################ -@router.post('/create', response_model=Optional[ToolResponse]) +@router.post('/create', response_model=ToolResponse | None) async def create_new_tools( request: Request, form_data: ToolForm, @@ -401,7 +400,7 @@ async def create_new_tools( ############################ -@router.get('/id/{id}', response_model=Optional[ToolAccessResponse]) +@router.get('/id/{id}', response_model=ToolAccessResponse | None) async def get_tools_by_id(id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): tools = await Tools.get_tool_by_id(id, db=db) @@ -448,7 +447,7 @@ async def get_tools_by_id(id: str, user=Depends(get_verified_user), db: AsyncSes ############################ -@router.post('/id/{id}/update', response_model=Optional[ToolModel]) +@router.post('/id/{id}/update', response_model=ToolModel | None) async def update_tools_by_id( request: Request, id: str, @@ -480,6 +479,17 @@ async def update_tools_by_id( detail=ERROR_MESSAGES.UNAUTHORIZED, ) + # Content edits trigger exec on load — gate them behind workspace.tools (matches /create). + if form_data.content != tools.content: + if user.role != 'admin' and not ( + await has_permission(user.id, 'workspace.tools', request.app.state.config.USER_PERMISSIONS, db=db) + or await has_permission(user.id, 'workspace.tools_import', request.app.state.config.USER_PERMISSIONS, db=db) + ): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail=ERROR_MESSAGES.UNAUTHORIZED, + ) + try: form_data.content = replace_imports(form_data.content) tool_module, frontmatter = await load_tool_module_by_id(id, content=form_data.content) @@ -530,7 +540,7 @@ class ToolAccessGrantsForm(BaseModel): access_grants: list[dict] -@router.post('/id/{id}/access/update', response_model=Optional[ToolModel]) +@router.post('/id/{id}/access/update', response_model=ToolModel | None) async def update_tool_access_by_id( request: Request, id: str, @@ -623,7 +633,7 @@ async def delete_tools_by_id( ############################ -@router.get('/id/{id}/valves', response_model=Optional[dict]) +@router.get('/id/{id}/valves', response_model=dict | None) async def get_tools_valves_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -665,7 +675,7 @@ async def get_tools_valves_by_id( ############################ -@router.get('/id/{id}/valves/spec', response_model=Optional[dict]) +@router.get('/id/{id}/valves/spec', response_model=dict | None) async def get_tools_valves_spec_by_id( request: Request, id: str, @@ -715,7 +725,7 @@ async def get_tools_valves_spec_by_id( ############################ -@router.post('/id/{id}/valves/update', response_model=Optional[dict]) +@router.post('/id/{id}/valves/update', response_model=dict | None) async def update_tools_valves_by_id( request: Request, id: str, @@ -778,7 +788,7 @@ async def update_tools_valves_by_id( ############################ -@router.get('/id/{id}/valves/user', response_model=Optional[dict]) +@router.get('/id/{id}/valves/user', response_model=dict | None) async def get_tools_user_valves_by_id( id: str, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -815,7 +825,7 @@ async def get_tools_user_valves_by_id( ) -@router.get('/id/{id}/valves/user/spec', response_model=Optional[dict]) +@router.get('/id/{id}/valves/user/spec', response_model=dict | None) async def get_tools_user_valves_spec_by_id( request: Request, id: str, @@ -860,7 +870,7 @@ async def get_tools_user_valves_spec_by_id( return None -@router.post('/id/{id}/valves/user/update', response_model=Optional[dict]) +@router.post('/id/{id}/valves/user/update', response_model=dict | None) async def update_tools_user_valves_by_id( request: Request, id: str, diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 04be89c92f..3c215c8f16 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -1,46 +1,45 @@ -import logging -from typing import Optional -from sqlalchemy.ext.asyncio import AsyncSession +from __future__ import annotations + import base64 import io - +import logging +import time +from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Request, status -from fastapi.responses import Response, StreamingResponse, FileResponse -from pydantic import BaseModel, ConfigDict - - +from fastapi.responses import FileResponse, Response, StreamingResponse +from open_webui.constants import ERROR_MESSAGES +from open_webui.env import ENABLE_PROFILE_IMAGE_URL_FORWARDING, PROFILE_IMAGE_ALLOWED_MIME_TYPES, STATIC_DIR +from open_webui.internal.db import get_async_session from open_webui.models.auths import Auths -from open_webui.models.oauth_sessions import OAuthSessions - from open_webui.models.groups import Groups - +from open_webui.models.oauth_sessions import OAuthSessions from open_webui.models.users import ( - UserModel, - UserGroupIdsModel, UserGroupIdsListResponse, - UserInfoResponse, + UserGroupIdsModel, UserInfoListResponse, + UserInfoResponse, + UserModel, UserRoleUpdateForm, - UserStatus, Users, UserSettings, + UserStatus, UserUpdateForm, ) - -from open_webui.constants import ERROR_MESSAGES -from open_webui.env import STATIC_DIR -from open_webui.internal.db import get_async_session - - +from open_webui.models.access_grants import AccessGrants +from open_webui.models.knowledge import Knowledges +from open_webui.models.models import Models +from open_webui.models.tools import Tools +from open_webui.socket.main import disconnect_user_sessions +from open_webui.utils.access_control import get_permissions, has_permission from open_webui.utils.auth import ( get_admin_user, get_password_hash, get_verified_user, validate_password, ) -from open_webui.utils.access_control import get_permissions, has_permission -from open_webui.socket.main import disconnect_user_sessions +from pydantic import BaseModel, ConfigDict +from sqlalchemy.ext.asyncio import AsyncSession log = logging.getLogger(__name__) @@ -59,10 +58,10 @@ PAGE_ITEM_COUNT = 30 @router.get('/', response_model=UserGroupIdsListResponse) async def get_users( - query: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + order_by: str | None = None, + direction: str | None = None, + page: int | None = 1, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session), ): @@ -114,10 +113,10 @@ async def get_all_users( @router.get('/search', response_model=UserInfoListResponse) async def search_users( - query: Optional[str] = None, - order_by: Optional[str] = None, - direction: Optional[str] = None, - page: Optional[int] = 1, + query: str | None = None, + order_by: str | None = None, + direction: str | None = None, + page: int | None = 1, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session), ): @@ -193,6 +192,8 @@ class SharingPermissions(BaseModel): public_skills: bool = False notes: bool = False public_notes: bool = True + public_chats: bool = False + public_calendars: bool = False class AccessGrantsPermissions(BaseModel): @@ -234,6 +235,7 @@ class FeaturesPermissions(BaseModel): code_interpreter: bool = True memories: bool = True automations: bool = False + calendar: bool = True class SettingsPermissions(BaseModel): @@ -272,7 +274,7 @@ async def update_default_user_permissions(request: Request, form_data: UserPermi ############################ -@router.get('/user/settings', response_model=Optional[UserSettings]) +@router.get('/user/settings', response_model=UserSettings | None) async def get_user_settings_by_session_user( user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -369,7 +371,7 @@ async def update_user_status_by_session_user( ############################ -@router.get('/user/info', response_model=Optional[dict]) +@router.get('/user/info', response_model=dict | None) async def get_user_info_by_session_user(user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)): # user already fetched by get_verified_user — no need to refetch return user.info @@ -380,7 +382,7 @@ async def get_user_info_by_session_user(user=Depends(get_verified_user), db: Asy ############################ -@router.post('/user/info/update', response_model=Optional[dict]) +@router.post('/user/info/update', response_model=dict | None) async def update_user_info_by_session_user( form_data: dict, user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session) ): @@ -405,8 +407,8 @@ async def update_user_info_by_session_user( class UserActiveResponse(UserStatus): name: str - profile_image_url: Optional[str] = None - groups: Optional[list] = [] + profile_image_url: str | None = None + groups: list | None = [] is_active: bool model_config = ConfigDict(extra='allow') @@ -477,23 +479,32 @@ async def get_user_profile_image_by_id(user_id: str, user=Depends(get_verified_u user = await Users.get_user_by_id(user_id) if user: if user.profile_image_url: - # check if it's url or base64 if user.profile_image_url.startswith('http'): - return Response( - status_code=status.HTTP_302_FOUND, - headers={'Location': user.profile_image_url}, - ) + if ENABLE_PROFILE_IMAGE_URL_FORWARDING: + return Response( + status_code=status.HTTP_302_FOUND, + headers={'Location': user.profile_image_url}, + ) + # When forwarding is disabled, fall through to the + # default image to prevent client-side IP/UA/Referer + # leaks via 302 redirect to external origins. elif user.profile_image_url.startswith('data:image'): try: header, base64_data = user.profile_image_url.split(',', 1) image_data = base64.b64decode(base64_data) image_buffer = io.BytesIO(image_data) - media_type = header.split(';')[0].lstrip('data:') + media_type = header.split(';')[0].lstrip('data:').lower() + + if media_type not in PROFILE_IMAGE_ALLOWED_MIME_TYPES: + return FileResponse(f'{STATIC_DIR}/user.png') return StreamingResponse( image_buffer, media_type=media_type, - headers={'Content-Disposition': 'inline'}, + headers={ + 'Content-Disposition': 'inline', + 'X-Content-Type-Options': 'nosniff', + }, ) except Exception as e: pass @@ -524,7 +535,7 @@ async def get_user_active_status_by_id( ############################ -@router.post('/{user_id}/update', response_model=Optional[UserModel]) +@router.post('/{user_id}/update', response_model=UserModel | None) async def update_user_by_id( user_id: str, form_data: UserUpdateForm, @@ -671,3 +682,88 @@ async def get_user_groups_by_id( user_id: str, user=Depends(get_admin_user), db: AsyncSession = Depends(get_async_session) ): return await Groups.get_groups_by_member_id(user_id, db=db) + + +############################ +# GetUserPreview +############################ + + +@router.get('/{user_id}/preview') +async def get_user_preview( + user_id: str, + user=Depends(get_admin_user), + db: AsyncSession = Depends(get_async_session), +): + """Show what resources a specific user can access across all their groups.""" + target_user = await Users.get_user_by_id(user_id, db=db) + if not target_user: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail=ERROR_MESSAGES.USER_NOT_FOUND, + ) + + # Get all group IDs this user belongs to + user_groups = await Groups.get_groups_by_member_id(user_id, db=db) + user_group_ids = {g.id for g in user_groups} + + all_models = await Models.get_all_models(db=db) + accessible_model_ids = await AccessGrants.get_accessible_resource_ids( + user_id=user_id, + resource_type='model', + resource_ids=[m.id for m in all_models], + permission='read', + user_group_ids=user_group_ids, + db=db, + ) + + all_knowledge = await Knowledges.get_knowledge_bases(db=db) + accessible_knowledge_ids = await AccessGrants.get_accessible_resource_ids( + user_id=user_id, + resource_type='knowledge', + resource_ids=[k.id for k in all_knowledge], + permission='read', + user_group_ids=user_group_ids, + db=db, + ) + + all_tools = await Tools.get_tools(defer_content=True, db=db) + accessible_tool_ids = await AccessGrants.get_accessible_resource_ids( + user_id=user_id, + resource_type='tool', + resource_ids=[t.id for t in all_tools], + permission='read', + user_group_ids=user_group_ids, + db=db, + ) + + active_models = [m for m in all_models if m.is_active] + + return { + 'user': {'id': target_user.id, 'name': target_user.name}, + 'groups': [{'id': g.id, 'name': g.name} for g in user_groups], + 'models': { + 'items': [ + {'id': m.id, 'name': m.name} + for m in active_models + if m.id in accessible_model_ids + ], + 'total': len(active_models), + }, + 'knowledge': { + 'items': [ + {'id': k.id, 'name': k.name} + for k in all_knowledge + if k.id in accessible_knowledge_ids + ], + 'total': len(all_knowledge), + }, + 'tools': { + 'items': [ + {'id': t.id, 'name': t.name} + for t in all_tools + if t.id in accessible_tool_ids + ], + 'total': len(all_tools), + }, + } diff --git a/backend/open_webui/routers/utils.py b/backend/open_webui/routers/utils.py index 20705c2c44..92caf5fee9 100644 --- a/backend/open_webui/routers/utils.py +++ b/backend/open_webui/routers/utils.py @@ -1,19 +1,19 @@ -import black -import logging -import markdown +from __future__ import annotations -from open_webui.models.chats import ChatTitleMessagesForm +import logging + +import black +import markdown +from fastapi import APIRouter, Depends, HTTPException, Request, Response, status from open_webui.config import DATA_DIR, ENABLE_ADMIN_EXPORT from open_webui.constants import ERROR_MESSAGES -from fastapi import APIRouter, Depends, HTTPException, Request, Response, status -from pydantic import BaseModel -from starlette.responses import FileResponse - - -from open_webui.utils.misc import get_gravatar_url -from open_webui.utils.pdf_generator import PDFGenerator +from open_webui.models.chats import ChatTitleMessagesForm from open_webui.utils.auth import get_admin_user, get_verified_user from open_webui.utils.code_interpreter import execute_code_jupyter +from open_webui.utils.misc import get_gravatar_url +from open_webui.utils.pdf_generator import PDFGenerator +from pydantic import BaseModel +from starlette.responses import FileResponse log = logging.getLogger(__name__) diff --git a/backend/open_webui/socket/main.py b/backend/open_webui/socket/main.py index e224408742..4217124e2b 100644 --- a/backend/open_webui/socket/main.py +++ b/backend/open_webui/socket/main.py @@ -1,55 +1,50 @@ -import asyncio -import random +from __future__ import annotations -import socketio +import asyncio import logging +import random import sys import time -from typing import Dict, Set -from redis import asyncio as aioredis +from typing import Dict + import pycrdt as Y - -from open_webui.models.users import Users, UserNameResponse -from open_webui.models.channels import Channels -from open_webui.models.chats import Chats -from open_webui.models.notes import Notes, NoteUpdateForm -from open_webui.utils.redis import ( - get_sentinels_from_env, - get_sentinel_url_from_env, -) - +import socketio from open_webui.config import ( CORS_ALLOW_ORIGIN, ) - from open_webui.env import ( - VERSION, ENABLE_WEBSOCKET_SUPPORT, + GLOBAL_LOG_LEVEL, + REDIS_KEY_PREFIX, + VERSION, + WEBSOCKET_EVENT_CALLER_TIMEOUT, WEBSOCKET_MANAGER, - WEBSOCKET_REDIS_URL, WEBSOCKET_REDIS_CLUSTER, WEBSOCKET_REDIS_LOCK_TIMEOUT, - WEBSOCKET_SENTINEL_PORT, - WEBSOCKET_SENTINEL_HOSTS, - REDIS_KEY_PREFIX, WEBSOCKET_REDIS_OPTIONS, - WEBSOCKET_SERVER_PING_TIMEOUT, - WEBSOCKET_SERVER_PING_INTERVAL, - WEBSOCKET_SERVER_LOGGING, + WEBSOCKET_REDIS_URL, + WEBSOCKET_SENTINEL_HOSTS, + WEBSOCKET_SENTINEL_PORT, WEBSOCKET_SERVER_ENGINEIO_LOGGING, - WEBSOCKET_EVENT_CALLER_TIMEOUT, + WEBSOCKET_SERVER_LOGGING, + WEBSOCKET_SERVER_PING_INTERVAL, + WEBSOCKET_SERVER_PING_TIMEOUT, ) -from open_webui.utils.auth import decode_token +from open_webui.models.access_grants import AccessGrants +from open_webui.models.channels import Channels +from open_webui.models.chats import Chats +from open_webui.models.notes import Notes, NoteUpdateForm +from open_webui.models.users import UserNameResponse, Users from open_webui.socket.utils import RedisDict, RedisLock, YdocManager from open_webui.tasks import create_task, stop_item_tasks -from open_webui.utils.redis import get_redis_connection from open_webui.utils.access_control import has_permission -from open_webui.models.access_grants import AccessGrants - - -from open_webui.env import ( - GLOBAL_LOG_LEVEL, +from open_webui.utils.auth import decode_token +from open_webui.utils.redis import ( + get_redis_connection, + get_sentinel_url_from_env, + get_sentinels_from_env, ) +from redis import asyncio as aioredis logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) log = logging.getLogger(__name__) @@ -371,15 +366,15 @@ async def connect(sid, environ, auth): @sio.on('user-join') async def user_join(sid, data): - auth = data['auth'] if 'auth' in data else None + auth = data.get('auth') if not auth or 'token' not in auth: return - data = decode_token(auth['token']) - if data is None or 'id' not in data: + token_data = decode_token(auth['token']) + if token_data is None or 'id' not in token_data: return - user = await Users.get_user_by_id(data['id']) + user = await Users.get_user_by_id(token_data['id']) if not user: return @@ -832,7 +827,76 @@ async def disconnect(sid): # print(f"Unknown session ID {sid} disconnected") +async def _make_channel_emitter(request_info): + """Event emitter that routes pipeline output to a channel message. + + Translates chat:completion events into channel message:update socket + emissions, throttled to avoid flooding with per-token updates. + """ + channel_id = request_info['chat_id'].removeprefix('channel:') + message_id = request_info['message_id'] + + state = {'last_emit_at': 0.0} + THROTTLE_INTERVAL = 0.15 # ~6 updates/sec + + async def _emit_channel_update(content: str, done: bool = False): + from open_webui.models.messages import MessageForm, Messages + + update_form = MessageForm(content=content) + if done: + # Merge done flag into existing meta (preserve model_id etc.) + msg = await Messages.get_message_by_id(message_id) + existing_meta = (msg.meta or {}) if msg else {} + update_form = MessageForm( + content=content, + meta={**existing_meta, 'done': True}, + ) + + await Messages.update_message_by_id(message_id, update_form) + message = await Messages.get_message_by_id(message_id) + if message: + await sio.emit( + 'events:channel', + { + 'channel_id': channel_id, + 'message_id': message_id, + 'data': { + 'type': 'message:update', + 'data': message.model_dump(), + }, + }, + to=f'channel:{channel_id}', + ) + + async def __channel_emitter__(event_data): + event_type = event_data.get('type') + + if event_type == 'chat:completion': + data = event_data.get('data', {}) + content = data.get('content', '') + done = data.get('done', False) + + if not content and not done: + return + + now = __import__('time').time() + if done or (now - state['last_emit_at']) >= THROTTLE_INTERVAL: + state['last_emit_at'] = now + await _emit_channel_update(content, done) + + elif event_type == 'chat:message:error': + error = event_data.get('data', {}).get('error', {}) + error_content = error.get('content', 'An error occurred') if isinstance(error, dict) else str(error) + await _emit_channel_update(f'Error: {error_content}', done=True) + + return __channel_emitter__ + + async def get_event_emitter(request_info, update_db=True): + # Channel mode: route pipeline output to channel message updates + if (request_info.get('chat_id') or '').startswith('channel:'): + return await _make_channel_emitter(request_info) + async def __event_emitter__(event_data): user_id = request_info['user_id'] chat_id = request_info['chat_id'] @@ -848,7 +912,7 @@ async def get_event_emitter(request_info, update_db=True): room=f'user:{user_id}', ) - if update_db and message_id and not request_info.get('chat_id', '').startswith('local:'): + if update_db and message_id and not (request_info.get('chat_id') or '').startswith('local:'): event_type = event_data.get('type') if event_type == 'status': @@ -888,13 +952,15 @@ async def get_event_emitter(request_info, update_db=True): ) elif event_type == 'embeds': - message = await Chats.get_message_by_id_and_message_id( - request_info['chat_id'], - request_info['message_id'], - ) + event_payload = event_data.get('data', {}) + embeds = event_payload.get('embeds', []) - embeds = event_data.get('data', {}).get('embeds', []) - embeds.extend(message.get('embeds', [])) + if not event_payload.get('replace', False): + message = await Chats.get_message_by_id_and_message_id( + request_info['chat_id'], + request_info['message_id'], + ) + embeds.extend(message.get('embeds', [])) await Chats.upsert_message_to_chat_by_id_and_message_id( request_info['chat_id'], @@ -948,17 +1014,27 @@ async def get_event_emitter(request_info, update_db=True): async def get_event_call(request_info): async def __event_caller__(event_data): - response = await sio.call( - 'events', - { - 'chat_id': request_info.get('chat_id', None), - 'message_id': request_info.get('message_id', None), - 'data': event_data, - }, - to=request_info['session_id'], - timeout=WEBSOCKET_EVENT_CALLER_TIMEOUT, - ) - return response + session_id = request_info['session_id'] + + # Fast-fail if the client has disconnected. + if session_id not in SESSION_POOL: + log.warning(f'Event caller: session {session_id} no longer connected') + return {'error': 'Client session disconnected.'} + + try: + return await sio.call( + 'events', + { + 'chat_id': request_info.get('chat_id', None), + 'message_id': request_info.get('message_id', None), + 'data': event_data, + }, + to=session_id, + timeout=WEBSOCKET_EVENT_CALLER_TIMEOUT, + ) + except TimeoutError: + log.warning(f'Event caller timed out for session {session_id}') + return {'error': 'Event call timed out. The browser tab may be inactive or closed.'} if 'session_id' in request_info and 'chat_id' in request_info and 'message_id' in request_info: return __event_caller__ diff --git a/backend/open_webui/socket/utils.py b/backend/open_webui/socket/utils.py index 16b0cc3855..0cf2a09246 100644 --- a/backend/open_webui/socket/utils.py +++ b/backend/open_webui/socket/utils.py @@ -1,9 +1,10 @@ import json import uuid -from open_webui.utils.redis import get_redis_connection -from open_webui.env import REDIS_KEY_PREFIX -from typing import Optional, List, Tuple +from typing import List, Optional, Tuple + import pycrdt as Y +from open_webui.env import REDIS_KEY_PREFIX +from open_webui.utils.redis import get_redis_connection class RedisLock: diff --git a/backend/open_webui/static/swagger-ui/swagger-ui-bundle.js b/backend/open_webui/static/swagger-ui/swagger-ui-bundle.js index 8656897872..5ea59d21ef 100644 --- a/backend/open_webui/static/swagger-ui/swagger-ui-bundle.js +++ b/backend/open_webui/static/swagger-ui/swagger-ui-bundle.js @@ -1,72362 +1,2 @@ /*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ -!(function webpackUniversalModuleDefinition(s, o) { - 'object' == typeof exports && 'object' == typeof module - ? (module.exports = o()) - : 'function' == typeof define && define.amd - ? define([], o) - : 'object' == typeof exports - ? (exports.SwaggerUIBundle = o()) - : (s.SwaggerUIBundle = o()); -})(this, () => - (() => { - var s, - o, - i = { - 69119: (s, o) => { - 'use strict'; - (Object.defineProperty(o, '__esModule', { value: !0 }), - (o.BLANK_URL = - o.relativeFirstCharacters = - o.whitespaceEscapeCharsRegex = - o.urlSchemeRegex = - o.ctrlCharactersRegex = - o.htmlCtrlEntityRegex = - o.htmlEntitiesRegex = - o.invalidProtocolRegex = - void 0), - (o.invalidProtocolRegex = /^([^\w]*)(javascript|data|vbscript)/im), - (o.htmlEntitiesRegex = /&#(\w+)(^\w|;)?/g), - (o.htmlCtrlEntityRegex = /&(newline|tab);/gi), - (o.ctrlCharactersRegex = /[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim), - (o.urlSchemeRegex = /^.+(:|:)/gim), - (o.whitespaceEscapeCharsRegex = /(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g), - (o.relativeFirstCharacters = ['.', '/']), - (o.BLANK_URL = 'about:blank')); - }, - 16750: (s, o, i) => { - 'use strict'; - o.J = void 0; - var u = i(69119); - function decodeURI(s) { - try { - return decodeURIComponent(s); - } catch (o) { - return s; - } - } - o.J = function sanitizeUrl(s) { - if (!s) return u.BLANK_URL; - var o, - i, - _ = decodeURI(s); - do { - o = - (_ = decodeURI( - (_ = ((i = _), - i - .replace(u.ctrlCharactersRegex, '') - .replace(u.htmlEntitiesRegex, function (s, o) { - return String.fromCharCode(o); - })) - .replace(u.htmlCtrlEntityRegex, '') - .replace(u.ctrlCharactersRegex, '') - .replace(u.whitespaceEscapeCharsRegex, '') - .trim()) - )).match(u.ctrlCharactersRegex) || - _.match(u.htmlEntitiesRegex) || - _.match(u.htmlCtrlEntityRegex) || - _.match(u.whitespaceEscapeCharsRegex); - } while (o && o.length > 0); - var w = _; - if (!w) return u.BLANK_URL; - if ( - (function isRelativeUrlWithoutProtocol(s) { - return u.relativeFirstCharacters.indexOf(s[0]) > -1; - })(w) - ) - return w; - var x = w.match(u.urlSchemeRegex); - if (!x) return w; - var C = x[0]; - return u.invalidProtocolRegex.test(C) ? u.BLANK_URL : w; - }; - }, - 67526: (s, o) => { - 'use strict'; - ((o.byteLength = function byteLength(s) { - var o = getLens(s), - i = o[0], - u = o[1]; - return (3 * (i + u)) / 4 - u; - }), - (o.toByteArray = function toByteArray(s) { - var o, - i, - w = getLens(s), - x = w[0], - C = w[1], - j = new _( - (function _byteLength(s, o, i) { - return (3 * (o + i)) / 4 - i; - })(0, x, C) - ), - L = 0, - B = C > 0 ? x - 4 : x; - for (i = 0; i < B; i += 4) - ((o = - (u[s.charCodeAt(i)] << 18) | - (u[s.charCodeAt(i + 1)] << 12) | - (u[s.charCodeAt(i + 2)] << 6) | - u[s.charCodeAt(i + 3)]), - (j[L++] = (o >> 16) & 255), - (j[L++] = (o >> 8) & 255), - (j[L++] = 255 & o)); - 2 === C && - ((o = (u[s.charCodeAt(i)] << 2) | (u[s.charCodeAt(i + 1)] >> 4)), - (j[L++] = 255 & o)); - 1 === C && - ((o = - (u[s.charCodeAt(i)] << 10) | - (u[s.charCodeAt(i + 1)] << 4) | - (u[s.charCodeAt(i + 2)] >> 2)), - (j[L++] = (o >> 8) & 255), - (j[L++] = 255 & o)); - return j; - }), - (o.fromByteArray = function fromByteArray(s) { - for ( - var o, u = s.length, _ = u % 3, w = [], x = 16383, C = 0, j = u - _; - C < j; - C += x - ) - w.push(encodeChunk(s, C, C + x > j ? j : C + x)); - 1 === _ - ? ((o = s[u - 1]), w.push(i[o >> 2] + i[(o << 4) & 63] + '==')) - : 2 === _ && - ((o = (s[u - 2] << 8) + s[u - 1]), - w.push(i[o >> 10] + i[(o >> 4) & 63] + i[(o << 2) & 63] + '=')); - return w.join(''); - })); - for ( - var i = [], - u = [], - _ = 'undefined' != typeof Uint8Array ? Uint8Array : Array, - w = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', - x = 0; - x < 64; - ++x - ) - ((i[x] = w[x]), (u[w.charCodeAt(x)] = x)); - function getLens(s) { - var o = s.length; - if (o % 4 > 0) throw new Error('Invalid string. Length must be a multiple of 4'); - var i = s.indexOf('='); - return (-1 === i && (i = o), [i, i === o ? 0 : 4 - (i % 4)]); - } - function encodeChunk(s, o, u) { - for (var _, w, x = [], C = o; C < u; C += 3) - ((_ = ((s[C] << 16) & 16711680) + ((s[C + 1] << 8) & 65280) + (255 & s[C + 2])), - x.push(i[((w = _) >> 18) & 63] + i[(w >> 12) & 63] + i[(w >> 6) & 63] + i[63 & w])); - return x.join(''); - } - ((u['-'.charCodeAt(0)] = 62), (u['_'.charCodeAt(0)] = 63)); - }, - 48287: (s, o, i) => { - 'use strict'; - const u = i(67526), - _ = i(251), - w = - 'function' == typeof Symbol && 'function' == typeof Symbol.for - ? Symbol.for('nodejs.util.inspect.custom') - : null; - ((o.Buffer = Buffer), - (o.SlowBuffer = function SlowBuffer(s) { - +s != s && (s = 0); - return Buffer.alloc(+s); - }), - (o.INSPECT_MAX_BYTES = 50)); - const x = 2147483647; - function createBuffer(s) { - if (s > x) throw new RangeError('The value "' + s + '" is invalid for option "size"'); - const o = new Uint8Array(s); - return (Object.setPrototypeOf(o, Buffer.prototype), o); - } - function Buffer(s, o, i) { - if ('number' == typeof s) { - if ('string' == typeof o) - throw new TypeError( - 'The "string" argument must be of type string. Received type number' - ); - return allocUnsafe(s); - } - return from(s, o, i); - } - function from(s, o, i) { - if ('string' == typeof s) - return (function fromString(s, o) { - ('string' == typeof o && '' !== o) || (o = 'utf8'); - if (!Buffer.isEncoding(o)) throw new TypeError('Unknown encoding: ' + o); - const i = 0 | byteLength(s, o); - let u = createBuffer(i); - const _ = u.write(s, o); - _ !== i && (u = u.slice(0, _)); - return u; - })(s, o); - if (ArrayBuffer.isView(s)) - return (function fromArrayView(s) { - if (isInstance(s, Uint8Array)) { - const o = new Uint8Array(s); - return fromArrayBuffer(o.buffer, o.byteOffset, o.byteLength); - } - return fromArrayLike(s); - })(s); - if (null == s) - throw new TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + - typeof s - ); - if (isInstance(s, ArrayBuffer) || (s && isInstance(s.buffer, ArrayBuffer))) - return fromArrayBuffer(s, o, i); - if ( - 'undefined' != typeof SharedArrayBuffer && - (isInstance(s, SharedArrayBuffer) || (s && isInstance(s.buffer, SharedArrayBuffer))) - ) - return fromArrayBuffer(s, o, i); - if ('number' == typeof s) - throw new TypeError( - 'The "value" argument must not be of type number. Received type number' - ); - const u = s.valueOf && s.valueOf(); - if (null != u && u !== s) return Buffer.from(u, o, i); - const _ = (function fromObject(s) { - if (Buffer.isBuffer(s)) { - const o = 0 | checked(s.length), - i = createBuffer(o); - return (0 === i.length || s.copy(i, 0, 0, o), i); - } - if (void 0 !== s.length) - return 'number' != typeof s.length || numberIsNaN(s.length) - ? createBuffer(0) - : fromArrayLike(s); - if ('Buffer' === s.type && Array.isArray(s.data)) return fromArrayLike(s.data); - })(s); - if (_) return _; - if ( - 'undefined' != typeof Symbol && - null != Symbol.toPrimitive && - 'function' == typeof s[Symbol.toPrimitive] - ) - return Buffer.from(s[Symbol.toPrimitive]('string'), o, i); - throw new TypeError( - 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + - typeof s - ); - } - function assertSize(s) { - if ('number' != typeof s) throw new TypeError('"size" argument must be of type number'); - if (s < 0) throw new RangeError('The value "' + s + '" is invalid for option "size"'); - } - function allocUnsafe(s) { - return (assertSize(s), createBuffer(s < 0 ? 0 : 0 | checked(s))); - } - function fromArrayLike(s) { - const o = s.length < 0 ? 0 : 0 | checked(s.length), - i = createBuffer(o); - for (let u = 0; u < o; u += 1) i[u] = 255 & s[u]; - return i; - } - function fromArrayBuffer(s, o, i) { - if (o < 0 || s.byteLength < o) - throw new RangeError('"offset" is outside of buffer bounds'); - if (s.byteLength < o + (i || 0)) - throw new RangeError('"length" is outside of buffer bounds'); - let u; - return ( - (u = - void 0 === o && void 0 === i - ? new Uint8Array(s) - : void 0 === i - ? new Uint8Array(s, o) - : new Uint8Array(s, o, i)), - Object.setPrototypeOf(u, Buffer.prototype), - u - ); - } - function checked(s) { - if (s >= x) - throw new RangeError( - 'Attempt to allocate Buffer larger than maximum size: 0x' + - x.toString(16) + - ' bytes' - ); - return 0 | s; - } - function byteLength(s, o) { - if (Buffer.isBuffer(s)) return s.length; - if (ArrayBuffer.isView(s) || isInstance(s, ArrayBuffer)) return s.byteLength; - if ('string' != typeof s) - throw new TypeError( - 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + - typeof s - ); - const i = s.length, - u = arguments.length > 2 && !0 === arguments[2]; - if (!u && 0 === i) return 0; - let _ = !1; - for (;;) - switch (o) { - case 'ascii': - case 'latin1': - case 'binary': - return i; - case 'utf8': - case 'utf-8': - return utf8ToBytes(s).length; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 2 * i; - case 'hex': - return i >>> 1; - case 'base64': - return base64ToBytes(s).length; - default: - if (_) return u ? -1 : utf8ToBytes(s).length; - ((o = ('' + o).toLowerCase()), (_ = !0)); - } - } - function slowToString(s, o, i) { - let u = !1; - if (((void 0 === o || o < 0) && (o = 0), o > this.length)) return ''; - if (((void 0 === i || i > this.length) && (i = this.length), i <= 0)) return ''; - if ((i >>>= 0) <= (o >>>= 0)) return ''; - for (s || (s = 'utf8'); ; ) - switch (s) { - case 'hex': - return hexSlice(this, o, i); - case 'utf8': - case 'utf-8': - return utf8Slice(this, o, i); - case 'ascii': - return asciiSlice(this, o, i); - case 'latin1': - case 'binary': - return latin1Slice(this, o, i); - case 'base64': - return base64Slice(this, o, i); - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return utf16leSlice(this, o, i); - default: - if (u) throw new TypeError('Unknown encoding: ' + s); - ((s = (s + '').toLowerCase()), (u = !0)); - } - } - function swap(s, o, i) { - const u = s[o]; - ((s[o] = s[i]), (s[i] = u)); - } - function bidirectionalIndexOf(s, o, i, u, _) { - if (0 === s.length) return -1; - if ( - ('string' == typeof i - ? ((u = i), (i = 0)) - : i > 2147483647 - ? (i = 2147483647) - : i < -2147483648 && (i = -2147483648), - numberIsNaN((i = +i)) && (i = _ ? 0 : s.length - 1), - i < 0 && (i = s.length + i), - i >= s.length) - ) { - if (_) return -1; - i = s.length - 1; - } else if (i < 0) { - if (!_) return -1; - i = 0; - } - if (('string' == typeof o && (o = Buffer.from(o, u)), Buffer.isBuffer(o))) - return 0 === o.length ? -1 : arrayIndexOf(s, o, i, u, _); - if ('number' == typeof o) - return ( - (o &= 255), - 'function' == typeof Uint8Array.prototype.indexOf - ? _ - ? Uint8Array.prototype.indexOf.call(s, o, i) - : Uint8Array.prototype.lastIndexOf.call(s, o, i) - : arrayIndexOf(s, [o], i, u, _) - ); - throw new TypeError('val must be string, number or Buffer'); - } - function arrayIndexOf(s, o, i, u, _) { - let w, - x = 1, - C = s.length, - j = o.length; - if ( - void 0 !== u && - ('ucs2' === (u = String(u).toLowerCase()) || - 'ucs-2' === u || - 'utf16le' === u || - 'utf-16le' === u) - ) { - if (s.length < 2 || o.length < 2) return -1; - ((x = 2), (C /= 2), (j /= 2), (i /= 2)); - } - function read(s, o) { - return 1 === x ? s[o] : s.readUInt16BE(o * x); - } - if (_) { - let u = -1; - for (w = i; w < C; w++) - if (read(s, w) === read(o, -1 === u ? 0 : w - u)) { - if ((-1 === u && (u = w), w - u + 1 === j)) return u * x; - } else (-1 !== u && (w -= w - u), (u = -1)); - } else - for (i + j > C && (i = C - j), w = i; w >= 0; w--) { - let i = !0; - for (let u = 0; u < j; u++) - if (read(s, w + u) !== read(o, u)) { - i = !1; - break; - } - if (i) return w; - } - return -1; - } - function hexWrite(s, o, i, u) { - i = Number(i) || 0; - const _ = s.length - i; - u ? (u = Number(u)) > _ && (u = _) : (u = _); - const w = o.length; - let x; - for (u > w / 2 && (u = w / 2), x = 0; x < u; ++x) { - const u = parseInt(o.substr(2 * x, 2), 16); - if (numberIsNaN(u)) return x; - s[i + x] = u; - } - return x; - } - function utf8Write(s, o, i, u) { - return blitBuffer(utf8ToBytes(o, s.length - i), s, i, u); - } - function asciiWrite(s, o, i, u) { - return blitBuffer( - (function asciiToBytes(s) { - const o = []; - for (let i = 0; i < s.length; ++i) o.push(255 & s.charCodeAt(i)); - return o; - })(o), - s, - i, - u - ); - } - function base64Write(s, o, i, u) { - return blitBuffer(base64ToBytes(o), s, i, u); - } - function ucs2Write(s, o, i, u) { - return blitBuffer( - (function utf16leToBytes(s, o) { - let i, u, _; - const w = []; - for (let x = 0; x < s.length && !((o -= 2) < 0); ++x) - ((i = s.charCodeAt(x)), (u = i >> 8), (_ = i % 256), w.push(_), w.push(u)); - return w; - })(o, s.length - i), - s, - i, - u - ); - } - function base64Slice(s, o, i) { - return 0 === o && i === s.length ? u.fromByteArray(s) : u.fromByteArray(s.slice(o, i)); - } - function utf8Slice(s, o, i) { - i = Math.min(s.length, i); - const u = []; - let _ = o; - for (; _ < i; ) { - const o = s[_]; - let w = null, - x = o > 239 ? 4 : o > 223 ? 3 : o > 191 ? 2 : 1; - if (_ + x <= i) { - let i, u, C, j; - switch (x) { - case 1: - o < 128 && (w = o); - break; - case 2: - ((i = s[_ + 1]), - 128 == (192 & i) && ((j = ((31 & o) << 6) | (63 & i)), j > 127 && (w = j))); - break; - case 3: - ((i = s[_ + 1]), - (u = s[_ + 2]), - 128 == (192 & i) && - 128 == (192 & u) && - ((j = ((15 & o) << 12) | ((63 & i) << 6) | (63 & u)), - j > 2047 && (j < 55296 || j > 57343) && (w = j))); - break; - case 4: - ((i = s[_ + 1]), - (u = s[_ + 2]), - (C = s[_ + 3]), - 128 == (192 & i) && - 128 == (192 & u) && - 128 == (192 & C) && - ((j = ((15 & o) << 18) | ((63 & i) << 12) | ((63 & u) << 6) | (63 & C)), - j > 65535 && j < 1114112 && (w = j))); - } - } - (null === w - ? ((w = 65533), (x = 1)) - : w > 65535 && - ((w -= 65536), u.push(((w >>> 10) & 1023) | 55296), (w = 56320 | (1023 & w))), - u.push(w), - (_ += x)); - } - return (function decodeCodePointsArray(s) { - const o = s.length; - if (o <= C) return String.fromCharCode.apply(String, s); - let i = '', - u = 0; - for (; u < o; ) i += String.fromCharCode.apply(String, s.slice(u, (u += C))); - return i; - })(u); - } - ((o.kMaxLength = x), - (Buffer.TYPED_ARRAY_SUPPORT = (function typedArraySupport() { - try { - const s = new Uint8Array(1), - o = { - foo: function () { - return 42; - } - }; - return ( - Object.setPrototypeOf(o, Uint8Array.prototype), - Object.setPrototypeOf(s, o), - 42 === s.foo() - ); - } catch (s) { - return !1; - } - })()), - Buffer.TYPED_ARRAY_SUPPORT || - 'undefined' == typeof console || - 'function' != typeof console.error || - console.error( - 'This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.' - ), - Object.defineProperty(Buffer.prototype, 'parent', { - enumerable: !0, - get: function () { - if (Buffer.isBuffer(this)) return this.buffer; - } - }), - Object.defineProperty(Buffer.prototype, 'offset', { - enumerable: !0, - get: function () { - if (Buffer.isBuffer(this)) return this.byteOffset; - } - }), - (Buffer.poolSize = 8192), - (Buffer.from = function (s, o, i) { - return from(s, o, i); - }), - Object.setPrototypeOf(Buffer.prototype, Uint8Array.prototype), - Object.setPrototypeOf(Buffer, Uint8Array), - (Buffer.alloc = function (s, o, i) { - return (function alloc(s, o, i) { - return ( - assertSize(s), - s <= 0 - ? createBuffer(s) - : void 0 !== o - ? 'string' == typeof i - ? createBuffer(s).fill(o, i) - : createBuffer(s).fill(o) - : createBuffer(s) - ); - })(s, o, i); - }), - (Buffer.allocUnsafe = function (s) { - return allocUnsafe(s); - }), - (Buffer.allocUnsafeSlow = function (s) { - return allocUnsafe(s); - }), - (Buffer.isBuffer = function isBuffer(s) { - return null != s && !0 === s._isBuffer && s !== Buffer.prototype; - }), - (Buffer.compare = function compare(s, o) { - if ( - (isInstance(s, Uint8Array) && (s = Buffer.from(s, s.offset, s.byteLength)), - isInstance(o, Uint8Array) && (o = Buffer.from(o, o.offset, o.byteLength)), - !Buffer.isBuffer(s) || !Buffer.isBuffer(o)) - ) - throw new TypeError( - 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' - ); - if (s === o) return 0; - let i = s.length, - u = o.length; - for (let _ = 0, w = Math.min(i, u); _ < w; ++_) - if (s[_] !== o[_]) { - ((i = s[_]), (u = o[_])); - break; - } - return i < u ? -1 : u < i ? 1 : 0; - }), - (Buffer.isEncoding = function isEncoding(s) { - switch (String(s).toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'latin1': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return !0; - default: - return !1; - } - }), - (Buffer.concat = function concat(s, o) { - if (!Array.isArray(s)) - throw new TypeError('"list" argument must be an Array of Buffers'); - if (0 === s.length) return Buffer.alloc(0); - let i; - if (void 0 === o) for (o = 0, i = 0; i < s.length; ++i) o += s[i].length; - const u = Buffer.allocUnsafe(o); - let _ = 0; - for (i = 0; i < s.length; ++i) { - let o = s[i]; - if (isInstance(o, Uint8Array)) - _ + o.length > u.length - ? (Buffer.isBuffer(o) || (o = Buffer.from(o)), o.copy(u, _)) - : Uint8Array.prototype.set.call(u, o, _); - else { - if (!Buffer.isBuffer(o)) - throw new TypeError('"list" argument must be an Array of Buffers'); - o.copy(u, _); - } - _ += o.length; - } - return u; - }), - (Buffer.byteLength = byteLength), - (Buffer.prototype._isBuffer = !0), - (Buffer.prototype.swap16 = function swap16() { - const s = this.length; - if (s % 2 != 0) throw new RangeError('Buffer size must be a multiple of 16-bits'); - for (let o = 0; o < s; o += 2) swap(this, o, o + 1); - return this; - }), - (Buffer.prototype.swap32 = function swap32() { - const s = this.length; - if (s % 4 != 0) throw new RangeError('Buffer size must be a multiple of 32-bits'); - for (let o = 0; o < s; o += 4) (swap(this, o, o + 3), swap(this, o + 1, o + 2)); - return this; - }), - (Buffer.prototype.swap64 = function swap64() { - const s = this.length; - if (s % 8 != 0) throw new RangeError('Buffer size must be a multiple of 64-bits'); - for (let o = 0; o < s; o += 8) - (swap(this, o, o + 7), - swap(this, o + 1, o + 6), - swap(this, o + 2, o + 5), - swap(this, o + 3, o + 4)); - return this; - }), - (Buffer.prototype.toString = function toString() { - const s = this.length; - return 0 === s - ? '' - : 0 === arguments.length - ? utf8Slice(this, 0, s) - : slowToString.apply(this, arguments); - }), - (Buffer.prototype.toLocaleString = Buffer.prototype.toString), - (Buffer.prototype.equals = function equals(s) { - if (!Buffer.isBuffer(s)) throw new TypeError('Argument must be a Buffer'); - return this === s || 0 === Buffer.compare(this, s); - }), - (Buffer.prototype.inspect = function inspect() { - let s = ''; - const i = o.INSPECT_MAX_BYTES; - return ( - (s = this.toString('hex', 0, i) - .replace(/(.{2})/g, '$1 ') - .trim()), - this.length > i && (s += ' ... '), - '' - ); - }), - w && (Buffer.prototype[w] = Buffer.prototype.inspect), - (Buffer.prototype.compare = function compare(s, o, i, u, _) { - if ( - (isInstance(s, Uint8Array) && (s = Buffer.from(s, s.offset, s.byteLength)), - !Buffer.isBuffer(s)) - ) - throw new TypeError( - 'The "target" argument must be one of type Buffer or Uint8Array. Received type ' + - typeof s - ); - if ( - (void 0 === o && (o = 0), - void 0 === i && (i = s ? s.length : 0), - void 0 === u && (u = 0), - void 0 === _ && (_ = this.length), - o < 0 || i > s.length || u < 0 || _ > this.length) - ) - throw new RangeError('out of range index'); - if (u >= _ && o >= i) return 0; - if (u >= _) return -1; - if (o >= i) return 1; - if (this === s) return 0; - let w = (_ >>>= 0) - (u >>>= 0), - x = (i >>>= 0) - (o >>>= 0); - const C = Math.min(w, x), - j = this.slice(u, _), - L = s.slice(o, i); - for (let s = 0; s < C; ++s) - if (j[s] !== L[s]) { - ((w = j[s]), (x = L[s])); - break; - } - return w < x ? -1 : x < w ? 1 : 0; - }), - (Buffer.prototype.includes = function includes(s, o, i) { - return -1 !== this.indexOf(s, o, i); - }), - (Buffer.prototype.indexOf = function indexOf(s, o, i) { - return bidirectionalIndexOf(this, s, o, i, !0); - }), - (Buffer.prototype.lastIndexOf = function lastIndexOf(s, o, i) { - return bidirectionalIndexOf(this, s, o, i, !1); - }), - (Buffer.prototype.write = function write(s, o, i, u) { - if (void 0 === o) ((u = 'utf8'), (i = this.length), (o = 0)); - else if (void 0 === i && 'string' == typeof o) ((u = o), (i = this.length), (o = 0)); - else { - if (!isFinite(o)) - throw new Error( - 'Buffer.write(string, encoding, offset[, length]) is no longer supported' - ); - ((o >>>= 0), - isFinite(i) - ? ((i >>>= 0), void 0 === u && (u = 'utf8')) - : ((u = i), (i = void 0))); - } - const _ = this.length - o; - if ( - ((void 0 === i || i > _) && (i = _), - (s.length > 0 && (i < 0 || o < 0)) || o > this.length) - ) - throw new RangeError('Attempt to write outside buffer bounds'); - u || (u = 'utf8'); - let w = !1; - for (;;) - switch (u) { - case 'hex': - return hexWrite(this, s, o, i); - case 'utf8': - case 'utf-8': - return utf8Write(this, s, o, i); - case 'ascii': - case 'latin1': - case 'binary': - return asciiWrite(this, s, o, i); - case 'base64': - return base64Write(this, s, o, i); - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return ucs2Write(this, s, o, i); - default: - if (w) throw new TypeError('Unknown encoding: ' + u); - ((u = ('' + u).toLowerCase()), (w = !0)); - } - }), - (Buffer.prototype.toJSON = function toJSON() { - return { type: 'Buffer', data: Array.prototype.slice.call(this._arr || this, 0) }; - })); - const C = 4096; - function asciiSlice(s, o, i) { - let u = ''; - i = Math.min(s.length, i); - for (let _ = o; _ < i; ++_) u += String.fromCharCode(127 & s[_]); - return u; - } - function latin1Slice(s, o, i) { - let u = ''; - i = Math.min(s.length, i); - for (let _ = o; _ < i; ++_) u += String.fromCharCode(s[_]); - return u; - } - function hexSlice(s, o, i) { - const u = s.length; - ((!o || o < 0) && (o = 0), (!i || i < 0 || i > u) && (i = u)); - let _ = ''; - for (let u = o; u < i; ++u) _ += B[s[u]]; - return _; - } - function utf16leSlice(s, o, i) { - const u = s.slice(o, i); - let _ = ''; - for (let s = 0; s < u.length - 1; s += 2) - _ += String.fromCharCode(u[s] + 256 * u[s + 1]); - return _; - } - function checkOffset(s, o, i) { - if (s % 1 != 0 || s < 0) throw new RangeError('offset is not uint'); - if (s + o > i) throw new RangeError('Trying to access beyond buffer length'); - } - function checkInt(s, o, i, u, _, w) { - if (!Buffer.isBuffer(s)) - throw new TypeError('"buffer" argument must be a Buffer instance'); - if (o > _ || o < w) throw new RangeError('"value" argument is out of bounds'); - if (i + u > s.length) throw new RangeError('Index out of range'); - } - function wrtBigUInt64LE(s, o, i, u, _) { - checkIntBI(o, u, _, s, i, 7); - let w = Number(o & BigInt(4294967295)); - ((s[i++] = w), - (w >>= 8), - (s[i++] = w), - (w >>= 8), - (s[i++] = w), - (w >>= 8), - (s[i++] = w)); - let x = Number((o >> BigInt(32)) & BigInt(4294967295)); - return ( - (s[i++] = x), - (x >>= 8), - (s[i++] = x), - (x >>= 8), - (s[i++] = x), - (x >>= 8), - (s[i++] = x), - i - ); - } - function wrtBigUInt64BE(s, o, i, u, _) { - checkIntBI(o, u, _, s, i, 7); - let w = Number(o & BigInt(4294967295)); - ((s[i + 7] = w), - (w >>= 8), - (s[i + 6] = w), - (w >>= 8), - (s[i + 5] = w), - (w >>= 8), - (s[i + 4] = w)); - let x = Number((o >> BigInt(32)) & BigInt(4294967295)); - return ( - (s[i + 3] = x), - (x >>= 8), - (s[i + 2] = x), - (x >>= 8), - (s[i + 1] = x), - (x >>= 8), - (s[i] = x), - i + 8 - ); - } - function checkIEEE754(s, o, i, u, _, w) { - if (i + u > s.length) throw new RangeError('Index out of range'); - if (i < 0) throw new RangeError('Index out of range'); - } - function writeFloat(s, o, i, u, w) { - return ( - (o = +o), - (i >>>= 0), - w || checkIEEE754(s, 0, i, 4), - _.write(s, o, i, u, 23, 4), - i + 4 - ); - } - function writeDouble(s, o, i, u, w) { - return ( - (o = +o), - (i >>>= 0), - w || checkIEEE754(s, 0, i, 8), - _.write(s, o, i, u, 52, 8), - i + 8 - ); - } - ((Buffer.prototype.slice = function slice(s, o) { - const i = this.length; - ((s = ~~s) < 0 ? (s += i) < 0 && (s = 0) : s > i && (s = i), - (o = void 0 === o ? i : ~~o) < 0 ? (o += i) < 0 && (o = 0) : o > i && (o = i), - o < s && (o = s)); - const u = this.subarray(s, o); - return (Object.setPrototypeOf(u, Buffer.prototype), u); - }), - (Buffer.prototype.readUintLE = Buffer.prototype.readUIntLE = - function readUIntLE(s, o, i) { - ((s >>>= 0), (o >>>= 0), i || checkOffset(s, o, this.length)); - let u = this[s], - _ = 1, - w = 0; - for (; ++w < o && (_ *= 256); ) u += this[s + w] * _; - return u; - }), - (Buffer.prototype.readUintBE = Buffer.prototype.readUIntBE = - function readUIntBE(s, o, i) { - ((s >>>= 0), (o >>>= 0), i || checkOffset(s, o, this.length)); - let u = this[s + --o], - _ = 1; - for (; o > 0 && (_ *= 256); ) u += this[s + --o] * _; - return u; - }), - (Buffer.prototype.readUint8 = Buffer.prototype.readUInt8 = - function readUInt8(s, o) { - return ((s >>>= 0), o || checkOffset(s, 1, this.length), this[s]); - }), - (Buffer.prototype.readUint16LE = Buffer.prototype.readUInt16LE = - function readUInt16LE(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 2, this.length), - this[s] | (this[s + 1] << 8) - ); - }), - (Buffer.prototype.readUint16BE = Buffer.prototype.readUInt16BE = - function readUInt16BE(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 2, this.length), - (this[s] << 8) | this[s + 1] - ); - }), - (Buffer.prototype.readUint32LE = Buffer.prototype.readUInt32LE = - function readUInt32LE(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 4, this.length), - (this[s] | (this[s + 1] << 8) | (this[s + 2] << 16)) + 16777216 * this[s + 3] - ); - }), - (Buffer.prototype.readUint32BE = Buffer.prototype.readUInt32BE = - function readUInt32BE(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 4, this.length), - 16777216 * this[s] + ((this[s + 1] << 16) | (this[s + 2] << 8) | this[s + 3]) - ); - }), - (Buffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE(s) { - validateNumber((s >>>= 0), 'offset'); - const o = this[s], - i = this[s + 7]; - (void 0 !== o && void 0 !== i) || boundsError(s, this.length - 8); - const u = o + 256 * this[++s] + 65536 * this[++s] + this[++s] * 2 ** 24, - _ = this[++s] + 256 * this[++s] + 65536 * this[++s] + i * 2 ** 24; - return BigInt(u) + (BigInt(_) << BigInt(32)); - })), - (Buffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE(s) { - validateNumber((s >>>= 0), 'offset'); - const o = this[s], - i = this[s + 7]; - (void 0 !== o && void 0 !== i) || boundsError(s, this.length - 8); - const u = o * 2 ** 24 + 65536 * this[++s] + 256 * this[++s] + this[++s], - _ = this[++s] * 2 ** 24 + 65536 * this[++s] + 256 * this[++s] + i; - return (BigInt(u) << BigInt(32)) + BigInt(_); - })), - (Buffer.prototype.readIntLE = function readIntLE(s, o, i) { - ((s >>>= 0), (o >>>= 0), i || checkOffset(s, o, this.length)); - let u = this[s], - _ = 1, - w = 0; - for (; ++w < o && (_ *= 256); ) u += this[s + w] * _; - return ((_ *= 128), u >= _ && (u -= Math.pow(2, 8 * o)), u); - }), - (Buffer.prototype.readIntBE = function readIntBE(s, o, i) { - ((s >>>= 0), (o >>>= 0), i || checkOffset(s, o, this.length)); - let u = o, - _ = 1, - w = this[s + --u]; - for (; u > 0 && (_ *= 256); ) w += this[s + --u] * _; - return ((_ *= 128), w >= _ && (w -= Math.pow(2, 8 * o)), w); - }), - (Buffer.prototype.readInt8 = function readInt8(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 1, this.length), - 128 & this[s] ? -1 * (255 - this[s] + 1) : this[s] - ); - }), - (Buffer.prototype.readInt16LE = function readInt16LE(s, o) { - ((s >>>= 0), o || checkOffset(s, 2, this.length)); - const i = this[s] | (this[s + 1] << 8); - return 32768 & i ? 4294901760 | i : i; - }), - (Buffer.prototype.readInt16BE = function readInt16BE(s, o) { - ((s >>>= 0), o || checkOffset(s, 2, this.length)); - const i = this[s + 1] | (this[s] << 8); - return 32768 & i ? 4294901760 | i : i; - }), - (Buffer.prototype.readInt32LE = function readInt32LE(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 4, this.length), - this[s] | (this[s + 1] << 8) | (this[s + 2] << 16) | (this[s + 3] << 24) - ); - }), - (Buffer.prototype.readInt32BE = function readInt32BE(s, o) { - return ( - (s >>>= 0), - o || checkOffset(s, 4, this.length), - (this[s] << 24) | (this[s + 1] << 16) | (this[s + 2] << 8) | this[s + 3] - ); - }), - (Buffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE(s) { - validateNumber((s >>>= 0), 'offset'); - const o = this[s], - i = this[s + 7]; - (void 0 !== o && void 0 !== i) || boundsError(s, this.length - 8); - const u = this[s + 4] + 256 * this[s + 5] + 65536 * this[s + 6] + (i << 24); - return ( - (BigInt(u) << BigInt(32)) + - BigInt(o + 256 * this[++s] + 65536 * this[++s] + this[++s] * 2 ** 24) - ); - })), - (Buffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE(s) { - validateNumber((s >>>= 0), 'offset'); - const o = this[s], - i = this[s + 7]; - (void 0 !== o && void 0 !== i) || boundsError(s, this.length - 8); - const u = (o << 24) + 65536 * this[++s] + 256 * this[++s] + this[++s]; - return ( - (BigInt(u) << BigInt(32)) + - BigInt(this[++s] * 2 ** 24 + 65536 * this[++s] + 256 * this[++s] + i) - ); - })), - (Buffer.prototype.readFloatLE = function readFloatLE(s, o) { - return ((s >>>= 0), o || checkOffset(s, 4, this.length), _.read(this, s, !0, 23, 4)); - }), - (Buffer.prototype.readFloatBE = function readFloatBE(s, o) { - return ((s >>>= 0), o || checkOffset(s, 4, this.length), _.read(this, s, !1, 23, 4)); - }), - (Buffer.prototype.readDoubleLE = function readDoubleLE(s, o) { - return ((s >>>= 0), o || checkOffset(s, 8, this.length), _.read(this, s, !0, 52, 8)); - }), - (Buffer.prototype.readDoubleBE = function readDoubleBE(s, o) { - return ((s >>>= 0), o || checkOffset(s, 8, this.length), _.read(this, s, !1, 52, 8)); - }), - (Buffer.prototype.writeUintLE = Buffer.prototype.writeUIntLE = - function writeUIntLE(s, o, i, u) { - if (((s = +s), (o >>>= 0), (i >>>= 0), !u)) { - checkInt(this, s, o, i, Math.pow(2, 8 * i) - 1, 0); - } - let _ = 1, - w = 0; - for (this[o] = 255 & s; ++w < i && (_ *= 256); ) this[o + w] = (s / _) & 255; - return o + i; - }), - (Buffer.prototype.writeUintBE = Buffer.prototype.writeUIntBE = - function writeUIntBE(s, o, i, u) { - if (((s = +s), (o >>>= 0), (i >>>= 0), !u)) { - checkInt(this, s, o, i, Math.pow(2, 8 * i) - 1, 0); - } - let _ = i - 1, - w = 1; - for (this[o + _] = 255 & s; --_ >= 0 && (w *= 256); ) this[o + _] = (s / w) & 255; - return o + i; - }), - (Buffer.prototype.writeUint8 = Buffer.prototype.writeUInt8 = - function writeUInt8(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 1, 255, 0), - (this[o] = 255 & s), - o + 1 - ); - }), - (Buffer.prototype.writeUint16LE = Buffer.prototype.writeUInt16LE = - function writeUInt16LE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 2, 65535, 0), - (this[o] = 255 & s), - (this[o + 1] = s >>> 8), - o + 2 - ); - }), - (Buffer.prototype.writeUint16BE = Buffer.prototype.writeUInt16BE = - function writeUInt16BE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 2, 65535, 0), - (this[o] = s >>> 8), - (this[o + 1] = 255 & s), - o + 2 - ); - }), - (Buffer.prototype.writeUint32LE = Buffer.prototype.writeUInt32LE = - function writeUInt32LE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 4, 4294967295, 0), - (this[o + 3] = s >>> 24), - (this[o + 2] = s >>> 16), - (this[o + 1] = s >>> 8), - (this[o] = 255 & s), - o + 4 - ); - }), - (Buffer.prototype.writeUint32BE = Buffer.prototype.writeUInt32BE = - function writeUInt32BE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 4, 4294967295, 0), - (this[o] = s >>> 24), - (this[o + 1] = s >>> 16), - (this[o + 2] = s >>> 8), - (this[o + 3] = 255 & s), - o + 4 - ); - }), - (Buffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE( - s, - o = 0 - ) { - return wrtBigUInt64LE(this, s, o, BigInt(0), BigInt('0xffffffffffffffff')); - })), - (Buffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE( - s, - o = 0 - ) { - return wrtBigUInt64BE(this, s, o, BigInt(0), BigInt('0xffffffffffffffff')); - })), - (Buffer.prototype.writeIntLE = function writeIntLE(s, o, i, u) { - if (((s = +s), (o >>>= 0), !u)) { - const u = Math.pow(2, 8 * i - 1); - checkInt(this, s, o, i, u - 1, -u); - } - let _ = 0, - w = 1, - x = 0; - for (this[o] = 255 & s; ++_ < i && (w *= 256); ) - (s < 0 && 0 === x && 0 !== this[o + _ - 1] && (x = 1), - (this[o + _] = (((s / w) | 0) - x) & 255)); - return o + i; - }), - (Buffer.prototype.writeIntBE = function writeIntBE(s, o, i, u) { - if (((s = +s), (o >>>= 0), !u)) { - const u = Math.pow(2, 8 * i - 1); - checkInt(this, s, o, i, u - 1, -u); - } - let _ = i - 1, - w = 1, - x = 0; - for (this[o + _] = 255 & s; --_ >= 0 && (w *= 256); ) - (s < 0 && 0 === x && 0 !== this[o + _ + 1] && (x = 1), - (this[o + _] = (((s / w) | 0) - x) & 255)); - return o + i; - }), - (Buffer.prototype.writeInt8 = function writeInt8(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 1, 127, -128), - s < 0 && (s = 255 + s + 1), - (this[o] = 255 & s), - o + 1 - ); - }), - (Buffer.prototype.writeInt16LE = function writeInt16LE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 2, 32767, -32768), - (this[o] = 255 & s), - (this[o + 1] = s >>> 8), - o + 2 - ); - }), - (Buffer.prototype.writeInt16BE = function writeInt16BE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 2, 32767, -32768), - (this[o] = s >>> 8), - (this[o + 1] = 255 & s), - o + 2 - ); - }), - (Buffer.prototype.writeInt32LE = function writeInt32LE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 4, 2147483647, -2147483648), - (this[o] = 255 & s), - (this[o + 1] = s >>> 8), - (this[o + 2] = s >>> 16), - (this[o + 3] = s >>> 24), - o + 4 - ); - }), - (Buffer.prototype.writeInt32BE = function writeInt32BE(s, o, i) { - return ( - (s = +s), - (o >>>= 0), - i || checkInt(this, s, o, 4, 2147483647, -2147483648), - s < 0 && (s = 4294967295 + s + 1), - (this[o] = s >>> 24), - (this[o + 1] = s >>> 16), - (this[o + 2] = s >>> 8), - (this[o + 3] = 255 & s), - o + 4 - ); - }), - (Buffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE( - s, - o = 0 - ) { - return wrtBigUInt64LE( - this, - s, - o, - -BigInt('0x8000000000000000'), - BigInt('0x7fffffffffffffff') - ); - })), - (Buffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE( - s, - o = 0 - ) { - return wrtBigUInt64BE( - this, - s, - o, - -BigInt('0x8000000000000000'), - BigInt('0x7fffffffffffffff') - ); - })), - (Buffer.prototype.writeFloatLE = function writeFloatLE(s, o, i) { - return writeFloat(this, s, o, !0, i); - }), - (Buffer.prototype.writeFloatBE = function writeFloatBE(s, o, i) { - return writeFloat(this, s, o, !1, i); - }), - (Buffer.prototype.writeDoubleLE = function writeDoubleLE(s, o, i) { - return writeDouble(this, s, o, !0, i); - }), - (Buffer.prototype.writeDoubleBE = function writeDoubleBE(s, o, i) { - return writeDouble(this, s, o, !1, i); - }), - (Buffer.prototype.copy = function copy(s, o, i, u) { - if (!Buffer.isBuffer(s)) throw new TypeError('argument should be a Buffer'); - if ( - (i || (i = 0), - u || 0 === u || (u = this.length), - o >= s.length && (o = s.length), - o || (o = 0), - u > 0 && u < i && (u = i), - u === i) - ) - return 0; - if (0 === s.length || 0 === this.length) return 0; - if (o < 0) throw new RangeError('targetStart out of bounds'); - if (i < 0 || i >= this.length) throw new RangeError('Index out of range'); - if (u < 0) throw new RangeError('sourceEnd out of bounds'); - (u > this.length && (u = this.length), - s.length - o < u - i && (u = s.length - o + i)); - const _ = u - i; - return ( - this === s && 'function' == typeof Uint8Array.prototype.copyWithin - ? this.copyWithin(o, i, u) - : Uint8Array.prototype.set.call(s, this.subarray(i, u), o), - _ - ); - }), - (Buffer.prototype.fill = function fill(s, o, i, u) { - if ('string' == typeof s) { - if ( - ('string' == typeof o - ? ((u = o), (o = 0), (i = this.length)) - : 'string' == typeof i && ((u = i), (i = this.length)), - void 0 !== u && 'string' != typeof u) - ) - throw new TypeError('encoding must be a string'); - if ('string' == typeof u && !Buffer.isEncoding(u)) - throw new TypeError('Unknown encoding: ' + u); - if (1 === s.length) { - const o = s.charCodeAt(0); - (('utf8' === u && o < 128) || 'latin1' === u) && (s = o); - } - } else 'number' == typeof s ? (s &= 255) : 'boolean' == typeof s && (s = Number(s)); - if (o < 0 || this.length < o || this.length < i) - throw new RangeError('Out of range index'); - if (i <= o) return this; - let _; - if ( - ((o >>>= 0), - (i = void 0 === i ? this.length : i >>> 0), - s || (s = 0), - 'number' == typeof s) - ) - for (_ = o; _ < i; ++_) this[_] = s; - else { - const w = Buffer.isBuffer(s) ? s : Buffer.from(s, u), - x = w.length; - if (0 === x) - throw new TypeError('The value "' + s + '" is invalid for argument "value"'); - for (_ = 0; _ < i - o; ++_) this[_ + o] = w[_ % x]; - } - return this; - })); - const j = {}; - function E(s, o, i) { - j[s] = class NodeError extends i { - constructor() { - (super(), - Object.defineProperty(this, 'message', { - value: o.apply(this, arguments), - writable: !0, - configurable: !0 - }), - (this.name = `${this.name} [${s}]`), - this.stack, - delete this.name); - } - get code() { - return s; - } - set code(s) { - Object.defineProperty(this, 'code', { - configurable: !0, - enumerable: !0, - value: s, - writable: !0 - }); - } - toString() { - return `${this.name} [${s}]: ${this.message}`; - } - }; - } - function addNumericalSeparator(s) { - let o = '', - i = s.length; - const u = '-' === s[0] ? 1 : 0; - for (; i >= u + 4; i -= 3) o = `_${s.slice(i - 3, i)}${o}`; - return `${s.slice(0, i)}${o}`; - } - function checkIntBI(s, o, i, u, _, w) { - if (s > i || s < o) { - const u = 'bigint' == typeof o ? 'n' : ''; - let _; - throw ( - (_ = - w > 3 - ? 0 === o || o === BigInt(0) - ? `>= 0${u} and < 2${u} ** ${8 * (w + 1)}${u}` - : `>= -(2${u} ** ${8 * (w + 1) - 1}${u}) and < 2 ** ${8 * (w + 1) - 1}${u}` - : `>= ${o}${u} and <= ${i}${u}`), - new j.ERR_OUT_OF_RANGE('value', _, s) - ); - } - !(function checkBounds(s, o, i) { - (validateNumber(o, 'offset'), - (void 0 !== s[o] && void 0 !== s[o + i]) || boundsError(o, s.length - (i + 1))); - })(u, _, w); - } - function validateNumber(s, o) { - if ('number' != typeof s) throw new j.ERR_INVALID_ARG_TYPE(o, 'number', s); - } - function boundsError(s, o, i) { - if (Math.floor(s) !== s) - throw (validateNumber(s, i), new j.ERR_OUT_OF_RANGE(i || 'offset', 'an integer', s)); - if (o < 0) throw new j.ERR_BUFFER_OUT_OF_BOUNDS(); - throw new j.ERR_OUT_OF_RANGE(i || 'offset', `>= ${i ? 1 : 0} and <= ${o}`, s); - } - (E( - 'ERR_BUFFER_OUT_OF_BOUNDS', - function (s) { - return s - ? `${s} is outside of buffer bounds` - : 'Attempt to access memory outside buffer bounds'; - }, - RangeError - ), - E( - 'ERR_INVALID_ARG_TYPE', - function (s, o) { - return `The "${s}" argument must be of type number. Received type ${typeof o}`; - }, - TypeError - ), - E( - 'ERR_OUT_OF_RANGE', - function (s, o, i) { - let u = `The value of "${s}" is out of range.`, - _ = i; - return ( - Number.isInteger(i) && Math.abs(i) > 2 ** 32 - ? (_ = addNumericalSeparator(String(i))) - : 'bigint' == typeof i && - ((_ = String(i)), - (i > BigInt(2) ** BigInt(32) || i < -(BigInt(2) ** BigInt(32))) && - (_ = addNumericalSeparator(_)), - (_ += 'n')), - (u += ` It must be ${o}. Received ${_}`), - u - ); - }, - RangeError - )); - const L = /[^+/0-9A-Za-z-_]/g; - function utf8ToBytes(s, o) { - let i; - o = o || 1 / 0; - const u = s.length; - let _ = null; - const w = []; - for (let x = 0; x < u; ++x) { - if (((i = s.charCodeAt(x)), i > 55295 && i < 57344)) { - if (!_) { - if (i > 56319) { - (o -= 3) > -1 && w.push(239, 191, 189); - continue; - } - if (x + 1 === u) { - (o -= 3) > -1 && w.push(239, 191, 189); - continue; - } - _ = i; - continue; - } - if (i < 56320) { - ((o -= 3) > -1 && w.push(239, 191, 189), (_ = i)); - continue; - } - i = 65536 + (((_ - 55296) << 10) | (i - 56320)); - } else _ && (o -= 3) > -1 && w.push(239, 191, 189); - if (((_ = null), i < 128)) { - if ((o -= 1) < 0) break; - w.push(i); - } else if (i < 2048) { - if ((o -= 2) < 0) break; - w.push((i >> 6) | 192, (63 & i) | 128); - } else if (i < 65536) { - if ((o -= 3) < 0) break; - w.push((i >> 12) | 224, ((i >> 6) & 63) | 128, (63 & i) | 128); - } else { - if (!(i < 1114112)) throw new Error('Invalid code point'); - if ((o -= 4) < 0) break; - w.push( - (i >> 18) | 240, - ((i >> 12) & 63) | 128, - ((i >> 6) & 63) | 128, - (63 & i) | 128 - ); - } - } - return w; - } - function base64ToBytes(s) { - return u.toByteArray( - (function base64clean(s) { - if ((s = (s = s.split('=')[0]).trim().replace(L, '')).length < 2) return ''; - for (; s.length % 4 != 0; ) s += '='; - return s; - })(s) - ); - } - function blitBuffer(s, o, i, u) { - let _; - for (_ = 0; _ < u && !(_ + i >= o.length || _ >= s.length); ++_) o[_ + i] = s[_]; - return _; - } - function isInstance(s, o) { - return ( - s instanceof o || - (null != s && - null != s.constructor && - null != s.constructor.name && - s.constructor.name === o.name) - ); - } - function numberIsNaN(s) { - return s != s; - } - const B = (function () { - const s = '0123456789abcdef', - o = new Array(256); - for (let i = 0; i < 16; ++i) { - const u = 16 * i; - for (let _ = 0; _ < 16; ++_) o[u + _] = s[i] + s[_]; - } - return o; - })(); - function defineBigIntMethod(s) { - return 'undefined' == typeof BigInt ? BufferBigIntNotDefined : s; - } - function BufferBigIntNotDefined() { - throw new Error('BigInt not supported'); - } - }, - 17965: (s, o, i) => { - 'use strict'; - var u = i(16426), - _ = { 'text/plain': 'Text', 'text/html': 'Url', default: 'Text' }; - s.exports = function copy(s, o) { - var i, - w, - x, - C, - j, - L, - B = !1; - (o || (o = {}), (i = o.debug || !1)); - try { - if ( - ((x = u()), - (C = document.createRange()), - (j = document.getSelection()), - ((L = document.createElement('span')).textContent = s), - (L.ariaHidden = 'true'), - (L.style.all = 'unset'), - (L.style.position = 'fixed'), - (L.style.top = 0), - (L.style.clip = 'rect(0, 0, 0, 0)'), - (L.style.whiteSpace = 'pre'), - (L.style.webkitUserSelect = 'text'), - (L.style.MozUserSelect = 'text'), - (L.style.msUserSelect = 'text'), - (L.style.userSelect = 'text'), - L.addEventListener('copy', function (u) { - if ((u.stopPropagation(), o.format)) - if ((u.preventDefault(), void 0 === u.clipboardData)) { - (i && console.warn('unable to use e.clipboardData'), - i && console.warn('trying IE specific stuff'), - window.clipboardData.clearData()); - var w = _[o.format] || _.default; - window.clipboardData.setData(w, s); - } else (u.clipboardData.clearData(), u.clipboardData.setData(o.format, s)); - o.onCopy && (u.preventDefault(), o.onCopy(u.clipboardData)); - }), - document.body.appendChild(L), - C.selectNodeContents(L), - j.addRange(C), - !document.execCommand('copy')) - ) - throw new Error('copy command was unsuccessful'); - B = !0; - } catch (u) { - (i && console.error('unable to copy using execCommand: ', u), - i && console.warn('trying IE specific stuff')); - try { - (window.clipboardData.setData(o.format || 'text', s), - o.onCopy && o.onCopy(window.clipboardData), - (B = !0)); - } catch (u) { - (i && console.error('unable to copy using clipboardData: ', u), - i && console.error('falling back to prompt'), - (w = (function format(s) { - var o = (/mac os x/i.test(navigator.userAgent) ? '⌘' : 'Ctrl') + '+C'; - return s.replace(/#{\s*key\s*}/g, o); - })('message' in o ? o.message : 'Copy to clipboard: #{key}, Enter')), - window.prompt(w, s)); - } - } finally { - (j && ('function' == typeof j.removeRange ? j.removeRange(C) : j.removeAllRanges()), - L && document.body.removeChild(L), - x()); - } - return B; - }; - }, - 2205: function (s, o, i) { - var u; - ((u = void 0 !== i.g ? i.g : this), - (s.exports = (function (s) { - if (s.CSS && s.CSS.escape) return s.CSS.escape; - var cssEscape = function (s) { - if (0 == arguments.length) - throw new TypeError('`CSS.escape` requires an argument.'); - for ( - var o, i = String(s), u = i.length, _ = -1, w = '', x = i.charCodeAt(0); - ++_ < u; - ) - 0 != (o = i.charCodeAt(_)) - ? (w += - (o >= 1 && o <= 31) || - 127 == o || - (0 == _ && o >= 48 && o <= 57) || - (1 == _ && o >= 48 && o <= 57 && 45 == x) - ? '\\' + o.toString(16) + ' ' - : (0 == _ && 1 == u && 45 == o) || - !( - o >= 128 || - 45 == o || - 95 == o || - (o >= 48 && o <= 57) || - (o >= 65 && o <= 90) || - (o >= 97 && o <= 122) - ) - ? '\\' + i.charAt(_) - : i.charAt(_)) - : (w += '�'); - return w; - }; - return (s.CSS || (s.CSS = {}), (s.CSS.escape = cssEscape), cssEscape); - })(u))); - }, - 81919: (s, o, i) => { - 'use strict'; - var u = i(48287).Buffer; - function isSpecificValue(s) { - return s instanceof u || s instanceof Date || s instanceof RegExp; - } - function cloneSpecificValue(s) { - if (s instanceof u) { - var o = u.alloc ? u.alloc(s.length) : new u(s.length); - return (s.copy(o), o); - } - if (s instanceof Date) return new Date(s.getTime()); - if (s instanceof RegExp) return new RegExp(s); - throw new Error('Unexpected situation'); - } - function deepCloneArray(s) { - var o = []; - return ( - s.forEach(function (s, i) { - 'object' == typeof s && null !== s - ? Array.isArray(s) - ? (o[i] = deepCloneArray(s)) - : isSpecificValue(s) - ? (o[i] = cloneSpecificValue(s)) - : (o[i] = _({}, s)) - : (o[i] = s); - }), - o - ); - } - function safeGetProperty(s, o) { - return '__proto__' === o ? void 0 : s[o]; - } - var _ = (s.exports = function () { - if (arguments.length < 1 || 'object' != typeof arguments[0]) return !1; - if (arguments.length < 2) return arguments[0]; - var s, - o, - i = arguments[0]; - return ( - Array.prototype.slice.call(arguments, 1).forEach(function (u) { - 'object' != typeof u || - null === u || - Array.isArray(u) || - Object.keys(u).forEach(function (w) { - return ( - (o = safeGetProperty(i, w)), - (s = safeGetProperty(u, w)) === i - ? void 0 - : 'object' != typeof s || null === s - ? void (i[w] = s) - : Array.isArray(s) - ? void (i[w] = deepCloneArray(s)) - : isSpecificValue(s) - ? void (i[w] = cloneSpecificValue(s)) - : 'object' != typeof o || null === o || Array.isArray(o) - ? void (i[w] = _({}, s)) - : void (i[w] = _(o, s)) - ); - }); - }), - i - ); - }); - }, - 14744: (s) => { - 'use strict'; - var o = function isMergeableObject(s) { - return ( - (function isNonNullObject(s) { - return !!s && 'object' == typeof s; - })(s) && - !(function isSpecial(s) { - var o = Object.prototype.toString.call(s); - return ( - '[object RegExp]' === o || - '[object Date]' === o || - (function isReactElement(s) { - return s.$$typeof === i; - })(s) - ); - })(s) - ); - }; - var i = 'function' == typeof Symbol && Symbol.for ? Symbol.for('react.element') : 60103; - function cloneUnlessOtherwiseSpecified(s, o) { - return !1 !== o.clone && o.isMergeableObject(s) - ? deepmerge( - (function emptyTarget(s) { - return Array.isArray(s) ? [] : {}; - })(s), - s, - o - ) - : s; - } - function defaultArrayMerge(s, o, i) { - return s.concat(o).map(function (s) { - return cloneUnlessOtherwiseSpecified(s, i); - }); - } - function getKeys(s) { - return Object.keys(s).concat( - (function getEnumerableOwnPropertySymbols(s) { - return Object.getOwnPropertySymbols - ? Object.getOwnPropertySymbols(s).filter(function (o) { - return Object.propertyIsEnumerable.call(s, o); - }) - : []; - })(s) - ); - } - function propertyIsOnObject(s, o) { - try { - return o in s; - } catch (s) { - return !1; - } - } - function mergeObject(s, o, i) { - var u = {}; - return ( - i.isMergeableObject(s) && - getKeys(s).forEach(function (o) { - u[o] = cloneUnlessOtherwiseSpecified(s[o], i); - }), - getKeys(o).forEach(function (_) { - (function propertyIsUnsafe(s, o) { - return ( - propertyIsOnObject(s, o) && - !(Object.hasOwnProperty.call(s, o) && Object.propertyIsEnumerable.call(s, o)) - ); - })(s, _) || - (propertyIsOnObject(s, _) && i.isMergeableObject(o[_]) - ? (u[_] = (function getMergeFunction(s, o) { - if (!o.customMerge) return deepmerge; - var i = o.customMerge(s); - return 'function' == typeof i ? i : deepmerge; - })(_, i)(s[_], o[_], i)) - : (u[_] = cloneUnlessOtherwiseSpecified(o[_], i))); - }), - u - ); - } - function deepmerge(s, i, u) { - (((u = u || {}).arrayMerge = u.arrayMerge || defaultArrayMerge), - (u.isMergeableObject = u.isMergeableObject || o), - (u.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified)); - var _ = Array.isArray(i); - return _ === Array.isArray(s) - ? _ - ? u.arrayMerge(s, i, u) - : mergeObject(s, i, u) - : cloneUnlessOtherwiseSpecified(i, u); - } - deepmerge.all = function deepmergeAll(s, o) { - if (!Array.isArray(s)) throw new Error('first argument should be an array'); - return s.reduce(function (s, i) { - return deepmerge(s, i, o); - }, {}); - }; - var u = deepmerge; - s.exports = u; - }, - 42838: function (s) { - s.exports = (function () { - 'use strict'; - const { - entries: s, - setPrototypeOf: o, - isFrozen: i, - getPrototypeOf: u, - getOwnPropertyDescriptor: _ - } = Object; - let { freeze: w, seal: x, create: C } = Object, - { apply: j, construct: L } = 'undefined' != typeof Reflect && Reflect; - (w || - (w = function freeze(s) { - return s; - }), - x || - (x = function seal(s) { - return s; - }), - j || - (j = function apply(s, o, i) { - return s.apply(o, i); - }), - L || - (L = function construct(s, o) { - return new s(...o); - })); - const B = unapply(Array.prototype.forEach), - $ = unapply(Array.prototype.pop), - V = unapply(Array.prototype.push), - U = unapply(String.prototype.toLowerCase), - z = unapply(String.prototype.toString), - Y = unapply(String.prototype.match), - Z = unapply(String.prototype.replace), - ee = unapply(String.prototype.indexOf), - ie = unapply(String.prototype.trim), - ae = unapply(Object.prototype.hasOwnProperty), - le = unapply(RegExp.prototype.test), - ce = unconstruct(TypeError); - function unapply(s) { - return function (o) { - for (var i = arguments.length, u = new Array(i > 1 ? i - 1 : 0), _ = 1; _ < i; _++) - u[_ - 1] = arguments[_]; - return j(s, o, u); - }; - } - function unconstruct(s) { - return function () { - for (var o = arguments.length, i = new Array(o), u = 0; u < o; u++) - i[u] = arguments[u]; - return L(s, i); - }; - } - function addToSet(s, u) { - let _ = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : U; - o && o(s, null); - let w = u.length; - for (; w--; ) { - let o = u[w]; - if ('string' == typeof o) { - const s = _(o); - s !== o && (i(u) || (u[w] = s), (o = s)); - } - s[o] = !0; - } - return s; - } - function cleanArray(s) { - for (let o = 0; o < s.length; o++) ae(s, o) || (s[o] = null); - return s; - } - function clone(o) { - const i = C(null); - for (const [u, _] of s(o)) - ae(o, u) && - (Array.isArray(_) - ? (i[u] = cleanArray(_)) - : _ && 'object' == typeof _ && _.constructor === Object - ? (i[u] = clone(_)) - : (i[u] = _)); - return i; - } - function lookupGetter(s, o) { - for (; null !== s; ) { - const i = _(s, o); - if (i) { - if (i.get) return unapply(i.get); - if ('function' == typeof i.value) return unapply(i.value); - } - s = u(s); - } - function fallbackValue() { - return null; - } - return fallbackValue; - } - const pe = w([ - 'a', - 'abbr', - 'acronym', - 'address', - 'area', - 'article', - 'aside', - 'audio', - 'b', - 'bdi', - 'bdo', - 'big', - 'blink', - 'blockquote', - 'body', - 'br', - 'button', - 'canvas', - 'caption', - 'center', - 'cite', - 'code', - 'col', - 'colgroup', - 'content', - 'data', - 'datalist', - 'dd', - 'decorator', - 'del', - 'details', - 'dfn', - 'dialog', - 'dir', - 'div', - 'dl', - 'dt', - 'element', - 'em', - 'fieldset', - 'figcaption', - 'figure', - 'font', - 'footer', - 'form', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'header', - 'hgroup', - 'hr', - 'html', - 'i', - 'img', - 'input', - 'ins', - 'kbd', - 'label', - 'legend', - 'li', - 'main', - 'map', - 'mark', - 'marquee', - 'menu', - 'menuitem', - 'meter', - 'nav', - 'nobr', - 'ol', - 'optgroup', - 'option', - 'output', - 'p', - 'picture', - 'pre', - 'progress', - 'q', - 'rp', - 'rt', - 'ruby', - 's', - 'samp', - 'section', - 'select', - 'shadow', - 'small', - 'source', - 'spacer', - 'span', - 'strike', - 'strong', - 'style', - 'sub', - 'summary', - 'sup', - 'table', - 'tbody', - 'td', - 'template', - 'textarea', - 'tfoot', - 'th', - 'thead', - 'time', - 'tr', - 'track', - 'tt', - 'u', - 'ul', - 'var', - 'video', - 'wbr' - ]), - de = w([ - 'svg', - 'a', - 'altglyph', - 'altglyphdef', - 'altglyphitem', - 'animatecolor', - 'animatemotion', - 'animatetransform', - 'circle', - 'clippath', - 'defs', - 'desc', - 'ellipse', - 'filter', - 'font', - 'g', - 'glyph', - 'glyphref', - 'hkern', - 'image', - 'line', - 'lineargradient', - 'marker', - 'mask', - 'metadata', - 'mpath', - 'path', - 'pattern', - 'polygon', - 'polyline', - 'radialgradient', - 'rect', - 'stop', - 'style', - 'switch', - 'symbol', - 'text', - 'textpath', - 'title', - 'tref', - 'tspan', - 'view', - 'vkern' - ]), - fe = w([ - 'feBlend', - 'feColorMatrix', - 'feComponentTransfer', - 'feComposite', - 'feConvolveMatrix', - 'feDiffuseLighting', - 'feDisplacementMap', - 'feDistantLight', - 'feDropShadow', - 'feFlood', - 'feFuncA', - 'feFuncB', - 'feFuncG', - 'feFuncR', - 'feGaussianBlur', - 'feImage', - 'feMerge', - 'feMergeNode', - 'feMorphology', - 'feOffset', - 'fePointLight', - 'feSpecularLighting', - 'feSpotLight', - 'feTile', - 'feTurbulence' - ]), - ye = w([ - 'animate', - 'color-profile', - 'cursor', - 'discard', - 'font-face', - 'font-face-format', - 'font-face-name', - 'font-face-src', - 'font-face-uri', - 'foreignobject', - 'hatch', - 'hatchpath', - 'mesh', - 'meshgradient', - 'meshpatch', - 'meshrow', - 'missing-glyph', - 'script', - 'set', - 'solidcolor', - 'unknown', - 'use' - ]), - be = w([ - 'math', - 'menclose', - 'merror', - 'mfenced', - 'mfrac', - 'mglyph', - 'mi', - 'mlabeledtr', - 'mmultiscripts', - 'mn', - 'mo', - 'mover', - 'mpadded', - 'mphantom', - 'mroot', - 'mrow', - 'ms', - 'mspace', - 'msqrt', - 'mstyle', - 'msub', - 'msup', - 'msubsup', - 'mtable', - 'mtd', - 'mtext', - 'mtr', - 'munder', - 'munderover', - 'mprescripts' - ]), - _e = w([ - 'maction', - 'maligngroup', - 'malignmark', - 'mlongdiv', - 'mscarries', - 'mscarry', - 'msgroup', - 'mstack', - 'msline', - 'msrow', - 'semantics', - 'annotation', - 'annotation-xml', - 'mprescripts', - 'none' - ]), - we = w(['#text']), - Se = w([ - 'accept', - 'action', - 'align', - 'alt', - 'autocapitalize', - 'autocomplete', - 'autopictureinpicture', - 'autoplay', - 'background', - 'bgcolor', - 'border', - 'capture', - 'cellpadding', - 'cellspacing', - 'checked', - 'cite', - 'class', - 'clear', - 'color', - 'cols', - 'colspan', - 'controls', - 'controlslist', - 'coords', - 'crossorigin', - 'datetime', - 'decoding', - 'default', - 'dir', - 'disabled', - 'disablepictureinpicture', - 'disableremoteplayback', - 'download', - 'draggable', - 'enctype', - 'enterkeyhint', - 'face', - 'for', - 'headers', - 'height', - 'hidden', - 'high', - 'href', - 'hreflang', - 'id', - 'inputmode', - 'integrity', - 'ismap', - 'kind', - 'label', - 'lang', - 'list', - 'loading', - 'loop', - 'low', - 'max', - 'maxlength', - 'media', - 'method', - 'min', - 'minlength', - 'multiple', - 'muted', - 'name', - 'nonce', - 'noshade', - 'novalidate', - 'nowrap', - 'open', - 'optimum', - 'pattern', - 'placeholder', - 'playsinline', - 'popover', - 'popovertarget', - 'popovertargetaction', - 'poster', - 'preload', - 'pubdate', - 'radiogroup', - 'readonly', - 'rel', - 'required', - 'rev', - 'reversed', - 'role', - 'rows', - 'rowspan', - 'spellcheck', - 'scope', - 'selected', - 'shape', - 'size', - 'sizes', - 'span', - 'srclang', - 'start', - 'src', - 'srcset', - 'step', - 'style', - 'summary', - 'tabindex', - 'title', - 'translate', - 'type', - 'usemap', - 'valign', - 'value', - 'width', - 'wrap', - 'xmlns', - 'slot' - ]), - xe = w([ - 'accent-height', - 'accumulate', - 'additive', - 'alignment-baseline', - 'ascent', - 'attributename', - 'attributetype', - 'azimuth', - 'basefrequency', - 'baseline-shift', - 'begin', - 'bias', - 'by', - 'class', - 'clip', - 'clippathunits', - 'clip-path', - 'clip-rule', - 'color', - 'color-interpolation', - 'color-interpolation-filters', - 'color-profile', - 'color-rendering', - 'cx', - 'cy', - 'd', - 'dx', - 'dy', - 'diffuseconstant', - 'direction', - 'display', - 'divisor', - 'dur', - 'edgemode', - 'elevation', - 'end', - 'fill', - 'fill-opacity', - 'fill-rule', - 'filter', - 'filterunits', - 'flood-color', - 'flood-opacity', - 'font-family', - 'font-size', - 'font-size-adjust', - 'font-stretch', - 'font-style', - 'font-variant', - 'font-weight', - 'fx', - 'fy', - 'g1', - 'g2', - 'glyph-name', - 'glyphref', - 'gradientunits', - 'gradienttransform', - 'height', - 'href', - 'id', - 'image-rendering', - 'in', - 'in2', - 'k', - 'k1', - 'k2', - 'k3', - 'k4', - 'kerning', - 'keypoints', - 'keysplines', - 'keytimes', - 'lang', - 'lengthadjust', - 'letter-spacing', - 'kernelmatrix', - 'kernelunitlength', - 'lighting-color', - 'local', - 'marker-end', - 'marker-mid', - 'marker-start', - 'markerheight', - 'markerunits', - 'markerwidth', - 'maskcontentunits', - 'maskunits', - 'max', - 'mask', - 'media', - 'method', - 'mode', - 'min', - 'name', - 'numoctaves', - 'offset', - 'operator', - 'opacity', - 'order', - 'orient', - 'orientation', - 'origin', - 'overflow', - 'paint-order', - 'path', - 'pathlength', - 'patterncontentunits', - 'patterntransform', - 'patternunits', - 'points', - 'preservealpha', - 'preserveaspectratio', - 'primitiveunits', - 'r', - 'rx', - 'ry', - 'radius', - 'refx', - 'refy', - 'repeatcount', - 'repeatdur', - 'restart', - 'result', - 'rotate', - 'scale', - 'seed', - 'shape-rendering', - 'specularconstant', - 'specularexponent', - 'spreadmethod', - 'startoffset', - 'stddeviation', - 'stitchtiles', - 'stop-color', - 'stop-opacity', - 'stroke-dasharray', - 'stroke-dashoffset', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-miterlimit', - 'stroke-opacity', - 'stroke', - 'stroke-width', - 'style', - 'surfacescale', - 'systemlanguage', - 'tabindex', - 'targetx', - 'targety', - 'transform', - 'transform-origin', - 'text-anchor', - 'text-decoration', - 'text-rendering', - 'textlength', - 'type', - 'u1', - 'u2', - 'unicode', - 'values', - 'viewbox', - 'visibility', - 'version', - 'vert-adv-y', - 'vert-origin-x', - 'vert-origin-y', - 'width', - 'word-spacing', - 'wrap', - 'writing-mode', - 'xchannelselector', - 'ychannelselector', - 'x', - 'x1', - 'x2', - 'xmlns', - 'y', - 'y1', - 'y2', - 'z', - 'zoomandpan' - ]), - Pe = w([ - 'accent', - 'accentunder', - 'align', - 'bevelled', - 'close', - 'columnsalign', - 'columnlines', - 'columnspan', - 'denomalign', - 'depth', - 'dir', - 'display', - 'displaystyle', - 'encoding', - 'fence', - 'frame', - 'height', - 'href', - 'id', - 'largeop', - 'length', - 'linethickness', - 'lspace', - 'lquote', - 'mathbackground', - 'mathcolor', - 'mathsize', - 'mathvariant', - 'maxsize', - 'minsize', - 'movablelimits', - 'notation', - 'numalign', - 'open', - 'rowalign', - 'rowlines', - 'rowspacing', - 'rowspan', - 'rspace', - 'rquote', - 'scriptlevel', - 'scriptminsize', - 'scriptsizemultiplier', - 'selection', - 'separator', - 'separators', - 'stretchy', - 'subscriptshift', - 'supscriptshift', - 'symmetric', - 'voffset', - 'width', - 'xmlns' - ]), - Te = w(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']), - Re = x(/\{\{[\w\W]*|[\w\W]*\}\}/gm), - qe = x(/<%[\w\W]*|[\w\W]*%>/gm), - $e = x(/\${[\w\W]*}/gm), - ze = x(/^data-[\-\w.\u00B7-\uFFFF]/), - We = x(/^aria-[\-\w]+$/), - He = x( - /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i - ), - Ye = x(/^(?:\w+script|data):/i), - Xe = x(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g), - Qe = x(/^html$/i), - et = x(/^[a-z][.\w]*(-[.\w]+)+$/i); - var tt = Object.freeze({ - __proto__: null, - MUSTACHE_EXPR: Re, - ERB_EXPR: qe, - TMPLIT_EXPR: $e, - DATA_ATTR: ze, - ARIA_ATTR: We, - IS_ALLOWED_URI: He, - IS_SCRIPT_OR_DATA: Ye, - ATTR_WHITESPACE: Xe, - DOCTYPE_NAME: Qe, - CUSTOM_ELEMENT: et - }); - const rt = { - element: 1, - attribute: 2, - text: 3, - cdataSection: 4, - entityReference: 5, - entityNode: 6, - progressingInstruction: 7, - comment: 8, - document: 9, - documentType: 10, - documentFragment: 11, - notation: 12 - }, - nt = function getGlobal() { - return 'undefined' == typeof window ? null : window; - }, - st = function _createTrustedTypesPolicy(s, o) { - if ('object' != typeof s || 'function' != typeof s.createPolicy) return null; - let i = null; - const u = 'data-tt-policy-suffix'; - o && o.hasAttribute(u) && (i = o.getAttribute(u)); - const _ = 'dompurify' + (i ? '#' + i : ''); - try { - return s.createPolicy(_, { createHTML: (s) => s, createScriptURL: (s) => s }); - } catch (s) { - return ( - console.warn('TrustedTypes policy ' + _ + ' could not be created.'), - null - ); - } - }; - function createDOMPurify() { - let o = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : nt(); - const DOMPurify = (s) => createDOMPurify(s); - if ( - ((DOMPurify.version = '3.1.6'), - (DOMPurify.removed = []), - !o || !o.document || o.document.nodeType !== rt.document) - ) - return ((DOMPurify.isSupported = !1), DOMPurify); - let { document: i } = o; - const u = i, - _ = u.currentScript, - { - DocumentFragment: x, - HTMLTemplateElement: j, - Node: L, - Element: Re, - NodeFilter: qe, - NamedNodeMap: $e = o.NamedNodeMap || o.MozNamedAttrMap, - HTMLFormElement: ze, - DOMParser: We, - trustedTypes: Ye - } = o, - Xe = Re.prototype, - et = lookupGetter(Xe, 'cloneNode'), - ot = lookupGetter(Xe, 'remove'), - it = lookupGetter(Xe, 'nextSibling'), - at = lookupGetter(Xe, 'childNodes'), - lt = lookupGetter(Xe, 'parentNode'); - if ('function' == typeof j) { - const s = i.createElement('template'); - s.content && s.content.ownerDocument && (i = s.content.ownerDocument); - } - let ct, - ut = ''; - const { - implementation: pt, - createNodeIterator: ht, - createDocumentFragment: dt, - getElementsByTagName: mt - } = i, - { importNode: gt } = u; - let yt = {}; - DOMPurify.isSupported = - 'function' == typeof s && - 'function' == typeof lt && - pt && - void 0 !== pt.createHTMLDocument; - const { - MUSTACHE_EXPR: vt, - ERB_EXPR: bt, - TMPLIT_EXPR: _t, - DATA_ATTR: Et, - ARIA_ATTR: wt, - IS_SCRIPT_OR_DATA: St, - ATTR_WHITESPACE: xt, - CUSTOM_ELEMENT: kt - } = tt; - let { IS_ALLOWED_URI: Ct } = tt, - Ot = null; - const At = addToSet({}, [...pe, ...de, ...fe, ...be, ...we]); - let jt = null; - const It = addToSet({}, [...Se, ...xe, ...Pe, ...Te]); - let Pt = Object.seal( - C(null, { - tagNameCheck: { writable: !0, configurable: !1, enumerable: !0, value: null }, - attributeNameCheck: { - writable: !0, - configurable: !1, - enumerable: !0, - value: null - }, - allowCustomizedBuiltInElements: { - writable: !0, - configurable: !1, - enumerable: !0, - value: !1 - } - }) - ), - Mt = null, - Tt = null, - Nt = !0, - Rt = !0, - Dt = !1, - Lt = !0, - Bt = !1, - Ft = !0, - qt = !1, - $t = !1, - Vt = !1, - Ut = !1, - zt = !1, - Wt = !1, - Kt = !0, - Ht = !1; - const Jt = 'user-content-'; - let Gt = !0, - Yt = !1, - Xt = {}, - Zt = null; - const Qt = addToSet({}, [ - 'annotation-xml', - 'audio', - 'colgroup', - 'desc', - 'foreignobject', - 'head', - 'iframe', - 'math', - 'mi', - 'mn', - 'mo', - 'ms', - 'mtext', - 'noembed', - 'noframes', - 'noscript', - 'plaintext', - 'script', - 'style', - 'svg', - 'template', - 'thead', - 'title', - 'video', - 'xmp' - ]); - let er = null; - const tr = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']); - let rr = null; - const nr = addToSet({}, [ - 'alt', - 'class', - 'for', - 'id', - 'label', - 'name', - 'pattern', - 'placeholder', - 'role', - 'summary', - 'title', - 'value', - 'style', - 'xmlns' - ]), - sr = 'http://www.w3.org/1998/Math/MathML', - ir = 'http://www.w3.org/2000/svg', - ar = 'http://www.w3.org/1999/xhtml'; - let lr = ar, - cr = !1, - ur = null; - const pr = addToSet({}, [sr, ir, ar], z); - let dr = null; - const fr = ['application/xhtml+xml', 'text/html'], - mr = 'text/html'; - let gr = null, - yr = null; - const vr = i.createElement('form'), - br = function isRegexOrFunction(s) { - return s instanceof RegExp || s instanceof Function; - }, - _r = function _parseConfig() { - let s = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; - if (!yr || yr !== s) { - if ( - ((s && 'object' == typeof s) || (s = {}), - (s = clone(s)), - (dr = -1 === fr.indexOf(s.PARSER_MEDIA_TYPE) ? mr : s.PARSER_MEDIA_TYPE), - (gr = 'application/xhtml+xml' === dr ? z : U), - (Ot = ae(s, 'ALLOWED_TAGS') ? addToSet({}, s.ALLOWED_TAGS, gr) : At), - (jt = ae(s, 'ALLOWED_ATTR') ? addToSet({}, s.ALLOWED_ATTR, gr) : It), - (ur = ae(s, 'ALLOWED_NAMESPACES') - ? addToSet({}, s.ALLOWED_NAMESPACES, z) - : pr), - (rr = ae(s, 'ADD_URI_SAFE_ATTR') - ? addToSet(clone(nr), s.ADD_URI_SAFE_ATTR, gr) - : nr), - (er = ae(s, 'ADD_DATA_URI_TAGS') - ? addToSet(clone(tr), s.ADD_DATA_URI_TAGS, gr) - : tr), - (Zt = ae(s, 'FORBID_CONTENTS') ? addToSet({}, s.FORBID_CONTENTS, gr) : Qt), - (Mt = ae(s, 'FORBID_TAGS') ? addToSet({}, s.FORBID_TAGS, gr) : {}), - (Tt = ae(s, 'FORBID_ATTR') ? addToSet({}, s.FORBID_ATTR, gr) : {}), - (Xt = !!ae(s, 'USE_PROFILES') && s.USE_PROFILES), - (Nt = !1 !== s.ALLOW_ARIA_ATTR), - (Rt = !1 !== s.ALLOW_DATA_ATTR), - (Dt = s.ALLOW_UNKNOWN_PROTOCOLS || !1), - (Lt = !1 !== s.ALLOW_SELF_CLOSE_IN_ATTR), - (Bt = s.SAFE_FOR_TEMPLATES || !1), - (Ft = !1 !== s.SAFE_FOR_XML), - (qt = s.WHOLE_DOCUMENT || !1), - (Ut = s.RETURN_DOM || !1), - (zt = s.RETURN_DOM_FRAGMENT || !1), - (Wt = s.RETURN_TRUSTED_TYPE || !1), - (Vt = s.FORCE_BODY || !1), - (Kt = !1 !== s.SANITIZE_DOM), - (Ht = s.SANITIZE_NAMED_PROPS || !1), - (Gt = !1 !== s.KEEP_CONTENT), - (Yt = s.IN_PLACE || !1), - (Ct = s.ALLOWED_URI_REGEXP || He), - (lr = s.NAMESPACE || ar), - (Pt = s.CUSTOM_ELEMENT_HANDLING || {}), - s.CUSTOM_ELEMENT_HANDLING && - br(s.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && - (Pt.tagNameCheck = s.CUSTOM_ELEMENT_HANDLING.tagNameCheck), - s.CUSTOM_ELEMENT_HANDLING && - br(s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && - (Pt.attributeNameCheck = s.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), - s.CUSTOM_ELEMENT_HANDLING && - 'boolean' == - typeof s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && - (Pt.allowCustomizedBuiltInElements = - s.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), - Bt && (Rt = !1), - zt && (Ut = !0), - Xt && - ((Ot = addToSet({}, we)), - (jt = []), - !0 === Xt.html && (addToSet(Ot, pe), addToSet(jt, Se)), - !0 === Xt.svg && (addToSet(Ot, de), addToSet(jt, xe), addToSet(jt, Te)), - !0 === Xt.svgFilters && - (addToSet(Ot, fe), addToSet(jt, xe), addToSet(jt, Te)), - !0 === Xt.mathMl && (addToSet(Ot, be), addToSet(jt, Pe), addToSet(jt, Te))), - s.ADD_TAGS && (Ot === At && (Ot = clone(Ot)), addToSet(Ot, s.ADD_TAGS, gr)), - s.ADD_ATTR && (jt === It && (jt = clone(jt)), addToSet(jt, s.ADD_ATTR, gr)), - s.ADD_URI_SAFE_ATTR && addToSet(rr, s.ADD_URI_SAFE_ATTR, gr), - s.FORBID_CONTENTS && - (Zt === Qt && (Zt = clone(Zt)), addToSet(Zt, s.FORBID_CONTENTS, gr)), - Gt && (Ot['#text'] = !0), - qt && addToSet(Ot, ['html', 'head', 'body']), - Ot.table && (addToSet(Ot, ['tbody']), delete Mt.tbody), - s.TRUSTED_TYPES_POLICY) - ) { - if ('function' != typeof s.TRUSTED_TYPES_POLICY.createHTML) - throw ce( - 'TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.' - ); - if ('function' != typeof s.TRUSTED_TYPES_POLICY.createScriptURL) - throw ce( - 'TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.' - ); - ((ct = s.TRUSTED_TYPES_POLICY), (ut = ct.createHTML(''))); - } else - (void 0 === ct && (ct = st(Ye, _)), - null !== ct && 'string' == typeof ut && (ut = ct.createHTML(''))); - (w && w(s), (yr = s)); - } - }, - Er = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']), - wr = addToSet({}, ['foreignobject', 'annotation-xml']), - Sr = addToSet({}, ['title', 'style', 'font', 'a', 'script']), - xr = addToSet({}, [...de, ...fe, ...ye]), - kr = addToSet({}, [...be, ..._e]), - Cr = function _checkValidNamespace(s) { - let o = lt(s); - (o && o.tagName) || (o = { namespaceURI: lr, tagName: 'template' }); - const i = U(s.tagName), - u = U(o.tagName); - return ( - !!ur[s.namespaceURI] && - (s.namespaceURI === ir - ? o.namespaceURI === ar - ? 'svg' === i - : o.namespaceURI === sr - ? 'svg' === i && ('annotation-xml' === u || Er[u]) - : Boolean(xr[i]) - : s.namespaceURI === sr - ? o.namespaceURI === ar - ? 'math' === i - : o.namespaceURI === ir - ? 'math' === i && wr[u] - : Boolean(kr[i]) - : s.namespaceURI === ar - ? !(o.namespaceURI === ir && !wr[u]) && - !(o.namespaceURI === sr && !Er[u]) && - !kr[i] && - (Sr[i] || !xr[i]) - : !('application/xhtml+xml' !== dr || !ur[s.namespaceURI])) - ); - }, - Or = function _forceRemove(s) { - V(DOMPurify.removed, { element: s }); - try { - lt(s).removeChild(s); - } catch (o) { - ot(s); - } - }, - Ar = function _removeAttribute(s, o) { - try { - V(DOMPurify.removed, { attribute: o.getAttributeNode(s), from: o }); - } catch (s) { - V(DOMPurify.removed, { attribute: null, from: o }); - } - if ((o.removeAttribute(s), 'is' === s && !jt[s])) - if (Ut || zt) - try { - Or(o); - } catch (s) {} - else - try { - o.setAttribute(s, ''); - } catch (s) {} - }, - jr = function _initDocument(s) { - let o = null, - u = null; - if (Vt) s = '' + s; - else { - const o = Y(s, /^[\r\n\t ]+/); - u = o && o[0]; - } - 'application/xhtml+xml' === dr && - lr === ar && - (s = - '' + - s + - ''); - const _ = ct ? ct.createHTML(s) : s; - if (lr === ar) - try { - o = new We().parseFromString(_, dr); - } catch (s) {} - if (!o || !o.documentElement) { - o = pt.createDocument(lr, 'template', null); - try { - o.documentElement.innerHTML = cr ? ut : _; - } catch (s) {} - } - const w = o.body || o.documentElement; - return ( - s && u && w.insertBefore(i.createTextNode(u), w.childNodes[0] || null), - lr === ar ? mt.call(o, qt ? 'html' : 'body')[0] : qt ? o.documentElement : w - ); - }, - Ir = function _createNodeIterator(s) { - return ht.call( - s.ownerDocument || s, - s, - qe.SHOW_ELEMENT | - qe.SHOW_COMMENT | - qe.SHOW_TEXT | - qe.SHOW_PROCESSING_INSTRUCTION | - qe.SHOW_CDATA_SECTION, - null - ); - }, - Pr = function _isClobbered(s) { - return ( - s instanceof ze && - ('string' != typeof s.nodeName || - 'string' != typeof s.textContent || - 'function' != typeof s.removeChild || - !(s.attributes instanceof $e) || - 'function' != typeof s.removeAttribute || - 'function' != typeof s.setAttribute || - 'string' != typeof s.namespaceURI || - 'function' != typeof s.insertBefore || - 'function' != typeof s.hasChildNodes) - ); - }, - Mr = function _isNode(s) { - return 'function' == typeof L && s instanceof L; - }, - Tr = function _executeHook(s, o, i) { - yt[s] && - B(yt[s], (s) => { - s.call(DOMPurify, o, i, yr); - }); - }, - Nr = function _sanitizeElements(s) { - let o = null; - if ((Tr('beforeSanitizeElements', s, null), Pr(s))) return (Or(s), !0); - const i = gr(s.nodeName); - if ( - (Tr('uponSanitizeElement', s, { tagName: i, allowedTags: Ot }), - s.hasChildNodes() && - !Mr(s.firstElementChild) && - le(/<[/\w]/g, s.innerHTML) && - le(/<[/\w]/g, s.textContent)) - ) - return (Or(s), !0); - if (s.nodeType === rt.progressingInstruction) return (Or(s), !0); - if (Ft && s.nodeType === rt.comment && le(/<[/\w]/g, s.data)) return (Or(s), !0); - if (!Ot[i] || Mt[i]) { - if (!Mt[i] && Dr(i)) { - if (Pt.tagNameCheck instanceof RegExp && le(Pt.tagNameCheck, i)) return !1; - if (Pt.tagNameCheck instanceof Function && Pt.tagNameCheck(i)) return !1; - } - if (Gt && !Zt[i]) { - const o = lt(s) || s.parentNode, - i = at(s) || s.childNodes; - if (i && o) - for (let u = i.length - 1; u >= 0; --u) { - const _ = et(i[u], !0); - ((_.__removalCount = (s.__removalCount || 0) + 1), - o.insertBefore(_, it(s))); - } - } - return (Or(s), !0); - } - return s instanceof Re && !Cr(s) - ? (Or(s), !0) - : ('noscript' !== i && 'noembed' !== i && 'noframes' !== i) || - !le(/<\/no(script|embed|frames)/i, s.innerHTML) - ? (Bt && - s.nodeType === rt.text && - ((o = s.textContent), - B([vt, bt, _t], (s) => { - o = Z(o, s, ' '); - }), - s.textContent !== o && - (V(DOMPurify.removed, { element: s.cloneNode() }), - (s.textContent = o))), - Tr('afterSanitizeElements', s, null), - !1) - : (Or(s), !0); - }, - Rr = function _isValidAttribute(s, o, u) { - if (Kt && ('id' === o || 'name' === o) && (u in i || u in vr)) return !1; - if (Rt && !Tt[o] && le(Et, o)); - else if (Nt && le(wt, o)); - else if (!jt[o] || Tt[o]) { - if ( - !( - (Dr(s) && - ((Pt.tagNameCheck instanceof RegExp && le(Pt.tagNameCheck, s)) || - (Pt.tagNameCheck instanceof Function && Pt.tagNameCheck(s))) && - ((Pt.attributeNameCheck instanceof RegExp && - le(Pt.attributeNameCheck, o)) || - (Pt.attributeNameCheck instanceof Function && - Pt.attributeNameCheck(o)))) || - ('is' === o && - Pt.allowCustomizedBuiltInElements && - ((Pt.tagNameCheck instanceof RegExp && le(Pt.tagNameCheck, u)) || - (Pt.tagNameCheck instanceof Function && Pt.tagNameCheck(u)))) - ) - ) - return !1; - } else if (rr[o]); - else if (le(Ct, Z(u, xt, ''))); - else if ( - ('src' !== o && 'xlink:href' !== o && 'href' !== o) || - 'script' === s || - 0 !== ee(u, 'data:') || - !er[s] - ) - if (Dt && !le(St, Z(u, xt, ''))); - else if (u) return !1; - return !0; - }, - Dr = function _isBasicCustomElement(s) { - return 'annotation-xml' !== s && Y(s, kt); - }, - Lr = function _sanitizeAttributes(s) { - Tr('beforeSanitizeAttributes', s, null); - const { attributes: o } = s; - if (!o) return; - const i = { attrName: '', attrValue: '', keepAttr: !0, allowedAttributes: jt }; - let u = o.length; - for (; u--; ) { - const _ = o[u], - { name: w, namespaceURI: x, value: C } = _, - j = gr(w); - let L = 'value' === w ? C : ie(C); - if ( - ((i.attrName = j), - (i.attrValue = L), - (i.keepAttr = !0), - (i.forceKeepAttr = void 0), - Tr('uponSanitizeAttribute', s, i), - (L = i.attrValue), - Ft && le(/((--!?|])>)|<\/(style|title)/i, L)) - ) { - Ar(w, s); - continue; - } - if (i.forceKeepAttr) continue; - if ((Ar(w, s), !i.keepAttr)) continue; - if (!Lt && le(/\/>/i, L)) { - Ar(w, s); - continue; - } - Bt && - B([vt, bt, _t], (s) => { - L = Z(L, s, ' '); - }); - const V = gr(s.nodeName); - if (Rr(V, j, L)) { - if ( - (!Ht || ('id' !== j && 'name' !== j) || (Ar(w, s), (L = Jt + L)), - ct && 'object' == typeof Ye && 'function' == typeof Ye.getAttributeType) - ) - if (x); - else - switch (Ye.getAttributeType(V, j)) { - case 'TrustedHTML': - L = ct.createHTML(L); - break; - case 'TrustedScriptURL': - L = ct.createScriptURL(L); - } - try { - (x ? s.setAttributeNS(x, w, L) : s.setAttribute(w, L), - Pr(s) ? Or(s) : $(DOMPurify.removed)); - } catch (s) {} - } - } - Tr('afterSanitizeAttributes', s, null); - }, - Br = function _sanitizeShadowDOM(s) { - let o = null; - const i = Ir(s); - for (Tr('beforeSanitizeShadowDOM', s, null); (o = i.nextNode()); ) - (Tr('uponSanitizeShadowNode', o, null), - Nr(o) || (o.content instanceof x && _sanitizeShadowDOM(o.content), Lr(o))); - Tr('afterSanitizeShadowDOM', s, null); - }; - return ( - (DOMPurify.sanitize = function (s) { - let o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, - i = null, - _ = null, - w = null, - C = null; - if (((cr = !s), cr && (s = '\x3c!--\x3e'), 'string' != typeof s && !Mr(s))) { - if ('function' != typeof s.toString) throw ce('toString is not a function'); - if ('string' != typeof (s = s.toString())) - throw ce('dirty is not a string, aborting'); - } - if (!DOMPurify.isSupported) return s; - if ( - ($t || _r(o), (DOMPurify.removed = []), 'string' == typeof s && (Yt = !1), Yt) - ) { - if (s.nodeName) { - const o = gr(s.nodeName); - if (!Ot[o] || Mt[o]) - throw ce('root node is forbidden and cannot be sanitized in-place'); - } - } else if (s instanceof L) - ((i = jr('\x3c!----\x3e')), - (_ = i.ownerDocument.importNode(s, !0)), - (_.nodeType === rt.element && 'BODY' === _.nodeName) || 'HTML' === _.nodeName - ? (i = _) - : i.appendChild(_)); - else { - if (!Ut && !Bt && !qt && -1 === s.indexOf('<')) - return ct && Wt ? ct.createHTML(s) : s; - if (((i = jr(s)), !i)) return Ut ? null : Wt ? ut : ''; - } - i && Vt && Or(i.firstChild); - const j = Ir(Yt ? s : i); - for (; (w = j.nextNode()); ) - Nr(w) || (w.content instanceof x && Br(w.content), Lr(w)); - if (Yt) return s; - if (Ut) { - if (zt) - for (C = dt.call(i.ownerDocument); i.firstChild; ) - C.appendChild(i.firstChild); - else C = i; - return ((jt.shadowroot || jt.shadowrootmode) && (C = gt.call(u, C, !0)), C); - } - let $ = qt ? i.outerHTML : i.innerHTML; - return ( - qt && - Ot['!doctype'] && - i.ownerDocument && - i.ownerDocument.doctype && - i.ownerDocument.doctype.name && - le(Qe, i.ownerDocument.doctype.name) && - ($ = '\n' + $), - Bt && - B([vt, bt, _t], (s) => { - $ = Z($, s, ' '); - }), - ct && Wt ? ct.createHTML($) : $ - ); - }), - (DOMPurify.setConfig = function () { - (_r(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}), - ($t = !0)); - }), - (DOMPurify.clearConfig = function () { - ((yr = null), ($t = !1)); - }), - (DOMPurify.isValidAttribute = function (s, o, i) { - yr || _r({}); - const u = gr(s), - _ = gr(o); - return Rr(u, _, i); - }), - (DOMPurify.addHook = function (s, o) { - 'function' == typeof o && ((yt[s] = yt[s] || []), V(yt[s], o)); - }), - (DOMPurify.removeHook = function (s) { - if (yt[s]) return $(yt[s]); - }), - (DOMPurify.removeHooks = function (s) { - yt[s] && (yt[s] = []); - }), - (DOMPurify.removeAllHooks = function () { - yt = {}; - }), - DOMPurify - ); - } - return createDOMPurify(); - })(); - }, - 78004: (s) => { - 'use strict'; - class SubRange { - constructor(s, o) { - ((this.low = s), (this.high = o), (this.length = 1 + o - s)); - } - overlaps(s) { - return !(this.high < s.low || this.low > s.high); - } - touches(s) { - return !(this.high + 1 < s.low || this.low - 1 > s.high); - } - add(s) { - return new SubRange(Math.min(this.low, s.low), Math.max(this.high, s.high)); - } - subtract(s) { - return s.low <= this.low && s.high >= this.high - ? [] - : s.low > this.low && s.high < this.high - ? [new SubRange(this.low, s.low - 1), new SubRange(s.high + 1, this.high)] - : s.low <= this.low - ? [new SubRange(s.high + 1, this.high)] - : [new SubRange(this.low, s.low - 1)]; - } - toString() { - return this.low == this.high ? this.low.toString() : this.low + '-' + this.high; - } - } - class DRange { - constructor(s, o) { - ((this.ranges = []), (this.length = 0), null != s && this.add(s, o)); - } - _update_length() { - this.length = this.ranges.reduce((s, o) => s + o.length, 0); - } - add(s, o) { - var _add = (s) => { - for (var o = 0; o < this.ranges.length && !s.touches(this.ranges[o]); ) o++; - for ( - var i = this.ranges.slice(0, o); - o < this.ranges.length && s.touches(this.ranges[o]); - ) - ((s = s.add(this.ranges[o])), o++); - (i.push(s), (this.ranges = i.concat(this.ranges.slice(o))), this._update_length()); - }; - return ( - s instanceof DRange - ? s.ranges.forEach(_add) - : (null == o && (o = s), _add(new SubRange(s, o))), - this - ); - } - subtract(s, o) { - var _subtract = (s) => { - for (var o = 0; o < this.ranges.length && !s.overlaps(this.ranges[o]); ) o++; - for ( - var i = this.ranges.slice(0, o); - o < this.ranges.length && s.overlaps(this.ranges[o]); - ) - ((i = i.concat(this.ranges[o].subtract(s))), o++); - ((this.ranges = i.concat(this.ranges.slice(o))), this._update_length()); - }; - return ( - s instanceof DRange - ? s.ranges.forEach(_subtract) - : (null == o && (o = s), _subtract(new SubRange(s, o))), - this - ); - } - intersect(s, o) { - var i = [], - _intersect = (s) => { - for (var o = 0; o < this.ranges.length && !s.overlaps(this.ranges[o]); ) o++; - for (; o < this.ranges.length && s.overlaps(this.ranges[o]); ) { - var u = Math.max(this.ranges[o].low, s.low), - _ = Math.min(this.ranges[o].high, s.high); - (i.push(new SubRange(u, _)), o++); - } - }; - return ( - s instanceof DRange - ? s.ranges.forEach(_intersect) - : (null == o && (o = s), _intersect(new SubRange(s, o))), - (this.ranges = i), - this._update_length(), - this - ); - } - index(s) { - for (var o = 0; o < this.ranges.length && this.ranges[o].length <= s; ) - ((s -= this.ranges[o].length), o++); - return this.ranges[o].low + s; - } - toString() { - return '[ ' + this.ranges.join(', ') + ' ]'; - } - clone() { - return new DRange(this); - } - numbers() { - return this.ranges.reduce((s, o) => { - for (var i = o.low; i <= o.high; ) (s.push(i), i++); - return s; - }, []); - } - subranges() { - return this.ranges.map((s) => ({ - low: s.low, - high: s.high, - length: 1 + s.high - s.low - })); - } - } - s.exports = DRange; - }, - 37007: (s) => { - 'use strict'; - var o, - i = 'object' == typeof Reflect ? Reflect : null, - u = - i && 'function' == typeof i.apply - ? i.apply - : function ReflectApply(s, o, i) { - return Function.prototype.apply.call(s, o, i); - }; - o = - i && 'function' == typeof i.ownKeys - ? i.ownKeys - : Object.getOwnPropertySymbols - ? function ReflectOwnKeys(s) { - return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s)); - } - : function ReflectOwnKeys(s) { - return Object.getOwnPropertyNames(s); - }; - var _ = - Number.isNaN || - function NumberIsNaN(s) { - return s != s; - }; - function EventEmitter() { - EventEmitter.init.call(this); - } - ((s.exports = EventEmitter), - (s.exports.once = function once(s, o) { - return new Promise(function (i, u) { - function errorListener(i) { - (s.removeListener(o, resolver), u(i)); - } - function resolver() { - ('function' == typeof s.removeListener && - s.removeListener('error', errorListener), - i([].slice.call(arguments))); - } - (eventTargetAgnosticAddListener(s, o, resolver, { once: !0 }), - 'error' !== o && - (function addErrorHandlerIfEventEmitter(s, o, i) { - 'function' == typeof s.on && eventTargetAgnosticAddListener(s, 'error', o, i); - })(s, errorListener, { once: !0 })); - }); - }), - (EventEmitter.EventEmitter = EventEmitter), - (EventEmitter.prototype._events = void 0), - (EventEmitter.prototype._eventsCount = 0), - (EventEmitter.prototype._maxListeners = void 0)); - var w = 10; - function checkListener(s) { - if ('function' != typeof s) - throw new TypeError( - 'The "listener" argument must be of type Function. Received type ' + typeof s - ); - } - function _getMaxListeners(s) { - return void 0 === s._maxListeners ? EventEmitter.defaultMaxListeners : s._maxListeners; - } - function _addListener(s, o, i, u) { - var _, w, x; - if ( - (checkListener(i), - void 0 === (w = s._events) - ? ((w = s._events = Object.create(null)), (s._eventsCount = 0)) - : (void 0 !== w.newListener && - (s.emit('newListener', o, i.listener ? i.listener : i), (w = s._events)), - (x = w[o])), - void 0 === x) - ) - ((x = w[o] = i), ++s._eventsCount); - else if ( - ('function' == typeof x - ? (x = w[o] = u ? [i, x] : [x, i]) - : u - ? x.unshift(i) - : x.push(i), - (_ = _getMaxListeners(s)) > 0 && x.length > _ && !x.warned) - ) { - x.warned = !0; - var C = new Error( - 'Possible EventEmitter memory leak detected. ' + - x.length + - ' ' + - String(o) + - ' listeners added. Use emitter.setMaxListeners() to increase limit' - ); - ((C.name = 'MaxListenersExceededWarning'), - (C.emitter = s), - (C.type = o), - (C.count = x.length), - (function ProcessEmitWarning(s) { - console && console.warn && console.warn(s); - })(C)); - } - return s; - } - function onceWrapper() { - if (!this.fired) - return ( - this.target.removeListener(this.type, this.wrapFn), - (this.fired = !0), - 0 === arguments.length - ? this.listener.call(this.target) - : this.listener.apply(this.target, arguments) - ); - } - function _onceWrap(s, o, i) { - var u = { fired: !1, wrapFn: void 0, target: s, type: o, listener: i }, - _ = onceWrapper.bind(u); - return ((_.listener = i), (u.wrapFn = _), _); - } - function _listeners(s, o, i) { - var u = s._events; - if (void 0 === u) return []; - var _ = u[o]; - return void 0 === _ - ? [] - : 'function' == typeof _ - ? i - ? [_.listener || _] - : [_] - : i - ? (function unwrapListeners(s) { - for (var o = new Array(s.length), i = 0; i < o.length; ++i) - o[i] = s[i].listener || s[i]; - return o; - })(_) - : arrayClone(_, _.length); - } - function listenerCount(s) { - var o = this._events; - if (void 0 !== o) { - var i = o[s]; - if ('function' == typeof i) return 1; - if (void 0 !== i) return i.length; - } - return 0; - } - function arrayClone(s, o) { - for (var i = new Array(o), u = 0; u < o; ++u) i[u] = s[u]; - return i; - } - function eventTargetAgnosticAddListener(s, o, i, u) { - if ('function' == typeof s.on) u.once ? s.once(o, i) : s.on(o, i); - else { - if ('function' != typeof s.addEventListener) - throw new TypeError( - 'The "emitter" argument must be of type EventEmitter. Received type ' + typeof s - ); - s.addEventListener(o, function wrapListener(_) { - (u.once && s.removeEventListener(o, wrapListener), i(_)); - }); - } - } - (Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: !0, - get: function () { - return w; - }, - set: function (s) { - if ('number' != typeof s || s < 0 || _(s)) - throw new RangeError( - 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + - s + - '.' - ); - w = s; - } - }), - (EventEmitter.init = function () { - ((void 0 !== this._events && this._events !== Object.getPrototypeOf(this)._events) || - ((this._events = Object.create(null)), (this._eventsCount = 0)), - (this._maxListeners = this._maxListeners || void 0)); - }), - (EventEmitter.prototype.setMaxListeners = function setMaxListeners(s) { - if ('number' != typeof s || s < 0 || _(s)) - throw new RangeError( - 'The value of "n" is out of range. It must be a non-negative number. Received ' + - s + - '.' - ); - return ((this._maxListeners = s), this); - }), - (EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); - }), - (EventEmitter.prototype.emit = function emit(s) { - for (var o = [], i = 1; i < arguments.length; i++) o.push(arguments[i]); - var _ = 'error' === s, - w = this._events; - if (void 0 !== w) _ = _ && void 0 === w.error; - else if (!_) return !1; - if (_) { - var x; - if ((o.length > 0 && (x = o[0]), x instanceof Error)) throw x; - var C = new Error('Unhandled error.' + (x ? ' (' + x.message + ')' : '')); - throw ((C.context = x), C); - } - var j = w[s]; - if (void 0 === j) return !1; - if ('function' == typeof j) u(j, this, o); - else { - var L = j.length, - B = arrayClone(j, L); - for (i = 0; i < L; ++i) u(B[i], this, o); - } - return !0; - }), - (EventEmitter.prototype.addListener = function addListener(s, o) { - return _addListener(this, s, o, !1); - }), - (EventEmitter.prototype.on = EventEmitter.prototype.addListener), - (EventEmitter.prototype.prependListener = function prependListener(s, o) { - return _addListener(this, s, o, !0); - }), - (EventEmitter.prototype.once = function once(s, o) { - return (checkListener(o), this.on(s, _onceWrap(this, s, o)), this); - }), - (EventEmitter.prototype.prependOnceListener = function prependOnceListener(s, o) { - return (checkListener(o), this.prependListener(s, _onceWrap(this, s, o)), this); - }), - (EventEmitter.prototype.removeListener = function removeListener(s, o) { - var i, u, _, w, x; - if ((checkListener(o), void 0 === (u = this._events))) return this; - if (void 0 === (i = u[s])) return this; - if (i === o || i.listener === o) - 0 == --this._eventsCount - ? (this._events = Object.create(null)) - : (delete u[s], - u.removeListener && this.emit('removeListener', s, i.listener || o)); - else if ('function' != typeof i) { - for (_ = -1, w = i.length - 1; w >= 0; w--) - if (i[w] === o || i[w].listener === o) { - ((x = i[w].listener), (_ = w)); - break; - } - if (_ < 0) return this; - (0 === _ - ? i.shift() - : (function spliceOne(s, o) { - for (; o + 1 < s.length; o++) s[o] = s[o + 1]; - s.pop(); - })(i, _), - 1 === i.length && (u[s] = i[0]), - void 0 !== u.removeListener && this.emit('removeListener', s, x || o)); - } - return this; - }), - (EventEmitter.prototype.off = EventEmitter.prototype.removeListener), - (EventEmitter.prototype.removeAllListeners = function removeAllListeners(s) { - var o, i, u; - if (void 0 === (i = this._events)) return this; - if (void 0 === i.removeListener) - return ( - 0 === arguments.length - ? ((this._events = Object.create(null)), (this._eventsCount = 0)) - : void 0 !== i[s] && - (0 == --this._eventsCount - ? (this._events = Object.create(null)) - : delete i[s]), - this - ); - if (0 === arguments.length) { - var _, - w = Object.keys(i); - for (u = 0; u < w.length; ++u) - 'removeListener' !== (_ = w[u]) && this.removeAllListeners(_); - return ( - this.removeAllListeners('removeListener'), - (this._events = Object.create(null)), - (this._eventsCount = 0), - this - ); - } - if ('function' == typeof (o = i[s])) this.removeListener(s, o); - else if (void 0 !== o) - for (u = o.length - 1; u >= 0; u--) this.removeListener(s, o[u]); - return this; - }), - (EventEmitter.prototype.listeners = function listeners(s) { - return _listeners(this, s, !0); - }), - (EventEmitter.prototype.rawListeners = function rawListeners(s) { - return _listeners(this, s, !1); - }), - (EventEmitter.listenerCount = function (s, o) { - return 'function' == typeof s.listenerCount - ? s.listenerCount(o) - : listenerCount.call(s, o); - }), - (EventEmitter.prototype.listenerCount = listenerCount), - (EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? o(this._events) : []; - })); - }, - 85587: (s, o, i) => { - 'use strict'; - var u = i(26311), - _ = create(Error); - function create(s) { - return ((FormattedError.displayName = s.displayName || s.name), FormattedError); - function FormattedError(o) { - return (o && (o = u.apply(null, arguments)), new s(o)); - } - } - ((s.exports = _), - (_.eval = create(EvalError)), - (_.range = create(RangeError)), - (_.reference = create(ReferenceError)), - (_.syntax = create(SyntaxError)), - (_.type = create(TypeError)), - (_.uri = create(URIError)), - (_.create = create)); - }, - 26311: (s) => { - !(function () { - var o; - function format(s) { - for ( - var o, - i, - u, - _, - w = 1, - x = [].slice.call(arguments), - C = 0, - j = s.length, - L = '', - B = !1, - $ = !1, - nextArg = function () { - return x[w++]; - }, - slurpNumber = function () { - for (var i = ''; /\d/.test(s[C]); ) ((i += s[C++]), (o = s[C])); - return i.length > 0 ? parseInt(i) : null; - }; - C < j; - ++C - ) - if (((o = s[C]), B)) - switch ( - ((B = !1), - '.' == o - ? (($ = !1), (o = s[++C])) - : '0' == o && '.' == s[C + 1] - ? (($ = !0), (o = s[(C += 2)])) - : ($ = !0), - (_ = slurpNumber()), - o) - ) { - case 'b': - L += parseInt(nextArg(), 10).toString(2); - break; - case 'c': - L += - 'string' == typeof (i = nextArg()) || i instanceof String - ? i - : String.fromCharCode(parseInt(i, 10)); - break; - case 'd': - L += parseInt(nextArg(), 10); - break; - case 'f': - ((u = String(parseFloat(nextArg()).toFixed(_ || 6))), - (L += $ ? u : u.replace(/^0/, ''))); - break; - case 'j': - L += JSON.stringify(nextArg()); - break; - case 'o': - L += '0' + parseInt(nextArg(), 10).toString(8); - break; - case 's': - L += nextArg(); - break; - case 'x': - L += '0x' + parseInt(nextArg(), 10).toString(16); - break; - case 'X': - L += '0x' + parseInt(nextArg(), 10).toString(16).toUpperCase(); - break; - default: - L += o; - } - else '%' === o ? (B = !0) : (L += o); - return L; - } - (((o = s.exports = format).format = format), - (o.vsprintf = function vsprintf(s, o) { - return format.apply(null, [s].concat(o)); - }), - 'undefined' != typeof console && - 'function' == typeof console.log && - (o.printf = function printf() { - console.log(format.apply(null, arguments)); - })); - })(); - }, - 45981: (s) => { - function deepFreeze(s) { - return ( - s instanceof Map - ? (s.clear = - s.delete = - s.set = - function () { - throw new Error('map is read-only'); - }) - : s instanceof Set && - (s.add = - s.clear = - s.delete = - function () { - throw new Error('set is read-only'); - }), - Object.freeze(s), - Object.getOwnPropertyNames(s).forEach(function (o) { - var i = s[o]; - 'object' != typeof i || Object.isFrozen(i) || deepFreeze(i); - }), - s - ); - } - var o = deepFreeze, - i = deepFreeze; - o.default = i; - class Response { - constructor(s) { - (void 0 === s.data && (s.data = {}), - (this.data = s.data), - (this.isMatchIgnored = !1)); - } - ignoreMatch() { - this.isMatchIgnored = !0; - } - } - function escapeHTML(s) { - return s - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, '''); - } - function inherit(s, ...o) { - const i = Object.create(null); - for (const o in s) i[o] = s[o]; - return ( - o.forEach(function (s) { - for (const o in s) i[o] = s[o]; - }), - i - ); - } - const emitsWrappingTags = (s) => !!s.kind; - class HTMLRenderer { - constructor(s, o) { - ((this.buffer = ''), (this.classPrefix = o.classPrefix), s.walk(this)); - } - addText(s) { - this.buffer += escapeHTML(s); - } - openNode(s) { - if (!emitsWrappingTags(s)) return; - let o = s.kind; - (s.sublanguage || (o = `${this.classPrefix}${o}`), this.span(o)); - } - closeNode(s) { - emitsWrappingTags(s) && (this.buffer += ''); - } - value() { - return this.buffer; - } - span(s) { - this.buffer += ``; - } - } - class TokenTree { - constructor() { - ((this.rootNode = { children: [] }), (this.stack = [this.rootNode])); - } - get top() { - return this.stack[this.stack.length - 1]; - } - get root() { - return this.rootNode; - } - add(s) { - this.top.children.push(s); - } - openNode(s) { - const o = { kind: s, children: [] }; - (this.add(o), this.stack.push(o)); - } - closeNode() { - if (this.stack.length > 1) return this.stack.pop(); - } - closeAllNodes() { - for (; this.closeNode(); ); - } - toJSON() { - return JSON.stringify(this.rootNode, null, 4); - } - walk(s) { - return this.constructor._walk(s, this.rootNode); - } - static _walk(s, o) { - return ( - 'string' == typeof o - ? s.addText(o) - : o.children && - (s.openNode(o), o.children.forEach((o) => this._walk(s, o)), s.closeNode(o)), - s - ); - } - static _collapse(s) { - 'string' != typeof s && - s.children && - (s.children.every((s) => 'string' == typeof s) - ? (s.children = [s.children.join('')]) - : s.children.forEach((s) => { - TokenTree._collapse(s); - })); - } - } - class TokenTreeEmitter extends TokenTree { - constructor(s) { - (super(), (this.options = s)); - } - addKeyword(s, o) { - '' !== s && (this.openNode(o), this.addText(s), this.closeNode()); - } - addText(s) { - '' !== s && this.add(s); - } - addSublanguage(s, o) { - const i = s.root; - ((i.kind = o), (i.sublanguage = !0), this.add(i)); - } - toHTML() { - return new HTMLRenderer(this, this.options).value(); - } - finalize() { - return !0; - } - } - function source(s) { - return s ? ('string' == typeof s ? s : s.source) : null; - } - const u = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; - const _ = '[a-zA-Z]\\w*', - w = '[a-zA-Z_]\\w*', - x = '\\b\\d+(\\.\\d+)?', - C = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)', - j = '\\b(0b[01]+)', - L = { begin: '\\\\[\\s\\S]', relevance: 0 }, - B = { className: 'string', begin: "'", end: "'", illegal: '\\n', contains: [L] }, - $ = { className: 'string', begin: '"', end: '"', illegal: '\\n', contains: [L] }, - V = { - begin: - /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ - }, - COMMENT = function (s, o, i = {}) { - const u = inherit({ className: 'comment', begin: s, end: o, contains: [] }, i); - return ( - u.contains.push(V), - u.contains.push({ - className: 'doctag', - begin: '(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):', - relevance: 0 - }), - u - ); - }, - U = COMMENT('//', '$'), - z = COMMENT('/\\*', '\\*/'), - Y = COMMENT('#', '$'), - Z = { className: 'number', begin: x, relevance: 0 }, - ee = { className: 'number', begin: C, relevance: 0 }, - ie = { className: 'number', begin: j, relevance: 0 }, - ae = { - className: 'number', - begin: - x + - '(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?', - relevance: 0 - }, - le = { - begin: /(?=\/[^/\n]*\/)/, - contains: [ - { - className: 'regexp', - begin: /\//, - end: /\/[gimuy]*/, - illegal: /\n/, - contains: [L, { begin: /\[/, end: /\]/, relevance: 0, contains: [L] }] - } - ] - }, - ce = { className: 'title', begin: _, relevance: 0 }, - pe = { className: 'title', begin: w, relevance: 0 }, - de = { begin: '\\.\\s*' + w, relevance: 0 }; - var fe = Object.freeze({ - __proto__: null, - MATCH_NOTHING_RE: /\b\B/, - IDENT_RE: _, - UNDERSCORE_IDENT_RE: w, - NUMBER_RE: x, - C_NUMBER_RE: C, - BINARY_NUMBER_RE: j, - RE_STARTERS_RE: - '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~', - SHEBANG: (s = {}) => { - const o = /^#![ ]*\//; - return ( - s.binary && - (s.begin = (function concat(...s) { - return s.map((s) => source(s)).join(''); - })(o, /.*\b/, s.binary, /\b.*/)), - inherit( - { - className: 'meta', - begin: o, - end: /$/, - relevance: 0, - 'on:begin': (s, o) => { - 0 !== s.index && o.ignoreMatch(); - } - }, - s - ) - ); - }, - BACKSLASH_ESCAPE: L, - APOS_STRING_MODE: B, - QUOTE_STRING_MODE: $, - PHRASAL_WORDS_MODE: V, - COMMENT, - C_LINE_COMMENT_MODE: U, - C_BLOCK_COMMENT_MODE: z, - HASH_COMMENT_MODE: Y, - NUMBER_MODE: Z, - C_NUMBER_MODE: ee, - BINARY_NUMBER_MODE: ie, - CSS_NUMBER_MODE: ae, - REGEXP_MODE: le, - TITLE_MODE: ce, - UNDERSCORE_TITLE_MODE: pe, - METHOD_GUARD: de, - END_SAME_AS_BEGIN: function (s) { - return Object.assign(s, { - 'on:begin': (s, o) => { - o.data._beginMatch = s[1]; - }, - 'on:end': (s, o) => { - o.data._beginMatch !== s[1] && o.ignoreMatch(); - } - }); - } - }); - function skipIfhasPrecedingDot(s, o) { - '.' === s.input[s.index - 1] && o.ignoreMatch(); - } - function beginKeywords(s, o) { - o && - s.beginKeywords && - ((s.begin = '\\b(' + s.beginKeywords.split(' ').join('|') + ')(?!\\.)(?=\\b|\\s)'), - (s.__beforeBegin = skipIfhasPrecedingDot), - (s.keywords = s.keywords || s.beginKeywords), - delete s.beginKeywords, - void 0 === s.relevance && (s.relevance = 0)); - } - function compileIllegal(s, o) { - Array.isArray(s.illegal) && - (s.illegal = (function either(...s) { - return '(' + s.map((s) => source(s)).join('|') + ')'; - })(...s.illegal)); - } - function compileMatch(s, o) { - if (s.match) { - if (s.begin || s.end) throw new Error('begin & end are not supported with match'); - ((s.begin = s.match), delete s.match); - } - } - function compileRelevance(s, o) { - void 0 === s.relevance && (s.relevance = 1); - } - const ye = [ - 'of', - 'and', - 'for', - 'in', - 'not', - 'or', - 'if', - 'then', - 'parent', - 'list', - 'value' - ]; - function compileKeywords(s, o, i = 'keyword') { - const u = {}; - return ( - 'string' == typeof s - ? compileList(i, s.split(' ')) - : Array.isArray(s) - ? compileList(i, s) - : Object.keys(s).forEach(function (i) { - Object.assign(u, compileKeywords(s[i], o, i)); - }), - u - ); - function compileList(s, i) { - (o && (i = i.map((s) => s.toLowerCase())), - i.forEach(function (o) { - const i = o.split('|'); - u[i[0]] = [s, scoreForKeyword(i[0], i[1])]; - })); - } - } - function scoreForKeyword(s, o) { - return o - ? Number(o) - : (function commonKeyword(s) { - return ye.includes(s.toLowerCase()); - })(s) - ? 0 - : 1; - } - function compileLanguage(s, { plugins: o }) { - function langRe(o, i) { - return new RegExp(source(o), 'm' + (s.case_insensitive ? 'i' : '') + (i ? 'g' : '')); - } - class MultiRegex { - constructor() { - ((this.matchIndexes = {}), - (this.regexes = []), - (this.matchAt = 1), - (this.position = 0)); - } - addRule(s, o) { - ((o.position = this.position++), - (this.matchIndexes[this.matchAt] = o), - this.regexes.push([o, s]), - (this.matchAt += - (function countMatchGroups(s) { - return new RegExp(s.toString() + '|').exec('').length - 1; - })(s) + 1)); - } - compile() { - 0 === this.regexes.length && (this.exec = () => null); - const s = this.regexes.map((s) => s[1]); - ((this.matcherRe = langRe( - (function join(s, o = '|') { - let i = 0; - return s - .map((s) => { - i += 1; - const o = i; - let _ = source(s), - w = ''; - for (; _.length > 0; ) { - const s = u.exec(_); - if (!s) { - w += _; - break; - } - ((w += _.substring(0, s.index)), - (_ = _.substring(s.index + s[0].length)), - '\\' === s[0][0] && s[1] - ? (w += '\\' + String(Number(s[1]) + o)) - : ((w += s[0]), '(' === s[0] && i++)); - } - return w; - }) - .map((s) => `(${s})`) - .join(o); - })(s), - !0 - )), - (this.lastIndex = 0)); - } - exec(s) { - this.matcherRe.lastIndex = this.lastIndex; - const o = this.matcherRe.exec(s); - if (!o) return null; - const i = o.findIndex((s, o) => o > 0 && void 0 !== s), - u = this.matchIndexes[i]; - return (o.splice(0, i), Object.assign(o, u)); - } - } - class ResumableMultiRegex { - constructor() { - ((this.rules = []), - (this.multiRegexes = []), - (this.count = 0), - (this.lastIndex = 0), - (this.regexIndex = 0)); - } - getMatcher(s) { - if (this.multiRegexes[s]) return this.multiRegexes[s]; - const o = new MultiRegex(); - return ( - this.rules.slice(s).forEach(([s, i]) => o.addRule(s, i)), - o.compile(), - (this.multiRegexes[s] = o), - o - ); - } - resumingScanAtSamePosition() { - return 0 !== this.regexIndex; - } - considerAll() { - this.regexIndex = 0; - } - addRule(s, o) { - (this.rules.push([s, o]), 'begin' === o.type && this.count++); - } - exec(s) { - const o = this.getMatcher(this.regexIndex); - o.lastIndex = this.lastIndex; - let i = o.exec(s); - if (this.resumingScanAtSamePosition()) - if (i && i.index === this.lastIndex); - else { - const o = this.getMatcher(0); - ((o.lastIndex = this.lastIndex + 1), (i = o.exec(s))); - } - return ( - i && - ((this.regexIndex += i.position + 1), - this.regexIndex === this.count && this.considerAll()), - i - ); - } - } - if ( - (s.compilerExtensions || (s.compilerExtensions = []), - s.contains && s.contains.includes('self')) - ) - throw new Error( - 'ERR: contains `self` is not supported at the top-level of a language. See documentation.' - ); - return ( - (s.classNameAliases = inherit(s.classNameAliases || {})), - (function compileMode(o, i) { - const u = o; - if (o.isCompiled) return u; - ([compileMatch].forEach((s) => s(o, i)), - s.compilerExtensions.forEach((s) => s(o, i)), - (o.__beforeBegin = null), - [beginKeywords, compileIllegal, compileRelevance].forEach((s) => s(o, i)), - (o.isCompiled = !0)); - let _ = null; - if ( - ('object' == typeof o.keywords && - ((_ = o.keywords.$pattern), delete o.keywords.$pattern), - o.keywords && (o.keywords = compileKeywords(o.keywords, s.case_insensitive)), - o.lexemes && _) - ) - throw new Error( - 'ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ' - ); - return ( - (_ = _ || o.lexemes || /\w+/), - (u.keywordPatternRe = langRe(_, !0)), - i && - (o.begin || (o.begin = /\B|\b/), - (u.beginRe = langRe(o.begin)), - o.endSameAsBegin && (o.end = o.begin), - o.end || o.endsWithParent || (o.end = /\B|\b/), - o.end && (u.endRe = langRe(o.end)), - (u.terminatorEnd = source(o.end) || ''), - o.endsWithParent && - i.terminatorEnd && - (u.terminatorEnd += (o.end ? '|' : '') + i.terminatorEnd)), - o.illegal && (u.illegalRe = langRe(o.illegal)), - o.contains || (o.contains = []), - (o.contains = [].concat( - ...o.contains.map(function (s) { - return (function expandOrCloneMode(s) { - s.variants && - !s.cachedVariants && - (s.cachedVariants = s.variants.map(function (o) { - return inherit(s, { variants: null }, o); - })); - if (s.cachedVariants) return s.cachedVariants; - if (dependencyOnParent(s)) - return inherit(s, { starts: s.starts ? inherit(s.starts) : null }); - if (Object.isFrozen(s)) return inherit(s); - return s; - })('self' === s ? o : s); - }) - )), - o.contains.forEach(function (s) { - compileMode(s, u); - }), - o.starts && compileMode(o.starts, i), - (u.matcher = (function buildModeRegex(s) { - const o = new ResumableMultiRegex(); - return ( - s.contains.forEach((s) => o.addRule(s.begin, { rule: s, type: 'begin' })), - s.terminatorEnd && o.addRule(s.terminatorEnd, { type: 'end' }), - s.illegal && o.addRule(s.illegal, { type: 'illegal' }), - o - ); - })(u)), - u - ); - })(s) - ); - } - function dependencyOnParent(s) { - return !!s && (s.endsWithParent || dependencyOnParent(s.starts)); - } - function BuildVuePlugin(s) { - const o = { - props: ['language', 'code', 'autodetect'], - data: function () { - return { detectedLanguage: '', unknownLanguage: !1 }; - }, - computed: { - className() { - return this.unknownLanguage ? '' : 'hljs ' + this.detectedLanguage; - }, - highlighted() { - if (!this.autoDetect && !s.getLanguage(this.language)) - return ( - console.warn( - `The language "${this.language}" you specified could not be found.` - ), - (this.unknownLanguage = !0), - escapeHTML(this.code) - ); - let o = {}; - return ( - this.autoDetect - ? ((o = s.highlightAuto(this.code)), (this.detectedLanguage = o.language)) - : ((o = s.highlight(this.language, this.code, this.ignoreIllegals)), - (this.detectedLanguage = this.language)), - o.value - ); - }, - autoDetect() { - return ( - !this.language || - (function hasValueOrEmptyAttribute(s) { - return Boolean(s || '' === s); - })(this.autodetect) - ); - }, - ignoreIllegals: () => !0 - }, - render(s) { - return s('pre', {}, [ - s('code', { class: this.className, domProps: { innerHTML: this.highlighted } }) - ]); - } - }; - return { - Component: o, - VuePlugin: { - install(s) { - s.component('highlightjs', o); - } - } - }; - } - const be = { - 'after:highlightElement': ({ el: s, result: o, text: i }) => { - const u = nodeStream(s); - if (!u.length) return; - const _ = document.createElement('div'); - ((_.innerHTML = o.value), - (o.value = (function mergeStreams(s, o, i) { - let u = 0, - _ = ''; - const w = []; - function selectStream() { - return s.length && o.length - ? s[0].offset !== o[0].offset - ? s[0].offset < o[0].offset - ? s - : o - : 'start' === o[0].event - ? s - : o - : s.length - ? s - : o; - } - function open(s) { - function attributeString(s) { - return ' ' + s.nodeName + '="' + escapeHTML(s.value) + '"'; - } - _ += '<' + tag(s) + [].map.call(s.attributes, attributeString).join('') + '>'; - } - function close(s) { - _ += ''; - } - function render(s) { - ('start' === s.event ? open : close)(s.node); - } - for (; s.length || o.length; ) { - let o = selectStream(); - if ( - ((_ += escapeHTML(i.substring(u, o[0].offset))), (u = o[0].offset), o === s) - ) { - w.reverse().forEach(close); - do { - (render(o.splice(0, 1)[0]), (o = selectStream())); - } while (o === s && o.length && o[0].offset === u); - w.reverse().forEach(open); - } else - ('start' === o[0].event ? w.push(o[0].node) : w.pop(), - render(o.splice(0, 1)[0])); - } - return _ + escapeHTML(i.substr(u)); - })(u, nodeStream(_), i))); - } - }; - function tag(s) { - return s.nodeName.toLowerCase(); - } - function nodeStream(s) { - const o = []; - return ( - (function _nodeStream(s, i) { - for (let u = s.firstChild; u; u = u.nextSibling) - 3 === u.nodeType - ? (i += u.nodeValue.length) - : 1 === u.nodeType && - (o.push({ event: 'start', offset: i, node: u }), - (i = _nodeStream(u, i)), - tag(u).match(/br|hr|img|input/) || - o.push({ event: 'stop', offset: i, node: u })); - return i; - })(s, 0), - o - ); - } - const _e = {}, - error = (s) => { - console.error(s); - }, - warn = (s, ...o) => { - console.log(`WARN: ${s}`, ...o); - }, - deprecated = (s, o) => { - _e[`${s}/${o}`] || - (console.log(`Deprecated as of ${s}. ${o}`), (_e[`${s}/${o}`] = !0)); - }, - we = escapeHTML, - Se = inherit, - xe = Symbol('nomatch'); - var Pe = (function (s) { - const i = Object.create(null), - u = Object.create(null), - _ = []; - let w = !0; - const x = /(^(<[^>]+>|\t|)+|\n)/gm, - C = - "Could not find the language '{}', did you forget to load/include a language module?", - j = { disableAutodetect: !0, name: 'Plain text', contains: [] }; - let L = { - noHighlightRe: /^(no-?highlight)$/i, - languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, - classPrefix: 'hljs-', - tabReplace: null, - useBR: !1, - languages: null, - __emitter: TokenTreeEmitter - }; - function shouldNotHighlight(s) { - return L.noHighlightRe.test(s); - } - function highlight(s, o, i, u) { - let _ = '', - w = ''; - 'object' == typeof o - ? ((_ = s), (i = o.ignoreIllegals), (w = o.language), (u = void 0)) - : (deprecated('10.7.0', 'highlight(lang, code, ...args) has been deprecated.'), - deprecated( - '10.7.0', - 'Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277' - ), - (w = s), - (_ = o)); - const x = { code: _, language: w }; - fire('before:highlight', x); - const C = x.result ? x.result : _highlight(x.language, x.code, i, u); - return ((C.code = x.code), fire('after:highlight', C), C); - } - function _highlight(s, o, u, x) { - function keywordData(s, o) { - const i = B.case_insensitive ? o[0].toLowerCase() : o[0]; - return Object.prototype.hasOwnProperty.call(s.keywords, i) && s.keywords[i]; - } - function processBuffer() { - (null != U.subLanguage - ? (function processSubLanguage() { - if ('' === Z) return; - let s = null; - if ('string' == typeof U.subLanguage) { - if (!i[U.subLanguage]) return void Y.addText(Z); - ((s = _highlight(U.subLanguage, Z, !0, z[U.subLanguage])), - (z[U.subLanguage] = s.top)); - } else s = highlightAuto(Z, U.subLanguage.length ? U.subLanguage : null); - (U.relevance > 0 && (ee += s.relevance), - Y.addSublanguage(s.emitter, s.language)); - })() - : (function processKeywords() { - if (!U.keywords) return void Y.addText(Z); - let s = 0; - U.keywordPatternRe.lastIndex = 0; - let o = U.keywordPatternRe.exec(Z), - i = ''; - for (; o; ) { - i += Z.substring(s, o.index); - const u = keywordData(U, o); - if (u) { - const [s, _] = u; - if ((Y.addText(i), (i = ''), (ee += _), s.startsWith('_'))) i += o[0]; - else { - const i = B.classNameAliases[s] || s; - Y.addKeyword(o[0], i); - } - } else i += o[0]; - ((s = U.keywordPatternRe.lastIndex), (o = U.keywordPatternRe.exec(Z))); - } - ((i += Z.substr(s)), Y.addText(i)); - })(), - (Z = '')); - } - function startNewMode(s) { - return ( - s.className && Y.openNode(B.classNameAliases[s.className] || s.className), - (U = Object.create(s, { parent: { value: U } })), - U - ); - } - function endOfMode(s, o, i) { - let u = (function startsWith(s, o) { - const i = s && s.exec(o); - return i && 0 === i.index; - })(s.endRe, i); - if (u) { - if (s['on:end']) { - const i = new Response(s); - (s['on:end'](o, i), i.isMatchIgnored && (u = !1)); - } - if (u) { - for (; s.endsParent && s.parent; ) s = s.parent; - return s; - } - } - if (s.endsWithParent) return endOfMode(s.parent, o, i); - } - function doIgnore(s) { - return 0 === U.matcher.regexIndex ? ((Z += s[0]), 1) : ((le = !0), 0); - } - function doBeginMatch(s) { - const o = s[0], - i = s.rule, - u = new Response(i), - _ = [i.__beforeBegin, i['on:begin']]; - for (const i of _) if (i && (i(s, u), u.isMatchIgnored)) return doIgnore(o); - return ( - i && - i.endSameAsBegin && - (i.endRe = (function escape(s) { - return new RegExp(s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'), 'm'); - })(o)), - i.skip - ? (Z += o) - : (i.excludeBegin && (Z += o), - processBuffer(), - i.returnBegin || i.excludeBegin || (Z = o)), - startNewMode(i), - i.returnBegin ? 0 : o.length - ); - } - function doEndMatch(s) { - const i = s[0], - u = o.substr(s.index), - _ = endOfMode(U, s, u); - if (!_) return xe; - const w = U; - w.skip - ? (Z += i) - : (w.returnEnd || w.excludeEnd || (Z += i), - processBuffer(), - w.excludeEnd && (Z = i)); - do { - (U.className && Y.closeNode(), - U.skip || U.subLanguage || (ee += U.relevance), - (U = U.parent)); - } while (U !== _.parent); - return ( - _.starts && - (_.endSameAsBegin && (_.starts.endRe = _.endRe), startNewMode(_.starts)), - w.returnEnd ? 0 : i.length - ); - } - let j = {}; - function processLexeme(i, _) { - const x = _ && _[0]; - if (((Z += i), null == x)) return (processBuffer(), 0); - if ('begin' === j.type && 'end' === _.type && j.index === _.index && '' === x) { - if (((Z += o.slice(_.index, _.index + 1)), !w)) { - const o = new Error('0 width match regex'); - throw ((o.languageName = s), (o.badRule = j.rule), o); - } - return 1; - } - if (((j = _), 'begin' === _.type)) return doBeginMatch(_); - if ('illegal' === _.type && !u) { - const s = new Error( - 'Illegal lexeme "' + x + '" for mode "' + (U.className || '') + '"' - ); - throw ((s.mode = U), s); - } - if ('end' === _.type) { - const s = doEndMatch(_); - if (s !== xe) return s; - } - if ('illegal' === _.type && '' === x) return 1; - if (ae > 1e5 && ae > 3 * _.index) { - throw new Error('potential infinite loop, way more iterations than matches'); - } - return ((Z += x), x.length); - } - const B = getLanguage(s); - if (!B) throw (error(C.replace('{}', s)), new Error('Unknown language: "' + s + '"')); - const $ = compileLanguage(B, { plugins: _ }); - let V = '', - U = x || $; - const z = {}, - Y = new L.__emitter(L); - !(function processContinuations() { - const s = []; - for (let o = U; o !== B; o = o.parent) o.className && s.unshift(o.className); - s.forEach((s) => Y.openNode(s)); - })(); - let Z = '', - ee = 0, - ie = 0, - ae = 0, - le = !1; - try { - for (U.matcher.considerAll(); ; ) { - (ae++, le ? (le = !1) : U.matcher.considerAll(), (U.matcher.lastIndex = ie)); - const s = U.matcher.exec(o); - if (!s) break; - const i = processLexeme(o.substring(ie, s.index), s); - ie = s.index + i; - } - return ( - processLexeme(o.substr(ie)), - Y.closeAllNodes(), - Y.finalize(), - (V = Y.toHTML()), - { - relevance: Math.floor(ee), - value: V, - language: s, - illegal: !1, - emitter: Y, - top: U - } - ); - } catch (i) { - if (i.message && i.message.includes('Illegal')) - return { - illegal: !0, - illegalBy: { - msg: i.message, - context: o.slice(ie - 100, ie + 100), - mode: i.mode - }, - sofar: V, - relevance: 0, - value: we(o), - emitter: Y - }; - if (w) - return { - illegal: !1, - relevance: 0, - value: we(o), - emitter: Y, - language: s, - top: U, - errorRaised: i - }; - throw i; - } - } - function highlightAuto(s, o) { - o = o || L.languages || Object.keys(i); - const u = (function justTextHighlightResult(s) { - const o = { - relevance: 0, - emitter: new L.__emitter(L), - value: we(s), - illegal: !1, - top: j - }; - return (o.emitter.addText(s), o); - })(s), - _ = o - .filter(getLanguage) - .filter(autoDetection) - .map((o) => _highlight(o, s, !1)); - _.unshift(u); - const w = _.sort((s, o) => { - if (s.relevance !== o.relevance) return o.relevance - s.relevance; - if (s.language && o.language) { - if (getLanguage(s.language).supersetOf === o.language) return 1; - if (getLanguage(o.language).supersetOf === s.language) return -1; - } - return 0; - }), - [x, C] = w, - B = x; - return ((B.second_best = C), B); - } - const B = { - 'before:highlightElement': ({ el: s }) => { - L.useBR && - (s.innerHTML = s.innerHTML.replace(/\n/g, '').replace(//g, '\n')); - }, - 'after:highlightElement': ({ result: s }) => { - L.useBR && (s.value = s.value.replace(/\n/g, '
')); - } - }, - $ = /^(<[^>]+>|\t)+/gm, - V = { - 'after:highlightElement': ({ result: s }) => { - L.tabReplace && - (s.value = s.value.replace($, (s) => s.replace(/\t/g, L.tabReplace))); - } - }; - function highlightElement(s) { - let o = null; - const i = (function blockLanguage(s) { - let o = s.className + ' '; - o += s.parentNode ? s.parentNode.className : ''; - const i = L.languageDetectRe.exec(o); - if (i) { - const o = getLanguage(i[1]); - return ( - o || - (warn(C.replace('{}', i[1])), - warn('Falling back to no-highlight mode for this block.', s)), - o ? i[1] : 'no-highlight' - ); - } - return o.split(/\s+/).find((s) => shouldNotHighlight(s) || getLanguage(s)); - })(s); - if (shouldNotHighlight(i)) return; - (fire('before:highlightElement', { el: s, language: i }), (o = s)); - const _ = o.textContent, - w = i ? highlight(_, { language: i, ignoreIllegals: !0 }) : highlightAuto(_); - (fire('after:highlightElement', { el: s, result: w, text: _ }), - (s.innerHTML = w.value), - (function updateClassName(s, o, i) { - const _ = o ? u[o] : i; - (s.classList.add('hljs'), _ && s.classList.add(_)); - })(s, i, w.language), - (s.result = { language: w.language, re: w.relevance, relavance: w.relevance }), - w.second_best && - (s.second_best = { - language: w.second_best.language, - re: w.second_best.relevance, - relavance: w.second_best.relevance - })); - } - const initHighlighting = () => { - if (initHighlighting.called) return; - ((initHighlighting.called = !0), - deprecated( - '10.6.0', - 'initHighlighting() is deprecated. Use highlightAll() instead.' - )); - document.querySelectorAll('pre code').forEach(highlightElement); - }; - let U = !1; - function highlightAll() { - if ('loading' === document.readyState) return void (U = !0); - document.querySelectorAll('pre code').forEach(highlightElement); - } - function getLanguage(s) { - return ((s = (s || '').toLowerCase()), i[s] || i[u[s]]); - } - function registerAliases(s, { languageName: o }) { - ('string' == typeof s && (s = [s]), - s.forEach((s) => { - u[s.toLowerCase()] = o; - })); - } - function autoDetection(s) { - const o = getLanguage(s); - return o && !o.disableAutodetect; - } - function fire(s, o) { - const i = s; - _.forEach(function (s) { - s[i] && s[i](o); - }); - } - ('undefined' != typeof window && - window.addEventListener && - window.addEventListener( - 'DOMContentLoaded', - function boot() { - U && highlightAll(); - }, - !1 - ), - Object.assign(s, { - highlight, - highlightAuto, - highlightAll, - fixMarkup: function deprecateFixMarkup(s) { - return ( - deprecated('10.2.0', 'fixMarkup will be removed entirely in v11.0'), - deprecated( - '10.2.0', - 'Please see https://github.com/highlightjs/highlight.js/issues/2534' - ), - (function fixMarkup(s) { - return L.tabReplace || L.useBR - ? s.replace(x, (s) => - '\n' === s - ? L.useBR - ? '
' - : s - : L.tabReplace - ? s.replace(/\t/g, L.tabReplace) - : s - ) - : s; - })(s) - ); - }, - highlightElement, - highlightBlock: function deprecateHighlightBlock(s) { - return ( - deprecated('10.7.0', 'highlightBlock will be removed entirely in v12.0'), - deprecated('10.7.0', 'Please use highlightElement now.'), - highlightElement(s) - ); - }, - configure: function configure(s) { - (s.useBR && - (deprecated('10.3.0', "'useBR' will be removed entirely in v11.0"), - deprecated( - '10.3.0', - 'Please see https://github.com/highlightjs/highlight.js/issues/2559' - )), - (L = Se(L, s))); - }, - initHighlighting, - initHighlightingOnLoad: function initHighlightingOnLoad() { - (deprecated( - '10.6.0', - 'initHighlightingOnLoad() is deprecated. Use highlightAll() instead.' - ), - (U = !0)); - }, - registerLanguage: function registerLanguage(o, u) { - let _ = null; - try { - _ = u(s); - } catch (s) { - if ( - (error( - "Language definition for '{}' could not be registered.".replace('{}', o) - ), - !w) - ) - throw s; - (error(s), (_ = j)); - } - (_.name || (_.name = o), - (i[o] = _), - (_.rawDefinition = u.bind(null, s)), - _.aliases && registerAliases(_.aliases, { languageName: o })); - }, - unregisterLanguage: function unregisterLanguage(s) { - delete i[s]; - for (const o of Object.keys(u)) u[o] === s && delete u[o]; - }, - listLanguages: function listLanguages() { - return Object.keys(i); - }, - getLanguage, - registerAliases, - requireLanguage: function requireLanguage(s) { - (deprecated('10.4.0', 'requireLanguage will be removed entirely in v11.'), - deprecated( - '10.4.0', - 'Please see https://github.com/highlightjs/highlight.js/pull/2844' - )); - const o = getLanguage(s); - if (o) return o; - throw new Error( - "The '{}' language is required, but not loaded.".replace('{}', s) - ); - }, - autoDetection, - inherit: Se, - addPlugin: function addPlugin(s) { - (!(function upgradePluginAPI(s) { - (s['before:highlightBlock'] && - !s['before:highlightElement'] && - (s['before:highlightElement'] = (o) => { - s['before:highlightBlock'](Object.assign({ block: o.el }, o)); - }), - s['after:highlightBlock'] && - !s['after:highlightElement'] && - (s['after:highlightElement'] = (o) => { - s['after:highlightBlock'](Object.assign({ block: o.el }, o)); - })); - })(s), - _.push(s)); - }, - vuePlugin: BuildVuePlugin(s).VuePlugin - }), - (s.debugMode = function () { - w = !1; - }), - (s.safeMode = function () { - w = !0; - }), - (s.versionString = '10.7.3')); - for (const s in fe) 'object' == typeof fe[s] && o(fe[s]); - return (Object.assign(s, fe), s.addPlugin(B), s.addPlugin(be), s.addPlugin(V), s); - })({}); - s.exports = Pe; - }, - 35344: (s) => { - function concat(...s) { - return s - .map((s) => - (function source(s) { - return s ? ('string' == typeof s ? s : s.source) : null; - })(s) - ) - .join(''); - } - s.exports = function bash(s) { - const o = {}, - i = { begin: /\$\{/, end: /\}/, contains: ['self', { begin: /:-/, contains: [o] }] }; - Object.assign(o, { - className: 'variable', - variants: [{ begin: concat(/\$[\w\d#@][\w\d_]*/, '(?![\\w\\d])(?![$])') }, i] - }); - const u = { - className: 'subst', - begin: /\$\(/, - end: /\)/, - contains: [s.BACKSLASH_ESCAPE] - }, - _ = { - begin: /<<-?\s*(?=\w+)/, - starts: { - contains: [ - s.END_SAME_AS_BEGIN({ begin: /(\w+)/, end: /(\w+)/, className: 'string' }) - ] - } - }, - w = { - className: 'string', - begin: /"/, - end: /"/, - contains: [s.BACKSLASH_ESCAPE, o, u] - }; - u.contains.push(w); - const x = { - begin: /\$\(\(/, - end: /\)\)/, - contains: [{ begin: /\d+#[0-9a-f]+/, className: 'number' }, s.NUMBER_MODE, o] - }, - C = s.SHEBANG({ - binary: `(${['fish', 'bash', 'zsh', 'sh', 'csh', 'ksh', 'tcsh', 'dash', 'scsh'].join('|')})`, - relevance: 10 - }), - j = { - className: 'function', - begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, - returnBegin: !0, - contains: [s.inherit(s.TITLE_MODE, { begin: /\w[\w\d_]*/ })], - relevance: 0 - }; - return { - name: 'Bash', - aliases: ['sh', 'zsh'], - keywords: { - $pattern: /\b[a-z._-]+\b/, - keyword: 'if then else elif fi for while in do done case esac function', - literal: 'true false', - built_in: - 'break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp' - }, - contains: [ - C, - s.SHEBANG(), - j, - x, - s.HASH_COMMENT_MODE, - _, - w, - { className: '', begin: /\\"/ }, - { className: 'string', begin: /'/, end: /'/ }, - o - ] - }; - }; - }, - 73402: (s) => { - function concat(...s) { - return s - .map((s) => - (function source(s) { - return s ? ('string' == typeof s ? s : s.source) : null; - })(s) - ) - .join(''); - } - s.exports = function http(s) { - const o = 'HTTP/(2|1\\.[01])', - i = { - className: 'attribute', - begin: concat('^', /[A-Za-z][A-Za-z0-9-]*/, '(?=\\:\\s)'), - starts: { - contains: [ - { - className: 'punctuation', - begin: /: /, - relevance: 0, - starts: { end: '$', relevance: 0 } - } - ] - } - }, - u = [i, { begin: '\\n\\n', starts: { subLanguage: [], endsWithParent: !0 } }]; - return { - name: 'HTTP', - aliases: ['https'], - illegal: /\S/, - contains: [ - { - begin: '^(?=' + o + ' \\d{3})', - end: /$/, - contains: [ - { className: 'meta', begin: o }, - { className: 'number', begin: '\\b\\d{3}\\b' } - ], - starts: { end: /\b\B/, illegal: /\S/, contains: u } - }, - { - begin: '(?=^[A-Z]+ (.*?) ' + o + '$)', - end: /$/, - contains: [ - { className: 'string', begin: ' ', end: ' ', excludeBegin: !0, excludeEnd: !0 }, - { className: 'meta', begin: o }, - { className: 'keyword', begin: '[A-Z]+' } - ], - starts: { end: /\b\B/, illegal: /\S/, contains: u } - }, - s.inherit(i, { relevance: 0 }) - ] - }; - }; - }, - 95089: (s) => { - const o = '[A-Za-z$_][0-9A-Za-z$_]*', - i = [ - 'as', - 'in', - 'of', - 'if', - 'for', - 'while', - 'finally', - 'var', - 'new', - 'function', - 'do', - 'return', - 'void', - 'else', - 'break', - 'catch', - 'instanceof', - 'with', - 'throw', - 'case', - 'default', - 'try', - 'switch', - 'continue', - 'typeof', - 'delete', - 'let', - 'yield', - 'const', - 'class', - 'debugger', - 'async', - 'await', - 'static', - 'import', - 'from', - 'export', - 'extends' - ], - u = ['true', 'false', 'null', 'undefined', 'NaN', 'Infinity'], - _ = [].concat( - [ - 'setInterval', - 'setTimeout', - 'clearInterval', - 'clearTimeout', - 'require', - 'exports', - 'eval', - 'isFinite', - 'isNaN', - 'parseFloat', - 'parseInt', - 'decodeURI', - 'decodeURIComponent', - 'encodeURI', - 'encodeURIComponent', - 'escape', - 'unescape' - ], - [ - 'arguments', - 'this', - 'super', - 'console', - 'window', - 'document', - 'localStorage', - 'module', - 'global' - ], - [ - 'Intl', - 'DataView', - 'Number', - 'Math', - 'Date', - 'String', - 'RegExp', - 'Object', - 'Function', - 'Boolean', - 'Error', - 'Symbol', - 'Set', - 'Map', - 'WeakSet', - 'WeakMap', - 'Proxy', - 'Reflect', - 'JSON', - 'Promise', - 'Float64Array', - 'Int16Array', - 'Int32Array', - 'Int8Array', - 'Uint16Array', - 'Uint32Array', - 'Float32Array', - 'Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'ArrayBuffer', - 'BigInt64Array', - 'BigUint64Array', - 'BigInt' - ], - [ - 'EvalError', - 'InternalError', - 'RangeError', - 'ReferenceError', - 'SyntaxError', - 'TypeError', - 'URIError' - ] - ); - function lookahead(s) { - return concat('(?=', s, ')'); - } - function concat(...s) { - return s - .map((s) => - (function source(s) { - return s ? ('string' == typeof s ? s : s.source) : null; - })(s) - ) - .join(''); - } - s.exports = function javascript(s) { - const w = o, - x = '<>', - C = '', - j = { - begin: /<[A-Za-z0-9\\._:-]+/, - end: /\/[A-Za-z0-9\\._:-]+>|\/>/, - isTrulyOpeningTag: (s, o) => { - const i = s[0].length + s.index, - u = s.input[i]; - '<' !== u - ? '>' === u && - (((s, { after: o }) => { - const i = '', - returnBegin: !0, - end: '\\s*=>', - contains: [ - { - className: 'params', - variants: [ - { begin: s.UNDERSCORE_IDENT_RE, relevance: 0 }, - { className: null, begin: /\(\s*\)/, skip: !0 }, - { - begin: /\(/, - end: /\)/, - excludeBegin: !0, - excludeEnd: !0, - keywords: L, - contains: ce - } - ] - } - ] - }, - { begin: /,/, relevance: 0 }, - { className: '', begin: /\s/, end: /\s*/, skip: !0 }, - { - variants: [ - { begin: x, end: C }, - { begin: j.begin, 'on:begin': j.isTrulyOpeningTag, end: j.end } - ], - subLanguage: 'xml', - contains: [{ begin: j.begin, end: j.end, skip: !0, contains: ['self'] }] - } - ], - relevance: 0 - }, - { - className: 'function', - beginKeywords: 'function', - end: /[{;]/, - excludeEnd: !0, - keywords: L, - contains: ['self', s.inherit(s.TITLE_MODE, { begin: w }), pe], - illegal: /%/ - }, - { beginKeywords: 'while if switch catch for' }, - { - className: 'function', - begin: - s.UNDERSCORE_IDENT_RE + - '\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{', - returnBegin: !0, - contains: [pe, s.inherit(s.TITLE_MODE, { begin: w })] - }, - { variants: [{ begin: '\\.' + w }, { begin: '\\$' + w }], relevance: 0 }, - { - className: 'class', - beginKeywords: 'class', - end: /[{;=]/, - excludeEnd: !0, - illegal: /[:"[\]]/, - contains: [{ beginKeywords: 'extends' }, s.UNDERSCORE_TITLE_MODE] - }, - { - begin: /\b(?=constructor)/, - end: /[{;]/, - excludeEnd: !0, - contains: [s.inherit(s.TITLE_MODE, { begin: w }), 'self', pe] - }, - { - begin: '(get|set)\\s+(?=' + w + '\\()', - end: /\{/, - keywords: 'get set', - contains: [s.inherit(s.TITLE_MODE, { begin: w }), { begin: /\(\)/ }, pe] - }, - { begin: /\$[(.]/ } - ] - }; - }; - }, - 65772: (s) => { - s.exports = function json(s) { - const o = { literal: 'true false null' }, - i = [s.C_LINE_COMMENT_MODE, s.C_BLOCK_COMMENT_MODE], - u = [s.QUOTE_STRING_MODE, s.C_NUMBER_MODE], - _ = { end: ',', endsWithParent: !0, excludeEnd: !0, contains: u, keywords: o }, - w = { - begin: /\{/, - end: /\}/, - contains: [ - { - className: 'attr', - begin: /"/, - end: /"/, - contains: [s.BACKSLASH_ESCAPE], - illegal: '\\n' - }, - s.inherit(_, { begin: /:/ }) - ].concat(i), - illegal: '\\S' - }, - x = { begin: '\\[', end: '\\]', contains: [s.inherit(_)], illegal: '\\S' }; - return ( - u.push(w, x), - i.forEach(function (s) { - u.push(s); - }), - { name: 'JSON', contains: u, keywords: o, illegal: '\\S' } - ); - }; - }, - 26571: (s) => { - s.exports = function powershell(s) { - const o = { - $pattern: /-?[A-z\.\-]+\b/, - keyword: - 'if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter', - built_in: - 'ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write' - }, - i = { begin: '`[\\s\\S]', relevance: 0 }, - u = { - className: 'variable', - variants: [ - { begin: /\$\B/ }, - { className: 'keyword', begin: /\$this/ }, - { begin: /\$[\w\d][\w\d_:]*/ } - ] - }, - _ = { - className: 'string', - variants: [ - { begin: /"/, end: /"/ }, - { begin: /@"/, end: /^"@/ } - ], - contains: [i, u, { className: 'variable', begin: /\$[A-z]/, end: /[^A-z]/ }] - }, - w = { - className: 'string', - variants: [ - { begin: /'/, end: /'/ }, - { begin: /@'/, end: /^'@/ } - ] - }, - x = s.inherit(s.COMMENT(null, null), { - variants: [ - { begin: /#/, end: /$/ }, - { begin: /<#/, end: /#>/ } - ], - contains: [ - { - className: 'doctag', - variants: [ - { - begin: - /\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/ - }, - { - begin: - /\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/ - } - ] - } - ] - }), - C = { - className: 'built_in', - variants: [ - { - begin: '('.concat( - 'Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where', - ')+(-)[\\w\\d]+' - ) - } - ] - }, - j = { - className: 'class', - beginKeywords: 'class enum', - end: /\s*[{]/, - excludeEnd: !0, - relevance: 0, - contains: [s.TITLE_MODE] - }, - L = { - className: 'function', - begin: /function\s+/, - end: /\s*\{|$/, - excludeEnd: !0, - returnBegin: !0, - relevance: 0, - contains: [ - { begin: 'function', relevance: 0, className: 'keyword' }, - { className: 'title', begin: /\w[\w\d]*((-)[\w\d]+)*/, relevance: 0 }, - { begin: /\(/, end: /\)/, className: 'params', relevance: 0, contains: [u] } - ] - }, - B = { - begin: /using\s/, - end: /$/, - returnBegin: !0, - contains: [ - _, - w, - { className: 'keyword', begin: /(using|assembly|command|module|namespace|type)/ } - ] - }, - $ = { - variants: [ - { - className: 'operator', - begin: '('.concat( - '-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor', - ')\\b' - ) - }, - { className: 'literal', begin: /(-)[\w\d]+/, relevance: 0 } - ] - }, - V = { - className: 'function', - begin: /\[.*\]\s*[\w]+[ ]??\(/, - end: /$/, - returnBegin: !0, - relevance: 0, - contains: [ - { - className: 'keyword', - begin: '('.concat(o.keyword.toString().replace(/\s/g, '|'), ')\\b'), - endsParent: !0, - relevance: 0 - }, - s.inherit(s.TITLE_MODE, { endsParent: !0 }) - ] - }, - U = [ - V, - x, - i, - s.NUMBER_MODE, - _, - w, - C, - u, - { className: 'literal', begin: /\$(null|true|false)\b/ }, - { className: 'selector-tag', begin: /@\B/, relevance: 0 } - ], - z = { - begin: /\[/, - end: /\]/, - excludeBegin: !0, - excludeEnd: !0, - relevance: 0, - contains: [].concat( - 'self', - U, - { - begin: - '(' + - [ - 'string', - 'char', - 'byte', - 'int', - 'long', - 'bool', - 'decimal', - 'single', - 'double', - 'DateTime', - 'xml', - 'array', - 'hashtable', - 'void' - ].join('|') + - ')', - className: 'built_in', - relevance: 0 - }, - { className: 'type', begin: /[\.\w\d]+/, relevance: 0 } - ) - }; - return ( - V.contains.unshift(z), - { - name: 'PowerShell', - aliases: ['ps', 'ps1'], - case_insensitive: !0, - keywords: o, - contains: U.concat(j, L, B, $, z) - } - ); - }; - }, - 17285: (s) => { - function source(s) { - return s ? ('string' == typeof s ? s : s.source) : null; - } - function lookahead(s) { - return concat('(?=', s, ')'); - } - function concat(...s) { - return s.map((s) => source(s)).join(''); - } - function either(...s) { - return '(' + s.map((s) => source(s)).join('|') + ')'; - } - s.exports = function xml(s) { - const o = concat( - /[A-Z_]/, - (function optional(s) { - return concat('(', s, ')?'); - })(/[A-Z0-9_.-]*:/), - /[A-Z0-9_.-]*/ - ), - i = { className: 'symbol', begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ }, - u = { - begin: /\s/, - contains: [ - { className: 'meta-keyword', begin: /#?[a-z_][a-z1-9_-]+/, illegal: /\n/ } - ] - }, - _ = s.inherit(u, { begin: /\(/, end: /\)/ }), - w = s.inherit(s.APOS_STRING_MODE, { className: 'meta-string' }), - x = s.inherit(s.QUOTE_STRING_MODE, { className: 'meta-string' }), - C = { - endsWithParent: !0, - illegal: /`]+/ } - ] - } - ] - } - ] - }; - return { - name: 'HTML, XML', - aliases: ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist', 'wsf', 'svg'], - case_insensitive: !0, - contains: [ - { - className: 'meta', - begin: //, - relevance: 10, - contains: [ - u, - x, - w, - _, - { - begin: /\[/, - end: /\]/, - contains: [ - { className: 'meta', begin: //, contains: [u, _, x, w] } - ] - } - ] - }, - s.COMMENT(//, { relevance: 10 }), - { begin: //, relevance: 10 }, - i, - { className: 'meta', begin: /<\?xml/, end: /\?>/, relevance: 10 }, - { - className: 'tag', - begin: /)/, - end: />/, - keywords: { name: 'style' }, - contains: [C], - starts: { end: /<\/style>/, returnEnd: !0, subLanguage: ['css', 'xml'] } - }, - { - className: 'tag', - begin: /)/, - end: />/, - keywords: { name: 'script' }, - contains: [C], - starts: { - end: /<\/script>/, - returnEnd: !0, - subLanguage: ['javascript', 'handlebars', 'xml'] - } - }, - { className: 'tag', begin: /<>|<\/>/ }, - { - className: 'tag', - begin: concat(//, />/, /\s/)))), - end: /\/?>/, - contains: [{ className: 'name', begin: o, relevance: 0, starts: C }] - }, - { - className: 'tag', - begin: concat(/<\//, lookahead(concat(o, />/))), - contains: [ - { className: 'name', begin: o, relevance: 0 }, - { begin: />/, relevance: 0, endsParent: !0 } - ] - } - ] - }; - }; - }, - 17533: (s) => { - s.exports = function yaml(s) { - var o = 'true false yes no null', - i = "[\\w#;/?:@&=+$,.~*'()[\\]]+", - u = { - className: 'string', - relevance: 0, - variants: [{ begin: /'/, end: /'/ }, { begin: /"/, end: /"/ }, { begin: /\S+/ }], - contains: [ - s.BACKSLASH_ESCAPE, - { - className: 'template-variable', - variants: [ - { begin: /\{\{/, end: /\}\}/ }, - { begin: /%\{/, end: /\}/ } - ] - } - ] - }, - _ = s.inherit(u, { - variants: [ - { begin: /'/, end: /'/ }, - { begin: /"/, end: /"/ }, - { begin: /[^\s,{}[\]]+/ } - ] - }), - w = { - className: 'number', - begin: - '\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b' - }, - x = { end: ',', endsWithParent: !0, excludeEnd: !0, keywords: o, relevance: 0 }, - C = { begin: /\{/, end: /\}/, contains: [x], illegal: '\\n', relevance: 0 }, - j = { begin: '\\[', end: '\\]', contains: [x], illegal: '\\n', relevance: 0 }, - L = [ - { - className: 'attr', - variants: [ - { begin: '\\w[\\w :\\/.-]*:(?=[ \t]|$)' }, - { begin: '"\\w[\\w :\\/.-]*":(?=[ \t]|$)' }, - { begin: "'\\w[\\w :\\/.-]*':(?=[ \t]|$)" } - ] - }, - { className: 'meta', begin: '^---\\s*$', relevance: 10 }, - { - className: 'string', - begin: '[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*' - }, - { - begin: '<%[%=-]?', - end: '[%-]?%>', - subLanguage: 'ruby', - excludeBegin: !0, - excludeEnd: !0, - relevance: 0 - }, - { className: 'type', begin: '!\\w+!' + i }, - { className: 'type', begin: '!<' + i + '>' }, - { className: 'type', begin: '!' + i }, - { className: 'type', begin: '!!' + i }, - { className: 'meta', begin: '&' + s.UNDERSCORE_IDENT_RE + '$' }, - { className: 'meta', begin: '\\*' + s.UNDERSCORE_IDENT_RE + '$' }, - { className: 'bullet', begin: '-(?=[ ]|$)', relevance: 0 }, - s.HASH_COMMENT_MODE, - { beginKeywords: o, keywords: { literal: o } }, - w, - { className: 'number', begin: s.C_NUMBER_RE + '\\b', relevance: 0 }, - C, - j, - u - ], - B = [...L]; - return ( - B.pop(), - B.push(_), - (x.contains = B), - { name: 'YAML', case_insensitive: !0, aliases: ['yml'], contains: L } - ); - }; - }, - 251: (s, o) => { - ((o.read = function (s, o, i, u, _) { - var w, - x, - C = 8 * _ - u - 1, - j = (1 << C) - 1, - L = j >> 1, - B = -7, - $ = i ? _ - 1 : 0, - V = i ? -1 : 1, - U = s[o + $]; - for ( - $ += V, w = U & ((1 << -B) - 1), U >>= -B, B += C; - B > 0; - w = 256 * w + s[o + $], $ += V, B -= 8 - ); - for ( - x = w & ((1 << -B) - 1), w >>= -B, B += u; - B > 0; - x = 256 * x + s[o + $], $ += V, B -= 8 - ); - if (0 === w) w = 1 - L; - else { - if (w === j) return x ? NaN : (1 / 0) * (U ? -1 : 1); - ((x += Math.pow(2, u)), (w -= L)); - } - return (U ? -1 : 1) * x * Math.pow(2, w - u); - }), - (o.write = function (s, o, i, u, _, w) { - var x, - C, - j, - L = 8 * w - _ - 1, - B = (1 << L) - 1, - $ = B >> 1, - V = 23 === _ ? Math.pow(2, -24) - Math.pow(2, -77) : 0, - U = u ? 0 : w - 1, - z = u ? 1 : -1, - Y = o < 0 || (0 === o && 1 / o < 0) ? 1 : 0; - for ( - o = Math.abs(o), - isNaN(o) || o === 1 / 0 - ? ((C = isNaN(o) ? 1 : 0), (x = B)) - : ((x = Math.floor(Math.log(o) / Math.LN2)), - o * (j = Math.pow(2, -x)) < 1 && (x--, (j *= 2)), - (o += x + $ >= 1 ? V / j : V * Math.pow(2, 1 - $)) * j >= 2 && - (x++, (j /= 2)), - x + $ >= B - ? ((C = 0), (x = B)) - : x + $ >= 1 - ? ((C = (o * j - 1) * Math.pow(2, _)), (x += $)) - : ((C = o * Math.pow(2, $ - 1) * Math.pow(2, _)), (x = 0))); - _ >= 8; - s[i + U] = 255 & C, U += z, C /= 256, _ -= 8 - ); - for (x = (x << _) | C, L += _; L > 0; s[i + U] = 255 & x, U += z, x /= 256, L -= 8); - s[i + U - z] |= 128 * Y; - })); - }, - 9404: function (s) { - s.exports = (function () { - 'use strict'; - var s = Array.prototype.slice; - function createClass(s, o) { - (o && (s.prototype = Object.create(o.prototype)), (s.prototype.constructor = s)); - } - function Iterable(s) { - return isIterable(s) ? s : Seq(s); - } - function KeyedIterable(s) { - return isKeyed(s) ? s : KeyedSeq(s); - } - function IndexedIterable(s) { - return isIndexed(s) ? s : IndexedSeq(s); - } - function SetIterable(s) { - return isIterable(s) && !isAssociative(s) ? s : SetSeq(s); - } - function isIterable(s) { - return !(!s || !s[o]); - } - function isKeyed(s) { - return !(!s || !s[i]); - } - function isIndexed(s) { - return !(!s || !s[u]); - } - function isAssociative(s) { - return isKeyed(s) || isIndexed(s); - } - function isOrdered(s) { - return !(!s || !s[_]); - } - (createClass(KeyedIterable, Iterable), - createClass(IndexedIterable, Iterable), - createClass(SetIterable, Iterable), - (Iterable.isIterable = isIterable), - (Iterable.isKeyed = isKeyed), - (Iterable.isIndexed = isIndexed), - (Iterable.isAssociative = isAssociative), - (Iterable.isOrdered = isOrdered), - (Iterable.Keyed = KeyedIterable), - (Iterable.Indexed = IndexedIterable), - (Iterable.Set = SetIterable)); - var o = '@@__IMMUTABLE_ITERABLE__@@', - i = '@@__IMMUTABLE_KEYED__@@', - u = '@@__IMMUTABLE_INDEXED__@@', - _ = '@@__IMMUTABLE_ORDERED__@@', - w = 'delete', - x = 5, - C = 1 << x, - j = C - 1, - L = {}, - B = { value: !1 }, - $ = { value: !1 }; - function MakeRef(s) { - return ((s.value = !1), s); - } - function SetRef(s) { - s && (s.value = !0); - } - function OwnerID() {} - function arrCopy(s, o) { - o = o || 0; - for (var i = Math.max(0, s.length - o), u = new Array(i), _ = 0; _ < i; _++) - u[_] = s[_ + o]; - return u; - } - function ensureSize(s) { - return (void 0 === s.size && (s.size = s.__iterate(returnTrue)), s.size); - } - function wrapIndex(s, o) { - if ('number' != typeof o) { - var i = o >>> 0; - if ('' + i !== o || 4294967295 === i) return NaN; - o = i; - } - return o < 0 ? ensureSize(s) + o : o; - } - function returnTrue() { - return !0; - } - function wholeSlice(s, o, i) { - return ( - (0 === s || (void 0 !== i && s <= -i)) && (void 0 === o || (void 0 !== i && o >= i)) - ); - } - function resolveBegin(s, o) { - return resolveIndex(s, o, 0); - } - function resolveEnd(s, o) { - return resolveIndex(s, o, o); - } - function resolveIndex(s, o, i) { - return void 0 === s - ? i - : s < 0 - ? Math.max(0, o + s) - : void 0 === o - ? s - : Math.min(o, s); - } - var V = 0, - U = 1, - z = 2, - Y = 'function' == typeof Symbol && Symbol.iterator, - Z = '@@iterator', - ee = Y || Z; - function Iterator(s) { - this.next = s; - } - function iteratorValue(s, o, i, u) { - var _ = 0 === s ? o : 1 === s ? i : [o, i]; - return (u ? (u.value = _) : (u = { value: _, done: !1 }), u); - } - function iteratorDone() { - return { value: void 0, done: !0 }; - } - function hasIterator(s) { - return !!getIteratorFn(s); - } - function isIterator(s) { - return s && 'function' == typeof s.next; - } - function getIterator(s) { - var o = getIteratorFn(s); - return o && o.call(s); - } - function getIteratorFn(s) { - var o = s && ((Y && s[Y]) || s[Z]); - if ('function' == typeof o) return o; - } - function isArrayLike(s) { - return s && 'number' == typeof s.length; - } - function Seq(s) { - return null == s ? emptySequence() : isIterable(s) ? s.toSeq() : seqFromValue(s); - } - function KeyedSeq(s) { - return null == s - ? emptySequence().toKeyedSeq() - : isIterable(s) - ? isKeyed(s) - ? s.toSeq() - : s.fromEntrySeq() - : keyedSeqFromValue(s); - } - function IndexedSeq(s) { - return null == s - ? emptySequence() - : isIterable(s) - ? isKeyed(s) - ? s.entrySeq() - : s.toIndexedSeq() - : indexedSeqFromValue(s); - } - function SetSeq(s) { - return ( - null == s - ? emptySequence() - : isIterable(s) - ? isKeyed(s) - ? s.entrySeq() - : s - : indexedSeqFromValue(s) - ).toSetSeq(); - } - ((Iterator.prototype.toString = function () { - return '[Iterator]'; - }), - (Iterator.KEYS = V), - (Iterator.VALUES = U), - (Iterator.ENTRIES = z), - (Iterator.prototype.inspect = Iterator.prototype.toSource = - function () { - return this.toString(); - }), - (Iterator.prototype[ee] = function () { - return this; - }), - createClass(Seq, Iterable), - (Seq.of = function () { - return Seq(arguments); - }), - (Seq.prototype.toSeq = function () { - return this; - }), - (Seq.prototype.toString = function () { - return this.__toString('Seq {', '}'); - }), - (Seq.prototype.cacheResult = function () { - return ( - !this._cache && - this.__iterateUncached && - ((this._cache = this.entrySeq().toArray()), (this.size = this._cache.length)), - this - ); - }), - (Seq.prototype.__iterate = function (s, o) { - return seqIterate(this, s, o, !0); - }), - (Seq.prototype.__iterator = function (s, o) { - return seqIterator(this, s, o, !0); - }), - createClass(KeyedSeq, Seq), - (KeyedSeq.prototype.toKeyedSeq = function () { - return this; - }), - createClass(IndexedSeq, Seq), - (IndexedSeq.of = function () { - return IndexedSeq(arguments); - }), - (IndexedSeq.prototype.toIndexedSeq = function () { - return this; - }), - (IndexedSeq.prototype.toString = function () { - return this.__toString('Seq [', ']'); - }), - (IndexedSeq.prototype.__iterate = function (s, o) { - return seqIterate(this, s, o, !1); - }), - (IndexedSeq.prototype.__iterator = function (s, o) { - return seqIterator(this, s, o, !1); - }), - createClass(SetSeq, Seq), - (SetSeq.of = function () { - return SetSeq(arguments); - }), - (SetSeq.prototype.toSetSeq = function () { - return this; - }), - (Seq.isSeq = isSeq), - (Seq.Keyed = KeyedSeq), - (Seq.Set = SetSeq), - (Seq.Indexed = IndexedSeq)); - var ie, - ae, - le, - ce = '@@__IMMUTABLE_SEQ__@@'; - function ArraySeq(s) { - ((this._array = s), (this.size = s.length)); - } - function ObjectSeq(s) { - var o = Object.keys(s); - ((this._object = s), (this._keys = o), (this.size = o.length)); - } - function IterableSeq(s) { - ((this._iterable = s), (this.size = s.length || s.size)); - } - function IteratorSeq(s) { - ((this._iterator = s), (this._iteratorCache = [])); - } - function isSeq(s) { - return !(!s || !s[ce]); - } - function emptySequence() { - return ie || (ie = new ArraySeq([])); - } - function keyedSeqFromValue(s) { - var o = Array.isArray(s) - ? new ArraySeq(s).fromEntrySeq() - : isIterator(s) - ? new IteratorSeq(s).fromEntrySeq() - : hasIterator(s) - ? new IterableSeq(s).fromEntrySeq() - : 'object' == typeof s - ? new ObjectSeq(s) - : void 0; - if (!o) - throw new TypeError( - 'Expected Array or iterable object of [k, v] entries, or keyed object: ' + s - ); - return o; - } - function indexedSeqFromValue(s) { - var o = maybeIndexedSeqFromValue(s); - if (!o) throw new TypeError('Expected Array or iterable object of values: ' + s); - return o; - } - function seqFromValue(s) { - var o = maybeIndexedSeqFromValue(s) || ('object' == typeof s && new ObjectSeq(s)); - if (!o) - throw new TypeError( - 'Expected Array or iterable object of values, or keyed object: ' + s - ); - return o; - } - function maybeIndexedSeqFromValue(s) { - return isArrayLike(s) - ? new ArraySeq(s) - : isIterator(s) - ? new IteratorSeq(s) - : hasIterator(s) - ? new IterableSeq(s) - : void 0; - } - function seqIterate(s, o, i, u) { - var _ = s._cache; - if (_) { - for (var w = _.length - 1, x = 0; x <= w; x++) { - var C = _[i ? w - x : x]; - if (!1 === o(C[1], u ? C[0] : x, s)) return x + 1; - } - return x; - } - return s.__iterateUncached(o, i); - } - function seqIterator(s, o, i, u) { - var _ = s._cache; - if (_) { - var w = _.length - 1, - x = 0; - return new Iterator(function () { - var s = _[i ? w - x : x]; - return x++ > w ? iteratorDone() : iteratorValue(o, u ? s[0] : x - 1, s[1]); - }); - } - return s.__iteratorUncached(o, i); - } - function fromJS(s, o) { - return o ? fromJSWith(o, s, '', { '': s }) : fromJSDefault(s); - } - function fromJSWith(s, o, i, u) { - return Array.isArray(o) - ? s.call( - u, - i, - IndexedSeq(o).map(function (i, u) { - return fromJSWith(s, i, u, o); - }) - ) - : isPlainObj(o) - ? s.call( - u, - i, - KeyedSeq(o).map(function (i, u) { - return fromJSWith(s, i, u, o); - }) - ) - : o; - } - function fromJSDefault(s) { - return Array.isArray(s) - ? IndexedSeq(s).map(fromJSDefault).toList() - : isPlainObj(s) - ? KeyedSeq(s).map(fromJSDefault).toMap() - : s; - } - function isPlainObj(s) { - return s && (s.constructor === Object || void 0 === s.constructor); - } - function is(s, o) { - if (s === o || (s != s && o != o)) return !0; - if (!s || !o) return !1; - if ('function' == typeof s.valueOf && 'function' == typeof o.valueOf) { - if ((s = s.valueOf()) === (o = o.valueOf()) || (s != s && o != o)) return !0; - if (!s || !o) return !1; - } - return !( - 'function' != typeof s.equals || - 'function' != typeof o.equals || - !s.equals(o) - ); - } - function deepEqual(s, o) { - if (s === o) return !0; - if ( - !isIterable(o) || - (void 0 !== s.size && void 0 !== o.size && s.size !== o.size) || - (void 0 !== s.__hash && void 0 !== o.__hash && s.__hash !== o.__hash) || - isKeyed(s) !== isKeyed(o) || - isIndexed(s) !== isIndexed(o) || - isOrdered(s) !== isOrdered(o) - ) - return !1; - if (0 === s.size && 0 === o.size) return !0; - var i = !isAssociative(s); - if (isOrdered(s)) { - var u = s.entries(); - return ( - o.every(function (s, o) { - var _ = u.next().value; - return _ && is(_[1], s) && (i || is(_[0], o)); - }) && u.next().done - ); - } - var _ = !1; - if (void 0 === s.size) - if (void 0 === o.size) 'function' == typeof s.cacheResult && s.cacheResult(); - else { - _ = !0; - var w = s; - ((s = o), (o = w)); - } - var x = !0, - C = o.__iterate(function (o, u) { - if (i ? !s.has(o) : _ ? !is(o, s.get(u, L)) : !is(s.get(u, L), o)) - return ((x = !1), !1); - }); - return x && s.size === C; - } - function Repeat(s, o) { - if (!(this instanceof Repeat)) return new Repeat(s, o); - if ( - ((this._value = s), - (this.size = void 0 === o ? 1 / 0 : Math.max(0, o)), - 0 === this.size) - ) { - if (ae) return ae; - ae = this; - } - } - function invariant(s, o) { - if (!s) throw new Error(o); - } - function Range(s, o, i) { - if (!(this instanceof Range)) return new Range(s, o, i); - if ( - (invariant(0 !== i, 'Cannot step a Range by 0'), - (s = s || 0), - void 0 === o && (o = 1 / 0), - (i = void 0 === i ? 1 : Math.abs(i)), - o < s && (i = -i), - (this._start = s), - (this._end = o), - (this._step = i), - (this.size = Math.max(0, Math.ceil((o - s) / i - 1) + 1)), - 0 === this.size) - ) { - if (le) return le; - le = this; - } - } - function Collection() { - throw TypeError('Abstract'); - } - function KeyedCollection() {} - function IndexedCollection() {} - function SetCollection() {} - ((Seq.prototype[ce] = !0), - createClass(ArraySeq, IndexedSeq), - (ArraySeq.prototype.get = function (s, o) { - return this.has(s) ? this._array[wrapIndex(this, s)] : o; - }), - (ArraySeq.prototype.__iterate = function (s, o) { - for (var i = this._array, u = i.length - 1, _ = 0; _ <= u; _++) - if (!1 === s(i[o ? u - _ : _], _, this)) return _ + 1; - return _; - }), - (ArraySeq.prototype.__iterator = function (s, o) { - var i = this._array, - u = i.length - 1, - _ = 0; - return new Iterator(function () { - return _ > u ? iteratorDone() : iteratorValue(s, _, i[o ? u - _++ : _++]); - }); - }), - createClass(ObjectSeq, KeyedSeq), - (ObjectSeq.prototype.get = function (s, o) { - return void 0 === o || this.has(s) ? this._object[s] : o; - }), - (ObjectSeq.prototype.has = function (s) { - return this._object.hasOwnProperty(s); - }), - (ObjectSeq.prototype.__iterate = function (s, o) { - for (var i = this._object, u = this._keys, _ = u.length - 1, w = 0; w <= _; w++) { - var x = u[o ? _ - w : w]; - if (!1 === s(i[x], x, this)) return w + 1; - } - return w; - }), - (ObjectSeq.prototype.__iterator = function (s, o) { - var i = this._object, - u = this._keys, - _ = u.length - 1, - w = 0; - return new Iterator(function () { - var x = u[o ? _ - w : w]; - return w++ > _ ? iteratorDone() : iteratorValue(s, x, i[x]); - }); - }), - (ObjectSeq.prototype[_] = !0), - createClass(IterableSeq, IndexedSeq), - (IterableSeq.prototype.__iterateUncached = function (s, o) { - if (o) return this.cacheResult().__iterate(s, o); - var i = getIterator(this._iterable), - u = 0; - if (isIterator(i)) - for (var _; !(_ = i.next()).done && !1 !== s(_.value, u++, this); ); - return u; - }), - (IterableSeq.prototype.__iteratorUncached = function (s, o) { - if (o) return this.cacheResult().__iterator(s, o); - var i = getIterator(this._iterable); - if (!isIterator(i)) return new Iterator(iteratorDone); - var u = 0; - return new Iterator(function () { - var o = i.next(); - return o.done ? o : iteratorValue(s, u++, o.value); - }); - }), - createClass(IteratorSeq, IndexedSeq), - (IteratorSeq.prototype.__iterateUncached = function (s, o) { - if (o) return this.cacheResult().__iterate(s, o); - for (var i, u = this._iterator, _ = this._iteratorCache, w = 0; w < _.length; ) - if (!1 === s(_[w], w++, this)) return w; - for (; !(i = u.next()).done; ) { - var x = i.value; - if (((_[w] = x), !1 === s(x, w++, this))) break; - } - return w; - }), - (IteratorSeq.prototype.__iteratorUncached = function (s, o) { - if (o) return this.cacheResult().__iterator(s, o); - var i = this._iterator, - u = this._iteratorCache, - _ = 0; - return new Iterator(function () { - if (_ >= u.length) { - var o = i.next(); - if (o.done) return o; - u[_] = o.value; - } - return iteratorValue(s, _, u[_++]); - }); - }), - createClass(Repeat, IndexedSeq), - (Repeat.prototype.toString = function () { - return 0 === this.size - ? 'Repeat []' - : 'Repeat [ ' + this._value + ' ' + this.size + ' times ]'; - }), - (Repeat.prototype.get = function (s, o) { - return this.has(s) ? this._value : o; - }), - (Repeat.prototype.includes = function (s) { - return is(this._value, s); - }), - (Repeat.prototype.slice = function (s, o) { - var i = this.size; - return wholeSlice(s, o, i) - ? this - : new Repeat(this._value, resolveEnd(o, i) - resolveBegin(s, i)); - }), - (Repeat.prototype.reverse = function () { - return this; - }), - (Repeat.prototype.indexOf = function (s) { - return is(this._value, s) ? 0 : -1; - }), - (Repeat.prototype.lastIndexOf = function (s) { - return is(this._value, s) ? this.size : -1; - }), - (Repeat.prototype.__iterate = function (s, o) { - for (var i = 0; i < this.size; i++) - if (!1 === s(this._value, i, this)) return i + 1; - return i; - }), - (Repeat.prototype.__iterator = function (s, o) { - var i = this, - u = 0; - return new Iterator(function () { - return u < i.size ? iteratorValue(s, u++, i._value) : iteratorDone(); - }); - }), - (Repeat.prototype.equals = function (s) { - return s instanceof Repeat ? is(this._value, s._value) : deepEqual(s); - }), - createClass(Range, IndexedSeq), - (Range.prototype.toString = function () { - return 0 === this.size - ? 'Range []' - : 'Range [ ' + - this._start + - '...' + - this._end + - (1 !== this._step ? ' by ' + this._step : '') + - ' ]'; - }), - (Range.prototype.get = function (s, o) { - return this.has(s) ? this._start + wrapIndex(this, s) * this._step : o; - }), - (Range.prototype.includes = function (s) { - var o = (s - this._start) / this._step; - return o >= 0 && o < this.size && o === Math.floor(o); - }), - (Range.prototype.slice = function (s, o) { - return wholeSlice(s, o, this.size) - ? this - : ((s = resolveBegin(s, this.size)), - (o = resolveEnd(o, this.size)) <= s - ? new Range(0, 0) - : new Range(this.get(s, this._end), this.get(o, this._end), this._step)); - }), - (Range.prototype.indexOf = function (s) { - var o = s - this._start; - if (o % this._step == 0) { - var i = o / this._step; - if (i >= 0 && i < this.size) return i; - } - return -1; - }), - (Range.prototype.lastIndexOf = function (s) { - return this.indexOf(s); - }), - (Range.prototype.__iterate = function (s, o) { - for ( - var i = this.size - 1, - u = this._step, - _ = o ? this._start + i * u : this._start, - w = 0; - w <= i; - w++ - ) { - if (!1 === s(_, w, this)) return w + 1; - _ += o ? -u : u; - } - return w; - }), - (Range.prototype.__iterator = function (s, o) { - var i = this.size - 1, - u = this._step, - _ = o ? this._start + i * u : this._start, - w = 0; - return new Iterator(function () { - var x = _; - return ((_ += o ? -u : u), w > i ? iteratorDone() : iteratorValue(s, w++, x)); - }); - }), - (Range.prototype.equals = function (s) { - return s instanceof Range - ? this._start === s._start && this._end === s._end && this._step === s._step - : deepEqual(this, s); - }), - createClass(Collection, Iterable), - createClass(KeyedCollection, Collection), - createClass(IndexedCollection, Collection), - createClass(SetCollection, Collection), - (Collection.Keyed = KeyedCollection), - (Collection.Indexed = IndexedCollection), - (Collection.Set = SetCollection)); - var pe = - 'function' == typeof Math.imul && -2 === Math.imul(4294967295, 2) - ? Math.imul - : function imul(s, o) { - var i = 65535 & (s |= 0), - u = 65535 & (o |= 0); - return (i * u + ((((s >>> 16) * u + i * (o >>> 16)) << 16) >>> 0)) | 0; - }; - function smi(s) { - return ((s >>> 1) & 1073741824) | (3221225471 & s); - } - function hash(s) { - if (!1 === s || null == s) return 0; - if ('function' == typeof s.valueOf && (!1 === (s = s.valueOf()) || null == s)) - return 0; - if (!0 === s) return 1; - var o = typeof s; - if ('number' === o) { - if (s != s || s === 1 / 0) return 0; - var i = 0 | s; - for (i !== s && (i ^= 4294967295 * s); s > 4294967295; ) i ^= s /= 4294967295; - return smi(i); - } - if ('string' === o) return s.length > Se ? cachedHashString(s) : hashString(s); - if ('function' == typeof s.hashCode) return s.hashCode(); - if ('object' === o) return hashJSObj(s); - if ('function' == typeof s.toString) return hashString(s.toString()); - throw new Error('Value type ' + o + ' cannot be hashed.'); - } - function cachedHashString(s) { - var o = Te[s]; - return ( - void 0 === o && - ((o = hashString(s)), Pe === xe && ((Pe = 0), (Te = {})), Pe++, (Te[s] = o)), - o - ); - } - function hashString(s) { - for (var o = 0, i = 0; i < s.length; i++) o = (31 * o + s.charCodeAt(i)) | 0; - return smi(o); - } - function hashJSObj(s) { - var o; - if (be && void 0 !== (o = ye.get(s))) return o; - if (void 0 !== (o = s[we])) return o; - if (!fe) { - if (void 0 !== (o = s.propertyIsEnumerable && s.propertyIsEnumerable[we])) return o; - if (void 0 !== (o = getIENodeHash(s))) return o; - } - if (((o = ++_e), 1073741824 & _e && (_e = 0), be)) ye.set(s, o); - else { - if (void 0 !== de && !1 === de(s)) - throw new Error('Non-extensible objects are not allowed as keys.'); - if (fe) - Object.defineProperty(s, we, { - enumerable: !1, - configurable: !1, - writable: !1, - value: o - }); - else if ( - void 0 !== s.propertyIsEnumerable && - s.propertyIsEnumerable === s.constructor.prototype.propertyIsEnumerable - ) - ((s.propertyIsEnumerable = function () { - return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments); - }), - (s.propertyIsEnumerable[we] = o)); - else { - if (void 0 === s.nodeType) - throw new Error('Unable to set a non-enumerable property on object.'); - s[we] = o; - } - } - return o; - } - var de = Object.isExtensible, - fe = (function () { - try { - return (Object.defineProperty({}, '@', {}), !0); - } catch (s) { - return !1; - } - })(); - function getIENodeHash(s) { - if (s && s.nodeType > 0) - switch (s.nodeType) { - case 1: - return s.uniqueID; - case 9: - return s.documentElement && s.documentElement.uniqueID; - } - } - var ye, - be = 'function' == typeof WeakMap; - be && (ye = new WeakMap()); - var _e = 0, - we = '__immutablehash__'; - 'function' == typeof Symbol && (we = Symbol(we)); - var Se = 16, - xe = 255, - Pe = 0, - Te = {}; - function assertNotInfinite(s) { - invariant(s !== 1 / 0, 'Cannot perform this action with an infinite size.'); - } - function Map(s) { - return null == s - ? emptyMap() - : isMap(s) && !isOrdered(s) - ? s - : emptyMap().withMutations(function (o) { - var i = KeyedIterable(s); - (assertNotInfinite(i.size), - i.forEach(function (s, i) { - return o.set(i, s); - })); - }); - } - function isMap(s) { - return !(!s || !s[qe]); - } - (createClass(Map, KeyedCollection), - (Map.of = function () { - var o = s.call(arguments, 0); - return emptyMap().withMutations(function (s) { - for (var i = 0; i < o.length; i += 2) { - if (i + 1 >= o.length) throw new Error('Missing value for key: ' + o[i]); - s.set(o[i], o[i + 1]); - } - }); - }), - (Map.prototype.toString = function () { - return this.__toString('Map {', '}'); - }), - (Map.prototype.get = function (s, o) { - return this._root ? this._root.get(0, void 0, s, o) : o; - }), - (Map.prototype.set = function (s, o) { - return updateMap(this, s, o); - }), - (Map.prototype.setIn = function (s, o) { - return this.updateIn(s, L, function () { - return o; - }); - }), - (Map.prototype.remove = function (s) { - return updateMap(this, s, L); - }), - (Map.prototype.deleteIn = function (s) { - return this.updateIn(s, function () { - return L; - }); - }), - (Map.prototype.update = function (s, o, i) { - return 1 === arguments.length ? s(this) : this.updateIn([s], o, i); - }), - (Map.prototype.updateIn = function (s, o, i) { - i || ((i = o), (o = void 0)); - var u = updateInDeepMap(this, forceIterator(s), o, i); - return u === L ? void 0 : u; - }), - (Map.prototype.clear = function () { - return 0 === this.size - ? this - : this.__ownerID - ? ((this.size = 0), - (this._root = null), - (this.__hash = void 0), - (this.__altered = !0), - this) - : emptyMap(); - }), - (Map.prototype.merge = function () { - return mergeIntoMapWith(this, void 0, arguments); - }), - (Map.prototype.mergeWith = function (o) { - return mergeIntoMapWith(this, o, s.call(arguments, 1)); - }), - (Map.prototype.mergeIn = function (o) { - var i = s.call(arguments, 1); - return this.updateIn(o, emptyMap(), function (s) { - return 'function' == typeof s.merge ? s.merge.apply(s, i) : i[i.length - 1]; - }); - }), - (Map.prototype.mergeDeep = function () { - return mergeIntoMapWith(this, deepMerger, arguments); - }), - (Map.prototype.mergeDeepWith = function (o) { - var i = s.call(arguments, 1); - return mergeIntoMapWith(this, deepMergerWith(o), i); - }), - (Map.prototype.mergeDeepIn = function (o) { - var i = s.call(arguments, 1); - return this.updateIn(o, emptyMap(), function (s) { - return 'function' == typeof s.mergeDeep - ? s.mergeDeep.apply(s, i) - : i[i.length - 1]; - }); - }), - (Map.prototype.sort = function (s) { - return OrderedMap(sortFactory(this, s)); - }), - (Map.prototype.sortBy = function (s, o) { - return OrderedMap(sortFactory(this, o, s)); - }), - (Map.prototype.withMutations = function (s) { - var o = this.asMutable(); - return (s(o), o.wasAltered() ? o.__ensureOwner(this.__ownerID) : this); - }), - (Map.prototype.asMutable = function () { - return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); - }), - (Map.prototype.asImmutable = function () { - return this.__ensureOwner(); - }), - (Map.prototype.wasAltered = function () { - return this.__altered; - }), - (Map.prototype.__iterator = function (s, o) { - return new MapIterator(this, s, o); - }), - (Map.prototype.__iterate = function (s, o) { - var i = this, - u = 0; - return ( - this._root && - this._root.iterate(function (o) { - return (u++, s(o[1], o[0], i)); - }, o), - u - ); - }), - (Map.prototype.__ensureOwner = function (s) { - return s === this.__ownerID - ? this - : s - ? makeMap(this.size, this._root, s, this.__hash) - : ((this.__ownerID = s), (this.__altered = !1), this); - }), - (Map.isMap = isMap)); - var Re, - qe = '@@__IMMUTABLE_MAP__@@', - $e = Map.prototype; - function ArrayMapNode(s, o) { - ((this.ownerID = s), (this.entries = o)); - } - function BitmapIndexedNode(s, o, i) { - ((this.ownerID = s), (this.bitmap = o), (this.nodes = i)); - } - function HashArrayMapNode(s, o, i) { - ((this.ownerID = s), (this.count = o), (this.nodes = i)); - } - function HashCollisionNode(s, o, i) { - ((this.ownerID = s), (this.keyHash = o), (this.entries = i)); - } - function ValueNode(s, o, i) { - ((this.ownerID = s), (this.keyHash = o), (this.entry = i)); - } - function MapIterator(s, o, i) { - ((this._type = o), - (this._reverse = i), - (this._stack = s._root && mapIteratorFrame(s._root))); - } - function mapIteratorValue(s, o) { - return iteratorValue(s, o[0], o[1]); - } - function mapIteratorFrame(s, o) { - return { node: s, index: 0, __prev: o }; - } - function makeMap(s, o, i, u) { - var _ = Object.create($e); - return ( - (_.size = s), - (_._root = o), - (_.__ownerID = i), - (_.__hash = u), - (_.__altered = !1), - _ - ); - } - function emptyMap() { - return Re || (Re = makeMap(0)); - } - function updateMap(s, o, i) { - var u, _; - if (s._root) { - var w = MakeRef(B), - x = MakeRef($); - if (((u = updateNode(s._root, s.__ownerID, 0, void 0, o, i, w, x)), !x.value)) - return s; - _ = s.size + (w.value ? (i === L ? -1 : 1) : 0); - } else { - if (i === L) return s; - ((_ = 1), (u = new ArrayMapNode(s.__ownerID, [[o, i]]))); - } - return s.__ownerID - ? ((s.size = _), (s._root = u), (s.__hash = void 0), (s.__altered = !0), s) - : u - ? makeMap(_, u) - : emptyMap(); - } - function updateNode(s, o, i, u, _, w, x, C) { - return s - ? s.update(o, i, u, _, w, x, C) - : w === L - ? s - : (SetRef(C), SetRef(x), new ValueNode(o, u, [_, w])); - } - function isLeafNode(s) { - return s.constructor === ValueNode || s.constructor === HashCollisionNode; - } - function mergeIntoNode(s, o, i, u, _) { - if (s.keyHash === u) return new HashCollisionNode(o, u, [s.entry, _]); - var w, - C = (0 === i ? s.keyHash : s.keyHash >>> i) & j, - L = (0 === i ? u : u >>> i) & j; - return new BitmapIndexedNode( - o, - (1 << C) | (1 << L), - C === L - ? [mergeIntoNode(s, o, i + x, u, _)] - : ((w = new ValueNode(o, u, _)), C < L ? [s, w] : [w, s]) - ); - } - function createNodes(s, o, i, u) { - s || (s = new OwnerID()); - for (var _ = new ValueNode(s, hash(i), [i, u]), w = 0; w < o.length; w++) { - var x = o[w]; - _ = _.update(s, 0, void 0, x[0], x[1]); - } - return _; - } - function packNodes(s, o, i, u) { - for ( - var _ = 0, w = 0, x = new Array(i), C = 0, j = 1, L = o.length; - C < L; - C++, j <<= 1 - ) { - var B = o[C]; - void 0 !== B && C !== u && ((_ |= j), (x[w++] = B)); - } - return new BitmapIndexedNode(s, _, x); - } - function expandNodes(s, o, i, u, _) { - for (var w = 0, x = new Array(C), j = 0; 0 !== i; j++, i >>>= 1) - x[j] = 1 & i ? o[w++] : void 0; - return ((x[u] = _), new HashArrayMapNode(s, w + 1, x)); - } - function mergeIntoMapWith(s, o, i) { - for (var u = [], _ = 0; _ < i.length; _++) { - var w = i[_], - x = KeyedIterable(w); - (isIterable(w) || - (x = x.map(function (s) { - return fromJS(s); - })), - u.push(x)); - } - return mergeIntoCollectionWith(s, o, u); - } - function deepMerger(s, o, i) { - return s && s.mergeDeep && isIterable(o) ? s.mergeDeep(o) : is(s, o) ? s : o; - } - function deepMergerWith(s) { - return function (o, i, u) { - if (o && o.mergeDeepWith && isIterable(i)) return o.mergeDeepWith(s, i); - var _ = s(o, i, u); - return is(o, _) ? o : _; - }; - } - function mergeIntoCollectionWith(s, o, i) { - return 0 === - (i = i.filter(function (s) { - return 0 !== s.size; - })).length - ? s - : 0 !== s.size || s.__ownerID || 1 !== i.length - ? s.withMutations(function (s) { - for ( - var u = o - ? function (i, u) { - s.update(u, L, function (s) { - return s === L ? i : o(s, i, u); - }); - } - : function (o, i) { - s.set(i, o); - }, - _ = 0; - _ < i.length; - _++ - ) - i[_].forEach(u); - }) - : s.constructor(i[0]); - } - function updateInDeepMap(s, o, i, u) { - var _ = s === L, - w = o.next(); - if (w.done) { - var x = _ ? i : s, - C = u(x); - return C === x ? s : C; - } - invariant(_ || (s && s.set), 'invalid keyPath'); - var j = w.value, - B = _ ? L : s.get(j, L), - $ = updateInDeepMap(B, o, i, u); - return $ === B ? s : $ === L ? s.remove(j) : (_ ? emptyMap() : s).set(j, $); - } - function popCount(s) { - return ( - (s = - ((s = (858993459 & (s -= (s >> 1) & 1431655765)) + ((s >> 2) & 858993459)) + - (s >> 4)) & - 252645135), - (s += s >> 8), - 127 & (s += s >> 16) - ); - } - function setIn(s, o, i, u) { - var _ = u ? s : arrCopy(s); - return ((_[o] = i), _); - } - function spliceIn(s, o, i, u) { - var _ = s.length + 1; - if (u && o + 1 === _) return ((s[o] = i), s); - for (var w = new Array(_), x = 0, C = 0; C < _; C++) - C === o ? ((w[C] = i), (x = -1)) : (w[C] = s[C + x]); - return w; - } - function spliceOut(s, o, i) { - var u = s.length - 1; - if (i && o === u) return (s.pop(), s); - for (var _ = new Array(u), w = 0, x = 0; x < u; x++) - (x === o && (w = 1), (_[x] = s[x + w])); - return _; - } - (($e[qe] = !0), - ($e[w] = $e.remove), - ($e.removeIn = $e.deleteIn), - (ArrayMapNode.prototype.get = function (s, o, i, u) { - for (var _ = this.entries, w = 0, x = _.length; w < x; w++) - if (is(i, _[w][0])) return _[w][1]; - return u; - }), - (ArrayMapNode.prototype.update = function (s, o, i, u, _, w, x) { - for ( - var C = _ === L, j = this.entries, B = 0, $ = j.length; - B < $ && !is(u, j[B][0]); - B++ - ); - var V = B < $; - if (V ? j[B][1] === _ : C) return this; - if ((SetRef(x), (C || !V) && SetRef(w), !C || 1 !== j.length)) { - if (!V && !C && j.length >= ze) return createNodes(s, j, u, _); - var U = s && s === this.ownerID, - z = U ? j : arrCopy(j); - return ( - V - ? C - ? B === $ - 1 - ? z.pop() - : (z[B] = z.pop()) - : (z[B] = [u, _]) - : z.push([u, _]), - U ? ((this.entries = z), this) : new ArrayMapNode(s, z) - ); - } - }), - (BitmapIndexedNode.prototype.get = function (s, o, i, u) { - void 0 === o && (o = hash(i)); - var _ = 1 << ((0 === s ? o : o >>> s) & j), - w = this.bitmap; - return w & _ ? this.nodes[popCount(w & (_ - 1))].get(s + x, o, i, u) : u; - }), - (BitmapIndexedNode.prototype.update = function (s, o, i, u, _, w, C) { - void 0 === i && (i = hash(u)); - var B = (0 === o ? i : i >>> o) & j, - $ = 1 << B, - V = this.bitmap, - U = !!(V & $); - if (!U && _ === L) return this; - var z = popCount(V & ($ - 1)), - Y = this.nodes, - Z = U ? Y[z] : void 0, - ee = updateNode(Z, s, o + x, i, u, _, w, C); - if (ee === Z) return this; - if (!U && ee && Y.length >= We) return expandNodes(s, Y, V, B, ee); - if (U && !ee && 2 === Y.length && isLeafNode(Y[1 ^ z])) return Y[1 ^ z]; - if (U && ee && 1 === Y.length && isLeafNode(ee)) return ee; - var ie = s && s === this.ownerID, - ae = U ? (ee ? V : V ^ $) : V | $, - le = U - ? ee - ? setIn(Y, z, ee, ie) - : spliceOut(Y, z, ie) - : spliceIn(Y, z, ee, ie); - return ie - ? ((this.bitmap = ae), (this.nodes = le), this) - : new BitmapIndexedNode(s, ae, le); - }), - (HashArrayMapNode.prototype.get = function (s, o, i, u) { - void 0 === o && (o = hash(i)); - var _ = (0 === s ? o : o >>> s) & j, - w = this.nodes[_]; - return w ? w.get(s + x, o, i, u) : u; - }), - (HashArrayMapNode.prototype.update = function (s, o, i, u, _, w, C) { - void 0 === i && (i = hash(u)); - var B = (0 === o ? i : i >>> o) & j, - $ = _ === L, - V = this.nodes, - U = V[B]; - if ($ && !U) return this; - var z = updateNode(U, s, o + x, i, u, _, w, C); - if (z === U) return this; - var Y = this.count; - if (U) { - if (!z && --Y < He) return packNodes(s, V, Y, B); - } else Y++; - var Z = s && s === this.ownerID, - ee = setIn(V, B, z, Z); - return Z - ? ((this.count = Y), (this.nodes = ee), this) - : new HashArrayMapNode(s, Y, ee); - }), - (HashCollisionNode.prototype.get = function (s, o, i, u) { - for (var _ = this.entries, w = 0, x = _.length; w < x; w++) - if (is(i, _[w][0])) return _[w][1]; - return u; - }), - (HashCollisionNode.prototype.update = function (s, o, i, u, _, w, x) { - void 0 === i && (i = hash(u)); - var C = _ === L; - if (i !== this.keyHash) - return C ? this : (SetRef(x), SetRef(w), mergeIntoNode(this, s, o, i, [u, _])); - for (var j = this.entries, B = 0, $ = j.length; B < $ && !is(u, j[B][0]); B++); - var V = B < $; - if (V ? j[B][1] === _ : C) return this; - if ((SetRef(x), (C || !V) && SetRef(w), C && 2 === $)) - return new ValueNode(s, this.keyHash, j[1 ^ B]); - var U = s && s === this.ownerID, - z = U ? j : arrCopy(j); - return ( - V - ? C - ? B === $ - 1 - ? z.pop() - : (z[B] = z.pop()) - : (z[B] = [u, _]) - : z.push([u, _]), - U ? ((this.entries = z), this) : new HashCollisionNode(s, this.keyHash, z) - ); - }), - (ValueNode.prototype.get = function (s, o, i, u) { - return is(i, this.entry[0]) ? this.entry[1] : u; - }), - (ValueNode.prototype.update = function (s, o, i, u, _, w, x) { - var C = _ === L, - j = is(u, this.entry[0]); - return (j ? _ === this.entry[1] : C) - ? this - : (SetRef(x), - C - ? void SetRef(w) - : j - ? s && s === this.ownerID - ? ((this.entry[1] = _), this) - : new ValueNode(s, this.keyHash, [u, _]) - : (SetRef(w), mergeIntoNode(this, s, o, hash(u), [u, _]))); - }), - (ArrayMapNode.prototype.iterate = HashCollisionNode.prototype.iterate = - function (s, o) { - for (var i = this.entries, u = 0, _ = i.length - 1; u <= _; u++) - if (!1 === s(i[o ? _ - u : u])) return !1; - }), - (BitmapIndexedNode.prototype.iterate = HashArrayMapNode.prototype.iterate = - function (s, o) { - for (var i = this.nodes, u = 0, _ = i.length - 1; u <= _; u++) { - var w = i[o ? _ - u : u]; - if (w && !1 === w.iterate(s, o)) return !1; - } - }), - (ValueNode.prototype.iterate = function (s, o) { - return s(this.entry); - }), - createClass(MapIterator, Iterator), - (MapIterator.prototype.next = function () { - for (var s = this._type, o = this._stack; o; ) { - var i, - u = o.node, - _ = o.index++; - if (u.entry) { - if (0 === _) return mapIteratorValue(s, u.entry); - } else if (u.entries) { - if (_ <= (i = u.entries.length - 1)) - return mapIteratorValue(s, u.entries[this._reverse ? i - _ : _]); - } else if (_ <= (i = u.nodes.length - 1)) { - var w = u.nodes[this._reverse ? i - _ : _]; - if (w) { - if (w.entry) return mapIteratorValue(s, w.entry); - o = this._stack = mapIteratorFrame(w, o); - } - continue; - } - o = this._stack = this._stack.__prev; - } - return iteratorDone(); - })); - var ze = C / 4, - We = C / 2, - He = C / 4; - function List(s) { - var o = emptyList(); - if (null == s) return o; - if (isList(s)) return s; - var i = IndexedIterable(s), - u = i.size; - return 0 === u - ? o - : (assertNotInfinite(u), - u > 0 && u < C - ? makeList(0, u, x, null, new VNode(i.toArray())) - : o.withMutations(function (s) { - (s.setSize(u), - i.forEach(function (o, i) { - return s.set(i, o); - })); - })); - } - function isList(s) { - return !(!s || !s[Ye]); - } - (createClass(List, IndexedCollection), - (List.of = function () { - return this(arguments); - }), - (List.prototype.toString = function () { - return this.__toString('List [', ']'); - }), - (List.prototype.get = function (s, o) { - if ((s = wrapIndex(this, s)) >= 0 && s < this.size) { - var i = listNodeFor(this, (s += this._origin)); - return i && i.array[s & j]; - } - return o; - }), - (List.prototype.set = function (s, o) { - return updateList(this, s, o); - }), - (List.prototype.remove = function (s) { - return this.has(s) - ? 0 === s - ? this.shift() - : s === this.size - 1 - ? this.pop() - : this.splice(s, 1) - : this; - }), - (List.prototype.insert = function (s, o) { - return this.splice(s, 0, o); - }), - (List.prototype.clear = function () { - return 0 === this.size - ? this - : this.__ownerID - ? ((this.size = this._origin = this._capacity = 0), - (this._level = x), - (this._root = this._tail = null), - (this.__hash = void 0), - (this.__altered = !0), - this) - : emptyList(); - }), - (List.prototype.push = function () { - var s = arguments, - o = this.size; - return this.withMutations(function (i) { - setListBounds(i, 0, o + s.length); - for (var u = 0; u < s.length; u++) i.set(o + u, s[u]); - }); - }), - (List.prototype.pop = function () { - return setListBounds(this, 0, -1); - }), - (List.prototype.unshift = function () { - var s = arguments; - return this.withMutations(function (o) { - setListBounds(o, -s.length); - for (var i = 0; i < s.length; i++) o.set(i, s[i]); - }); - }), - (List.prototype.shift = function () { - return setListBounds(this, 1); - }), - (List.prototype.merge = function () { - return mergeIntoListWith(this, void 0, arguments); - }), - (List.prototype.mergeWith = function (o) { - return mergeIntoListWith(this, o, s.call(arguments, 1)); - }), - (List.prototype.mergeDeep = function () { - return mergeIntoListWith(this, deepMerger, arguments); - }), - (List.prototype.mergeDeepWith = function (o) { - var i = s.call(arguments, 1); - return mergeIntoListWith(this, deepMergerWith(o), i); - }), - (List.prototype.setSize = function (s) { - return setListBounds(this, 0, s); - }), - (List.prototype.slice = function (s, o) { - var i = this.size; - return wholeSlice(s, o, i) - ? this - : setListBounds(this, resolveBegin(s, i), resolveEnd(o, i)); - }), - (List.prototype.__iterator = function (s, o) { - var i = 0, - u = iterateList(this, o); - return new Iterator(function () { - var o = u(); - return o === tt ? iteratorDone() : iteratorValue(s, i++, o); - }); - }), - (List.prototype.__iterate = function (s, o) { - for ( - var i, u = 0, _ = iterateList(this, o); - (i = _()) !== tt && !1 !== s(i, u++, this); - ); - return u; - }), - (List.prototype.__ensureOwner = function (s) { - return s === this.__ownerID - ? this - : s - ? makeList( - this._origin, - this._capacity, - this._level, - this._root, - this._tail, - s, - this.__hash - ) - : ((this.__ownerID = s), this); - }), - (List.isList = isList)); - var Ye = '@@__IMMUTABLE_LIST__@@', - Xe = List.prototype; - function VNode(s, o) { - ((this.array = s), (this.ownerID = o)); - } - ((Xe[Ye] = !0), - (Xe[w] = Xe.remove), - (Xe.setIn = $e.setIn), - (Xe.deleteIn = Xe.removeIn = $e.removeIn), - (Xe.update = $e.update), - (Xe.updateIn = $e.updateIn), - (Xe.mergeIn = $e.mergeIn), - (Xe.mergeDeepIn = $e.mergeDeepIn), - (Xe.withMutations = $e.withMutations), - (Xe.asMutable = $e.asMutable), - (Xe.asImmutable = $e.asImmutable), - (Xe.wasAltered = $e.wasAltered), - (VNode.prototype.removeBefore = function (s, o, i) { - if (i === o ? 1 << o : 0 === this.array.length) return this; - var u = (i >>> o) & j; - if (u >= this.array.length) return new VNode([], s); - var _, - w = 0 === u; - if (o > 0) { - var C = this.array[u]; - if ((_ = C && C.removeBefore(s, o - x, i)) === C && w) return this; - } - if (w && !_) return this; - var L = editableVNode(this, s); - if (!w) for (var B = 0; B < u; B++) L.array[B] = void 0; - return (_ && (L.array[u] = _), L); - }), - (VNode.prototype.removeAfter = function (s, o, i) { - if (i === (o ? 1 << o : 0) || 0 === this.array.length) return this; - var u, - _ = ((i - 1) >>> o) & j; - if (_ >= this.array.length) return this; - if (o > 0) { - var w = this.array[_]; - if ((u = w && w.removeAfter(s, o - x, i)) === w && _ === this.array.length - 1) - return this; - } - var C = editableVNode(this, s); - return (C.array.splice(_ + 1), u && (C.array[_] = u), C); - })); - var Qe, - et, - tt = {}; - function iterateList(s, o) { - var i = s._origin, - u = s._capacity, - _ = getTailOffset(u), - w = s._tail; - return iterateNodeOrLeaf(s._root, s._level, 0); - function iterateNodeOrLeaf(s, o, i) { - return 0 === o ? iterateLeaf(s, i) : iterateNode(s, o, i); - } - function iterateLeaf(s, x) { - var j = x === _ ? w && w.array : s && s.array, - L = x > i ? 0 : i - x, - B = u - x; - return ( - B > C && (B = C), - function () { - if (L === B) return tt; - var s = o ? --B : L++; - return j && j[s]; - } - ); - } - function iterateNode(s, _, w) { - var j, - L = s && s.array, - B = w > i ? 0 : (i - w) >> _, - $ = 1 + ((u - w) >> _); - return ( - $ > C && ($ = C), - function () { - for (;;) { - if (j) { - var s = j(); - if (s !== tt) return s; - j = null; - } - if (B === $) return tt; - var i = o ? --$ : B++; - j = iterateNodeOrLeaf(L && L[i], _ - x, w + (i << _)); - } - } - ); - } - } - function makeList(s, o, i, u, _, w, x) { - var C = Object.create(Xe); - return ( - (C.size = o - s), - (C._origin = s), - (C._capacity = o), - (C._level = i), - (C._root = u), - (C._tail = _), - (C.__ownerID = w), - (C.__hash = x), - (C.__altered = !1), - C - ); - } - function emptyList() { - return Qe || (Qe = makeList(0, 0, x)); - } - function updateList(s, o, i) { - if ((o = wrapIndex(s, o)) != o) return s; - if (o >= s.size || o < 0) - return s.withMutations(function (s) { - o < 0 ? setListBounds(s, o).set(0, i) : setListBounds(s, 0, o + 1).set(o, i); - }); - o += s._origin; - var u = s._tail, - _ = s._root, - w = MakeRef($); - return ( - o >= getTailOffset(s._capacity) - ? (u = updateVNode(u, s.__ownerID, 0, o, i, w)) - : (_ = updateVNode(_, s.__ownerID, s._level, o, i, w)), - w.value - ? s.__ownerID - ? ((s._root = _), (s._tail = u), (s.__hash = void 0), (s.__altered = !0), s) - : makeList(s._origin, s._capacity, s._level, _, u) - : s - ); - } - function updateVNode(s, o, i, u, _, w) { - var C, - L = (u >>> i) & j, - B = s && L < s.array.length; - if (!B && void 0 === _) return s; - if (i > 0) { - var $ = s && s.array[L], - V = updateVNode($, o, i - x, u, _, w); - return V === $ ? s : (((C = editableVNode(s, o)).array[L] = V), C); - } - return B && s.array[L] === _ - ? s - : (SetRef(w), - (C = editableVNode(s, o)), - void 0 === _ && L === C.array.length - 1 ? C.array.pop() : (C.array[L] = _), - C); - } - function editableVNode(s, o) { - return o && s && o === s.ownerID ? s : new VNode(s ? s.array.slice() : [], o); - } - function listNodeFor(s, o) { - if (o >= getTailOffset(s._capacity)) return s._tail; - if (o < 1 << (s._level + x)) { - for (var i = s._root, u = s._level; i && u > 0; ) - ((i = i.array[(o >>> u) & j]), (u -= x)); - return i; - } - } - function setListBounds(s, o, i) { - (void 0 !== o && (o |= 0), void 0 !== i && (i |= 0)); - var u = s.__ownerID || new OwnerID(), - _ = s._origin, - w = s._capacity, - C = _ + o, - L = void 0 === i ? w : i < 0 ? w + i : _ + i; - if (C === _ && L === w) return s; - if (C >= L) return s.clear(); - for (var B = s._level, $ = s._root, V = 0; C + V < 0; ) - (($ = new VNode($ && $.array.length ? [void 0, $] : [], u)), (V += 1 << (B += x))); - V && ((C += V), (_ += V), (L += V), (w += V)); - for (var U = getTailOffset(w), z = getTailOffset(L); z >= 1 << (B + x); ) - (($ = new VNode($ && $.array.length ? [$] : [], u)), (B += x)); - var Y = s._tail, - Z = z < U ? listNodeFor(s, L - 1) : z > U ? new VNode([], u) : Y; - if (Y && z > U && C < w && Y.array.length) { - for (var ee = ($ = editableVNode($, u)), ie = B; ie > x; ie -= x) { - var ae = (U >>> ie) & j; - ee = ee.array[ae] = editableVNode(ee.array[ae], u); - } - ee.array[(U >>> x) & j] = Y; - } - if ((L < w && (Z = Z && Z.removeAfter(u, 0, L)), C >= z)) - ((C -= z), (L -= z), (B = x), ($ = null), (Z = Z && Z.removeBefore(u, 0, C))); - else if (C > _ || z < U) { - for (V = 0; $; ) { - var le = (C >>> B) & j; - if ((le !== z >>> B) & j) break; - (le && (V += (1 << B) * le), (B -= x), ($ = $.array[le])); - } - ($ && C > _ && ($ = $.removeBefore(u, B, C - V)), - $ && z < U && ($ = $.removeAfter(u, B, z - V)), - V && ((C -= V), (L -= V))); - } - return s.__ownerID - ? ((s.size = L - C), - (s._origin = C), - (s._capacity = L), - (s._level = B), - (s._root = $), - (s._tail = Z), - (s.__hash = void 0), - (s.__altered = !0), - s) - : makeList(C, L, B, $, Z); - } - function mergeIntoListWith(s, o, i) { - for (var u = [], _ = 0, w = 0; w < i.length; w++) { - var x = i[w], - C = IndexedIterable(x); - (C.size > _ && (_ = C.size), - isIterable(x) || - (C = C.map(function (s) { - return fromJS(s); - })), - u.push(C)); - } - return (_ > s.size && (s = s.setSize(_)), mergeIntoCollectionWith(s, o, u)); - } - function getTailOffset(s) { - return s < C ? 0 : ((s - 1) >>> x) << x; - } - function OrderedMap(s) { - return null == s - ? emptyOrderedMap() - : isOrderedMap(s) - ? s - : emptyOrderedMap().withMutations(function (o) { - var i = KeyedIterable(s); - (assertNotInfinite(i.size), - i.forEach(function (s, i) { - return o.set(i, s); - })); - }); - } - function isOrderedMap(s) { - return isMap(s) && isOrdered(s); - } - function makeOrderedMap(s, o, i, u) { - var _ = Object.create(OrderedMap.prototype); - return ( - (_.size = s ? s.size : 0), - (_._map = s), - (_._list = o), - (_.__ownerID = i), - (_.__hash = u), - _ - ); - } - function emptyOrderedMap() { - return et || (et = makeOrderedMap(emptyMap(), emptyList())); - } - function updateOrderedMap(s, o, i) { - var u, - _, - w = s._map, - x = s._list, - j = w.get(o), - B = void 0 !== j; - if (i === L) { - if (!B) return s; - x.size >= C && x.size >= 2 * w.size - ? ((u = (_ = x.filter(function (s, o) { - return void 0 !== s && j !== o; - })) - .toKeyedSeq() - .map(function (s) { - return s[0]; - }) - .flip() - .toMap()), - s.__ownerID && (u.__ownerID = _.__ownerID = s.__ownerID)) - : ((u = w.remove(o)), (_ = j === x.size - 1 ? x.pop() : x.set(j, void 0))); - } else if (B) { - if (i === x.get(j)[1]) return s; - ((u = w), (_ = x.set(j, [o, i]))); - } else ((u = w.set(o, x.size)), (_ = x.set(x.size, [o, i]))); - return s.__ownerID - ? ((s.size = u.size), (s._map = u), (s._list = _), (s.__hash = void 0), s) - : makeOrderedMap(u, _); - } - function ToKeyedSequence(s, o) { - ((this._iter = s), (this._useKeys = o), (this.size = s.size)); - } - function ToIndexedSequence(s) { - ((this._iter = s), (this.size = s.size)); - } - function ToSetSequence(s) { - ((this._iter = s), (this.size = s.size)); - } - function FromEntriesSequence(s) { - ((this._iter = s), (this.size = s.size)); - } - function flipFactory(s) { - var o = makeSequence(s); - return ( - (o._iter = s), - (o.size = s.size), - (o.flip = function () { - return s; - }), - (o.reverse = function () { - var o = s.reverse.apply(this); - return ( - (o.flip = function () { - return s.reverse(); - }), - o - ); - }), - (o.has = function (o) { - return s.includes(o); - }), - (o.includes = function (o) { - return s.has(o); - }), - (o.cacheResult = cacheResultThrough), - (o.__iterateUncached = function (o, i) { - var u = this; - return s.__iterate(function (s, i) { - return !1 !== o(i, s, u); - }, i); - }), - (o.__iteratorUncached = function (o, i) { - if (o === z) { - var u = s.__iterator(o, i); - return new Iterator(function () { - var s = u.next(); - if (!s.done) { - var o = s.value[0]; - ((s.value[0] = s.value[1]), (s.value[1] = o)); - } - return s; - }); - } - return s.__iterator(o === U ? V : U, i); - }), - o - ); - } - function mapFactory(s, o, i) { - var u = makeSequence(s); - return ( - (u.size = s.size), - (u.has = function (o) { - return s.has(o); - }), - (u.get = function (u, _) { - var w = s.get(u, L); - return w === L ? _ : o.call(i, w, u, s); - }), - (u.__iterateUncached = function (u, _) { - var w = this; - return s.__iterate(function (s, _, x) { - return !1 !== u(o.call(i, s, _, x), _, w); - }, _); - }), - (u.__iteratorUncached = function (u, _) { - var w = s.__iterator(z, _); - return new Iterator(function () { - var _ = w.next(); - if (_.done) return _; - var x = _.value, - C = x[0]; - return iteratorValue(u, C, o.call(i, x[1], C, s), _); - }); - }), - u - ); - } - function reverseFactory(s, o) { - var i = makeSequence(s); - return ( - (i._iter = s), - (i.size = s.size), - (i.reverse = function () { - return s; - }), - s.flip && - (i.flip = function () { - var o = flipFactory(s); - return ( - (o.reverse = function () { - return s.flip(); - }), - o - ); - }), - (i.get = function (i, u) { - return s.get(o ? i : -1 - i, u); - }), - (i.has = function (i) { - return s.has(o ? i : -1 - i); - }), - (i.includes = function (o) { - return s.includes(o); - }), - (i.cacheResult = cacheResultThrough), - (i.__iterate = function (o, i) { - var u = this; - return s.__iterate(function (s, i) { - return o(s, i, u); - }, !i); - }), - (i.__iterator = function (o, i) { - return s.__iterator(o, !i); - }), - i - ); - } - function filterFactory(s, o, i, u) { - var _ = makeSequence(s); - return ( - u && - ((_.has = function (u) { - var _ = s.get(u, L); - return _ !== L && !!o.call(i, _, u, s); - }), - (_.get = function (u, _) { - var w = s.get(u, L); - return w !== L && o.call(i, w, u, s) ? w : _; - })), - (_.__iterateUncached = function (_, w) { - var x = this, - C = 0; - return ( - s.__iterate(function (s, w, j) { - if (o.call(i, s, w, j)) return (C++, _(s, u ? w : C - 1, x)); - }, w), - C - ); - }), - (_.__iteratorUncached = function (_, w) { - var x = s.__iterator(z, w), - C = 0; - return new Iterator(function () { - for (;;) { - var w = x.next(); - if (w.done) return w; - var j = w.value, - L = j[0], - B = j[1]; - if (o.call(i, B, L, s)) return iteratorValue(_, u ? L : C++, B, w); - } - }); - }), - _ - ); - } - function countByFactory(s, o, i) { - var u = Map().asMutable(); - return ( - s.__iterate(function (_, w) { - u.update(o.call(i, _, w, s), 0, function (s) { - return s + 1; - }); - }), - u.asImmutable() - ); - } - function groupByFactory(s, o, i) { - var u = isKeyed(s), - _ = (isOrdered(s) ? OrderedMap() : Map()).asMutable(); - s.__iterate(function (w, x) { - _.update(o.call(i, w, x, s), function (s) { - return ((s = s || []).push(u ? [x, w] : w), s); - }); - }); - var w = iterableClass(s); - return _.map(function (o) { - return reify(s, w(o)); - }); - } - function sliceFactory(s, o, i, u) { - var _ = s.size; - if ( - (void 0 !== o && (o |= 0), - void 0 !== i && (i === 1 / 0 ? (i = _) : (i |= 0)), - wholeSlice(o, i, _)) - ) - return s; - var w = resolveBegin(o, _), - x = resolveEnd(i, _); - if (w != w || x != x) return sliceFactory(s.toSeq().cacheResult(), o, i, u); - var C, - j = x - w; - j == j && (C = j < 0 ? 0 : j); - var L = makeSequence(s); - return ( - (L.size = 0 === C ? C : (s.size && C) || void 0), - !u && - isSeq(s) && - C >= 0 && - (L.get = function (o, i) { - return (o = wrapIndex(this, o)) >= 0 && o < C ? s.get(o + w, i) : i; - }), - (L.__iterateUncached = function (o, i) { - var _ = this; - if (0 === C) return 0; - if (i) return this.cacheResult().__iterate(o, i); - var x = 0, - j = !0, - L = 0; - return ( - s.__iterate(function (s, i) { - if (!j || !(j = x++ < w)) - return (L++, !1 !== o(s, u ? i : L - 1, _) && L !== C); - }), - L - ); - }), - (L.__iteratorUncached = function (o, i) { - if (0 !== C && i) return this.cacheResult().__iterator(o, i); - var _ = 0 !== C && s.__iterator(o, i), - x = 0, - j = 0; - return new Iterator(function () { - for (; x++ < w; ) _.next(); - if (++j > C) return iteratorDone(); - var s = _.next(); - return u || o === U - ? s - : iteratorValue(o, j - 1, o === V ? void 0 : s.value[1], s); - }); - }), - L - ); - } - function takeWhileFactory(s, o, i) { - var u = makeSequence(s); - return ( - (u.__iterateUncached = function (u, _) { - var w = this; - if (_) return this.cacheResult().__iterate(u, _); - var x = 0; - return ( - s.__iterate(function (s, _, C) { - return o.call(i, s, _, C) && ++x && u(s, _, w); - }), - x - ); - }), - (u.__iteratorUncached = function (u, _) { - var w = this; - if (_) return this.cacheResult().__iterator(u, _); - var x = s.__iterator(z, _), - C = !0; - return new Iterator(function () { - if (!C) return iteratorDone(); - var s = x.next(); - if (s.done) return s; - var _ = s.value, - j = _[0], - L = _[1]; - return o.call(i, L, j, w) - ? u === z - ? s - : iteratorValue(u, j, L, s) - : ((C = !1), iteratorDone()); - }); - }), - u - ); - } - function skipWhileFactory(s, o, i, u) { - var _ = makeSequence(s); - return ( - (_.__iterateUncached = function (_, w) { - var x = this; - if (w) return this.cacheResult().__iterate(_, w); - var C = !0, - j = 0; - return ( - s.__iterate(function (s, w, L) { - if (!C || !(C = o.call(i, s, w, L))) return (j++, _(s, u ? w : j - 1, x)); - }), - j - ); - }), - (_.__iteratorUncached = function (_, w) { - var x = this; - if (w) return this.cacheResult().__iterator(_, w); - var C = s.__iterator(z, w), - j = !0, - L = 0; - return new Iterator(function () { - var s, w, B; - do { - if ((s = C.next()).done) - return u || _ === U - ? s - : iteratorValue(_, L++, _ === V ? void 0 : s.value[1], s); - var $ = s.value; - ((w = $[0]), (B = $[1]), j && (j = o.call(i, B, w, x))); - } while (j); - return _ === z ? s : iteratorValue(_, w, B, s); - }); - }), - _ - ); - } - function concatFactory(s, o) { - var i = isKeyed(s), - u = [s] - .concat(o) - .map(function (s) { - return ( - isIterable(s) - ? i && (s = KeyedIterable(s)) - : (s = i - ? keyedSeqFromValue(s) - : indexedSeqFromValue(Array.isArray(s) ? s : [s])), - s - ); - }) - .filter(function (s) { - return 0 !== s.size; - }); - if (0 === u.length) return s; - if (1 === u.length) { - var _ = u[0]; - if (_ === s || (i && isKeyed(_)) || (isIndexed(s) && isIndexed(_))) return _; - } - var w = new ArraySeq(u); - return ( - i ? (w = w.toKeyedSeq()) : isIndexed(s) || (w = w.toSetSeq()), - ((w = w.flatten(!0)).size = u.reduce(function (s, o) { - if (void 0 !== s) { - var i = o.size; - if (void 0 !== i) return s + i; - } - }, 0)), - w - ); - } - function flattenFactory(s, o, i) { - var u = makeSequence(s); - return ( - (u.__iterateUncached = function (u, _) { - var w = 0, - x = !1; - function flatDeep(s, C) { - var j = this; - s.__iterate(function (s, _) { - return ( - (!o || C < o) && isIterable(s) - ? flatDeep(s, C + 1) - : !1 === u(s, i ? _ : w++, j) && (x = !0), - !x - ); - }, _); - } - return (flatDeep(s, 0), w); - }), - (u.__iteratorUncached = function (u, _) { - var w = s.__iterator(u, _), - x = [], - C = 0; - return new Iterator(function () { - for (; w; ) { - var s = w.next(); - if (!1 === s.done) { - var j = s.value; - if ((u === z && (j = j[1]), (o && !(x.length < o)) || !isIterable(j))) - return i ? s : iteratorValue(u, C++, j, s); - (x.push(w), (w = j.__iterator(u, _))); - } else w = x.pop(); - } - return iteratorDone(); - }); - }), - u - ); - } - function flatMapFactory(s, o, i) { - var u = iterableClass(s); - return s - .toSeq() - .map(function (_, w) { - return u(o.call(i, _, w, s)); - }) - .flatten(!0); - } - function interposeFactory(s, o) { - var i = makeSequence(s); - return ( - (i.size = s.size && 2 * s.size - 1), - (i.__iterateUncached = function (i, u) { - var _ = this, - w = 0; - return ( - s.__iterate(function (s, u) { - return (!w || !1 !== i(o, w++, _)) && !1 !== i(s, w++, _); - }, u), - w - ); - }), - (i.__iteratorUncached = function (i, u) { - var _, - w = s.__iterator(U, u), - x = 0; - return new Iterator(function () { - return (!_ || x % 2) && (_ = w.next()).done - ? _ - : x % 2 - ? iteratorValue(i, x++, o) - : iteratorValue(i, x++, _.value, _); - }); - }), - i - ); - } - function sortFactory(s, o, i) { - o || (o = defaultComparator); - var u = isKeyed(s), - _ = 0, - w = s - .toSeq() - .map(function (o, u) { - return [u, o, _++, i ? i(o, u, s) : o]; - }) - .toArray(); - return ( - w - .sort(function (s, i) { - return o(s[3], i[3]) || s[2] - i[2]; - }) - .forEach( - u - ? function (s, o) { - w[o].length = 2; - } - : function (s, o) { - w[o] = s[1]; - } - ), - u ? KeyedSeq(w) : isIndexed(s) ? IndexedSeq(w) : SetSeq(w) - ); - } - function maxFactory(s, o, i) { - if ((o || (o = defaultComparator), i)) { - var u = s - .toSeq() - .map(function (o, u) { - return [o, i(o, u, s)]; - }) - .reduce(function (s, i) { - return maxCompare(o, s[1], i[1]) ? i : s; - }); - return u && u[0]; - } - return s.reduce(function (s, i) { - return maxCompare(o, s, i) ? i : s; - }); - } - function maxCompare(s, o, i) { - var u = s(i, o); - return (0 === u && i !== o && (null == i || i != i)) || u > 0; - } - function zipWithFactory(s, o, i) { - var u = makeSequence(s); - return ( - (u.size = new ArraySeq(i) - .map(function (s) { - return s.size; - }) - .min()), - (u.__iterate = function (s, o) { - for ( - var i, u = this.__iterator(U, o), _ = 0; - !(i = u.next()).done && !1 !== s(i.value, _++, this); - ); - return _; - }), - (u.__iteratorUncached = function (s, u) { - var _ = i.map(function (s) { - return ((s = Iterable(s)), getIterator(u ? s.reverse() : s)); - }), - w = 0, - x = !1; - return new Iterator(function () { - var i; - return ( - x || - ((i = _.map(function (s) { - return s.next(); - })), - (x = i.some(function (s) { - return s.done; - }))), - x - ? iteratorDone() - : iteratorValue( - s, - w++, - o.apply( - null, - i.map(function (s) { - return s.value; - }) - ) - ) - ); - }); - }), - u - ); - } - function reify(s, o) { - return isSeq(s) ? o : s.constructor(o); - } - function validateEntry(s) { - if (s !== Object(s)) throw new TypeError('Expected [K, V] tuple: ' + s); - } - function resolveSize(s) { - return (assertNotInfinite(s.size), ensureSize(s)); - } - function iterableClass(s) { - return isKeyed(s) ? KeyedIterable : isIndexed(s) ? IndexedIterable : SetIterable; - } - function makeSequence(s) { - return Object.create( - (isKeyed(s) ? KeyedSeq : isIndexed(s) ? IndexedSeq : SetSeq).prototype - ); - } - function cacheResultThrough() { - return this._iter.cacheResult - ? (this._iter.cacheResult(), (this.size = this._iter.size), this) - : Seq.prototype.cacheResult.call(this); - } - function defaultComparator(s, o) { - return s > o ? 1 : s < o ? -1 : 0; - } - function forceIterator(s) { - var o = getIterator(s); - if (!o) { - if (!isArrayLike(s)) throw new TypeError('Expected iterable or array-like: ' + s); - o = getIterator(Iterable(s)); - } - return o; - } - function Record(s, o) { - var i, - u = function Record(w) { - if (w instanceof u) return w; - if (!(this instanceof u)) return new u(w); - if (!i) { - i = !0; - var x = Object.keys(s); - (setProps(_, x), - (_.size = x.length), - (_._name = o), - (_._keys = x), - (_._defaultValues = s)); - } - this._map = Map(w); - }, - _ = (u.prototype = Object.create(rt)); - return ((_.constructor = u), u); - } - (createClass(OrderedMap, Map), - (OrderedMap.of = function () { - return this(arguments); - }), - (OrderedMap.prototype.toString = function () { - return this.__toString('OrderedMap {', '}'); - }), - (OrderedMap.prototype.get = function (s, o) { - var i = this._map.get(s); - return void 0 !== i ? this._list.get(i)[1] : o; - }), - (OrderedMap.prototype.clear = function () { - return 0 === this.size - ? this - : this.__ownerID - ? ((this.size = 0), this._map.clear(), this._list.clear(), this) - : emptyOrderedMap(); - }), - (OrderedMap.prototype.set = function (s, o) { - return updateOrderedMap(this, s, o); - }), - (OrderedMap.prototype.remove = function (s) { - return updateOrderedMap(this, s, L); - }), - (OrderedMap.prototype.wasAltered = function () { - return this._map.wasAltered() || this._list.wasAltered(); - }), - (OrderedMap.prototype.__iterate = function (s, o) { - var i = this; - return this._list.__iterate(function (o) { - return o && s(o[1], o[0], i); - }, o); - }), - (OrderedMap.prototype.__iterator = function (s, o) { - return this._list.fromEntrySeq().__iterator(s, o); - }), - (OrderedMap.prototype.__ensureOwner = function (s) { - if (s === this.__ownerID) return this; - var o = this._map.__ensureOwner(s), - i = this._list.__ensureOwner(s); - return s - ? makeOrderedMap(o, i, s, this.__hash) - : ((this.__ownerID = s), (this._map = o), (this._list = i), this); - }), - (OrderedMap.isOrderedMap = isOrderedMap), - (OrderedMap.prototype[_] = !0), - (OrderedMap.prototype[w] = OrderedMap.prototype.remove), - createClass(ToKeyedSequence, KeyedSeq), - (ToKeyedSequence.prototype.get = function (s, o) { - return this._iter.get(s, o); - }), - (ToKeyedSequence.prototype.has = function (s) { - return this._iter.has(s); - }), - (ToKeyedSequence.prototype.valueSeq = function () { - return this._iter.valueSeq(); - }), - (ToKeyedSequence.prototype.reverse = function () { - var s = this, - o = reverseFactory(this, !0); - return ( - this._useKeys || - (o.valueSeq = function () { - return s._iter.toSeq().reverse(); - }), - o - ); - }), - (ToKeyedSequence.prototype.map = function (s, o) { - var i = this, - u = mapFactory(this, s, o); - return ( - this._useKeys || - (u.valueSeq = function () { - return i._iter.toSeq().map(s, o); - }), - u - ); - }), - (ToKeyedSequence.prototype.__iterate = function (s, o) { - var i, - u = this; - return this._iter.__iterate( - this._useKeys - ? function (o, i) { - return s(o, i, u); - } - : ((i = o ? resolveSize(this) : 0), - function (_) { - return s(_, o ? --i : i++, u); - }), - o - ); - }), - (ToKeyedSequence.prototype.__iterator = function (s, o) { - if (this._useKeys) return this._iter.__iterator(s, o); - var i = this._iter.__iterator(U, o), - u = o ? resolveSize(this) : 0; - return new Iterator(function () { - var _ = i.next(); - return _.done ? _ : iteratorValue(s, o ? --u : u++, _.value, _); - }); - }), - (ToKeyedSequence.prototype[_] = !0), - createClass(ToIndexedSequence, IndexedSeq), - (ToIndexedSequence.prototype.includes = function (s) { - return this._iter.includes(s); - }), - (ToIndexedSequence.prototype.__iterate = function (s, o) { - var i = this, - u = 0; - return this._iter.__iterate(function (o) { - return s(o, u++, i); - }, o); - }), - (ToIndexedSequence.prototype.__iterator = function (s, o) { - var i = this._iter.__iterator(U, o), - u = 0; - return new Iterator(function () { - var o = i.next(); - return o.done ? o : iteratorValue(s, u++, o.value, o); - }); - }), - createClass(ToSetSequence, SetSeq), - (ToSetSequence.prototype.has = function (s) { - return this._iter.includes(s); - }), - (ToSetSequence.prototype.__iterate = function (s, o) { - var i = this; - return this._iter.__iterate(function (o) { - return s(o, o, i); - }, o); - }), - (ToSetSequence.prototype.__iterator = function (s, o) { - var i = this._iter.__iterator(U, o); - return new Iterator(function () { - var o = i.next(); - return o.done ? o : iteratorValue(s, o.value, o.value, o); - }); - }), - createClass(FromEntriesSequence, KeyedSeq), - (FromEntriesSequence.prototype.entrySeq = function () { - return this._iter.toSeq(); - }), - (FromEntriesSequence.prototype.__iterate = function (s, o) { - var i = this; - return this._iter.__iterate(function (o) { - if (o) { - validateEntry(o); - var u = isIterable(o); - return s(u ? o.get(1) : o[1], u ? o.get(0) : o[0], i); - } - }, o); - }), - (FromEntriesSequence.prototype.__iterator = function (s, o) { - var i = this._iter.__iterator(U, o); - return new Iterator(function () { - for (;;) { - var o = i.next(); - if (o.done) return o; - var u = o.value; - if (u) { - validateEntry(u); - var _ = isIterable(u); - return iteratorValue(s, _ ? u.get(0) : u[0], _ ? u.get(1) : u[1], o); - } - } - }); - }), - (ToIndexedSequence.prototype.cacheResult = - ToKeyedSequence.prototype.cacheResult = - ToSetSequence.prototype.cacheResult = - FromEntriesSequence.prototype.cacheResult = - cacheResultThrough), - createClass(Record, KeyedCollection), - (Record.prototype.toString = function () { - return this.__toString(recordName(this) + ' {', '}'); - }), - (Record.prototype.has = function (s) { - return this._defaultValues.hasOwnProperty(s); - }), - (Record.prototype.get = function (s, o) { - if (!this.has(s)) return o; - var i = this._defaultValues[s]; - return this._map ? this._map.get(s, i) : i; - }), - (Record.prototype.clear = function () { - if (this.__ownerID) return (this._map && this._map.clear(), this); - var s = this.constructor; - return s._empty || (s._empty = makeRecord(this, emptyMap())); - }), - (Record.prototype.set = function (s, o) { - if (!this.has(s)) - throw new Error('Cannot set unknown key "' + s + '" on ' + recordName(this)); - if (this._map && !this._map.has(s) && o === this._defaultValues[s]) return this; - var i = this._map && this._map.set(s, o); - return this.__ownerID || i === this._map ? this : makeRecord(this, i); - }), - (Record.prototype.remove = function (s) { - if (!this.has(s)) return this; - var o = this._map && this._map.remove(s); - return this.__ownerID || o === this._map ? this : makeRecord(this, o); - }), - (Record.prototype.wasAltered = function () { - return this._map.wasAltered(); - }), - (Record.prototype.__iterator = function (s, o) { - var i = this; - return KeyedIterable(this._defaultValues) - .map(function (s, o) { - return i.get(o); - }) - .__iterator(s, o); - }), - (Record.prototype.__iterate = function (s, o) { - var i = this; - return KeyedIterable(this._defaultValues) - .map(function (s, o) { - return i.get(o); - }) - .__iterate(s, o); - }), - (Record.prototype.__ensureOwner = function (s) { - if (s === this.__ownerID) return this; - var o = this._map && this._map.__ensureOwner(s); - return s ? makeRecord(this, o, s) : ((this.__ownerID = s), (this._map = o), this); - })); - var rt = Record.prototype; - function makeRecord(s, o, i) { - var u = Object.create(Object.getPrototypeOf(s)); - return ((u._map = o), (u.__ownerID = i), u); - } - function recordName(s) { - return s._name || s.constructor.name || 'Record'; - } - function setProps(s, o) { - try { - o.forEach(setProp.bind(void 0, s)); - } catch (s) {} - } - function setProp(s, o) { - Object.defineProperty(s, o, { - get: function () { - return this.get(o); - }, - set: function (s) { - (invariant(this.__ownerID, 'Cannot set on an immutable record.'), this.set(o, s)); - } - }); - } - function Set(s) { - return null == s - ? emptySet() - : isSet(s) && !isOrdered(s) - ? s - : emptySet().withMutations(function (o) { - var i = SetIterable(s); - (assertNotInfinite(i.size), - i.forEach(function (s) { - return o.add(s); - })); - }); - } - function isSet(s) { - return !(!s || !s[st]); - } - ((rt[w] = rt.remove), - (rt.deleteIn = rt.removeIn = $e.removeIn), - (rt.merge = $e.merge), - (rt.mergeWith = $e.mergeWith), - (rt.mergeIn = $e.mergeIn), - (rt.mergeDeep = $e.mergeDeep), - (rt.mergeDeepWith = $e.mergeDeepWith), - (rt.mergeDeepIn = $e.mergeDeepIn), - (rt.setIn = $e.setIn), - (rt.update = $e.update), - (rt.updateIn = $e.updateIn), - (rt.withMutations = $e.withMutations), - (rt.asMutable = $e.asMutable), - (rt.asImmutable = $e.asImmutable), - createClass(Set, SetCollection), - (Set.of = function () { - return this(arguments); - }), - (Set.fromKeys = function (s) { - return this(KeyedIterable(s).keySeq()); - }), - (Set.prototype.toString = function () { - return this.__toString('Set {', '}'); - }), - (Set.prototype.has = function (s) { - return this._map.has(s); - }), - (Set.prototype.add = function (s) { - return updateSet(this, this._map.set(s, !0)); - }), - (Set.prototype.remove = function (s) { - return updateSet(this, this._map.remove(s)); - }), - (Set.prototype.clear = function () { - return updateSet(this, this._map.clear()); - }), - (Set.prototype.union = function () { - var o = s.call(arguments, 0); - return 0 === - (o = o.filter(function (s) { - return 0 !== s.size; - })).length - ? this - : 0 !== this.size || this.__ownerID || 1 !== o.length - ? this.withMutations(function (s) { - for (var i = 0; i < o.length; i++) - SetIterable(o[i]).forEach(function (o) { - return s.add(o); - }); - }) - : this.constructor(o[0]); - }), - (Set.prototype.intersect = function () { - var o = s.call(arguments, 0); - if (0 === o.length) return this; - o = o.map(function (s) { - return SetIterable(s); - }); - var i = this; - return this.withMutations(function (s) { - i.forEach(function (i) { - o.every(function (s) { - return s.includes(i); - }) || s.remove(i); - }); - }); - }), - (Set.prototype.subtract = function () { - var o = s.call(arguments, 0); - if (0 === o.length) return this; - o = o.map(function (s) { - return SetIterable(s); - }); - var i = this; - return this.withMutations(function (s) { - i.forEach(function (i) { - o.some(function (s) { - return s.includes(i); - }) && s.remove(i); - }); - }); - }), - (Set.prototype.merge = function () { - return this.union.apply(this, arguments); - }), - (Set.prototype.mergeWith = function (o) { - var i = s.call(arguments, 1); - return this.union.apply(this, i); - }), - (Set.prototype.sort = function (s) { - return OrderedSet(sortFactory(this, s)); - }), - (Set.prototype.sortBy = function (s, o) { - return OrderedSet(sortFactory(this, o, s)); - }), - (Set.prototype.wasAltered = function () { - return this._map.wasAltered(); - }), - (Set.prototype.__iterate = function (s, o) { - var i = this; - return this._map.__iterate(function (o, u) { - return s(u, u, i); - }, o); - }), - (Set.prototype.__iterator = function (s, o) { - return this._map - .map(function (s, o) { - return o; - }) - .__iterator(s, o); - }), - (Set.prototype.__ensureOwner = function (s) { - if (s === this.__ownerID) return this; - var o = this._map.__ensureOwner(s); - return s ? this.__make(o, s) : ((this.__ownerID = s), (this._map = o), this); - }), - (Set.isSet = isSet)); - var nt, - st = '@@__IMMUTABLE_SET__@@', - ot = Set.prototype; - function updateSet(s, o) { - return s.__ownerID - ? ((s.size = o.size), (s._map = o), s) - : o === s._map - ? s - : 0 === o.size - ? s.__empty() - : s.__make(o); - } - function makeSet(s, o) { - var i = Object.create(ot); - return ((i.size = s ? s.size : 0), (i._map = s), (i.__ownerID = o), i); - } - function emptySet() { - return nt || (nt = makeSet(emptyMap())); - } - function OrderedSet(s) { - return null == s - ? emptyOrderedSet() - : isOrderedSet(s) - ? s - : emptyOrderedSet().withMutations(function (o) { - var i = SetIterable(s); - (assertNotInfinite(i.size), - i.forEach(function (s) { - return o.add(s); - })); - }); - } - function isOrderedSet(s) { - return isSet(s) && isOrdered(s); - } - ((ot[st] = !0), - (ot[w] = ot.remove), - (ot.mergeDeep = ot.merge), - (ot.mergeDeepWith = ot.mergeWith), - (ot.withMutations = $e.withMutations), - (ot.asMutable = $e.asMutable), - (ot.asImmutable = $e.asImmutable), - (ot.__empty = emptySet), - (ot.__make = makeSet), - createClass(OrderedSet, Set), - (OrderedSet.of = function () { - return this(arguments); - }), - (OrderedSet.fromKeys = function (s) { - return this(KeyedIterable(s).keySeq()); - }), - (OrderedSet.prototype.toString = function () { - return this.__toString('OrderedSet {', '}'); - }), - (OrderedSet.isOrderedSet = isOrderedSet)); - var it, - at = OrderedSet.prototype; - function makeOrderedSet(s, o) { - var i = Object.create(at); - return ((i.size = s ? s.size : 0), (i._map = s), (i.__ownerID = o), i); - } - function emptyOrderedSet() { - return it || (it = makeOrderedSet(emptyOrderedMap())); - } - function Stack(s) { - return null == s ? emptyStack() : isStack(s) ? s : emptyStack().unshiftAll(s); - } - function isStack(s) { - return !(!s || !s[ct]); - } - ((at[_] = !0), - (at.__empty = emptyOrderedSet), - (at.__make = makeOrderedSet), - createClass(Stack, IndexedCollection), - (Stack.of = function () { - return this(arguments); - }), - (Stack.prototype.toString = function () { - return this.__toString('Stack [', ']'); - }), - (Stack.prototype.get = function (s, o) { - var i = this._head; - for (s = wrapIndex(this, s); i && s--; ) i = i.next; - return i ? i.value : o; - }), - (Stack.prototype.peek = function () { - return this._head && this._head.value; - }), - (Stack.prototype.push = function () { - if (0 === arguments.length) return this; - for ( - var s = this.size + arguments.length, o = this._head, i = arguments.length - 1; - i >= 0; - i-- - ) - o = { value: arguments[i], next: o }; - return this.__ownerID - ? ((this.size = s), - (this._head = o), - (this.__hash = void 0), - (this.__altered = !0), - this) - : makeStack(s, o); - }), - (Stack.prototype.pushAll = function (s) { - if (0 === (s = IndexedIterable(s)).size) return this; - assertNotInfinite(s.size); - var o = this.size, - i = this._head; - return ( - s.reverse().forEach(function (s) { - (o++, (i = { value: s, next: i })); - }), - this.__ownerID - ? ((this.size = o), - (this._head = i), - (this.__hash = void 0), - (this.__altered = !0), - this) - : makeStack(o, i) - ); - }), - (Stack.prototype.pop = function () { - return this.slice(1); - }), - (Stack.prototype.unshift = function () { - return this.push.apply(this, arguments); - }), - (Stack.prototype.unshiftAll = function (s) { - return this.pushAll(s); - }), - (Stack.prototype.shift = function () { - return this.pop.apply(this, arguments); - }), - (Stack.prototype.clear = function () { - return 0 === this.size - ? this - : this.__ownerID - ? ((this.size = 0), - (this._head = void 0), - (this.__hash = void 0), - (this.__altered = !0), - this) - : emptyStack(); - }), - (Stack.prototype.slice = function (s, o) { - if (wholeSlice(s, o, this.size)) return this; - var i = resolveBegin(s, this.size); - if (resolveEnd(o, this.size) !== this.size) - return IndexedCollection.prototype.slice.call(this, s, o); - for (var u = this.size - i, _ = this._head; i--; ) _ = _.next; - return this.__ownerID - ? ((this.size = u), - (this._head = _), - (this.__hash = void 0), - (this.__altered = !0), - this) - : makeStack(u, _); - }), - (Stack.prototype.__ensureOwner = function (s) { - return s === this.__ownerID - ? this - : s - ? makeStack(this.size, this._head, s, this.__hash) - : ((this.__ownerID = s), (this.__altered = !1), this); - }), - (Stack.prototype.__iterate = function (s, o) { - if (o) return this.reverse().__iterate(s); - for (var i = 0, u = this._head; u && !1 !== s(u.value, i++, this); ) u = u.next; - return i; - }), - (Stack.prototype.__iterator = function (s, o) { - if (o) return this.reverse().__iterator(s); - var i = 0, - u = this._head; - return new Iterator(function () { - if (u) { - var o = u.value; - return ((u = u.next), iteratorValue(s, i++, o)); - } - return iteratorDone(); - }); - }), - (Stack.isStack = isStack)); - var lt, - ct = '@@__IMMUTABLE_STACK__@@', - ut = Stack.prototype; - function makeStack(s, o, i, u) { - var _ = Object.create(ut); - return ( - (_.size = s), - (_._head = o), - (_.__ownerID = i), - (_.__hash = u), - (_.__altered = !1), - _ - ); - } - function emptyStack() { - return lt || (lt = makeStack(0)); - } - function mixin(s, o) { - var keyCopier = function (i) { - s.prototype[i] = o[i]; - }; - return ( - Object.keys(o).forEach(keyCopier), - Object.getOwnPropertySymbols && Object.getOwnPropertySymbols(o).forEach(keyCopier), - s - ); - } - ((ut[ct] = !0), - (ut.withMutations = $e.withMutations), - (ut.asMutable = $e.asMutable), - (ut.asImmutable = $e.asImmutable), - (ut.wasAltered = $e.wasAltered), - (Iterable.Iterator = Iterator), - mixin(Iterable, { - toArray: function () { - assertNotInfinite(this.size); - var s = new Array(this.size || 0); - return ( - this.valueSeq().__iterate(function (o, i) { - s[i] = o; - }), - s - ); - }, - toIndexedSeq: function () { - return new ToIndexedSequence(this); - }, - toJS: function () { - return this.toSeq() - .map(function (s) { - return s && 'function' == typeof s.toJS ? s.toJS() : s; - }) - .__toJS(); - }, - toJSON: function () { - return this.toSeq() - .map(function (s) { - return s && 'function' == typeof s.toJSON ? s.toJSON() : s; - }) - .__toJS(); - }, - toKeyedSeq: function () { - return new ToKeyedSequence(this, !0); - }, - toMap: function () { - return Map(this.toKeyedSeq()); - }, - toObject: function () { - assertNotInfinite(this.size); - var s = {}; - return ( - this.__iterate(function (o, i) { - s[i] = o; - }), - s - ); - }, - toOrderedMap: function () { - return OrderedMap(this.toKeyedSeq()); - }, - toOrderedSet: function () { - return OrderedSet(isKeyed(this) ? this.valueSeq() : this); - }, - toSet: function () { - return Set(isKeyed(this) ? this.valueSeq() : this); - }, - toSetSeq: function () { - return new ToSetSequence(this); - }, - toSeq: function () { - return isIndexed(this) - ? this.toIndexedSeq() - : isKeyed(this) - ? this.toKeyedSeq() - : this.toSetSeq(); - }, - toStack: function () { - return Stack(isKeyed(this) ? this.valueSeq() : this); - }, - toList: function () { - return List(isKeyed(this) ? this.valueSeq() : this); - }, - toString: function () { - return '[Iterable]'; - }, - __toString: function (s, o) { - return 0 === this.size - ? s + o - : s + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + o; - }, - concat: function () { - return reify(this, concatFactory(this, s.call(arguments, 0))); - }, - includes: function (s) { - return this.some(function (o) { - return is(o, s); - }); - }, - entries: function () { - return this.__iterator(z); - }, - every: function (s, o) { - assertNotInfinite(this.size); - var i = !0; - return ( - this.__iterate(function (u, _, w) { - if (!s.call(o, u, _, w)) return ((i = !1), !1); - }), - i - ); - }, - filter: function (s, o) { - return reify(this, filterFactory(this, s, o, !0)); - }, - find: function (s, o, i) { - var u = this.findEntry(s, o); - return u ? u[1] : i; - }, - forEach: function (s, o) { - return (assertNotInfinite(this.size), this.__iterate(o ? s.bind(o) : s)); - }, - join: function (s) { - (assertNotInfinite(this.size), (s = void 0 !== s ? '' + s : ',')); - var o = '', - i = !0; - return ( - this.__iterate(function (u) { - (i ? (i = !1) : (o += s), (o += null != u ? u.toString() : '')); - }), - o - ); - }, - keys: function () { - return this.__iterator(V); - }, - map: function (s, o) { - return reify(this, mapFactory(this, s, o)); - }, - reduce: function (s, o, i) { - var u, _; - return ( - assertNotInfinite(this.size), - arguments.length < 2 ? (_ = !0) : (u = o), - this.__iterate(function (o, w, x) { - _ ? ((_ = !1), (u = o)) : (u = s.call(i, u, o, w, x)); - }), - u - ); - }, - reduceRight: function (s, o, i) { - var u = this.toKeyedSeq().reverse(); - return u.reduce.apply(u, arguments); - }, - reverse: function () { - return reify(this, reverseFactory(this, !0)); - }, - slice: function (s, o) { - return reify(this, sliceFactory(this, s, o, !0)); - }, - some: function (s, o) { - return !this.every(not(s), o); - }, - sort: function (s) { - return reify(this, sortFactory(this, s)); - }, - values: function () { - return this.__iterator(U); - }, - butLast: function () { - return this.slice(0, -1); - }, - isEmpty: function () { - return void 0 !== this.size - ? 0 === this.size - : !this.some(function () { - return !0; - }); - }, - count: function (s, o) { - return ensureSize(s ? this.toSeq().filter(s, o) : this); - }, - countBy: function (s, o) { - return countByFactory(this, s, o); - }, - equals: function (s) { - return deepEqual(this, s); - }, - entrySeq: function () { - var s = this; - if (s._cache) return new ArraySeq(s._cache); - var o = s.toSeq().map(entryMapper).toIndexedSeq(); - return ( - (o.fromEntrySeq = function () { - return s.toSeq(); - }), - o - ); - }, - filterNot: function (s, o) { - return this.filter(not(s), o); - }, - findEntry: function (s, o, i) { - var u = i; - return ( - this.__iterate(function (i, _, w) { - if (s.call(o, i, _, w)) return ((u = [_, i]), !1); - }), - u - ); - }, - findKey: function (s, o) { - var i = this.findEntry(s, o); - return i && i[0]; - }, - findLast: function (s, o, i) { - return this.toKeyedSeq().reverse().find(s, o, i); - }, - findLastEntry: function (s, o, i) { - return this.toKeyedSeq().reverse().findEntry(s, o, i); - }, - findLastKey: function (s, o) { - return this.toKeyedSeq().reverse().findKey(s, o); - }, - first: function () { - return this.find(returnTrue); - }, - flatMap: function (s, o) { - return reify(this, flatMapFactory(this, s, o)); - }, - flatten: function (s) { - return reify(this, flattenFactory(this, s, !0)); - }, - fromEntrySeq: function () { - return new FromEntriesSequence(this); - }, - get: function (s, o) { - return this.find( - function (o, i) { - return is(i, s); - }, - void 0, - o - ); - }, - getIn: function (s, o) { - for (var i, u = this, _ = forceIterator(s); !(i = _.next()).done; ) { - var w = i.value; - if ((u = u && u.get ? u.get(w, L) : L) === L) return o; - } - return u; - }, - groupBy: function (s, o) { - return groupByFactory(this, s, o); - }, - has: function (s) { - return this.get(s, L) !== L; - }, - hasIn: function (s) { - return this.getIn(s, L) !== L; - }, - isSubset: function (s) { - return ( - (s = 'function' == typeof s.includes ? s : Iterable(s)), - this.every(function (o) { - return s.includes(o); - }) - ); - }, - isSuperset: function (s) { - return (s = 'function' == typeof s.isSubset ? s : Iterable(s)).isSubset(this); - }, - keyOf: function (s) { - return this.findKey(function (o) { - return is(o, s); - }); - }, - keySeq: function () { - return this.toSeq().map(keyMapper).toIndexedSeq(); - }, - last: function () { - return this.toSeq().reverse().first(); - }, - lastKeyOf: function (s) { - return this.toKeyedSeq().reverse().keyOf(s); - }, - max: function (s) { - return maxFactory(this, s); - }, - maxBy: function (s, o) { - return maxFactory(this, o, s); - }, - min: function (s) { - return maxFactory(this, s ? neg(s) : defaultNegComparator); - }, - minBy: function (s, o) { - return maxFactory(this, o ? neg(o) : defaultNegComparator, s); - }, - rest: function () { - return this.slice(1); - }, - skip: function (s) { - return this.slice(Math.max(0, s)); - }, - skipLast: function (s) { - return reify(this, this.toSeq().reverse().skip(s).reverse()); - }, - skipWhile: function (s, o) { - return reify(this, skipWhileFactory(this, s, o, !0)); - }, - skipUntil: function (s, o) { - return this.skipWhile(not(s), o); - }, - sortBy: function (s, o) { - return reify(this, sortFactory(this, o, s)); - }, - take: function (s) { - return this.slice(0, Math.max(0, s)); - }, - takeLast: function (s) { - return reify(this, this.toSeq().reverse().take(s).reverse()); - }, - takeWhile: function (s, o) { - return reify(this, takeWhileFactory(this, s, o)); - }, - takeUntil: function (s, o) { - return this.takeWhile(not(s), o); - }, - valueSeq: function () { - return this.toIndexedSeq(); - }, - hashCode: function () { - return this.__hash || (this.__hash = hashIterable(this)); - } - })); - var pt = Iterable.prototype; - ((pt[o] = !0), - (pt[ee] = pt.values), - (pt.__toJS = pt.toArray), - (pt.__toStringMapper = quoteString), - (pt.inspect = pt.toSource = - function () { - return this.toString(); - }), - (pt.chain = pt.flatMap), - (pt.contains = pt.includes), - mixin(KeyedIterable, { - flip: function () { - return reify(this, flipFactory(this)); - }, - mapEntries: function (s, o) { - var i = this, - u = 0; - return reify( - this, - this.toSeq() - .map(function (_, w) { - return s.call(o, [w, _], u++, i); - }) - .fromEntrySeq() - ); - }, - mapKeys: function (s, o) { - var i = this; - return reify( - this, - this.toSeq() - .flip() - .map(function (u, _) { - return s.call(o, u, _, i); - }) - .flip() - ); - } - })); - var ht = KeyedIterable.prototype; - function keyMapper(s, o) { - return o; - } - function entryMapper(s, o) { - return [o, s]; - } - function not(s) { - return function () { - return !s.apply(this, arguments); - }; - } - function neg(s) { - return function () { - return -s.apply(this, arguments); - }; - } - function quoteString(s) { - return 'string' == typeof s ? JSON.stringify(s) : String(s); - } - function defaultZipper() { - return arrCopy(arguments); - } - function defaultNegComparator(s, o) { - return s < o ? 1 : s > o ? -1 : 0; - } - function hashIterable(s) { - if (s.size === 1 / 0) return 0; - var o = isOrdered(s), - i = isKeyed(s), - u = o ? 1 : 0; - return murmurHashOfSize( - s.__iterate( - i - ? o - ? function (s, o) { - u = (31 * u + hashMerge(hash(s), hash(o))) | 0; - } - : function (s, o) { - u = (u + hashMerge(hash(s), hash(o))) | 0; - } - : o - ? function (s) { - u = (31 * u + hash(s)) | 0; - } - : function (s) { - u = (u + hash(s)) | 0; - } - ), - u - ); - } - function murmurHashOfSize(s, o) { - return ( - (o = pe(o, 3432918353)), - (o = pe((o << 15) | (o >>> -15), 461845907)), - (o = pe((o << 13) | (o >>> -13), 5)), - (o = pe((o = (o + 3864292196) ^ s) ^ (o >>> 16), 2246822507)), - (o = smi((o = pe(o ^ (o >>> 13), 3266489909)) ^ (o >>> 16))) - ); - } - function hashMerge(s, o) { - return s ^ (o + 2654435769 + (s << 6) + (s >> 2)); - } - return ( - (ht[i] = !0), - (ht[ee] = pt.entries), - (ht.__toJS = pt.toObject), - (ht.__toStringMapper = function (s, o) { - return JSON.stringify(o) + ': ' + quoteString(s); - }), - mixin(IndexedIterable, { - toKeyedSeq: function () { - return new ToKeyedSequence(this, !1); - }, - filter: function (s, o) { - return reify(this, filterFactory(this, s, o, !1)); - }, - findIndex: function (s, o) { - var i = this.findEntry(s, o); - return i ? i[0] : -1; - }, - indexOf: function (s) { - var o = this.keyOf(s); - return void 0 === o ? -1 : o; - }, - lastIndexOf: function (s) { - var o = this.lastKeyOf(s); - return void 0 === o ? -1 : o; - }, - reverse: function () { - return reify(this, reverseFactory(this, !1)); - }, - slice: function (s, o) { - return reify(this, sliceFactory(this, s, o, !1)); - }, - splice: function (s, o) { - var i = arguments.length; - if (((o = Math.max(0 | o, 0)), 0 === i || (2 === i && !o))) return this; - s = resolveBegin(s, s < 0 ? this.count() : this.size); - var u = this.slice(0, s); - return reify( - this, - 1 === i ? u : u.concat(arrCopy(arguments, 2), this.slice(s + o)) - ); - }, - findLastIndex: function (s, o) { - var i = this.findLastEntry(s, o); - return i ? i[0] : -1; - }, - first: function () { - return this.get(0); - }, - flatten: function (s) { - return reify(this, flattenFactory(this, s, !1)); - }, - get: function (s, o) { - return (s = wrapIndex(this, s)) < 0 || - this.size === 1 / 0 || - (void 0 !== this.size && s > this.size) - ? o - : this.find( - function (o, i) { - return i === s; - }, - void 0, - o - ); - }, - has: function (s) { - return ( - (s = wrapIndex(this, s)) >= 0 && - (void 0 !== this.size - ? this.size === 1 / 0 || s < this.size - : -1 !== this.indexOf(s)) - ); - }, - interpose: function (s) { - return reify(this, interposeFactory(this, s)); - }, - interleave: function () { - var s = [this].concat(arrCopy(arguments)), - o = zipWithFactory(this.toSeq(), IndexedSeq.of, s), - i = o.flatten(!0); - return (o.size && (i.size = o.size * s.length), reify(this, i)); - }, - keySeq: function () { - return Range(0, this.size); - }, - last: function () { - return this.get(-1); - }, - skipWhile: function (s, o) { - return reify(this, skipWhileFactory(this, s, o, !1)); - }, - zip: function () { - return reify( - this, - zipWithFactory(this, defaultZipper, [this].concat(arrCopy(arguments))) - ); - }, - zipWith: function (s) { - var o = arrCopy(arguments); - return ((o[0] = this), reify(this, zipWithFactory(this, s, o))); - } - }), - (IndexedIterable.prototype[u] = !0), - (IndexedIterable.prototype[_] = !0), - mixin(SetIterable, { - get: function (s, o) { - return this.has(s) ? s : o; - }, - includes: function (s) { - return this.has(s); - }, - keySeq: function () { - return this.valueSeq(); - } - }), - (SetIterable.prototype.has = pt.includes), - (SetIterable.prototype.contains = SetIterable.prototype.includes), - mixin(KeyedSeq, KeyedIterable.prototype), - mixin(IndexedSeq, IndexedIterable.prototype), - mixin(SetSeq, SetIterable.prototype), - mixin(KeyedCollection, KeyedIterable.prototype), - mixin(IndexedCollection, IndexedIterable.prototype), - mixin(SetCollection, SetIterable.prototype), - { - Iterable, - Seq, - Collection, - Map, - OrderedMap, - List, - Stack, - Set, - OrderedSet, - Record, - Range, - Repeat, - is, - fromJS - } - ); - })(); - }, - 56698: (s) => { - 'function' == typeof Object.create - ? (s.exports = function inherits(s, o) { - o && - ((s.super_ = o), - (s.prototype = Object.create(o.prototype, { - constructor: { value: s, enumerable: !1, writable: !0, configurable: !0 } - }))); - }) - : (s.exports = function inherits(s, o) { - if (o) { - s.super_ = o; - var TempCtor = function () {}; - ((TempCtor.prototype = o.prototype), - (s.prototype = new TempCtor()), - (s.prototype.constructor = s)); - } - }); - }, - 5419: (s) => { - s.exports = function (s, o, i, u) { - var _ = new Blob(void 0 !== u ? [u, s] : [s], { - type: i || 'application/octet-stream' - }); - if (void 0 !== window.navigator.msSaveBlob) window.navigator.msSaveBlob(_, o); - else { - var w = - window.URL && window.URL.createObjectURL - ? window.URL.createObjectURL(_) - : window.webkitURL.createObjectURL(_), - x = document.createElement('a'); - ((x.style.display = 'none'), - (x.href = w), - x.setAttribute('download', o), - void 0 === x.download && x.setAttribute('target', '_blank'), - document.body.appendChild(x), - x.click(), - setTimeout(function () { - (document.body.removeChild(x), window.URL.revokeObjectURL(w)); - }, 200)); - } - }; - }, - 20181: (s, o, i) => { - var u = /^\s+|\s+$/g, - _ = /^[-+]0x[0-9a-f]+$/i, - w = /^0b[01]+$/i, - x = /^0o[0-7]+$/i, - C = parseInt, - j = 'object' == typeof i.g && i.g && i.g.Object === Object && i.g, - L = 'object' == typeof self && self && self.Object === Object && self, - B = j || L || Function('return this')(), - $ = Object.prototype.toString, - V = Math.max, - U = Math.min, - now = function () { - return B.Date.now(); - }; - function isObject(s) { - var o = typeof s; - return !!s && ('object' == o || 'function' == o); - } - function toNumber(s) { - if ('number' == typeof s) return s; - if ( - (function isSymbol(s) { - return ( - 'symbol' == typeof s || - ((function isObjectLike(s) { - return !!s && 'object' == typeof s; - })(s) && - '[object Symbol]' == $.call(s)) - ); - })(s) - ) - return NaN; - if (isObject(s)) { - var o = 'function' == typeof s.valueOf ? s.valueOf() : s; - s = isObject(o) ? o + '' : o; - } - if ('string' != typeof s) return 0 === s ? s : +s; - s = s.replace(u, ''); - var i = w.test(s); - return i || x.test(s) ? C(s.slice(2), i ? 2 : 8) : _.test(s) ? NaN : +s; - } - s.exports = function debounce(s, o, i) { - var u, - _, - w, - x, - C, - j, - L = 0, - B = !1, - $ = !1, - z = !0; - if ('function' != typeof s) throw new TypeError('Expected a function'); - function invokeFunc(o) { - var i = u, - w = _; - return ((u = _ = void 0), (L = o), (x = s.apply(w, i))); - } - function shouldInvoke(s) { - var i = s - j; - return void 0 === j || i >= o || i < 0 || ($ && s - L >= w); - } - function timerExpired() { - var s = now(); - if (shouldInvoke(s)) return trailingEdge(s); - C = setTimeout( - timerExpired, - (function remainingWait(s) { - var i = o - (s - j); - return $ ? U(i, w - (s - L)) : i; - })(s) - ); - } - function trailingEdge(s) { - return ((C = void 0), z && u ? invokeFunc(s) : ((u = _ = void 0), x)); - } - function debounced() { - var s = now(), - i = shouldInvoke(s); - if (((u = arguments), (_ = this), (j = s), i)) { - if (void 0 === C) - return (function leadingEdge(s) { - return ((L = s), (C = setTimeout(timerExpired, o)), B ? invokeFunc(s) : x); - })(j); - if ($) return ((C = setTimeout(timerExpired, o)), invokeFunc(j)); - } - return (void 0 === C && (C = setTimeout(timerExpired, o)), x); - } - return ( - (o = toNumber(o) || 0), - isObject(i) && - ((B = !!i.leading), - (w = ($ = 'maxWait' in i) ? V(toNumber(i.maxWait) || 0, o) : w), - (z = 'trailing' in i ? !!i.trailing : z)), - (debounced.cancel = function cancel() { - (void 0 !== C && clearTimeout(C), (L = 0), (u = j = _ = C = void 0)); - }), - (debounced.flush = function flush() { - return void 0 === C ? x : trailingEdge(now()); - }), - debounced - ); - }; - }, - 55580: (s, o, i) => { - var u = i(56110)(i(9325), 'DataView'); - s.exports = u; - }, - 21549: (s, o, i) => { - var u = i(22032), - _ = i(63862), - w = i(66721), - x = i(12749), - C = i(35749); - function Hash(s) { - var o = -1, - i = null == s ? 0 : s.length; - for (this.clear(); ++o < i; ) { - var u = s[o]; - this.set(u[0], u[1]); - } - } - ((Hash.prototype.clear = u), - (Hash.prototype.delete = _), - (Hash.prototype.get = w), - (Hash.prototype.has = x), - (Hash.prototype.set = C), - (s.exports = Hash)); - }, - 30980: (s, o, i) => { - var u = i(39344), - _ = i(94033); - function LazyWrapper(s) { - ((this.__wrapped__ = s), - (this.__actions__ = []), - (this.__dir__ = 1), - (this.__filtered__ = !1), - (this.__iteratees__ = []), - (this.__takeCount__ = 4294967295), - (this.__views__ = [])); - } - ((LazyWrapper.prototype = u(_.prototype)), - (LazyWrapper.prototype.constructor = LazyWrapper), - (s.exports = LazyWrapper)); - }, - 80079: (s, o, i) => { - var u = i(63702), - _ = i(70080), - w = i(24739), - x = i(48655), - C = i(31175); - function ListCache(s) { - var o = -1, - i = null == s ? 0 : s.length; - for (this.clear(); ++o < i; ) { - var u = s[o]; - this.set(u[0], u[1]); - } - } - ((ListCache.prototype.clear = u), - (ListCache.prototype.delete = _), - (ListCache.prototype.get = w), - (ListCache.prototype.has = x), - (ListCache.prototype.set = C), - (s.exports = ListCache)); - }, - 56017: (s, o, i) => { - var u = i(39344), - _ = i(94033); - function LodashWrapper(s, o) { - ((this.__wrapped__ = s), - (this.__actions__ = []), - (this.__chain__ = !!o), - (this.__index__ = 0), - (this.__values__ = void 0)); - } - ((LodashWrapper.prototype = u(_.prototype)), - (LodashWrapper.prototype.constructor = LodashWrapper), - (s.exports = LodashWrapper)); - }, - 68223: (s, o, i) => { - var u = i(56110)(i(9325), 'Map'); - s.exports = u; - }, - 53661: (s, o, i) => { - var u = i(63040), - _ = i(17670), - w = i(90289), - x = i(4509), - C = i(72949); - function MapCache(s) { - var o = -1, - i = null == s ? 0 : s.length; - for (this.clear(); ++o < i; ) { - var u = s[o]; - this.set(u[0], u[1]); - } - } - ((MapCache.prototype.clear = u), - (MapCache.prototype.delete = _), - (MapCache.prototype.get = w), - (MapCache.prototype.has = x), - (MapCache.prototype.set = C), - (s.exports = MapCache)); - }, - 32804: (s, o, i) => { - var u = i(56110)(i(9325), 'Promise'); - s.exports = u; - }, - 76545: (s, o, i) => { - var u = i(56110)(i(9325), 'Set'); - s.exports = u; - }, - 38859: (s, o, i) => { - var u = i(53661), - _ = i(31380), - w = i(51459); - function SetCache(s) { - var o = -1, - i = null == s ? 0 : s.length; - for (this.__data__ = new u(); ++o < i; ) this.add(s[o]); - } - ((SetCache.prototype.add = SetCache.prototype.push = _), - (SetCache.prototype.has = w), - (s.exports = SetCache)); - }, - 37217: (s, o, i) => { - var u = i(80079), - _ = i(51420), - w = i(90938), - x = i(63605), - C = i(29817), - j = i(80945); - function Stack(s) { - var o = (this.__data__ = new u(s)); - this.size = o.size; - } - ((Stack.prototype.clear = _), - (Stack.prototype.delete = w), - (Stack.prototype.get = x), - (Stack.prototype.has = C), - (Stack.prototype.set = j), - (s.exports = Stack)); - }, - 51873: (s, o, i) => { - var u = i(9325).Symbol; - s.exports = u; - }, - 37828: (s, o, i) => { - var u = i(9325).Uint8Array; - s.exports = u; - }, - 28303: (s, o, i) => { - var u = i(56110)(i(9325), 'WeakMap'); - s.exports = u; - }, - 91033: (s) => { - s.exports = function apply(s, o, i) { - switch (i.length) { - case 0: - return s.call(o); - case 1: - return s.call(o, i[0]); - case 2: - return s.call(o, i[0], i[1]); - case 3: - return s.call(o, i[0], i[1], i[2]); - } - return s.apply(o, i); - }; - }, - 83729: (s) => { - s.exports = function arrayEach(s, o) { - for (var i = -1, u = null == s ? 0 : s.length; ++i < u && !1 !== o(s[i], i, s); ); - return s; - }; - }, - 79770: (s) => { - s.exports = function arrayFilter(s, o) { - for (var i = -1, u = null == s ? 0 : s.length, _ = 0, w = []; ++i < u; ) { - var x = s[i]; - o(x, i, s) && (w[_++] = x); - } - return w; - }; - }, - 15325: (s, o, i) => { - var u = i(96131); - s.exports = function arrayIncludes(s, o) { - return !!(null == s ? 0 : s.length) && u(s, o, 0) > -1; - }; - }, - 70695: (s, o, i) => { - var u = i(78096), - _ = i(72428), - w = i(56449), - x = i(3656), - C = i(30361), - j = i(37167), - L = Object.prototype.hasOwnProperty; - s.exports = function arrayLikeKeys(s, o) { - var i = w(s), - B = !i && _(s), - $ = !i && !B && x(s), - V = !i && !B && !$ && j(s), - U = i || B || $ || V, - z = U ? u(s.length, String) : [], - Y = z.length; - for (var Z in s) - (!o && !L.call(s, Z)) || - (U && - ('length' == Z || - ($ && ('offset' == Z || 'parent' == Z)) || - (V && ('buffer' == Z || 'byteLength' == Z || 'byteOffset' == Z)) || - C(Z, Y))) || - z.push(Z); - return z; - }; - }, - 34932: (s) => { - s.exports = function arrayMap(s, o) { - for (var i = -1, u = null == s ? 0 : s.length, _ = Array(u); ++i < u; ) - _[i] = o(s[i], i, s); - return _; - }; - }, - 14528: (s) => { - s.exports = function arrayPush(s, o) { - for (var i = -1, u = o.length, _ = s.length; ++i < u; ) s[_ + i] = o[i]; - return s; - }; - }, - 40882: (s) => { - s.exports = function arrayReduce(s, o, i, u) { - var _ = -1, - w = null == s ? 0 : s.length; - for (u && w && (i = s[++_]); ++_ < w; ) i = o(i, s[_], _, s); - return i; - }; - }, - 14248: (s) => { - s.exports = function arraySome(s, o) { - for (var i = -1, u = null == s ? 0 : s.length; ++i < u; ) if (o(s[i], i, s)) return !0; - return !1; - }; - }, - 61074: (s) => { - s.exports = function asciiToArray(s) { - return s.split(''); - }; - }, - 1733: (s) => { - var o = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; - s.exports = function asciiWords(s) { - return s.match(o) || []; - }; - }, - 87805: (s, o, i) => { - var u = i(43360), - _ = i(75288); - s.exports = function assignMergeValue(s, o, i) { - ((void 0 !== i && !_(s[o], i)) || (void 0 === i && !(o in s))) && u(s, o, i); - }; - }, - 16547: (s, o, i) => { - var u = i(43360), - _ = i(75288), - w = Object.prototype.hasOwnProperty; - s.exports = function assignValue(s, o, i) { - var x = s[o]; - (w.call(s, o) && _(x, i) && (void 0 !== i || o in s)) || u(s, o, i); - }; - }, - 26025: (s, o, i) => { - var u = i(75288); - s.exports = function assocIndexOf(s, o) { - for (var i = s.length; i--; ) if (u(s[i][0], o)) return i; - return -1; - }; - }, - 74733: (s, o, i) => { - var u = i(21791), - _ = i(95950); - s.exports = function baseAssign(s, o) { - return s && u(o, _(o), s); - }; - }, - 43838: (s, o, i) => { - var u = i(21791), - _ = i(37241); - s.exports = function baseAssignIn(s, o) { - return s && u(o, _(o), s); - }; - }, - 43360: (s, o, i) => { - var u = i(93243); - s.exports = function baseAssignValue(s, o, i) { - '__proto__' == o && u - ? u(s, o, { configurable: !0, enumerable: !0, value: i, writable: !0 }) - : (s[o] = i); - }; - }, - 9999: (s, o, i) => { - var u = i(37217), - _ = i(83729), - w = i(16547), - x = i(74733), - C = i(43838), - j = i(93290), - L = i(23007), - B = i(92271), - $ = i(48948), - V = i(50002), - U = i(83349), - z = i(5861), - Y = i(76189), - Z = i(77199), - ee = i(35529), - ie = i(56449), - ae = i(3656), - le = i(87730), - ce = i(23805), - pe = i(38440), - de = i(95950), - fe = i(37241), - ye = '[object Arguments]', - be = '[object Function]', - _e = '[object Object]', - we = {}; - ((we[ye] = - we['[object Array]'] = - we['[object ArrayBuffer]'] = - we['[object DataView]'] = - we['[object Boolean]'] = - we['[object Date]'] = - we['[object Float32Array]'] = - we['[object Float64Array]'] = - we['[object Int8Array]'] = - we['[object Int16Array]'] = - we['[object Int32Array]'] = - we['[object Map]'] = - we['[object Number]'] = - we[_e] = - we['[object RegExp]'] = - we['[object Set]'] = - we['[object String]'] = - we['[object Symbol]'] = - we['[object Uint8Array]'] = - we['[object Uint8ClampedArray]'] = - we['[object Uint16Array]'] = - we['[object Uint32Array]'] = - !0), - (we['[object Error]'] = we[be] = we['[object WeakMap]'] = !1), - (s.exports = function baseClone(s, o, i, Se, xe, Pe) { - var Te, - Re = 1 & o, - qe = 2 & o, - $e = 4 & o; - if ((i && (Te = xe ? i(s, Se, xe, Pe) : i(s)), void 0 !== Te)) return Te; - if (!ce(s)) return s; - var ze = ie(s); - if (ze) { - if (((Te = Y(s)), !Re)) return L(s, Te); - } else { - var We = z(s), - He = We == be || '[object GeneratorFunction]' == We; - if (ae(s)) return j(s, Re); - if (We == _e || We == ye || (He && !xe)) { - if (((Te = qe || He ? {} : ee(s)), !Re)) - return qe ? $(s, C(Te, s)) : B(s, x(Te, s)); - } else { - if (!we[We]) return xe ? s : {}; - Te = Z(s, We, Re); - } - } - Pe || (Pe = new u()); - var Ye = Pe.get(s); - if (Ye) return Ye; - (Pe.set(s, Te), - pe(s) - ? s.forEach(function (u) { - Te.add(baseClone(u, o, i, u, s, Pe)); - }) - : le(s) && - s.forEach(function (u, _) { - Te.set(_, baseClone(u, o, i, _, s, Pe)); - })); - var Xe = ze ? void 0 : ($e ? (qe ? U : V) : qe ? fe : de)(s); - return ( - _(Xe || s, function (u, _) { - (Xe && (u = s[(_ = u)]), w(Te, _, baseClone(u, o, i, _, s, Pe))); - }), - Te - ); - })); - }, - 39344: (s, o, i) => { - var u = i(23805), - _ = Object.create, - w = (function () { - function object() {} - return function (s) { - if (!u(s)) return {}; - if (_) return _(s); - object.prototype = s; - var o = new object(); - return ((object.prototype = void 0), o); - }; - })(); - s.exports = w; - }, - 80909: (s, o, i) => { - var u = i(30641), - _ = i(38329)(u); - s.exports = _; - }, - 2523: (s) => { - s.exports = function baseFindIndex(s, o, i, u) { - for (var _ = s.length, w = i + (u ? 1 : -1); u ? w-- : ++w < _; ) - if (o(s[w], w, s)) return w; - return -1; - }; - }, - 83120: (s, o, i) => { - var u = i(14528), - _ = i(45891); - s.exports = function baseFlatten(s, o, i, w, x) { - var C = -1, - j = s.length; - for (i || (i = _), x || (x = []); ++C < j; ) { - var L = s[C]; - o > 0 && i(L) - ? o > 1 - ? baseFlatten(L, o - 1, i, w, x) - : u(x, L) - : w || (x[x.length] = L); - } - return x; - }; - }, - 86649: (s, o, i) => { - var u = i(83221)(); - s.exports = u; - }, - 30641: (s, o, i) => { - var u = i(86649), - _ = i(95950); - s.exports = function baseForOwn(s, o) { - return s && u(s, o, _); - }; - }, - 47422: (s, o, i) => { - var u = i(31769), - _ = i(77797); - s.exports = function baseGet(s, o) { - for (var i = 0, w = (o = u(o, s)).length; null != s && i < w; ) s = s[_(o[i++])]; - return i && i == w ? s : void 0; - }; - }, - 82199: (s, o, i) => { - var u = i(14528), - _ = i(56449); - s.exports = function baseGetAllKeys(s, o, i) { - var w = o(s); - return _(s) ? w : u(w, i(s)); - }; - }, - 72552: (s, o, i) => { - var u = i(51873), - _ = i(659), - w = i(59350), - x = u ? u.toStringTag : void 0; - s.exports = function baseGetTag(s) { - return null == s - ? void 0 === s - ? '[object Undefined]' - : '[object Null]' - : x && x in Object(s) - ? _(s) - : w(s); - }; - }, - 20426: (s) => { - var o = Object.prototype.hasOwnProperty; - s.exports = function baseHas(s, i) { - return null != s && o.call(s, i); - }; - }, - 28077: (s) => { - s.exports = function baseHasIn(s, o) { - return null != s && o in Object(s); - }; - }, - 96131: (s, o, i) => { - var u = i(2523), - _ = i(85463), - w = i(76959); - s.exports = function baseIndexOf(s, o, i) { - return o == o ? w(s, o, i) : u(s, _, i); - }; - }, - 27534: (s, o, i) => { - var u = i(72552), - _ = i(40346); - s.exports = function baseIsArguments(s) { - return _(s) && '[object Arguments]' == u(s); - }; - }, - 60270: (s, o, i) => { - var u = i(87068), - _ = i(40346); - s.exports = function baseIsEqual(s, o, i, w, x) { - return ( - s === o || - (null == s || null == o || (!_(s) && !_(o)) - ? s != s && o != o - : u(s, o, i, w, baseIsEqual, x)) - ); - }; - }, - 87068: (s, o, i) => { - var u = i(37217), - _ = i(25911), - w = i(21986), - x = i(50689), - C = i(5861), - j = i(56449), - L = i(3656), - B = i(37167), - $ = '[object Arguments]', - V = '[object Array]', - U = '[object Object]', - z = Object.prototype.hasOwnProperty; - s.exports = function baseIsEqualDeep(s, o, i, Y, Z, ee) { - var ie = j(s), - ae = j(o), - le = ie ? V : C(s), - ce = ae ? V : C(o), - pe = (le = le == $ ? U : le) == U, - de = (ce = ce == $ ? U : ce) == U, - fe = le == ce; - if (fe && L(s)) { - if (!L(o)) return !1; - ((ie = !0), (pe = !1)); - } - if (fe && !pe) - return ( - ee || (ee = new u()), - ie || B(s) ? _(s, o, i, Y, Z, ee) : w(s, o, le, i, Y, Z, ee) - ); - if (!(1 & i)) { - var ye = pe && z.call(s, '__wrapped__'), - be = de && z.call(o, '__wrapped__'); - if (ye || be) { - var _e = ye ? s.value() : s, - we = be ? o.value() : o; - return (ee || (ee = new u()), Z(_e, we, i, Y, ee)); - } - } - return !!fe && (ee || (ee = new u()), x(s, o, i, Y, Z, ee)); - }; - }, - 29172: (s, o, i) => { - var u = i(5861), - _ = i(40346); - s.exports = function baseIsMap(s) { - return _(s) && '[object Map]' == u(s); - }; - }, - 41799: (s, o, i) => { - var u = i(37217), - _ = i(60270); - s.exports = function baseIsMatch(s, o, i, w) { - var x = i.length, - C = x, - j = !w; - if (null == s) return !C; - for (s = Object(s); x--; ) { - var L = i[x]; - if (j && L[2] ? L[1] !== s[L[0]] : !(L[0] in s)) return !1; - } - for (; ++x < C; ) { - var B = (L = i[x])[0], - $ = s[B], - V = L[1]; - if (j && L[2]) { - if (void 0 === $ && !(B in s)) return !1; - } else { - var U = new u(); - if (w) var z = w($, V, B, s, o, U); - if (!(void 0 === z ? _(V, $, 3, w, U) : z)) return !1; - } - } - return !0; - }; - }, - 85463: (s) => { - s.exports = function baseIsNaN(s) { - return s != s; - }; - }, - 45083: (s, o, i) => { - var u = i(1882), - _ = i(87296), - w = i(23805), - x = i(47473), - C = /^\[object .+?Constructor\]$/, - j = Function.prototype, - L = Object.prototype, - B = j.toString, - $ = L.hasOwnProperty, - V = RegExp( - '^' + - B.call($) - .replace(/[\\^$.*+?()[\]{}|]/g, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + - '$' - ); - s.exports = function baseIsNative(s) { - return !(!w(s) || _(s)) && (u(s) ? V : C).test(x(s)); - }; - }, - 16038: (s, o, i) => { - var u = i(5861), - _ = i(40346); - s.exports = function baseIsSet(s) { - return _(s) && '[object Set]' == u(s); - }; - }, - 4901: (s, o, i) => { - var u = i(72552), - _ = i(30294), - w = i(40346), - x = {}; - ((x['[object Float32Array]'] = - x['[object Float64Array]'] = - x['[object Int8Array]'] = - x['[object Int16Array]'] = - x['[object Int32Array]'] = - x['[object Uint8Array]'] = - x['[object Uint8ClampedArray]'] = - x['[object Uint16Array]'] = - x['[object Uint32Array]'] = - !0), - (x['[object Arguments]'] = - x['[object Array]'] = - x['[object ArrayBuffer]'] = - x['[object Boolean]'] = - x['[object DataView]'] = - x['[object Date]'] = - x['[object Error]'] = - x['[object Function]'] = - x['[object Map]'] = - x['[object Number]'] = - x['[object Object]'] = - x['[object RegExp]'] = - x['[object Set]'] = - x['[object String]'] = - x['[object WeakMap]'] = - !1), - (s.exports = function baseIsTypedArray(s) { - return w(s) && _(s.length) && !!x[u(s)]; - })); - }, - 15389: (s, o, i) => { - var u = i(93663), - _ = i(87978), - w = i(83488), - x = i(56449), - C = i(50583); - s.exports = function baseIteratee(s) { - return 'function' == typeof s - ? s - : null == s - ? w - : 'object' == typeof s - ? x(s) - ? _(s[0], s[1]) - : u(s) - : C(s); - }; - }, - 88984: (s, o, i) => { - var u = i(55527), - _ = i(3650), - w = Object.prototype.hasOwnProperty; - s.exports = function baseKeys(s) { - if (!u(s)) return _(s); - var o = []; - for (var i in Object(s)) w.call(s, i) && 'constructor' != i && o.push(i); - return o; - }; - }, - 72903: (s, o, i) => { - var u = i(23805), - _ = i(55527), - w = i(90181), - x = Object.prototype.hasOwnProperty; - s.exports = function baseKeysIn(s) { - if (!u(s)) return w(s); - var o = _(s), - i = []; - for (var C in s) ('constructor' != C || (!o && x.call(s, C))) && i.push(C); - return i; - }; - }, - 94033: (s) => { - s.exports = function baseLodash() {}; - }, - 93663: (s, o, i) => { - var u = i(41799), - _ = i(10776), - w = i(67197); - s.exports = function baseMatches(s) { - var o = _(s); - return 1 == o.length && o[0][2] - ? w(o[0][0], o[0][1]) - : function (i) { - return i === s || u(i, s, o); - }; - }; - }, - 87978: (s, o, i) => { - var u = i(60270), - _ = i(58156), - w = i(80631), - x = i(28586), - C = i(30756), - j = i(67197), - L = i(77797); - s.exports = function baseMatchesProperty(s, o) { - return x(s) && C(o) - ? j(L(s), o) - : function (i) { - var x = _(i, s); - return void 0 === x && x === o ? w(i, s) : u(o, x, 3); - }; - }; - }, - 85250: (s, o, i) => { - var u = i(37217), - _ = i(87805), - w = i(86649), - x = i(42824), - C = i(23805), - j = i(37241), - L = i(14974); - s.exports = function baseMerge(s, o, i, B, $) { - s !== o && - w( - o, - function (w, j) { - if (($ || ($ = new u()), C(w))) x(s, o, j, i, baseMerge, B, $); - else { - var V = B ? B(L(s, j), w, j + '', s, o, $) : void 0; - (void 0 === V && (V = w), _(s, j, V)); - } - }, - j - ); - }; - }, - 42824: (s, o, i) => { - var u = i(87805), - _ = i(93290), - w = i(71961), - x = i(23007), - C = i(35529), - j = i(72428), - L = i(56449), - B = i(83693), - $ = i(3656), - V = i(1882), - U = i(23805), - z = i(11331), - Y = i(37167), - Z = i(14974), - ee = i(69884); - s.exports = function baseMergeDeep(s, o, i, ie, ae, le, ce) { - var pe = Z(s, i), - de = Z(o, i), - fe = ce.get(de); - if (fe) u(s, i, fe); - else { - var ye = le ? le(pe, de, i + '', s, o, ce) : void 0, - be = void 0 === ye; - if (be) { - var _e = L(de), - we = !_e && $(de), - Se = !_e && !we && Y(de); - ((ye = de), - _e || we || Se - ? L(pe) - ? (ye = pe) - : B(pe) - ? (ye = x(pe)) - : we - ? ((be = !1), (ye = _(de, !0))) - : Se - ? ((be = !1), (ye = w(de, !0))) - : (ye = []) - : z(de) || j(de) - ? ((ye = pe), j(pe) ? (ye = ee(pe)) : (U(pe) && !V(pe)) || (ye = C(de))) - : (be = !1)); - } - (be && (ce.set(de, ye), ae(ye, de, ie, le, ce), ce.delete(de)), u(s, i, ye)); - } - }; - }, - 47237: (s) => { - s.exports = function baseProperty(s) { - return function (o) { - return null == o ? void 0 : o[s]; - }; - }; - }, - 17255: (s, o, i) => { - var u = i(47422); - s.exports = function basePropertyDeep(s) { - return function (o) { - return u(o, s); - }; - }; - }, - 54552: (s) => { - s.exports = function basePropertyOf(s) { - return function (o) { - return null == s ? void 0 : s[o]; - }; - }; - }, - 85558: (s) => { - s.exports = function baseReduce(s, o, i, u, _) { - return ( - _(s, function (s, _, w) { - i = u ? ((u = !1), s) : o(i, s, _, w); - }), - i - ); - }; - }, - 69302: (s, o, i) => { - var u = i(83488), - _ = i(56757), - w = i(32865); - s.exports = function baseRest(s, o) { - return w(_(s, o, u), s + ''); - }; - }, - 73170: (s, o, i) => { - var u = i(16547), - _ = i(31769), - w = i(30361), - x = i(23805), - C = i(77797); - s.exports = function baseSet(s, o, i, j) { - if (!x(s)) return s; - for (var L = -1, B = (o = _(o, s)).length, $ = B - 1, V = s; null != V && ++L < B; ) { - var U = C(o[L]), - z = i; - if ('__proto__' === U || 'constructor' === U || 'prototype' === U) return s; - if (L != $) { - var Y = V[U]; - void 0 === (z = j ? j(Y, U, V) : void 0) && (z = x(Y) ? Y : w(o[L + 1]) ? [] : {}); - } - (u(V, U, z), (V = V[U])); - } - return s; - }; - }, - 68882: (s, o, i) => { - var u = i(83488), - _ = i(48152), - w = _ - ? function (s, o) { - return (_.set(s, o), s); - } - : u; - s.exports = w; - }, - 19570: (s, o, i) => { - var u = i(37334), - _ = i(93243), - w = i(83488), - x = _ - ? function (s, o) { - return _(s, 'toString', { - configurable: !0, - enumerable: !1, - value: u(o), - writable: !0 - }); - } - : w; - s.exports = x; - }, - 25160: (s) => { - s.exports = function baseSlice(s, o, i) { - var u = -1, - _ = s.length; - (o < 0 && (o = -o > _ ? 0 : _ + o), - (i = i > _ ? _ : i) < 0 && (i += _), - (_ = o > i ? 0 : (i - o) >>> 0), - (o >>>= 0)); - for (var w = Array(_); ++u < _; ) w[u] = s[u + o]; - return w; - }; - }, - 90916: (s, o, i) => { - var u = i(80909); - s.exports = function baseSome(s, o) { - var i; - return ( - u(s, function (s, u, _) { - return !(i = o(s, u, _)); - }), - !!i - ); - }; - }, - 78096: (s) => { - s.exports = function baseTimes(s, o) { - for (var i = -1, u = Array(s); ++i < s; ) u[i] = o(i); - return u; - }; - }, - 77556: (s, o, i) => { - var u = i(51873), - _ = i(34932), - w = i(56449), - x = i(44394), - C = u ? u.prototype : void 0, - j = C ? C.toString : void 0; - s.exports = function baseToString(s) { - if ('string' == typeof s) return s; - if (w(s)) return _(s, baseToString) + ''; - if (x(s)) return j ? j.call(s) : ''; - var o = s + ''; - return '0' == o && 1 / s == -1 / 0 ? '-0' : o; - }; - }, - 54128: (s, o, i) => { - var u = i(31800), - _ = /^\s+/; - s.exports = function baseTrim(s) { - return s ? s.slice(0, u(s) + 1).replace(_, '') : s; - }; - }, - 27301: (s) => { - s.exports = function baseUnary(s) { - return function (o) { - return s(o); - }; - }; - }, - 19931: (s, o, i) => { - var u = i(31769), - _ = i(68090), - w = i(68969), - x = i(77797); - s.exports = function baseUnset(s, o) { - return ((o = u(o, s)), null == (s = w(s, o)) || delete s[x(_(o))]); - }; - }, - 51234: (s) => { - s.exports = function baseZipObject(s, o, i) { - for (var u = -1, _ = s.length, w = o.length, x = {}; ++u < _; ) { - var C = u < w ? o[u] : void 0; - i(x, s[u], C); - } - return x; - }; - }, - 19219: (s) => { - s.exports = function cacheHas(s, o) { - return s.has(o); - }; - }, - 31769: (s, o, i) => { - var u = i(56449), - _ = i(28586), - w = i(61802), - x = i(13222); - s.exports = function castPath(s, o) { - return u(s) ? s : _(s, o) ? [s] : w(x(s)); - }; - }, - 28754: (s, o, i) => { - var u = i(25160); - s.exports = function castSlice(s, o, i) { - var _ = s.length; - return ((i = void 0 === i ? _ : i), !o && i >= _ ? s : u(s, o, i)); - }; - }, - 49653: (s, o, i) => { - var u = i(37828); - s.exports = function cloneArrayBuffer(s) { - var o = new s.constructor(s.byteLength); - return (new u(o).set(new u(s)), o); - }; - }, - 93290: (s, o, i) => { - s = i.nmd(s); - var u = i(9325), - _ = o && !o.nodeType && o, - w = _ && s && !s.nodeType && s, - x = w && w.exports === _ ? u.Buffer : void 0, - C = x ? x.allocUnsafe : void 0; - s.exports = function cloneBuffer(s, o) { - if (o) return s.slice(); - var i = s.length, - u = C ? C(i) : new s.constructor(i); - return (s.copy(u), u); - }; - }, - 76169: (s, o, i) => { - var u = i(49653); - s.exports = function cloneDataView(s, o) { - var i = o ? u(s.buffer) : s.buffer; - return new s.constructor(i, s.byteOffset, s.byteLength); - }; - }, - 73201: (s) => { - var o = /\w*$/; - s.exports = function cloneRegExp(s) { - var i = new s.constructor(s.source, o.exec(s)); - return ((i.lastIndex = s.lastIndex), i); - }; - }, - 93736: (s, o, i) => { - var u = i(51873), - _ = u ? u.prototype : void 0, - w = _ ? _.valueOf : void 0; - s.exports = function cloneSymbol(s) { - return w ? Object(w.call(s)) : {}; - }; - }, - 71961: (s, o, i) => { - var u = i(49653); - s.exports = function cloneTypedArray(s, o) { - var i = o ? u(s.buffer) : s.buffer; - return new s.constructor(i, s.byteOffset, s.length); - }; - }, - 91596: (s) => { - var o = Math.max; - s.exports = function composeArgs(s, i, u, _) { - for ( - var w = -1, - x = s.length, - C = u.length, - j = -1, - L = i.length, - B = o(x - C, 0), - $ = Array(L + B), - V = !_; - ++j < L; - ) - $[j] = i[j]; - for (; ++w < C; ) (V || w < x) && ($[u[w]] = s[w]); - for (; B--; ) $[j++] = s[w++]; - return $; - }; - }, - 53320: (s) => { - var o = Math.max; - s.exports = function composeArgsRight(s, i, u, _) { - for ( - var w = -1, - x = s.length, - C = -1, - j = u.length, - L = -1, - B = i.length, - $ = o(x - j, 0), - V = Array($ + B), - U = !_; - ++w < $; - ) - V[w] = s[w]; - for (var z = w; ++L < B; ) V[z + L] = i[L]; - for (; ++C < j; ) (U || w < x) && (V[z + u[C]] = s[w++]); - return V; - }; - }, - 23007: (s) => { - s.exports = function copyArray(s, o) { - var i = -1, - u = s.length; - for (o || (o = Array(u)); ++i < u; ) o[i] = s[i]; - return o; - }; - }, - 21791: (s, o, i) => { - var u = i(16547), - _ = i(43360); - s.exports = function copyObject(s, o, i, w) { - var x = !i; - i || (i = {}); - for (var C = -1, j = o.length; ++C < j; ) { - var L = o[C], - B = w ? w(i[L], s[L], L, i, s) : void 0; - (void 0 === B && (B = s[L]), x ? _(i, L, B) : u(i, L, B)); - } - return i; - }; - }, - 92271: (s, o, i) => { - var u = i(21791), - _ = i(4664); - s.exports = function copySymbols(s, o) { - return u(s, _(s), o); - }; - }, - 48948: (s, o, i) => { - var u = i(21791), - _ = i(86375); - s.exports = function copySymbolsIn(s, o) { - return u(s, _(s), o); - }; - }, - 55481: (s, o, i) => { - var u = i(9325)['__core-js_shared__']; - s.exports = u; - }, - 58523: (s) => { - s.exports = function countHolders(s, o) { - for (var i = s.length, u = 0; i--; ) s[i] === o && ++u; - return u; - }; - }, - 20999: (s, o, i) => { - var u = i(69302), - _ = i(36800); - s.exports = function createAssigner(s) { - return u(function (o, i) { - var u = -1, - w = i.length, - x = w > 1 ? i[w - 1] : void 0, - C = w > 2 ? i[2] : void 0; - for ( - x = s.length > 3 && 'function' == typeof x ? (w--, x) : void 0, - C && _(i[0], i[1], C) && ((x = w < 3 ? void 0 : x), (w = 1)), - o = Object(o); - ++u < w; - ) { - var j = i[u]; - j && s(o, j, u, x); - } - return o; - }); - }; - }, - 38329: (s, o, i) => { - var u = i(64894); - s.exports = function createBaseEach(s, o) { - return function (i, _) { - if (null == i) return i; - if (!u(i)) return s(i, _); - for ( - var w = i.length, x = o ? w : -1, C = Object(i); - (o ? x-- : ++x < w) && !1 !== _(C[x], x, C); - ); - return i; - }; - }; - }, - 83221: (s) => { - s.exports = function createBaseFor(s) { - return function (o, i, u) { - for (var _ = -1, w = Object(o), x = u(o), C = x.length; C--; ) { - var j = x[s ? C : ++_]; - if (!1 === i(w[j], j, w)) break; - } - return o; - }; - }; - }, - 11842: (s, o, i) => { - var u = i(82819), - _ = i(9325); - s.exports = function createBind(s, o, i) { - var w = 1 & o, - x = u(s); - return function wrapper() { - return (this && this !== _ && this instanceof wrapper ? x : s).apply( - w ? i : this, - arguments - ); - }; - }; - }, - 12507: (s, o, i) => { - var u = i(28754), - _ = i(49698), - w = i(63912), - x = i(13222); - s.exports = function createCaseFirst(s) { - return function (o) { - o = x(o); - var i = _(o) ? w(o) : void 0, - C = i ? i[0] : o.charAt(0), - j = i ? u(i, 1).join('') : o.slice(1); - return C[s]() + j; - }; - }; - }, - 45539: (s, o, i) => { - var u = i(40882), - _ = i(50828), - w = i(66645), - x = RegExp("['’]", 'g'); - s.exports = function createCompounder(s) { - return function (o) { - return u(w(_(o).replace(x, '')), s, ''); - }; - }; - }, - 82819: (s, o, i) => { - var u = i(39344), - _ = i(23805); - s.exports = function createCtor(s) { - return function () { - var o = arguments; - switch (o.length) { - case 0: - return new s(); - case 1: - return new s(o[0]); - case 2: - return new s(o[0], o[1]); - case 3: - return new s(o[0], o[1], o[2]); - case 4: - return new s(o[0], o[1], o[2], o[3]); - case 5: - return new s(o[0], o[1], o[2], o[3], o[4]); - case 6: - return new s(o[0], o[1], o[2], o[3], o[4], o[5]); - case 7: - return new s(o[0], o[1], o[2], o[3], o[4], o[5], o[6]); - } - var i = u(s.prototype), - w = s.apply(i, o); - return _(w) ? w : i; - }; - }; - }, - 77078: (s, o, i) => { - var u = i(91033), - _ = i(82819), - w = i(37471), - x = i(18073), - C = i(11287), - j = i(36306), - L = i(9325); - s.exports = function createCurry(s, o, i) { - var B = _(s); - return function wrapper() { - for (var _ = arguments.length, $ = Array(_), V = _, U = C(wrapper); V--; ) - $[V] = arguments[V]; - var z = _ < 3 && $[0] !== U && $[_ - 1] !== U ? [] : j($, U); - return (_ -= z.length) < i - ? x(s, o, w, wrapper.placeholder, void 0, $, z, void 0, void 0, i - _) - : u(this && this !== L && this instanceof wrapper ? B : s, this, $); - }; - }; - }, - 62006: (s, o, i) => { - var u = i(15389), - _ = i(64894), - w = i(95950); - s.exports = function createFind(s) { - return function (o, i, x) { - var C = Object(o); - if (!_(o)) { - var j = u(i, 3); - ((o = w(o)), - (i = function (s) { - return j(C[s], s, C); - })); - } - var L = s(o, i, x); - return L > -1 ? C[j ? o[L] : L] : void 0; - }; - }; - }, - 37471: (s, o, i) => { - var u = i(91596), - _ = i(53320), - w = i(58523), - x = i(82819), - C = i(18073), - j = i(11287), - L = i(68294), - B = i(36306), - $ = i(9325); - s.exports = function createHybrid(s, o, i, V, U, z, Y, Z, ee, ie) { - var ae = 128 & o, - le = 1 & o, - ce = 2 & o, - pe = 24 & o, - de = 512 & o, - fe = ce ? void 0 : x(s); - return function wrapper() { - for (var ye = arguments.length, be = Array(ye), _e = ye; _e--; ) - be[_e] = arguments[_e]; - if (pe) - var we = j(wrapper), - Se = w(be, we); - if ( - (V && (be = u(be, V, U, pe)), - z && (be = _(be, z, Y, pe)), - (ye -= Se), - pe && ye < ie) - ) { - var xe = B(be, we); - return C(s, o, createHybrid, wrapper.placeholder, i, be, xe, Z, ee, ie - ye); - } - var Pe = le ? i : this, - Te = ce ? Pe[s] : s; - return ( - (ye = be.length), - Z ? (be = L(be, Z)) : de && ye > 1 && be.reverse(), - ae && ee < ye && (be.length = ee), - this && this !== $ && this instanceof wrapper && (Te = fe || x(Te)), - Te.apply(Pe, be) - ); - }; - }; - }, - 24168: (s, o, i) => { - var u = i(91033), - _ = i(82819), - w = i(9325); - s.exports = function createPartial(s, o, i, x) { - var C = 1 & o, - j = _(s); - return function wrapper() { - for ( - var o = -1, - _ = arguments.length, - L = -1, - B = x.length, - $ = Array(B + _), - V = this && this !== w && this instanceof wrapper ? j : s; - ++L < B; - ) - $[L] = x[L]; - for (; _--; ) $[L++] = arguments[++o]; - return u(V, C ? i : this, $); - }; - }; - }, - 18073: (s, o, i) => { - var u = i(85087), - _ = i(54641), - w = i(70981); - s.exports = function createRecurry(s, o, i, x, C, j, L, B, $, V) { - var U = 8 & o; - ((o |= U ? 32 : 64), 4 & (o &= ~(U ? 64 : 32)) || (o &= -4)); - var z = [ - s, - o, - C, - U ? j : void 0, - U ? L : void 0, - U ? void 0 : j, - U ? void 0 : L, - B, - $, - V - ], - Y = i.apply(void 0, z); - return (u(s) && _(Y, z), (Y.placeholder = x), w(Y, s, o)); - }; - }, - 66977: (s, o, i) => { - var u = i(68882), - _ = i(11842), - w = i(77078), - x = i(37471), - C = i(24168), - j = i(37381), - L = i(3209), - B = i(54641), - $ = i(70981), - V = i(61489), - U = Math.max; - s.exports = function createWrap(s, o, i, z, Y, Z, ee, ie) { - var ae = 2 & o; - if (!ae && 'function' != typeof s) throw new TypeError('Expected a function'); - var le = z ? z.length : 0; - if ( - (le || ((o &= -97), (z = Y = void 0)), - (ee = void 0 === ee ? ee : U(V(ee), 0)), - (ie = void 0 === ie ? ie : V(ie)), - (le -= Y ? Y.length : 0), - 64 & o) - ) { - var ce = z, - pe = Y; - z = Y = void 0; - } - var de = ae ? void 0 : j(s), - fe = [s, o, i, z, Y, ce, pe, Z, ee, ie]; - if ( - (de && L(fe, de), - (s = fe[0]), - (o = fe[1]), - (i = fe[2]), - (z = fe[3]), - (Y = fe[4]), - !(ie = fe[9] = void 0 === fe[9] ? (ae ? 0 : s.length) : U(fe[9] - le, 0)) && - 24 & o && - (o &= -25), - o && 1 != o) - ) - ye = - 8 == o || 16 == o - ? w(s, o, ie) - : (32 != o && 33 != o) || Y.length - ? x.apply(void 0, fe) - : C(s, o, i, z); - else var ye = _(s, o, i); - return $((de ? u : B)(ye, fe), s, o); - }; - }, - 53138: (s, o, i) => { - var u = i(11331); - s.exports = function customOmitClone(s) { - return u(s) ? void 0 : s; - }; - }, - 24647: (s, o, i) => { - var u = i(54552)({ - À: 'A', - Á: 'A', - Â: 'A', - Ã: 'A', - Ä: 'A', - Å: 'A', - à: 'a', - á: 'a', - â: 'a', - ã: 'a', - ä: 'a', - å: 'a', - Ç: 'C', - ç: 'c', - Ð: 'D', - ð: 'd', - È: 'E', - É: 'E', - Ê: 'E', - Ë: 'E', - è: 'e', - é: 'e', - ê: 'e', - ë: 'e', - Ì: 'I', - Í: 'I', - Î: 'I', - Ï: 'I', - ì: 'i', - í: 'i', - î: 'i', - ï: 'i', - Ñ: 'N', - ñ: 'n', - Ò: 'O', - Ó: 'O', - Ô: 'O', - Õ: 'O', - Ö: 'O', - Ø: 'O', - ò: 'o', - ó: 'o', - ô: 'o', - õ: 'o', - ö: 'o', - ø: 'o', - Ù: 'U', - Ú: 'U', - Û: 'U', - Ü: 'U', - ù: 'u', - ú: 'u', - û: 'u', - ü: 'u', - Ý: 'Y', - ý: 'y', - ÿ: 'y', - Æ: 'Ae', - æ: 'ae', - Þ: 'Th', - þ: 'th', - ß: 'ss', - Ā: 'A', - Ă: 'A', - Ą: 'A', - ā: 'a', - ă: 'a', - ą: 'a', - Ć: 'C', - Ĉ: 'C', - Ċ: 'C', - Č: 'C', - ć: 'c', - ĉ: 'c', - ċ: 'c', - č: 'c', - Ď: 'D', - Đ: 'D', - ď: 'd', - đ: 'd', - Ē: 'E', - Ĕ: 'E', - Ė: 'E', - Ę: 'E', - Ě: 'E', - ē: 'e', - ĕ: 'e', - ė: 'e', - ę: 'e', - ě: 'e', - Ĝ: 'G', - Ğ: 'G', - Ġ: 'G', - Ģ: 'G', - ĝ: 'g', - ğ: 'g', - ġ: 'g', - ģ: 'g', - Ĥ: 'H', - Ħ: 'H', - ĥ: 'h', - ħ: 'h', - Ĩ: 'I', - Ī: 'I', - Ĭ: 'I', - Į: 'I', - İ: 'I', - ĩ: 'i', - ī: 'i', - ĭ: 'i', - į: 'i', - ı: 'i', - Ĵ: 'J', - ĵ: 'j', - Ķ: 'K', - ķ: 'k', - ĸ: 'k', - Ĺ: 'L', - Ļ: 'L', - Ľ: 'L', - Ŀ: 'L', - Ł: 'L', - ĺ: 'l', - ļ: 'l', - ľ: 'l', - ŀ: 'l', - ł: 'l', - Ń: 'N', - Ņ: 'N', - Ň: 'N', - Ŋ: 'N', - ń: 'n', - ņ: 'n', - ň: 'n', - ŋ: 'n', - Ō: 'O', - Ŏ: 'O', - Ő: 'O', - ō: 'o', - ŏ: 'o', - ő: 'o', - Ŕ: 'R', - Ŗ: 'R', - Ř: 'R', - ŕ: 'r', - ŗ: 'r', - ř: 'r', - Ś: 'S', - Ŝ: 'S', - Ş: 'S', - Š: 'S', - ś: 's', - ŝ: 's', - ş: 's', - š: 's', - Ţ: 'T', - Ť: 'T', - Ŧ: 'T', - ţ: 't', - ť: 't', - ŧ: 't', - Ũ: 'U', - Ū: 'U', - Ŭ: 'U', - Ů: 'U', - Ű: 'U', - Ų: 'U', - ũ: 'u', - ū: 'u', - ŭ: 'u', - ů: 'u', - ű: 'u', - ų: 'u', - Ŵ: 'W', - ŵ: 'w', - Ŷ: 'Y', - ŷ: 'y', - Ÿ: 'Y', - Ź: 'Z', - Ż: 'Z', - Ž: 'Z', - ź: 'z', - ż: 'z', - ž: 'z', - IJ: 'IJ', - ij: 'ij', - Œ: 'Oe', - œ: 'oe', - ʼn: "'n", - ſ: 's' - }); - s.exports = u; - }, - 93243: (s, o, i) => { - var u = i(56110), - _ = (function () { - try { - var s = u(Object, 'defineProperty'); - return (s({}, '', {}), s); - } catch (s) {} - })(); - s.exports = _; - }, - 25911: (s, o, i) => { - var u = i(38859), - _ = i(14248), - w = i(19219); - s.exports = function equalArrays(s, o, i, x, C, j) { - var L = 1 & i, - B = s.length, - $ = o.length; - if (B != $ && !(L && $ > B)) return !1; - var V = j.get(s), - U = j.get(o); - if (V && U) return V == o && U == s; - var z = -1, - Y = !0, - Z = 2 & i ? new u() : void 0; - for (j.set(s, o), j.set(o, s); ++z < B; ) { - var ee = s[z], - ie = o[z]; - if (x) var ae = L ? x(ie, ee, z, o, s, j) : x(ee, ie, z, s, o, j); - if (void 0 !== ae) { - if (ae) continue; - Y = !1; - break; - } - if (Z) { - if ( - !_(o, function (s, o) { - if (!w(Z, o) && (ee === s || C(ee, s, i, x, j))) return Z.push(o); - }) - ) { - Y = !1; - break; - } - } else if (ee !== ie && !C(ee, ie, i, x, j)) { - Y = !1; - break; - } - } - return (j.delete(s), j.delete(o), Y); - }; - }, - 21986: (s, o, i) => { - var u = i(51873), - _ = i(37828), - w = i(75288), - x = i(25911), - C = i(20317), - j = i(84247), - L = u ? u.prototype : void 0, - B = L ? L.valueOf : void 0; - s.exports = function equalByTag(s, o, i, u, L, $, V) { - switch (i) { - case '[object DataView]': - if (s.byteLength != o.byteLength || s.byteOffset != o.byteOffset) return !1; - ((s = s.buffer), (o = o.buffer)); - case '[object ArrayBuffer]': - return !(s.byteLength != o.byteLength || !$(new _(s), new _(o))); - case '[object Boolean]': - case '[object Date]': - case '[object Number]': - return w(+s, +o); - case '[object Error]': - return s.name == o.name && s.message == o.message; - case '[object RegExp]': - case '[object String]': - return s == o + ''; - case '[object Map]': - var U = C; - case '[object Set]': - var z = 1 & u; - if ((U || (U = j), s.size != o.size && !z)) return !1; - var Y = V.get(s); - if (Y) return Y == o; - ((u |= 2), V.set(s, o)); - var Z = x(U(s), U(o), u, L, $, V); - return (V.delete(s), Z); - case '[object Symbol]': - if (B) return B.call(s) == B.call(o); - } - return !1; - }; - }, - 50689: (s, o, i) => { - var u = i(50002), - _ = Object.prototype.hasOwnProperty; - s.exports = function equalObjects(s, o, i, w, x, C) { - var j = 1 & i, - L = u(s), - B = L.length; - if (B != u(o).length && !j) return !1; - for (var $ = B; $--; ) { - var V = L[$]; - if (!(j ? V in o : _.call(o, V))) return !1; - } - var U = C.get(s), - z = C.get(o); - if (U && z) return U == o && z == s; - var Y = !0; - (C.set(s, o), C.set(o, s)); - for (var Z = j; ++$ < B; ) { - var ee = s[(V = L[$])], - ie = o[V]; - if (w) var ae = j ? w(ie, ee, V, o, s, C) : w(ee, ie, V, s, o, C); - if (!(void 0 === ae ? ee === ie || x(ee, ie, i, w, C) : ae)) { - Y = !1; - break; - } - Z || (Z = 'constructor' == V); - } - if (Y && !Z) { - var le = s.constructor, - ce = o.constructor; - le == ce || - !('constructor' in s) || - !('constructor' in o) || - ('function' == typeof le && - le instanceof le && - 'function' == typeof ce && - ce instanceof ce) || - (Y = !1); - } - return (C.delete(s), C.delete(o), Y); - }; - }, - 38816: (s, o, i) => { - var u = i(35970), - _ = i(56757), - w = i(32865); - s.exports = function flatRest(s) { - return w(_(s, void 0, u), s + ''); - }; - }, - 34840: (s, o, i) => { - var u = 'object' == typeof i.g && i.g && i.g.Object === Object && i.g; - s.exports = u; - }, - 50002: (s, o, i) => { - var u = i(82199), - _ = i(4664), - w = i(95950); - s.exports = function getAllKeys(s) { - return u(s, w, _); - }; - }, - 83349: (s, o, i) => { - var u = i(82199), - _ = i(86375), - w = i(37241); - s.exports = function getAllKeysIn(s) { - return u(s, w, _); - }; - }, - 37381: (s, o, i) => { - var u = i(48152), - _ = i(63950), - w = u - ? function (s) { - return u.get(s); - } - : _; - s.exports = w; - }, - 62284: (s, o, i) => { - var u = i(84629), - _ = Object.prototype.hasOwnProperty; - s.exports = function getFuncName(s) { - for (var o = s.name + '', i = u[o], w = _.call(u, o) ? i.length : 0; w--; ) { - var x = i[w], - C = x.func; - if (null == C || C == s) return x.name; - } - return o; - }; - }, - 11287: (s) => { - s.exports = function getHolder(s) { - return s.placeholder; - }; - }, - 12651: (s, o, i) => { - var u = i(74218); - s.exports = function getMapData(s, o) { - var i = s.__data__; - return u(o) ? i['string' == typeof o ? 'string' : 'hash'] : i.map; - }; - }, - 10776: (s, o, i) => { - var u = i(30756), - _ = i(95950); - s.exports = function getMatchData(s) { - for (var o = _(s), i = o.length; i--; ) { - var w = o[i], - x = s[w]; - o[i] = [w, x, u(x)]; - } - return o; - }; - }, - 56110: (s, o, i) => { - var u = i(45083), - _ = i(10392); - s.exports = function getNative(s, o) { - var i = _(s, o); - return u(i) ? i : void 0; - }; - }, - 28879: (s, o, i) => { - var u = i(74335)(Object.getPrototypeOf, Object); - s.exports = u; - }, - 659: (s, o, i) => { - var u = i(51873), - _ = Object.prototype, - w = _.hasOwnProperty, - x = _.toString, - C = u ? u.toStringTag : void 0; - s.exports = function getRawTag(s) { - var o = w.call(s, C), - i = s[C]; - try { - s[C] = void 0; - var u = !0; - } catch (s) {} - var _ = x.call(s); - return (u && (o ? (s[C] = i) : delete s[C]), _); - }; - }, - 4664: (s, o, i) => { - var u = i(79770), - _ = i(63345), - w = Object.prototype.propertyIsEnumerable, - x = Object.getOwnPropertySymbols, - C = x - ? function (s) { - return null == s - ? [] - : ((s = Object(s)), - u(x(s), function (o) { - return w.call(s, o); - })); - } - : _; - s.exports = C; - }, - 86375: (s, o, i) => { - var u = i(14528), - _ = i(28879), - w = i(4664), - x = i(63345), - C = Object.getOwnPropertySymbols - ? function (s) { - for (var o = []; s; ) (u(o, w(s)), (s = _(s))); - return o; - } - : x; - s.exports = C; - }, - 5861: (s, o, i) => { - var u = i(55580), - _ = i(68223), - w = i(32804), - x = i(76545), - C = i(28303), - j = i(72552), - L = i(47473), - B = '[object Map]', - $ = '[object Promise]', - V = '[object Set]', - U = '[object WeakMap]', - z = '[object DataView]', - Y = L(u), - Z = L(_), - ee = L(w), - ie = L(x), - ae = L(C), - le = j; - (((u && le(new u(new ArrayBuffer(1))) != z) || - (_ && le(new _()) != B) || - (w && le(w.resolve()) != $) || - (x && le(new x()) != V) || - (C && le(new C()) != U)) && - (le = function (s) { - var o = j(s), - i = '[object Object]' == o ? s.constructor : void 0, - u = i ? L(i) : ''; - if (u) - switch (u) { - case Y: - return z; - case Z: - return B; - case ee: - return $; - case ie: - return V; - case ae: - return U; - } - return o; - }), - (s.exports = le)); - }, - 10392: (s) => { - s.exports = function getValue(s, o) { - return null == s ? void 0 : s[o]; - }; - }, - 75251: (s) => { - var o = /\{\n\/\* \[wrapped with (.+)\] \*/, - i = /,? & /; - s.exports = function getWrapDetails(s) { - var u = s.match(o); - return u ? u[1].split(i) : []; - }; - }, - 49326: (s, o, i) => { - var u = i(31769), - _ = i(72428), - w = i(56449), - x = i(30361), - C = i(30294), - j = i(77797); - s.exports = function hasPath(s, o, i) { - for (var L = -1, B = (o = u(o, s)).length, $ = !1; ++L < B; ) { - var V = j(o[L]); - if (!($ = null != s && i(s, V))) break; - s = s[V]; - } - return $ || ++L != B - ? $ - : !!(B = null == s ? 0 : s.length) && C(B) && x(V, B) && (w(s) || _(s)); - }; - }, - 49698: (s) => { - var o = RegExp( - '[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]' - ); - s.exports = function hasUnicode(s) { - return o.test(s); - }; - }, - 45434: (s) => { - var o = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; - s.exports = function hasUnicodeWord(s) { - return o.test(s); - }; - }, - 22032: (s, o, i) => { - var u = i(81042); - s.exports = function hashClear() { - ((this.__data__ = u ? u(null) : {}), (this.size = 0)); - }; - }, - 63862: (s) => { - s.exports = function hashDelete(s) { - var o = this.has(s) && delete this.__data__[s]; - return ((this.size -= o ? 1 : 0), o); - }; - }, - 66721: (s, o, i) => { - var u = i(81042), - _ = Object.prototype.hasOwnProperty; - s.exports = function hashGet(s) { - var o = this.__data__; - if (u) { - var i = o[s]; - return '__lodash_hash_undefined__' === i ? void 0 : i; - } - return _.call(o, s) ? o[s] : void 0; - }; - }, - 12749: (s, o, i) => { - var u = i(81042), - _ = Object.prototype.hasOwnProperty; - s.exports = function hashHas(s) { - var o = this.__data__; - return u ? void 0 !== o[s] : _.call(o, s); - }; - }, - 35749: (s, o, i) => { - var u = i(81042); - s.exports = function hashSet(s, o) { - var i = this.__data__; - return ( - (this.size += this.has(s) ? 0 : 1), - (i[s] = u && void 0 === o ? '__lodash_hash_undefined__' : o), - this - ); - }; - }, - 76189: (s) => { - var o = Object.prototype.hasOwnProperty; - s.exports = function initCloneArray(s) { - var i = s.length, - u = new s.constructor(i); - return ( - i && - 'string' == typeof s[0] && - o.call(s, 'index') && - ((u.index = s.index), (u.input = s.input)), - u - ); - }; - }, - 77199: (s, o, i) => { - var u = i(49653), - _ = i(76169), - w = i(73201), - x = i(93736), - C = i(71961); - s.exports = function initCloneByTag(s, o, i) { - var j = s.constructor; - switch (o) { - case '[object ArrayBuffer]': - return u(s); - case '[object Boolean]': - case '[object Date]': - return new j(+s); - case '[object DataView]': - return _(s, i); - case '[object Float32Array]': - case '[object Float64Array]': - case '[object Int8Array]': - case '[object Int16Array]': - case '[object Int32Array]': - case '[object Uint8Array]': - case '[object Uint8ClampedArray]': - case '[object Uint16Array]': - case '[object Uint32Array]': - return C(s, i); - case '[object Map]': - case '[object Set]': - return new j(); - case '[object Number]': - case '[object String]': - return new j(s); - case '[object RegExp]': - return w(s); - case '[object Symbol]': - return x(s); - } - }; - }, - 35529: (s, o, i) => { - var u = i(39344), - _ = i(28879), - w = i(55527); - s.exports = function initCloneObject(s) { - return 'function' != typeof s.constructor || w(s) ? {} : u(_(s)); - }; - }, - 62060: (s) => { - var o = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/; - s.exports = function insertWrapDetails(s, i) { - var u = i.length; - if (!u) return s; - var _ = u - 1; - return ( - (i[_] = (u > 1 ? '& ' : '') + i[_]), - (i = i.join(u > 2 ? ', ' : ' ')), - s.replace(o, '{\n/* [wrapped with ' + i + '] */\n') - ); - }; - }, - 45891: (s, o, i) => { - var u = i(51873), - _ = i(72428), - w = i(56449), - x = u ? u.isConcatSpreadable : void 0; - s.exports = function isFlattenable(s) { - return w(s) || _(s) || !!(x && s && s[x]); - }; - }, - 30361: (s) => { - var o = /^(?:0|[1-9]\d*)$/; - s.exports = function isIndex(s, i) { - var u = typeof s; - return ( - !!(i = null == i ? 9007199254740991 : i) && - ('number' == u || ('symbol' != u && o.test(s))) && - s > -1 && - s % 1 == 0 && - s < i - ); - }; - }, - 36800: (s, o, i) => { - var u = i(75288), - _ = i(64894), - w = i(30361), - x = i(23805); - s.exports = function isIterateeCall(s, o, i) { - if (!x(i)) return !1; - var C = typeof o; - return ( - !!('number' == C ? _(i) && w(o, i.length) : 'string' == C && o in i) && u(i[o], s) - ); - }; - }, - 28586: (s, o, i) => { - var u = i(56449), - _ = i(44394), - w = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - x = /^\w*$/; - s.exports = function isKey(s, o) { - if (u(s)) return !1; - var i = typeof s; - return ( - !('number' != i && 'symbol' != i && 'boolean' != i && null != s && !_(s)) || - x.test(s) || - !w.test(s) || - (null != o && s in Object(o)) - ); - }; - }, - 74218: (s) => { - s.exports = function isKeyable(s) { - var o = typeof s; - return 'string' == o || 'number' == o || 'symbol' == o || 'boolean' == o - ? '__proto__' !== s - : null === s; - }; - }, - 85087: (s, o, i) => { - var u = i(30980), - _ = i(37381), - w = i(62284), - x = i(53758); - s.exports = function isLaziable(s) { - var o = w(s), - i = x[o]; - if ('function' != typeof i || !(o in u.prototype)) return !1; - if (s === i) return !0; - var C = _(i); - return !!C && s === C[0]; - }; - }, - 87296: (s, o, i) => { - var u, - _ = i(55481), - w = (u = /[^.]+$/.exec((_ && _.keys && _.keys.IE_PROTO) || '')) - ? 'Symbol(src)_1.' + u - : ''; - s.exports = function isMasked(s) { - return !!w && w in s; - }; - }, - 55527: (s) => { - var o = Object.prototype; - s.exports = function isPrototype(s) { - var i = s && s.constructor; - return s === (('function' == typeof i && i.prototype) || o); - }; - }, - 30756: (s, o, i) => { - var u = i(23805); - s.exports = function isStrictComparable(s) { - return s == s && !u(s); - }; - }, - 63702: (s) => { - s.exports = function listCacheClear() { - ((this.__data__ = []), (this.size = 0)); - }; - }, - 70080: (s, o, i) => { - var u = i(26025), - _ = Array.prototype.splice; - s.exports = function listCacheDelete(s) { - var o = this.__data__, - i = u(o, s); - return !(i < 0) && (i == o.length - 1 ? o.pop() : _.call(o, i, 1), --this.size, !0); - }; - }, - 24739: (s, o, i) => { - var u = i(26025); - s.exports = function listCacheGet(s) { - var o = this.__data__, - i = u(o, s); - return i < 0 ? void 0 : o[i][1]; - }; - }, - 48655: (s, o, i) => { - var u = i(26025); - s.exports = function listCacheHas(s) { - return u(this.__data__, s) > -1; - }; - }, - 31175: (s, o, i) => { - var u = i(26025); - s.exports = function listCacheSet(s, o) { - var i = this.__data__, - _ = u(i, s); - return (_ < 0 ? (++this.size, i.push([s, o])) : (i[_][1] = o), this); - }; - }, - 63040: (s, o, i) => { - var u = i(21549), - _ = i(80079), - w = i(68223); - s.exports = function mapCacheClear() { - ((this.size = 0), - (this.__data__ = { hash: new u(), map: new (w || _)(), string: new u() })); - }; - }, - 17670: (s, o, i) => { - var u = i(12651); - s.exports = function mapCacheDelete(s) { - var o = u(this, s).delete(s); - return ((this.size -= o ? 1 : 0), o); - }; - }, - 90289: (s, o, i) => { - var u = i(12651); - s.exports = function mapCacheGet(s) { - return u(this, s).get(s); - }; - }, - 4509: (s, o, i) => { - var u = i(12651); - s.exports = function mapCacheHas(s) { - return u(this, s).has(s); - }; - }, - 72949: (s, o, i) => { - var u = i(12651); - s.exports = function mapCacheSet(s, o) { - var i = u(this, s), - _ = i.size; - return (i.set(s, o), (this.size += i.size == _ ? 0 : 1), this); - }; - }, - 20317: (s) => { - s.exports = function mapToArray(s) { - var o = -1, - i = Array(s.size); - return ( - s.forEach(function (s, u) { - i[++o] = [u, s]; - }), - i - ); - }; - }, - 67197: (s) => { - s.exports = function matchesStrictComparable(s, o) { - return function (i) { - return null != i && i[s] === o && (void 0 !== o || s in Object(i)); - }; - }; - }, - 62224: (s, o, i) => { - var u = i(50104); - s.exports = function memoizeCapped(s) { - var o = u(s, function (s) { - return (500 === i.size && i.clear(), s); - }), - i = o.cache; - return o; - }; - }, - 3209: (s, o, i) => { - var u = i(91596), - _ = i(53320), - w = i(36306), - x = '__lodash_placeholder__', - C = 128, - j = Math.min; - s.exports = function mergeData(s, o) { - var i = s[1], - L = o[1], - B = i | L, - $ = B < 131, - V = - (L == C && 8 == i) || - (L == C && 256 == i && s[7].length <= o[8]) || - (384 == L && o[7].length <= o[8] && 8 == i); - if (!$ && !V) return s; - 1 & L && ((s[2] = o[2]), (B |= 1 & i ? 0 : 4)); - var U = o[3]; - if (U) { - var z = s[3]; - ((s[3] = z ? u(z, U, o[4]) : U), (s[4] = z ? w(s[3], x) : o[4])); - } - return ( - (U = o[5]) && - ((z = s[5]), (s[5] = z ? _(z, U, o[6]) : U), (s[6] = z ? w(s[5], x) : o[6])), - (U = o[7]) && (s[7] = U), - L & C && (s[8] = null == s[8] ? o[8] : j(s[8], o[8])), - null == s[9] && (s[9] = o[9]), - (s[0] = o[0]), - (s[1] = B), - s - ); - }; - }, - 48152: (s, o, i) => { - var u = i(28303), - _ = u && new u(); - s.exports = _; - }, - 81042: (s, o, i) => { - var u = i(56110)(Object, 'create'); - s.exports = u; - }, - 3650: (s, o, i) => { - var u = i(74335)(Object.keys, Object); - s.exports = u; - }, - 90181: (s) => { - s.exports = function nativeKeysIn(s) { - var o = []; - if (null != s) for (var i in Object(s)) o.push(i); - return o; - }; - }, - 86009: (s, o, i) => { - s = i.nmd(s); - var u = i(34840), - _ = o && !o.nodeType && o, - w = _ && s && !s.nodeType && s, - x = w && w.exports === _ && u.process, - C = (function () { - try { - var s = w && w.require && w.require('util').types; - return s || (x && x.binding && x.binding('util')); - } catch (s) {} - })(); - s.exports = C; - }, - 59350: (s) => { - var o = Object.prototype.toString; - s.exports = function objectToString(s) { - return o.call(s); - }; - }, - 74335: (s) => { - s.exports = function overArg(s, o) { - return function (i) { - return s(o(i)); - }; - }; - }, - 56757: (s, o, i) => { - var u = i(91033), - _ = Math.max; - s.exports = function overRest(s, o, i) { - return ( - (o = _(void 0 === o ? s.length - 1 : o, 0)), - function () { - for (var w = arguments, x = -1, C = _(w.length - o, 0), j = Array(C); ++x < C; ) - j[x] = w[o + x]; - x = -1; - for (var L = Array(o + 1); ++x < o; ) L[x] = w[x]; - return ((L[o] = i(j)), u(s, this, L)); - } - ); - }; - }, - 68969: (s, o, i) => { - var u = i(47422), - _ = i(25160); - s.exports = function parent(s, o) { - return o.length < 2 ? s : u(s, _(o, 0, -1)); - }; - }, - 84629: (s) => { - s.exports = {}; - }, - 68294: (s, o, i) => { - var u = i(23007), - _ = i(30361), - w = Math.min; - s.exports = function reorder(s, o) { - for (var i = s.length, x = w(o.length, i), C = u(s); x--; ) { - var j = o[x]; - s[x] = _(j, i) ? C[j] : void 0; - } - return s; - }; - }, - 36306: (s) => { - var o = '__lodash_placeholder__'; - s.exports = function replaceHolders(s, i) { - for (var u = -1, _ = s.length, w = 0, x = []; ++u < _; ) { - var C = s[u]; - (C !== i && C !== o) || ((s[u] = o), (x[w++] = u)); - } - return x; - }; - }, - 9325: (s, o, i) => { - var u = i(34840), - _ = 'object' == typeof self && self && self.Object === Object && self, - w = u || _ || Function('return this')(); - s.exports = w; - }, - 14974: (s) => { - s.exports = function safeGet(s, o) { - if (('constructor' !== o || 'function' != typeof s[o]) && '__proto__' != o) return s[o]; - }; - }, - 31380: (s) => { - s.exports = function setCacheAdd(s) { - return (this.__data__.set(s, '__lodash_hash_undefined__'), this); - }; - }, - 51459: (s) => { - s.exports = function setCacheHas(s) { - return this.__data__.has(s); - }; - }, - 54641: (s, o, i) => { - var u = i(68882), - _ = i(51811)(u); - s.exports = _; - }, - 84247: (s) => { - s.exports = function setToArray(s) { - var o = -1, - i = Array(s.size); - return ( - s.forEach(function (s) { - i[++o] = s; - }), - i - ); - }; - }, - 32865: (s, o, i) => { - var u = i(19570), - _ = i(51811)(u); - s.exports = _; - }, - 70981: (s, o, i) => { - var u = i(75251), - _ = i(62060), - w = i(32865), - x = i(75948); - s.exports = function setWrapToString(s, o, i) { - var C = o + ''; - return w(s, _(C, x(u(C), i))); - }; - }, - 51811: (s) => { - var o = Date.now; - s.exports = function shortOut(s) { - var i = 0, - u = 0; - return function () { - var _ = o(), - w = 16 - (_ - u); - if (((u = _), w > 0)) { - if (++i >= 800) return arguments[0]; - } else i = 0; - return s.apply(void 0, arguments); - }; - }; - }, - 51420: (s, o, i) => { - var u = i(80079); - s.exports = function stackClear() { - ((this.__data__ = new u()), (this.size = 0)); - }; - }, - 90938: (s) => { - s.exports = function stackDelete(s) { - var o = this.__data__, - i = o.delete(s); - return ((this.size = o.size), i); - }; - }, - 63605: (s) => { - s.exports = function stackGet(s) { - return this.__data__.get(s); - }; - }, - 29817: (s) => { - s.exports = function stackHas(s) { - return this.__data__.has(s); - }; - }, - 80945: (s, o, i) => { - var u = i(80079), - _ = i(68223), - w = i(53661); - s.exports = function stackSet(s, o) { - var i = this.__data__; - if (i instanceof u) { - var x = i.__data__; - if (!_ || x.length < 199) return (x.push([s, o]), (this.size = ++i.size), this); - i = this.__data__ = new w(x); - } - return (i.set(s, o), (this.size = i.size), this); - }; - }, - 76959: (s) => { - s.exports = function strictIndexOf(s, o, i) { - for (var u = i - 1, _ = s.length; ++u < _; ) if (s[u] === o) return u; - return -1; - }; - }, - 63912: (s, o, i) => { - var u = i(61074), - _ = i(49698), - w = i(42054); - s.exports = function stringToArray(s) { - return _(s) ? w(s) : u(s); - }; - }, - 61802: (s, o, i) => { - var u = i(62224), - _ = - /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g, - w = /\\(\\)?/g, - x = u(function (s) { - var o = []; - return ( - 46 === s.charCodeAt(0) && o.push(''), - s.replace(_, function (s, i, u, _) { - o.push(u ? _.replace(w, '$1') : i || s); - }), - o - ); - }); - s.exports = x; - }, - 77797: (s, o, i) => { - var u = i(44394); - s.exports = function toKey(s) { - if ('string' == typeof s || u(s)) return s; - var o = s + ''; - return '0' == o && 1 / s == -1 / 0 ? '-0' : o; - }; - }, - 47473: (s) => { - var o = Function.prototype.toString; - s.exports = function toSource(s) { - if (null != s) { - try { - return o.call(s); - } catch (s) {} - try { - return s + ''; - } catch (s) {} - } - return ''; - }; - }, - 31800: (s) => { - var o = /\s/; - s.exports = function trimmedEndIndex(s) { - for (var i = s.length; i-- && o.test(s.charAt(i)); ); - return i; - }; - }, - 42054: (s) => { - var o = '\\ud800-\\udfff', - i = '[' + o + ']', - u = '[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]', - _ = '\\ud83c[\\udffb-\\udfff]', - w = '[^' + o + ']', - x = '(?:\\ud83c[\\udde6-\\uddff]){2}', - C = '[\\ud800-\\udbff][\\udc00-\\udfff]', - j = '(?:' + u + '|' + _ + ')' + '?', - L = '[\\ufe0e\\ufe0f]?', - B = L + j + ('(?:\\u200d(?:' + [w, x, C].join('|') + ')' + L + j + ')*'), - $ = '(?:' + [w + u + '?', u, x, C, i].join('|') + ')', - V = RegExp(_ + '(?=' + _ + ')|' + $ + B, 'g'); - s.exports = function unicodeToArray(s) { - return s.match(V) || []; - }; - }, - 22225: (s) => { - var o = '\\ud800-\\udfff', - i = '\\u2700-\\u27bf', - u = 'a-z\\xdf-\\xf6\\xf8-\\xff', - _ = 'A-Z\\xc0-\\xd6\\xd8-\\xde', - w = - '\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', - x = '[' + w + ']', - C = '\\d+', - j = '[' + i + ']', - L = '[' + u + ']', - B = '[^' + o + w + C + i + u + _ + ']', - $ = '(?:\\ud83c[\\udde6-\\uddff]){2}', - V = '[\\ud800-\\udbff][\\udc00-\\udfff]', - U = '[' + _ + ']', - z = '(?:' + L + '|' + B + ')', - Y = '(?:' + U + '|' + B + ')', - Z = "(?:['’](?:d|ll|m|re|s|t|ve))?", - ee = "(?:['’](?:D|LL|M|RE|S|T|VE))?", - ie = '(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?', - ae = '[\\ufe0e\\ufe0f]?', - le = - ae + ie + ('(?:\\u200d(?:' + ['[^' + o + ']', $, V].join('|') + ')' + ae + ie + ')*'), - ce = '(?:' + [j, $, V].join('|') + ')' + le, - pe = RegExp( - [ - U + '?' + L + '+' + Z + '(?=' + [x, U, '$'].join('|') + ')', - Y + '+' + ee + '(?=' + [x, U + z, '$'].join('|') + ')', - U + '?' + z + '+' + Z, - U + '+' + ee, - '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', - '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', - C, - ce - ].join('|'), - 'g' - ); - s.exports = function unicodeWords(s) { - return s.match(pe) || []; - }; - }, - 75948: (s, o, i) => { - var u = i(83729), - _ = i(15325), - w = [ - ['ary', 128], - ['bind', 1], - ['bindKey', 2], - ['curry', 8], - ['curryRight', 16], - ['flip', 512], - ['partial', 32], - ['partialRight', 64], - ['rearg', 256] - ]; - s.exports = function updateWrapDetails(s, o) { - return ( - u(w, function (i) { - var u = '_.' + i[0]; - o & i[1] && !_(s, u) && s.push(u); - }), - s.sort() - ); - }; - }, - 80257: (s, o, i) => { - var u = i(30980), - _ = i(56017), - w = i(23007); - s.exports = function wrapperClone(s) { - if (s instanceof u) return s.clone(); - var o = new _(s.__wrapped__, s.__chain__); - return ( - (o.__actions__ = w(s.__actions__)), - (o.__index__ = s.__index__), - (o.__values__ = s.__values__), - o - ); - }; - }, - 64626: (s, o, i) => { - var u = i(66977); - s.exports = function ary(s, o, i) { - return ( - (o = i ? void 0 : o), - (o = s && null == o ? s.length : o), - u(s, 128, void 0, void 0, void 0, void 0, o) - ); - }; - }, - 84058: (s, o, i) => { - var u = i(14792), - _ = i(45539)(function (s, o, i) { - return ((o = o.toLowerCase()), s + (i ? u(o) : o)); - }); - s.exports = _; - }, - 14792: (s, o, i) => { - var u = i(13222), - _ = i(55808); - s.exports = function capitalize(s) { - return _(u(s).toLowerCase()); - }; - }, - 32629: (s, o, i) => { - var u = i(9999); - s.exports = function clone(s) { - return u(s, 4); - }; - }, - 37334: (s) => { - s.exports = function constant(s) { - return function () { - return s; - }; - }; - }, - 49747: (s, o, i) => { - var u = i(66977); - function curry(s, o, i) { - var _ = u(s, 8, void 0, void 0, void 0, void 0, void 0, (o = i ? void 0 : o)); - return ((_.placeholder = curry.placeholder), _); - } - ((curry.placeholder = {}), (s.exports = curry)); - }, - 38221: (s, o, i) => { - var u = i(23805), - _ = i(10124), - w = i(99374), - x = Math.max, - C = Math.min; - s.exports = function debounce(s, o, i) { - var j, - L, - B, - $, - V, - U, - z = 0, - Y = !1, - Z = !1, - ee = !0; - if ('function' != typeof s) throw new TypeError('Expected a function'); - function invokeFunc(o) { - var i = j, - u = L; - return ((j = L = void 0), (z = o), ($ = s.apply(u, i))); - } - function shouldInvoke(s) { - var i = s - U; - return void 0 === U || i >= o || i < 0 || (Z && s - z >= B); - } - function timerExpired() { - var s = _(); - if (shouldInvoke(s)) return trailingEdge(s); - V = setTimeout( - timerExpired, - (function remainingWait(s) { - var i = o - (s - U); - return Z ? C(i, B - (s - z)) : i; - })(s) - ); - } - function trailingEdge(s) { - return ((V = void 0), ee && j ? invokeFunc(s) : ((j = L = void 0), $)); - } - function debounced() { - var s = _(), - i = shouldInvoke(s); - if (((j = arguments), (L = this), (U = s), i)) { - if (void 0 === V) - return (function leadingEdge(s) { - return ((z = s), (V = setTimeout(timerExpired, o)), Y ? invokeFunc(s) : $); - })(U); - if (Z) return (clearTimeout(V), (V = setTimeout(timerExpired, o)), invokeFunc(U)); - } - return (void 0 === V && (V = setTimeout(timerExpired, o)), $); - } - return ( - (o = w(o) || 0), - u(i) && - ((Y = !!i.leading), - (B = (Z = 'maxWait' in i) ? x(w(i.maxWait) || 0, o) : B), - (ee = 'trailing' in i ? !!i.trailing : ee)), - (debounced.cancel = function cancel() { - (void 0 !== V && clearTimeout(V), (z = 0), (j = U = L = V = void 0)); - }), - (debounced.flush = function flush() { - return void 0 === V ? $ : trailingEdge(_()); - }), - debounced - ); - }; - }, - 50828: (s, o, i) => { - var u = i(24647), - _ = i(13222), - w = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g, - x = RegExp('[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]', 'g'); - s.exports = function deburr(s) { - return (s = _(s)) && s.replace(w, u).replace(x, ''); - }; - }, - 75288: (s) => { - s.exports = function eq(s, o) { - return s === o || (s != s && o != o); - }; - }, - 60680: (s, o, i) => { - var u = i(13222), - _ = /[\\^$.*+?()[\]{}|]/g, - w = RegExp(_.source); - s.exports = function escapeRegExp(s) { - return (s = u(s)) && w.test(s) ? s.replace(_, '\\$&') : s; - }; - }, - 7309: (s, o, i) => { - var u = i(62006)(i(24713)); - s.exports = u; - }, - 24713: (s, o, i) => { - var u = i(2523), - _ = i(15389), - w = i(61489), - x = Math.max; - s.exports = function findIndex(s, o, i) { - var C = null == s ? 0 : s.length; - if (!C) return -1; - var j = null == i ? 0 : w(i); - return (j < 0 && (j = x(C + j, 0)), u(s, _(o, 3), j)); - }; - }, - 35970: (s, o, i) => { - var u = i(83120); - s.exports = function flatten(s) { - return (null == s ? 0 : s.length) ? u(s, 1) : []; - }; - }, - 73424: (s, o, i) => { - var u = i(16962), - _ = i(2874), - w = Array.prototype.push; - function baseAry(s, o) { - return 2 == o - ? function (o, i) { - return s(o, i); - } - : function (o) { - return s(o); - }; - } - function cloneArray(s) { - for (var o = s ? s.length : 0, i = Array(o); o--; ) i[o] = s[o]; - return i; - } - function wrapImmutable(s, o) { - return function () { - var i = arguments.length; - if (i) { - for (var u = Array(i); i--; ) u[i] = arguments[i]; - var _ = (u[0] = o.apply(void 0, u)); - return (s.apply(void 0, u), _); - } - }; - } - s.exports = function baseConvert(s, o, i, x) { - var C = 'function' == typeof o, - j = o === Object(o); - if ((j && ((x = i), (i = o), (o = void 0)), null == i)) throw new TypeError(); - x || (x = {}); - var L = !('cap' in x) || x.cap, - B = !('curry' in x) || x.curry, - $ = !('fixed' in x) || x.fixed, - V = !('immutable' in x) || x.immutable, - U = !('rearg' in x) || x.rearg, - z = C ? i : _, - Y = 'curry' in x && x.curry, - Z = 'fixed' in x && x.fixed, - ee = 'rearg' in x && x.rearg, - ie = C ? i.runInContext() : void 0, - ae = C - ? i - : { - ary: s.ary, - assign: s.assign, - clone: s.clone, - curry: s.curry, - forEach: s.forEach, - isArray: s.isArray, - isError: s.isError, - isFunction: s.isFunction, - isWeakMap: s.isWeakMap, - iteratee: s.iteratee, - keys: s.keys, - rearg: s.rearg, - toInteger: s.toInteger, - toPath: s.toPath - }, - le = ae.ary, - ce = ae.assign, - pe = ae.clone, - de = ae.curry, - fe = ae.forEach, - ye = ae.isArray, - be = ae.isError, - _e = ae.isFunction, - we = ae.isWeakMap, - Se = ae.keys, - xe = ae.rearg, - Pe = ae.toInteger, - Te = ae.toPath, - Re = Se(u.aryMethod), - qe = { - castArray: function (s) { - return function () { - var o = arguments[0]; - return ye(o) ? s(cloneArray(o)) : s.apply(void 0, arguments); - }; - }, - iteratee: function (s) { - return function () { - var o = arguments[1], - i = s(arguments[0], o), - u = i.length; - return L && 'number' == typeof o - ? ((o = o > 2 ? o - 2 : 1), u && u <= o ? i : baseAry(i, o)) - : i; - }; - }, - mixin: function (s) { - return function (o) { - var i = this; - if (!_e(i)) return s(i, Object(o)); - var u = []; - return ( - fe(Se(o), function (s) { - _e(o[s]) && u.push([s, i.prototype[s]]); - }), - s(i, Object(o)), - fe(u, function (s) { - var o = s[1]; - _e(o) ? (i.prototype[s[0]] = o) : delete i.prototype[s[0]]; - }), - i - ); - }; - }, - nthArg: function (s) { - return function (o) { - var i = o < 0 ? 1 : Pe(o) + 1; - return de(s(o), i); - }; - }, - rearg: function (s) { - return function (o, i) { - var u = i ? i.length : 0; - return de(s(o, i), u); - }; - }, - runInContext: function (o) { - return function (i) { - return baseConvert(s, o(i), x); - }; - } - }; - function castCap(s, o) { - if (L) { - var i = u.iterateeRearg[s]; - if (i) - return (function iterateeRearg(s, o) { - return overArg(s, function (s) { - var i = o.length; - return (function baseArity(s, o) { - return 2 == o - ? function (o, i) { - return s.apply(void 0, arguments); - } - : function (o) { - return s.apply(void 0, arguments); - }; - })(xe(baseAry(s, i), o), i); - }); - })(o, i); - var _ = !C && u.iterateeAry[s]; - if (_) - return (function iterateeAry(s, o) { - return overArg(s, function (s) { - return 'function' == typeof s ? baseAry(s, o) : s; - }); - })(o, _); - } - return o; - } - function castFixed(s, o, i) { - if ($ && (Z || !u.skipFixed[s])) { - var _ = u.methodSpread[s], - x = _ && _.start; - return void 0 === x - ? le(o, i) - : (function flatSpread(s, o) { - return function () { - for (var i = arguments.length, u = i - 1, _ = Array(i); i--; ) - _[i] = arguments[i]; - var x = _[o], - C = _.slice(0, o); - return ( - x && w.apply(C, x), - o != u && w.apply(C, _.slice(o + 1)), - s.apply(this, C) - ); - }; - })(o, x); - } - return o; - } - function castRearg(s, o, i) { - return U && i > 1 && (ee || !u.skipRearg[s]) - ? xe(o, u.methodRearg[s] || u.aryRearg[i]) - : o; - } - function cloneByPath(s, o) { - for ( - var i = -1, u = (o = Te(o)).length, _ = u - 1, w = pe(Object(s)), x = w; - null != x && ++i < u; - ) { - var C = o[i], - j = x[C]; - (null == j || _e(j) || be(j) || we(j) || (x[C] = pe(i == _ ? j : Object(j))), - (x = x[C])); - } - return w; - } - function createConverter(s, o) { - var i = u.aliasToReal[s] || s, - _ = u.remap[i] || i, - w = x; - return function (s) { - var u = C ? ie : ae, - x = C ? ie[_] : o, - j = ce(ce({}, w), s); - return baseConvert(u, i, x, j); - }; - } - function overArg(s, o) { - return function () { - var i = arguments.length; - if (!i) return s(); - for (var u = Array(i); i--; ) u[i] = arguments[i]; - var _ = U ? 0 : i - 1; - return ((u[_] = o(u[_])), s.apply(void 0, u)); - }; - } - function wrap(s, o, i) { - var _, - w = u.aliasToReal[s] || s, - x = o, - C = qe[w]; - return ( - C - ? (x = C(o)) - : V && - (u.mutate.array[w] - ? (x = wrapImmutable(o, cloneArray)) - : u.mutate.object[w] - ? (x = wrapImmutable( - o, - (function createCloner(s) { - return function (o) { - return s({}, o); - }; - })(o) - )) - : u.mutate.set[w] && (x = wrapImmutable(o, cloneByPath))), - fe(Re, function (s) { - return ( - fe(u.aryMethod[s], function (o) { - if (w == o) { - var i = u.methodSpread[w], - C = i && i.afterRearg; - return ( - (_ = C - ? castFixed(w, castRearg(w, x, s), s) - : castRearg(w, castFixed(w, x, s), s)), - (_ = (function castCurry(s, o, i) { - return Y || (B && i > 1) ? de(o, i) : o; - })(0, (_ = castCap(w, _)), s)), - !1 - ); - } - }), - !_ - ); - }), - _ || (_ = x), - _ == o && - (_ = Y - ? de(_, 1) - : function () { - return o.apply(this, arguments); - }), - (_.convert = createConverter(w, o)), - (_.placeholder = o.placeholder = i), - _ - ); - } - if (!j) return wrap(o, i, z); - var $e = i, - ze = []; - return ( - fe(Re, function (s) { - fe(u.aryMethod[s], function (s) { - var o = $e[u.remap[s] || s]; - o && ze.push([s, wrap(s, o, $e)]); - }); - }), - fe(Se($e), function (s) { - var o = $e[s]; - if ('function' == typeof o) { - for (var i = ze.length; i--; ) if (ze[i][0] == s) return; - ((o.convert = createConverter(s, o)), ze.push([s, o])); - } - }), - fe(ze, function (s) { - $e[s[0]] = s[1]; - }), - ($e.convert = function convertLib(s) { - return $e.runInContext.convert(s)(void 0); - }), - ($e.placeholder = $e), - fe(Se($e), function (s) { - fe(u.realToAlias[s] || [], function (o) { - $e[o] = $e[s]; - }); - }), - $e - ); - }; - }, - 16962: (s, o) => { - ((o.aliasToReal = { - each: 'forEach', - eachRight: 'forEachRight', - entries: 'toPairs', - entriesIn: 'toPairsIn', - extend: 'assignIn', - extendAll: 'assignInAll', - extendAllWith: 'assignInAllWith', - extendWith: 'assignInWith', - first: 'head', - conforms: 'conformsTo', - matches: 'isMatch', - property: 'get', - __: 'placeholder', - F: 'stubFalse', - T: 'stubTrue', - all: 'every', - allPass: 'overEvery', - always: 'constant', - any: 'some', - anyPass: 'overSome', - apply: 'spread', - assoc: 'set', - assocPath: 'set', - complement: 'negate', - compose: 'flowRight', - contains: 'includes', - dissoc: 'unset', - dissocPath: 'unset', - dropLast: 'dropRight', - dropLastWhile: 'dropRightWhile', - equals: 'isEqual', - identical: 'eq', - indexBy: 'keyBy', - init: 'initial', - invertObj: 'invert', - juxt: 'over', - omitAll: 'omit', - nAry: 'ary', - path: 'get', - pathEq: 'matchesProperty', - pathOr: 'getOr', - paths: 'at', - pickAll: 'pick', - pipe: 'flow', - pluck: 'map', - prop: 'get', - propEq: 'matchesProperty', - propOr: 'getOr', - props: 'at', - symmetricDifference: 'xor', - symmetricDifferenceBy: 'xorBy', - symmetricDifferenceWith: 'xorWith', - takeLast: 'takeRight', - takeLastWhile: 'takeRightWhile', - unapply: 'rest', - unnest: 'flatten', - useWith: 'overArgs', - where: 'conformsTo', - whereEq: 'isMatch', - zipObj: 'zipObject' - }), - (o.aryMethod = { - 1: [ - 'assignAll', - 'assignInAll', - 'attempt', - 'castArray', - 'ceil', - 'create', - 'curry', - 'curryRight', - 'defaultsAll', - 'defaultsDeepAll', - 'floor', - 'flow', - 'flowRight', - 'fromPairs', - 'invert', - 'iteratee', - 'memoize', - 'method', - 'mergeAll', - 'methodOf', - 'mixin', - 'nthArg', - 'over', - 'overEvery', - 'overSome', - 'rest', - 'reverse', - 'round', - 'runInContext', - 'spread', - 'template', - 'trim', - 'trimEnd', - 'trimStart', - 'uniqueId', - 'words', - 'zipAll' - ], - 2: [ - 'add', - 'after', - 'ary', - 'assign', - 'assignAllWith', - 'assignIn', - 'assignInAllWith', - 'at', - 'before', - 'bind', - 'bindAll', - 'bindKey', - 'chunk', - 'cloneDeepWith', - 'cloneWith', - 'concat', - 'conformsTo', - 'countBy', - 'curryN', - 'curryRightN', - 'debounce', - 'defaults', - 'defaultsDeep', - 'defaultTo', - 'delay', - 'difference', - 'divide', - 'drop', - 'dropRight', - 'dropRightWhile', - 'dropWhile', - 'endsWith', - 'eq', - 'every', - 'filter', - 'find', - 'findIndex', - 'findKey', - 'findLast', - 'findLastIndex', - 'findLastKey', - 'flatMap', - 'flatMapDeep', - 'flattenDepth', - 'forEach', - 'forEachRight', - 'forIn', - 'forInRight', - 'forOwn', - 'forOwnRight', - 'get', - 'groupBy', - 'gt', - 'gte', - 'has', - 'hasIn', - 'includes', - 'indexOf', - 'intersection', - 'invertBy', - 'invoke', - 'invokeMap', - 'isEqual', - 'isMatch', - 'join', - 'keyBy', - 'lastIndexOf', - 'lt', - 'lte', - 'map', - 'mapKeys', - 'mapValues', - 'matchesProperty', - 'maxBy', - 'meanBy', - 'merge', - 'mergeAllWith', - 'minBy', - 'multiply', - 'nth', - 'omit', - 'omitBy', - 'overArgs', - 'pad', - 'padEnd', - 'padStart', - 'parseInt', - 'partial', - 'partialRight', - 'partition', - 'pick', - 'pickBy', - 'propertyOf', - 'pull', - 'pullAll', - 'pullAt', - 'random', - 'range', - 'rangeRight', - 'rearg', - 'reject', - 'remove', - 'repeat', - 'restFrom', - 'result', - 'sampleSize', - 'some', - 'sortBy', - 'sortedIndex', - 'sortedIndexOf', - 'sortedLastIndex', - 'sortedLastIndexOf', - 'sortedUniqBy', - 'split', - 'spreadFrom', - 'startsWith', - 'subtract', - 'sumBy', - 'take', - 'takeRight', - 'takeRightWhile', - 'takeWhile', - 'tap', - 'throttle', - 'thru', - 'times', - 'trimChars', - 'trimCharsEnd', - 'trimCharsStart', - 'truncate', - 'union', - 'uniqBy', - 'uniqWith', - 'unset', - 'unzipWith', - 'without', - 'wrap', - 'xor', - 'zip', - 'zipObject', - 'zipObjectDeep' - ], - 3: [ - 'assignInWith', - 'assignWith', - 'clamp', - 'differenceBy', - 'differenceWith', - 'findFrom', - 'findIndexFrom', - 'findLastFrom', - 'findLastIndexFrom', - 'getOr', - 'includesFrom', - 'indexOfFrom', - 'inRange', - 'intersectionBy', - 'intersectionWith', - 'invokeArgs', - 'invokeArgsMap', - 'isEqualWith', - 'isMatchWith', - 'flatMapDepth', - 'lastIndexOfFrom', - 'mergeWith', - 'orderBy', - 'padChars', - 'padCharsEnd', - 'padCharsStart', - 'pullAllBy', - 'pullAllWith', - 'rangeStep', - 'rangeStepRight', - 'reduce', - 'reduceRight', - 'replace', - 'set', - 'slice', - 'sortedIndexBy', - 'sortedLastIndexBy', - 'transform', - 'unionBy', - 'unionWith', - 'update', - 'xorBy', - 'xorWith', - 'zipWith' - ], - 4: ['fill', 'setWith', 'updateWith'] - }), - (o.aryRearg = { 2: [1, 0], 3: [2, 0, 1], 4: [3, 2, 0, 1] }), - (o.iterateeAry = { - dropRightWhile: 1, - dropWhile: 1, - every: 1, - filter: 1, - find: 1, - findFrom: 1, - findIndex: 1, - findIndexFrom: 1, - findKey: 1, - findLast: 1, - findLastFrom: 1, - findLastIndex: 1, - findLastIndexFrom: 1, - findLastKey: 1, - flatMap: 1, - flatMapDeep: 1, - flatMapDepth: 1, - forEach: 1, - forEachRight: 1, - forIn: 1, - forInRight: 1, - forOwn: 1, - forOwnRight: 1, - map: 1, - mapKeys: 1, - mapValues: 1, - partition: 1, - reduce: 2, - reduceRight: 2, - reject: 1, - remove: 1, - some: 1, - takeRightWhile: 1, - takeWhile: 1, - times: 1, - transform: 2 - }), - (o.iterateeRearg = { mapKeys: [1], reduceRight: [1, 0] }), - (o.methodRearg = { - assignInAllWith: [1, 0], - assignInWith: [1, 2, 0], - assignAllWith: [1, 0], - assignWith: [1, 2, 0], - differenceBy: [1, 2, 0], - differenceWith: [1, 2, 0], - getOr: [2, 1, 0], - intersectionBy: [1, 2, 0], - intersectionWith: [1, 2, 0], - isEqualWith: [1, 2, 0], - isMatchWith: [2, 1, 0], - mergeAllWith: [1, 0], - mergeWith: [1, 2, 0], - padChars: [2, 1, 0], - padCharsEnd: [2, 1, 0], - padCharsStart: [2, 1, 0], - pullAllBy: [2, 1, 0], - pullAllWith: [2, 1, 0], - rangeStep: [1, 2, 0], - rangeStepRight: [1, 2, 0], - setWith: [3, 1, 2, 0], - sortedIndexBy: [2, 1, 0], - sortedLastIndexBy: [2, 1, 0], - unionBy: [1, 2, 0], - unionWith: [1, 2, 0], - updateWith: [3, 1, 2, 0], - xorBy: [1, 2, 0], - xorWith: [1, 2, 0], - zipWith: [1, 2, 0] - }), - (o.methodSpread = { - assignAll: { start: 0 }, - assignAllWith: { start: 0 }, - assignInAll: { start: 0 }, - assignInAllWith: { start: 0 }, - defaultsAll: { start: 0 }, - defaultsDeepAll: { start: 0 }, - invokeArgs: { start: 2 }, - invokeArgsMap: { start: 2 }, - mergeAll: { start: 0 }, - mergeAllWith: { start: 0 }, - partial: { start: 1 }, - partialRight: { start: 1 }, - without: { start: 1 }, - zipAll: { start: 0 } - }), - (o.mutate = { - array: { - fill: !0, - pull: !0, - pullAll: !0, - pullAllBy: !0, - pullAllWith: !0, - pullAt: !0, - remove: !0, - reverse: !0 - }, - object: { - assign: !0, - assignAll: !0, - assignAllWith: !0, - assignIn: !0, - assignInAll: !0, - assignInAllWith: !0, - assignInWith: !0, - assignWith: !0, - defaults: !0, - defaultsAll: !0, - defaultsDeep: !0, - defaultsDeepAll: !0, - merge: !0, - mergeAll: !0, - mergeAllWith: !0, - mergeWith: !0 - }, - set: { set: !0, setWith: !0, unset: !0, update: !0, updateWith: !0 } - }), - (o.realToAlias = (function () { - var s = Object.prototype.hasOwnProperty, - i = o.aliasToReal, - u = {}; - for (var _ in i) { - var w = i[_]; - s.call(u, w) ? u[w].push(_) : (u[w] = [_]); - } - return u; - })()), - (o.remap = { - assignAll: 'assign', - assignAllWith: 'assignWith', - assignInAll: 'assignIn', - assignInAllWith: 'assignInWith', - curryN: 'curry', - curryRightN: 'curryRight', - defaultsAll: 'defaults', - defaultsDeepAll: 'defaultsDeep', - findFrom: 'find', - findIndexFrom: 'findIndex', - findLastFrom: 'findLast', - findLastIndexFrom: 'findLastIndex', - getOr: 'get', - includesFrom: 'includes', - indexOfFrom: 'indexOf', - invokeArgs: 'invoke', - invokeArgsMap: 'invokeMap', - lastIndexOfFrom: 'lastIndexOf', - mergeAll: 'merge', - mergeAllWith: 'mergeWith', - padChars: 'pad', - padCharsEnd: 'padEnd', - padCharsStart: 'padStart', - propertyOf: 'get', - rangeStep: 'range', - rangeStepRight: 'rangeRight', - restFrom: 'rest', - spreadFrom: 'spread', - trimChars: 'trim', - trimCharsEnd: 'trimEnd', - trimCharsStart: 'trimStart', - zipAll: 'zip' - }), - (o.skipFixed = { - castArray: !0, - flow: !0, - flowRight: !0, - iteratee: !0, - mixin: !0, - rearg: !0, - runInContext: !0 - }), - (o.skipRearg = { - add: !0, - assign: !0, - assignIn: !0, - bind: !0, - bindKey: !0, - concat: !0, - difference: !0, - divide: !0, - eq: !0, - gt: !0, - gte: !0, - isEqual: !0, - lt: !0, - lte: !0, - matchesProperty: !0, - merge: !0, - multiply: !0, - overArgs: !0, - partial: !0, - partialRight: !0, - propertyOf: !0, - random: !0, - range: !0, - rangeRight: !0, - subtract: !0, - zip: !0, - zipObject: !0, - zipObjectDeep: !0 - })); - }, - 47934: (s, o, i) => { - s.exports = { - ary: i(64626), - assign: i(74733), - clone: i(32629), - curry: i(49747), - forEach: i(83729), - isArray: i(56449), - isError: i(23546), - isFunction: i(1882), - isWeakMap: i(47886), - iteratee: i(33855), - keys: i(88984), - rearg: i(84195), - toInteger: i(61489), - toPath: i(42072) - }; - }, - 56367: (s, o, i) => { - s.exports = i(77731); - }, - 79920: (s, o, i) => { - var u = i(73424), - _ = i(47934); - s.exports = function convert(s, o, i) { - return u(_, s, o, i); - }; - }, - 2874: (s) => { - s.exports = {}; - }, - 77731: (s, o, i) => { - var u = i(79920)('set', i(63560)); - ((u.placeholder = i(2874)), (s.exports = u)); - }, - 58156: (s, o, i) => { - var u = i(47422); - s.exports = function get(s, o, i) { - var _ = null == s ? void 0 : u(s, o); - return void 0 === _ ? i : _; - }; - }, - 61448: (s, o, i) => { - var u = i(20426), - _ = i(49326); - s.exports = function has(s, o) { - return null != s && _(s, o, u); - }; - }, - 80631: (s, o, i) => { - var u = i(28077), - _ = i(49326); - s.exports = function hasIn(s, o) { - return null != s && _(s, o, u); - }; - }, - 83488: (s) => { - s.exports = function identity(s) { - return s; - }; - }, - 72428: (s, o, i) => { - var u = i(27534), - _ = i(40346), - w = Object.prototype, - x = w.hasOwnProperty, - C = w.propertyIsEnumerable, - j = u( - (function () { - return arguments; - })() - ) - ? u - : function (s) { - return _(s) && x.call(s, 'callee') && !C.call(s, 'callee'); - }; - s.exports = j; - }, - 56449: (s) => { - var o = Array.isArray; - s.exports = o; - }, - 64894: (s, o, i) => { - var u = i(1882), - _ = i(30294); - s.exports = function isArrayLike(s) { - return null != s && _(s.length) && !u(s); - }; - }, - 83693: (s, o, i) => { - var u = i(64894), - _ = i(40346); - s.exports = function isArrayLikeObject(s) { - return _(s) && u(s); - }; - }, - 53812: (s, o, i) => { - var u = i(72552), - _ = i(40346); - s.exports = function isBoolean(s) { - return !0 === s || !1 === s || (_(s) && '[object Boolean]' == u(s)); - }; - }, - 3656: (s, o, i) => { - s = i.nmd(s); - var u = i(9325), - _ = i(89935), - w = o && !o.nodeType && o, - x = w && s && !s.nodeType && s, - C = x && x.exports === w ? u.Buffer : void 0, - j = (C ? C.isBuffer : void 0) || _; - s.exports = j; - }, - 62193: (s, o, i) => { - var u = i(88984), - _ = i(5861), - w = i(72428), - x = i(56449), - C = i(64894), - j = i(3656), - L = i(55527), - B = i(37167), - $ = Object.prototype.hasOwnProperty; - s.exports = function isEmpty(s) { - if (null == s) return !0; - if ( - C(s) && - (x(s) || - 'string' == typeof s || - 'function' == typeof s.splice || - j(s) || - B(s) || - w(s)) - ) - return !s.length; - var o = _(s); - if ('[object Map]' == o || '[object Set]' == o) return !s.size; - if (L(s)) return !u(s).length; - for (var i in s) if ($.call(s, i)) return !1; - return !0; - }; - }, - 2404: (s, o, i) => { - var u = i(60270); - s.exports = function isEqual(s, o) { - return u(s, o); - }; - }, - 23546: (s, o, i) => { - var u = i(72552), - _ = i(40346), - w = i(11331); - s.exports = function isError(s) { - if (!_(s)) return !1; - var o = u(s); - return ( - '[object Error]' == o || - '[object DOMException]' == o || - ('string' == typeof s.message && 'string' == typeof s.name && !w(s)) - ); - }; - }, - 1882: (s, o, i) => { - var u = i(72552), - _ = i(23805); - s.exports = function isFunction(s) { - if (!_(s)) return !1; - var o = u(s); - return ( - '[object Function]' == o || - '[object GeneratorFunction]' == o || - '[object AsyncFunction]' == o || - '[object Proxy]' == o - ); - }; - }, - 30294: (s) => { - s.exports = function isLength(s) { - return 'number' == typeof s && s > -1 && s % 1 == 0 && s <= 9007199254740991; - }; - }, - 87730: (s, o, i) => { - var u = i(29172), - _ = i(27301), - w = i(86009), - x = w && w.isMap, - C = x ? _(x) : u; - s.exports = C; - }, - 5187: (s) => { - s.exports = function isNull(s) { - return null === s; - }; - }, - 98023: (s, o, i) => { - var u = i(72552), - _ = i(40346); - s.exports = function isNumber(s) { - return 'number' == typeof s || (_(s) && '[object Number]' == u(s)); - }; - }, - 23805: (s) => { - s.exports = function isObject(s) { - var o = typeof s; - return null != s && ('object' == o || 'function' == o); - }; - }, - 40346: (s) => { - s.exports = function isObjectLike(s) { - return null != s && 'object' == typeof s; - }; - }, - 11331: (s, o, i) => { - var u = i(72552), - _ = i(28879), - w = i(40346), - x = Function.prototype, - C = Object.prototype, - j = x.toString, - L = C.hasOwnProperty, - B = j.call(Object); - s.exports = function isPlainObject(s) { - if (!w(s) || '[object Object]' != u(s)) return !1; - var o = _(s); - if (null === o) return !0; - var i = L.call(o, 'constructor') && o.constructor; - return 'function' == typeof i && i instanceof i && j.call(i) == B; - }; - }, - 38440: (s, o, i) => { - var u = i(16038), - _ = i(27301), - w = i(86009), - x = w && w.isSet, - C = x ? _(x) : u; - s.exports = C; - }, - 85015: (s, o, i) => { - var u = i(72552), - _ = i(56449), - w = i(40346); - s.exports = function isString(s) { - return 'string' == typeof s || (!_(s) && w(s) && '[object String]' == u(s)); - }; - }, - 44394: (s, o, i) => { - var u = i(72552), - _ = i(40346); - s.exports = function isSymbol(s) { - return 'symbol' == typeof s || (_(s) && '[object Symbol]' == u(s)); - }; - }, - 37167: (s, o, i) => { - var u = i(4901), - _ = i(27301), - w = i(86009), - x = w && w.isTypedArray, - C = x ? _(x) : u; - s.exports = C; - }, - 47886: (s, o, i) => { - var u = i(5861), - _ = i(40346); - s.exports = function isWeakMap(s) { - return _(s) && '[object WeakMap]' == u(s); - }; - }, - 33855: (s, o, i) => { - var u = i(9999), - _ = i(15389); - s.exports = function iteratee(s) { - return _('function' == typeof s ? s : u(s, 1)); - }; - }, - 95950: (s, o, i) => { - var u = i(70695), - _ = i(88984), - w = i(64894); - s.exports = function keys(s) { - return w(s) ? u(s) : _(s); - }; - }, - 37241: (s, o, i) => { - var u = i(70695), - _ = i(72903), - w = i(64894); - s.exports = function keysIn(s) { - return w(s) ? u(s, !0) : _(s); - }; - }, - 68090: (s) => { - s.exports = function last(s) { - var o = null == s ? 0 : s.length; - return o ? s[o - 1] : void 0; - }; - }, - 50104: (s, o, i) => { - var u = i(53661); - function memoize(s, o) { - if ('function' != typeof s || (null != o && 'function' != typeof o)) - throw new TypeError('Expected a function'); - var memoized = function () { - var i = arguments, - u = o ? o.apply(this, i) : i[0], - _ = memoized.cache; - if (_.has(u)) return _.get(u); - var w = s.apply(this, i); - return ((memoized.cache = _.set(u, w) || _), w); - }; - return ((memoized.cache = new (memoize.Cache || u)()), memoized); - } - ((memoize.Cache = u), (s.exports = memoize)); - }, - 55364: (s, o, i) => { - var u = i(85250), - _ = i(20999)(function (s, o, i) { - u(s, o, i); - }); - s.exports = _; - }, - 6048: (s) => { - s.exports = function negate(s) { - if ('function' != typeof s) throw new TypeError('Expected a function'); - return function () { - var o = arguments; - switch (o.length) { - case 0: - return !s.call(this); - case 1: - return !s.call(this, o[0]); - case 2: - return !s.call(this, o[0], o[1]); - case 3: - return !s.call(this, o[0], o[1], o[2]); - } - return !s.apply(this, o); - }; - }; - }, - 63950: (s) => { - s.exports = function noop() {}; - }, - 10124: (s, o, i) => { - var u = i(9325); - s.exports = function () { - return u.Date.now(); - }; - }, - 90179: (s, o, i) => { - var u = i(34932), - _ = i(9999), - w = i(19931), - x = i(31769), - C = i(21791), - j = i(53138), - L = i(38816), - B = i(83349), - $ = L(function (s, o) { - var i = {}; - if (null == s) return i; - var L = !1; - ((o = u(o, function (o) { - return ((o = x(o, s)), L || (L = o.length > 1), o); - })), - C(s, B(s), i), - L && (i = _(i, 7, j))); - for (var $ = o.length; $--; ) w(i, o[$]); - return i; - }); - s.exports = $; - }, - 50583: (s, o, i) => { - var u = i(47237), - _ = i(17255), - w = i(28586), - x = i(77797); - s.exports = function property(s) { - return w(s) ? u(x(s)) : _(s); - }; - }, - 84195: (s, o, i) => { - var u = i(66977), - _ = i(38816), - w = _(function (s, o) { - return u(s, 256, void 0, void 0, void 0, o); - }); - s.exports = w; - }, - 40860: (s, o, i) => { - var u = i(40882), - _ = i(80909), - w = i(15389), - x = i(85558), - C = i(56449); - s.exports = function reduce(s, o, i) { - var j = C(s) ? u : x, - L = arguments.length < 3; - return j(s, w(o, 4), i, L, _); - }; - }, - 63560: (s, o, i) => { - var u = i(73170); - s.exports = function set(s, o, i) { - return null == s ? s : u(s, o, i); - }; - }, - 42426: (s, o, i) => { - var u = i(14248), - _ = i(15389), - w = i(90916), - x = i(56449), - C = i(36800); - s.exports = function some(s, o, i) { - var j = x(s) ? u : w; - return (i && C(s, o, i) && (o = void 0), j(s, _(o, 3))); - }; - }, - 63345: (s) => { - s.exports = function stubArray() { - return []; - }; - }, - 89935: (s) => { - s.exports = function stubFalse() { - return !1; - }; - }, - 17400: (s, o, i) => { - var u = i(99374), - _ = 1 / 0; - s.exports = function toFinite(s) { - return s - ? (s = u(s)) === _ || s === -1 / 0 - ? 17976931348623157e292 * (s < 0 ? -1 : 1) - : s == s - ? s - : 0 - : 0 === s - ? s - : 0; - }; - }, - 61489: (s, o, i) => { - var u = i(17400); - s.exports = function toInteger(s) { - var o = u(s), - i = o % 1; - return o == o ? (i ? o - i : o) : 0; - }; - }, - 80218: (s, o, i) => { - var u = i(13222); - s.exports = function toLower(s) { - return u(s).toLowerCase(); - }; - }, - 99374: (s, o, i) => { - var u = i(54128), - _ = i(23805), - w = i(44394), - x = /^[-+]0x[0-9a-f]+$/i, - C = /^0b[01]+$/i, - j = /^0o[0-7]+$/i, - L = parseInt; - s.exports = function toNumber(s) { - if ('number' == typeof s) return s; - if (w(s)) return NaN; - if (_(s)) { - var o = 'function' == typeof s.valueOf ? s.valueOf() : s; - s = _(o) ? o + '' : o; - } - if ('string' != typeof s) return 0 === s ? s : +s; - s = u(s); - var i = C.test(s); - return i || j.test(s) ? L(s.slice(2), i ? 2 : 8) : x.test(s) ? NaN : +s; - }; - }, - 42072: (s, o, i) => { - var u = i(34932), - _ = i(23007), - w = i(56449), - x = i(44394), - C = i(61802), - j = i(77797), - L = i(13222); - s.exports = function toPath(s) { - return w(s) ? u(s, j) : x(s) ? [s] : _(C(L(s))); - }; - }, - 69884: (s, o, i) => { - var u = i(21791), - _ = i(37241); - s.exports = function toPlainObject(s) { - return u(s, _(s)); - }; - }, - 13222: (s, o, i) => { - var u = i(77556); - s.exports = function toString(s) { - return null == s ? '' : u(s); - }; - }, - 55808: (s, o, i) => { - var u = i(12507)('toUpperCase'); - s.exports = u; - }, - 66645: (s, o, i) => { - var u = i(1733), - _ = i(45434), - w = i(13222), - x = i(22225); - s.exports = function words(s, o, i) { - return ( - (s = w(s)), - void 0 === (o = i ? void 0 : o) ? (_(s) ? x(s) : u(s)) : s.match(o) || [] - ); - }; - }, - 53758: (s, o, i) => { - var u = i(30980), - _ = i(56017), - w = i(94033), - x = i(56449), - C = i(40346), - j = i(80257), - L = Object.prototype.hasOwnProperty; - function lodash(s) { - if (C(s) && !x(s) && !(s instanceof u)) { - if (s instanceof _) return s; - if (L.call(s, '__wrapped__')) return j(s); - } - return new _(s); - } - ((lodash.prototype = w.prototype), - (lodash.prototype.constructor = lodash), - (s.exports = lodash)); - }, - 47248: (s, o, i) => { - var u = i(16547), - _ = i(51234); - s.exports = function zipObject(s, o) { - return _(s || [], o || [], u); - }; - }, - 43768: (s, o, i) => { - 'use strict'; - var u = i(45981), - _ = i(85587); - ((o.highlight = highlight), - (o.highlightAuto = function highlightAuto(s, o) { - var i, - x, - C, - j, - L = o || {}, - B = L.subset || u.listLanguages(), - $ = L.prefix, - V = B.length, - U = -1; - null == $ && ($ = w); - if ('string' != typeof s) throw _('Expected `string` for value, got `%s`', s); - ((x = { relevance: 0, language: null, value: [] }), - (i = { relevance: 0, language: null, value: [] })); - for (; ++U < V; ) - ((j = B[U]), - u.getLanguage(j) && - (((C = highlight(j, s, o)).language = j), - C.relevance > x.relevance && (x = C), - C.relevance > i.relevance && ((x = i), (i = C)))); - x.language && (i.secondBest = x); - return i; - }), - (o.registerLanguage = function registerLanguage(s, o) { - u.registerLanguage(s, o); - }), - (o.listLanguages = function listLanguages() { - return u.listLanguages(); - }), - (o.registerAlias = function registerAlias(s, o) { - var i, - _ = s; - o && ((_ = {})[s] = o); - for (i in _) u.registerAliases(_[i], { languageName: i }); - }), - (Emitter.prototype.addText = function text(s) { - var o, - i, - u = this.stack; - if ('' === s) return; - ((o = u[u.length - 1]), - (i = o.children[o.children.length - 1]) && 'text' === i.type - ? (i.value += s) - : o.children.push({ type: 'text', value: s })); - }), - (Emitter.prototype.addKeyword = function addKeyword(s, o) { - (this.openNode(o), this.addText(s), this.closeNode()); - }), - (Emitter.prototype.addSublanguage = function addSublanguage(s, o) { - var i = this.stack, - u = i[i.length - 1], - _ = s.rootNode.children, - w = o - ? { - type: 'element', - tagName: 'span', - properties: { className: [o] }, - children: _ - } - : _; - u.children = u.children.concat(w); - }), - (Emitter.prototype.openNode = function open(s) { - var o = this.stack, - i = this.options.classPrefix + s, - u = o[o.length - 1], - _ = { - type: 'element', - tagName: 'span', - properties: { className: [i] }, - children: [] - }; - (u.children.push(_), o.push(_)); - }), - (Emitter.prototype.closeNode = function close() { - this.stack.pop(); - }), - (Emitter.prototype.closeAllNodes = noop), - (Emitter.prototype.finalize = noop), - (Emitter.prototype.toHTML = function toHtmlNoop() { - return ''; - })); - var w = 'hljs-'; - function highlight(s, o, i) { - var x, - C = u.configure({}), - j = (i || {}).prefix; - if ('string' != typeof s) throw _('Expected `string` for name, got `%s`', s); - if (!u.getLanguage(s)) throw _('Unknown language: `%s` is not registered', s); - if ('string' != typeof o) throw _('Expected `string` for value, got `%s`', o); - if ( - (null == j && (j = w), - u.configure({ __emitter: Emitter, classPrefix: j }), - (x = u.highlight(o, { language: s, ignoreIllegals: !0 })), - u.configure(C || {}), - x.errorRaised) - ) - throw x.errorRaised; - return { - relevance: x.relevance, - language: x.language, - value: x.emitter.rootNode.children - }; - } - function Emitter(s) { - ((this.options = s), - (this.rootNode = { children: [] }), - (this.stack = [this.rootNode])); - } - function noop() {} - }, - 92340: (s, o, i) => { - const u = i(6048); - function coerceElementMatchingCallback(s) { - return 'string' == typeof s - ? (o) => o.element === s - : s.constructor && s.extend - ? (o) => o instanceof s - : s; - } - class ArraySlice { - constructor(s) { - this.elements = s || []; - } - toValue() { - return this.elements.map((s) => s.toValue()); - } - map(s, o) { - return this.elements.map(s, o); - } - flatMap(s, o) { - return this.map(s, o).reduce((s, o) => s.concat(o), []); - } - compactMap(s, o) { - const i = []; - return ( - this.forEach((u) => { - const _ = s.bind(o)(u); - _ && i.push(_); - }), - i - ); - } - filter(s, o) { - return ( - (s = coerceElementMatchingCallback(s)), - new ArraySlice(this.elements.filter(s, o)) - ); - } - reject(s, o) { - return ( - (s = coerceElementMatchingCallback(s)), - new ArraySlice(this.elements.filter(u(s), o)) - ); - } - find(s, o) { - return ((s = coerceElementMatchingCallback(s)), this.elements.find(s, o)); - } - forEach(s, o) { - this.elements.forEach(s, o); - } - reduce(s, o) { - return this.elements.reduce(s, o); - } - includes(s) { - return this.elements.some((o) => o.equals(s)); - } - shift() { - return this.elements.shift(); - } - unshift(s) { - this.elements.unshift(this.refract(s)); - } - push(s) { - return (this.elements.push(this.refract(s)), this); - } - add(s) { - this.push(s); - } - get(s) { - return this.elements[s]; - } - getValue(s) { - const o = this.elements[s]; - if (o) return o.toValue(); - } - get length() { - return this.elements.length; - } - get isEmpty() { - return 0 === this.elements.length; - } - get first() { - return this.elements[0]; - } - } - ('undefined' != typeof Symbol && - (ArraySlice.prototype[Symbol.iterator] = function symbol() { - return this.elements[Symbol.iterator](); - }), - (s.exports = ArraySlice)); - }, - 55973: (s) => { - class KeyValuePair { - constructor(s, o) { - ((this.key = s), (this.value = o)); - } - clone() { - const s = new KeyValuePair(); - return ( - this.key && (s.key = this.key.clone()), - this.value && (s.value = this.value.clone()), - s - ); - } - } - s.exports = KeyValuePair; - }, - 3110: (s, o, i) => { - const u = i(5187), - _ = i(85015), - w = i(98023), - x = i(53812), - C = i(23805), - j = i(85105), - L = i(86804); - class Namespace { - constructor(s) { - ((this.elementMap = {}), - (this.elementDetection = []), - (this.Element = L.Element), - (this.KeyValuePair = L.KeyValuePair), - (s && s.noDefault) || this.useDefault(), - (this._attributeElementKeys = []), - (this._attributeElementArrayKeys = [])); - } - use(s) { - return ( - s.namespace && s.namespace({ base: this }), - s.load && s.load({ base: this }), - this - ); - } - useDefault() { - return ( - this.register('null', L.NullElement) - .register('string', L.StringElement) - .register('number', L.NumberElement) - .register('boolean', L.BooleanElement) - .register('array', L.ArrayElement) - .register('object', L.ObjectElement) - .register('member', L.MemberElement) - .register('ref', L.RefElement) - .register('link', L.LinkElement), - this.detect(u, L.NullElement, !1) - .detect(_, L.StringElement, !1) - .detect(w, L.NumberElement, !1) - .detect(x, L.BooleanElement, !1) - .detect(Array.isArray, L.ArrayElement, !1) - .detect(C, L.ObjectElement, !1), - this - ); - } - register(s, o) { - return ((this._elements = void 0), (this.elementMap[s] = o), this); - } - unregister(s) { - return ((this._elements = void 0), delete this.elementMap[s], this); - } - detect(s, o, i) { - return ( - void 0 === i || i - ? this.elementDetection.unshift([s, o]) - : this.elementDetection.push([s, o]), - this - ); - } - toElement(s) { - if (s instanceof this.Element) return s; - let o; - for (let i = 0; i < this.elementDetection.length; i += 1) { - const u = this.elementDetection[i][0], - _ = this.elementDetection[i][1]; - if (u(s)) { - o = new _(s); - break; - } - } - return o; - } - getElementClass(s) { - const o = this.elementMap[s]; - return void 0 === o ? this.Element : o; - } - fromRefract(s) { - return this.serialiser.deserialise(s); - } - toRefract(s) { - return this.serialiser.serialise(s); - } - get elements() { - return ( - void 0 === this._elements && - ((this._elements = { Element: this.Element }), - Object.keys(this.elementMap).forEach((s) => { - const o = s[0].toUpperCase() + s.substr(1); - this._elements[o] = this.elementMap[s]; - })), - this._elements - ); - } - get serialiser() { - return new j(this); - } - } - ((j.prototype.Namespace = Namespace), (s.exports = Namespace)); - }, - 10866: (s, o, i) => { - const u = i(6048), - _ = i(92340); - class ObjectSlice extends _ { - map(s, o) { - return this.elements.map((i) => s.bind(o)(i.value, i.key, i)); - } - filter(s, o) { - return new ObjectSlice(this.elements.filter((i) => s.bind(o)(i.value, i.key, i))); - } - reject(s, o) { - return this.filter(u(s.bind(o))); - } - forEach(s, o) { - return this.elements.forEach((i, u) => { - s.bind(o)(i.value, i.key, i, u); - }); - } - keys() { - return this.map((s, o) => o.toValue()); - } - values() { - return this.map((s) => s.toValue()); - } - } - s.exports = ObjectSlice; - }, - 86804: (s, o, i) => { - const u = i(10316), - _ = i(41067), - w = i(71167), - x = i(40239), - C = i(12242), - j = i(6233), - L = i(87726), - B = i(61045), - $ = i(86303), - V = i(14540), - U = i(92340), - z = i(10866), - Y = i(55973); - function refract(s) { - if (s instanceof u) return s; - if ('string' == typeof s) return new w(s); - if ('number' == typeof s) return new x(s); - if ('boolean' == typeof s) return new C(s); - if (null === s) return new _(); - if (Array.isArray(s)) return new j(s.map(refract)); - if ('object' == typeof s) { - return new B(s); - } - return s; - } - ((u.prototype.ObjectElement = B), - (u.prototype.RefElement = V), - (u.prototype.MemberElement = L), - (u.prototype.refract = refract), - (U.prototype.refract = refract), - (s.exports = { - Element: u, - NullElement: _, - StringElement: w, - NumberElement: x, - BooleanElement: C, - ArrayElement: j, - MemberElement: L, - ObjectElement: B, - LinkElement: $, - RefElement: V, - refract, - ArraySlice: U, - ObjectSlice: z, - KeyValuePair: Y - })); - }, - 86303: (s, o, i) => { - const u = i(10316); - s.exports = class LinkElement extends u { - constructor(s, o, i) { - (super(s || [], o, i), (this.element = 'link')); - } - get relation() { - return this.attributes.get('relation'); - } - set relation(s) { - this.attributes.set('relation', s); - } - get href() { - return this.attributes.get('href'); - } - set href(s) { - this.attributes.set('href', s); - } - }; - }, - 14540: (s, o, i) => { - const u = i(10316); - s.exports = class RefElement extends u { - constructor(s, o, i) { - (super(s || [], o, i), (this.element = 'ref'), this.path || (this.path = 'element')); - } - get path() { - return this.attributes.get('path'); - } - set path(s) { - this.attributes.set('path', s); - } - }; - }, - 34035: (s, o, i) => { - const u = i(3110), - _ = i(86804); - ((o.g$ = u), - (o.KeyValuePair = i(55973)), - (o.G6 = _.ArraySlice), - (o.ot = _.ObjectSlice), - (o.Hg = _.Element), - (o.Om = _.StringElement), - (o.kT = _.NumberElement), - (o.bd = _.BooleanElement), - (o.Os = _.NullElement), - (o.wE = _.ArrayElement), - (o.Sh = _.ObjectElement), - (o.Pr = _.MemberElement), - (o.sI = _.RefElement), - (o.Ft = _.LinkElement), - (o.e = _.refract), - i(85105), - i(75147)); - }, - 6233: (s, o, i) => { - const u = i(6048), - _ = i(10316), - w = i(92340); - class ArrayElement extends _ { - constructor(s, o, i) { - (super(s || [], o, i), (this.element = 'array')); - } - primitive() { - return 'array'; - } - get(s) { - return this.content[s]; - } - getValue(s) { - const o = this.get(s); - if (o) return o.toValue(); - } - getIndex(s) { - return this.content[s]; - } - set(s, o) { - return ((this.content[s] = this.refract(o)), this); - } - remove(s) { - const o = this.content.splice(s, 1); - return o.length ? o[0] : null; - } - map(s, o) { - return this.content.map(s, o); - } - flatMap(s, o) { - return this.map(s, o).reduce((s, o) => s.concat(o), []); - } - compactMap(s, o) { - const i = []; - return ( - this.forEach((u) => { - const _ = s.bind(o)(u); - _ && i.push(_); - }), - i - ); - } - filter(s, o) { - return new w(this.content.filter(s, o)); - } - reject(s, o) { - return this.filter(u(s), o); - } - reduce(s, o) { - let i, u; - void 0 !== o - ? ((i = 0), (u = this.refract(o))) - : ((i = 1), (u = 'object' === this.primitive() ? this.first.value : this.first)); - for (let o = i; o < this.length; o += 1) { - const i = this.content[o]; - u = - 'object' === this.primitive() - ? this.refract(s(u, i.value, i.key, i, this)) - : this.refract(s(u, i, o, this)); - } - return u; - } - forEach(s, o) { - this.content.forEach((i, u) => { - s.bind(o)(i, this.refract(u)); - }); - } - shift() { - return this.content.shift(); - } - unshift(s) { - this.content.unshift(this.refract(s)); - } - push(s) { - return (this.content.push(this.refract(s)), this); - } - add(s) { - this.push(s); - } - findElements(s, o) { - const i = o || {}, - u = !!i.recursive, - _ = void 0 === i.results ? [] : i.results; - return ( - this.forEach((o, i, w) => { - (u && - void 0 !== o.findElements && - o.findElements(s, { results: _, recursive: u }), - s(o, i, w) && _.push(o)); - }), - _ - ); - } - find(s) { - return new w(this.findElements(s, { recursive: !0 })); - } - findByElement(s) { - return this.find((o) => o.element === s); - } - findByClass(s) { - return this.find((o) => o.classes.includes(s)); - } - getById(s) { - return this.find((o) => o.id.toValue() === s).first; - } - includes(s) { - return this.content.some((o) => o.equals(s)); - } - contains(s) { - return this.includes(s); - } - empty() { - return new this.constructor([]); - } - 'fantasy-land/empty'() { - return this.empty(); - } - concat(s) { - return new this.constructor(this.content.concat(s.content)); - } - 'fantasy-land/concat'(s) { - return this.concat(s); - } - 'fantasy-land/map'(s) { - return new this.constructor(this.map(s)); - } - 'fantasy-land/chain'(s) { - return this.map((o) => s(o), this).reduce((s, o) => s.concat(o), this.empty()); - } - 'fantasy-land/filter'(s) { - return new this.constructor(this.content.filter(s)); - } - 'fantasy-land/reduce'(s, o) { - return this.content.reduce(s, o); - } - get length() { - return this.content.length; - } - get isEmpty() { - return 0 === this.content.length; - } - get first() { - return this.getIndex(0); - } - get second() { - return this.getIndex(1); - } - get last() { - return this.getIndex(this.length - 1); - } - } - ((ArrayElement.empty = function empty() { - return new this(); - }), - (ArrayElement['fantasy-land/empty'] = ArrayElement.empty), - 'undefined' != typeof Symbol && - (ArrayElement.prototype[Symbol.iterator] = function symbol() { - return this.content[Symbol.iterator](); - }), - (s.exports = ArrayElement)); - }, - 12242: (s, o, i) => { - const u = i(10316); - s.exports = class BooleanElement extends u { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'boolean')); - } - primitive() { - return 'boolean'; - } - }; - }, - 10316: (s, o, i) => { - const u = i(2404), - _ = i(55973), - w = i(92340); - class Element { - constructor(s, o, i) { - (o && (this.meta = o), i && (this.attributes = i), (this.content = s)); - } - freeze() { - Object.isFrozen(this) || - (this._meta && ((this.meta.parent = this), this.meta.freeze()), - this._attributes && ((this.attributes.parent = this), this.attributes.freeze()), - this.children.forEach((s) => { - ((s.parent = this), s.freeze()); - }, this), - this.content && Array.isArray(this.content) && Object.freeze(this.content), - Object.freeze(this)); - } - primitive() {} - clone() { - const s = new this.constructor(); - return ( - (s.element = this.element), - this.meta.length && (s._meta = this.meta.clone()), - this.attributes.length && (s._attributes = this.attributes.clone()), - this.content - ? this.content.clone - ? (s.content = this.content.clone()) - : Array.isArray(this.content) - ? (s.content = this.content.map((s) => s.clone())) - : (s.content = this.content) - : (s.content = this.content), - s - ); - } - toValue() { - return this.content instanceof Element - ? this.content.toValue() - : this.content instanceof _ - ? { - key: this.content.key.toValue(), - value: this.content.value ? this.content.value.toValue() : void 0 - } - : this.content && this.content.map - ? this.content.map((s) => s.toValue(), this) - : this.content; - } - toRef(s) { - if ('' === this.id.toValue()) - throw Error('Cannot create reference to an element that does not contain an ID'); - const o = new this.RefElement(this.id.toValue()); - return (s && (o.path = s), o); - } - findRecursive(...s) { - if (arguments.length > 1 && !this.isFrozen) - throw new Error( - 'Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`' - ); - const o = s.pop(); - let i = new w(); - const append = (s, o) => (s.push(o), s), - checkElement = (s, i) => { - i.element === o && s.push(i); - const u = i.findRecursive(o); - return ( - u && u.reduce(append, s), - i.content instanceof _ && - (i.content.key && checkElement(s, i.content.key), - i.content.value && checkElement(s, i.content.value)), - s - ); - }; - return ( - this.content && - (this.content.element && checkElement(i, this.content), - Array.isArray(this.content) && this.content.reduce(checkElement, i)), - s.isEmpty || - (i = i.filter((o) => { - let i = o.parents.map((s) => s.element); - for (const o in s) { - const u = s[o], - _ = i.indexOf(u); - if (-1 === _) return !1; - i = i.splice(0, _); - } - return !0; - })), - i - ); - } - set(s) { - return ((this.content = s), this); - } - equals(s) { - return u(this.toValue(), s); - } - getMetaProperty(s, o) { - if (!this.meta.hasKey(s)) { - if (this.isFrozen) { - const s = this.refract(o); - return (s.freeze(), s); - } - this.meta.set(s, o); - } - return this.meta.get(s); - } - setMetaProperty(s, o) { - this.meta.set(s, o); - } - get element() { - return this._storedElement || 'element'; - } - set element(s) { - this._storedElement = s; - } - get content() { - return this._content; - } - set content(s) { - if (s instanceof Element) this._content = s; - else if (s instanceof w) this.content = s.elements; - else if ( - 'string' == typeof s || - 'number' == typeof s || - 'boolean' == typeof s || - 'null' === s || - null == s - ) - this._content = s; - else if (s instanceof _) this._content = s; - else if (Array.isArray(s)) this._content = s.map(this.refract); - else { - if ('object' != typeof s) throw new Error('Cannot set content to given value'); - this._content = Object.keys(s).map((o) => new this.MemberElement(o, s[o])); - } - } - get meta() { - if (!this._meta) { - if (this.isFrozen) { - const s = new this.ObjectElement(); - return (s.freeze(), s); - } - this._meta = new this.ObjectElement(); - } - return this._meta; - } - set meta(s) { - s instanceof this.ObjectElement ? (this._meta = s) : this.meta.set(s || {}); - } - get attributes() { - if (!this._attributes) { - if (this.isFrozen) { - const s = new this.ObjectElement(); - return (s.freeze(), s); - } - this._attributes = new this.ObjectElement(); - } - return this._attributes; - } - set attributes(s) { - s instanceof this.ObjectElement - ? (this._attributes = s) - : this.attributes.set(s || {}); - } - get id() { - return this.getMetaProperty('id', ''); - } - set id(s) { - this.setMetaProperty('id', s); - } - get classes() { - return this.getMetaProperty('classes', []); - } - set classes(s) { - this.setMetaProperty('classes', s); - } - get title() { - return this.getMetaProperty('title', ''); - } - set title(s) { - this.setMetaProperty('title', s); - } - get description() { - return this.getMetaProperty('description', ''); - } - set description(s) { - this.setMetaProperty('description', s); - } - get links() { - return this.getMetaProperty('links', []); - } - set links(s) { - this.setMetaProperty('links', s); - } - get isFrozen() { - return Object.isFrozen(this); - } - get parents() { - let { parent: s } = this; - const o = new w(); - for (; s; ) (o.push(s), (s = s.parent)); - return o; - } - get children() { - if (Array.isArray(this.content)) return new w(this.content); - if (this.content instanceof _) { - const s = new w([this.content.key]); - return (this.content.value && s.push(this.content.value), s); - } - return this.content instanceof Element ? new w([this.content]) : new w(); - } - get recursiveChildren() { - const s = new w(); - return ( - this.children.forEach((o) => { - (s.push(o), - o.recursiveChildren.forEach((o) => { - s.push(o); - })); - }), - s - ); - } - } - s.exports = Element; - }, - 87726: (s, o, i) => { - const u = i(55973), - _ = i(10316); - s.exports = class MemberElement extends _ { - constructor(s, o, i, _) { - (super(new u(), i, _), (this.element = 'member'), (this.key = s), (this.value = o)); - } - get key() { - return this.content.key; - } - set key(s) { - this.content.key = this.refract(s); - } - get value() { - return this.content.value; - } - set value(s) { - this.content.value = this.refract(s); - } - }; - }, - 41067: (s, o, i) => { - const u = i(10316); - s.exports = class NullElement extends u { - constructor(s, o, i) { - (super(s || null, o, i), (this.element = 'null')); - } - primitive() { - return 'null'; - } - set() { - return new Error('Cannot set the value of null'); - } - }; - }, - 40239: (s, o, i) => { - const u = i(10316); - s.exports = class NumberElement extends u { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'number')); - } - primitive() { - return 'number'; - } - }; - }, - 61045: (s, o, i) => { - const u = i(6048), - _ = i(23805), - w = i(6233), - x = i(87726), - C = i(10866); - s.exports = class ObjectElement extends w { - constructor(s, o, i) { - (super(s || [], o, i), (this.element = 'object')); - } - primitive() { - return 'object'; - } - toValue() { - return this.content.reduce( - (s, o) => ((s[o.key.toValue()] = o.value ? o.value.toValue() : void 0), s), - {} - ); - } - get(s) { - const o = this.getMember(s); - if (o) return o.value; - } - getMember(s) { - if (void 0 !== s) return this.content.find((o) => o.key.toValue() === s); - } - remove(s) { - let o = null; - return ( - (this.content = this.content.filter((i) => i.key.toValue() !== s || ((o = i), !1))), - o - ); - } - getKey(s) { - const o = this.getMember(s); - if (o) return o.key; - } - set(s, o) { - if (_(s)) - return ( - Object.keys(s).forEach((o) => { - this.set(o, s[o]); - }), - this - ); - const i = s, - u = this.getMember(i); - return (u ? (u.value = o) : this.content.push(new x(i, o)), this); - } - keys() { - return this.content.map((s) => s.key.toValue()); - } - values() { - return this.content.map((s) => s.value.toValue()); - } - hasKey(s) { - return this.content.some((o) => o.key.equals(s)); - } - items() { - return this.content.map((s) => [s.key.toValue(), s.value.toValue()]); - } - map(s, o) { - return this.content.map((i) => s.bind(o)(i.value, i.key, i)); - } - compactMap(s, o) { - const i = []; - return ( - this.forEach((u, _, w) => { - const x = s.bind(o)(u, _, w); - x && i.push(x); - }), - i - ); - } - filter(s, o) { - return new C(this.content).filter(s, o); - } - reject(s, o) { - return this.filter(u(s), o); - } - forEach(s, o) { - return this.content.forEach((i) => s.bind(o)(i.value, i.key, i)); - } - }; - }, - 71167: (s, o, i) => { - const u = i(10316); - s.exports = class StringElement extends u { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'string')); - } - primitive() { - return 'string'; - } - get length() { - return this.content.length; - } - }; - }, - 75147: (s, o, i) => { - const u = i(85105); - s.exports = class JSON06Serialiser extends u { - serialise(s) { - if (!(s instanceof this.namespace.elements.Element)) - throw new TypeError(`Given element \`${s}\` is not an Element instance`); - let o; - s._attributes && s.attributes.get('variable') && (o = s.attributes.get('variable')); - const i = { element: s.element }; - s._meta && s._meta.length > 0 && (i.meta = this.serialiseObject(s.meta)); - const u = 'enum' === s.element || -1 !== s.attributes.keys().indexOf('enumerations'); - if (u) { - const o = this.enumSerialiseAttributes(s); - o && (i.attributes = o); - } else if (s._attributes && s._attributes.length > 0) { - let { attributes: u } = s; - (u.get('metadata') && - ((u = u.clone()), u.set('meta', u.get('metadata')), u.remove('metadata')), - 'member' === s.element && o && ((u = u.clone()), u.remove('variable')), - u.length > 0 && (i.attributes = this.serialiseObject(u))); - } - if (u) i.content = this.enumSerialiseContent(s, i); - else if (this[`${s.element}SerialiseContent`]) - i.content = this[`${s.element}SerialiseContent`](s, i); - else if (void 0 !== s.content) { - let u; - (o && s.content.key - ? ((u = s.content.clone()), - u.key.attributes.set('variable', o), - (u = this.serialiseContent(u))) - : (u = this.serialiseContent(s.content)), - this.shouldSerialiseContent(s, u) && (i.content = u)); - } else - this.shouldSerialiseContent(s, s.content) && - s instanceof this.namespace.elements.Array && - (i.content = []); - return i; - } - shouldSerialiseContent(s, o) { - return ( - 'parseResult' === s.element || - 'httpRequest' === s.element || - 'httpResponse' === s.element || - 'category' === s.element || - 'link' === s.element || - (void 0 !== o && (!Array.isArray(o) || 0 !== o.length)) - ); - } - refSerialiseContent(s, o) { - return (delete o.attributes, { href: s.toValue(), path: s.path.toValue() }); - } - sourceMapSerialiseContent(s) { - return s.toValue(); - } - dataStructureSerialiseContent(s) { - return [this.serialiseContent(s.content)]; - } - enumSerialiseAttributes(s) { - const o = s.attributes.clone(), - i = o.remove('enumerations') || new this.namespace.elements.Array([]), - u = o.get('default'); - let _ = o.get('samples') || new this.namespace.elements.Array([]); - if ( - (u && - u.content && - (u.content.attributes && u.content.attributes.remove('typeAttributes'), - o.set('default', new this.namespace.elements.Array([u.content]))), - _.forEach((s) => { - s.content && s.content.element && s.content.attributes.remove('typeAttributes'); - }), - s.content && 0 !== i.length && _.unshift(s.content), - (_ = _.map((s) => - s instanceof this.namespace.elements.Array - ? [s] - : new this.namespace.elements.Array([s.content]) - )), - _.length && o.set('samples', _), - o.length > 0) - ) - return this.serialiseObject(o); - } - enumSerialiseContent(s) { - if (s._attributes) { - const o = s.attributes.get('enumerations'); - if (o && o.length > 0) - return o.content.map((s) => { - const o = s.clone(); - return (o.attributes.remove('typeAttributes'), this.serialise(o)); - }); - } - if (s.content) { - const o = s.content.clone(); - return (o.attributes.remove('typeAttributes'), [this.serialise(o)]); - } - return []; - } - deserialise(s) { - if ('string' == typeof s) return new this.namespace.elements.String(s); - if ('number' == typeof s) return new this.namespace.elements.Number(s); - if ('boolean' == typeof s) return new this.namespace.elements.Boolean(s); - if (null === s) return new this.namespace.elements.Null(); - if (Array.isArray(s)) - return new this.namespace.elements.Array(s.map(this.deserialise, this)); - const o = this.namespace.getElementClass(s.element), - i = new o(); - (i.element !== s.element && (i.element = s.element), - s.meta && this.deserialiseObject(s.meta, i.meta), - s.attributes && this.deserialiseObject(s.attributes, i.attributes)); - const u = this.deserialiseContent(s.content); - if (((void 0 === u && null !== i.content) || (i.content = u), 'enum' === i.element)) { - i.content && i.attributes.set('enumerations', i.content); - let s = i.attributes.get('samples'); - if ((i.attributes.remove('samples'), s)) { - const u = s; - ((s = new this.namespace.elements.Array()), - u.forEach((u) => { - u.forEach((u) => { - const _ = new o(u); - ((_.element = i.element), s.push(_)); - }); - })); - const _ = s.shift(); - ((i.content = _ ? _.content : void 0), i.attributes.set('samples', s)); - } else i.content = void 0; - let u = i.attributes.get('default'); - if (u && u.length > 0) { - u = u.get(0); - const s = new o(u); - ((s.element = i.element), i.attributes.set('default', s)); - } - } else if ('dataStructure' === i.element && Array.isArray(i.content)) - [i.content] = i.content; - else if ('category' === i.element) { - const s = i.attributes.get('meta'); - s && (i.attributes.set('metadata', s), i.attributes.remove('meta')); - } else - 'member' === i.element && - i.key && - i.key._attributes && - i.key._attributes.getValue('variable') && - (i.attributes.set('variable', i.key.attributes.get('variable')), - i.key.attributes.remove('variable')); - return i; - } - serialiseContent(s) { - if (s instanceof this.namespace.elements.Element) return this.serialise(s); - if (s instanceof this.namespace.KeyValuePair) { - const o = { key: this.serialise(s.key) }; - return (s.value && (o.value = this.serialise(s.value)), o); - } - return s && s.map ? s.map(this.serialise, this) : s; - } - deserialiseContent(s) { - if (s) { - if (s.element) return this.deserialise(s); - if (s.key) { - const o = new this.namespace.KeyValuePair(this.deserialise(s.key)); - return (s.value && (o.value = this.deserialise(s.value)), o); - } - if (s.map) return s.map(this.deserialise, this); - } - return s; - } - shouldRefract(s) { - return ( - !!( - (s._attributes && s.attributes.keys().length) || - (s._meta && s.meta.keys().length) - ) || - ('enum' !== s.element && (s.element !== s.primitive() || 'member' === s.element)) - ); - } - convertKeyToRefract(s, o) { - return this.shouldRefract(o) - ? this.serialise(o) - : 'enum' === o.element - ? this.serialiseEnum(o) - : 'array' === o.element - ? o.map((o) => - this.shouldRefract(o) || 'default' === s - ? this.serialise(o) - : 'array' === o.element || 'object' === o.element || 'enum' === o.element - ? o.children.map((s) => this.serialise(s)) - : o.toValue() - ) - : 'object' === o.element - ? (o.content || []).map(this.serialise, this) - : o.toValue(); - } - serialiseEnum(s) { - return s.children.map((s) => this.serialise(s)); - } - serialiseObject(s) { - const o = {}; - return ( - s.forEach((s, i) => { - if (s) { - const u = i.toValue(); - o[u] = this.convertKeyToRefract(u, s); - } - }), - o - ); - } - deserialiseObject(s, o) { - Object.keys(s).forEach((i) => { - o.set(i, this.deserialise(s[i])); - }); - } - }; - }, - 85105: (s) => { - s.exports = class JSONSerialiser { - constructor(s) { - this.namespace = s || new this.Namespace(); - } - serialise(s) { - if (!(s instanceof this.namespace.elements.Element)) - throw new TypeError(`Given element \`${s}\` is not an Element instance`); - const o = { element: s.element }; - (s._meta && s._meta.length > 0 && (o.meta = this.serialiseObject(s.meta)), - s._attributes && - s._attributes.length > 0 && - (o.attributes = this.serialiseObject(s.attributes))); - const i = this.serialiseContent(s.content); - return (void 0 !== i && (o.content = i), o); - } - deserialise(s) { - if (!s.element) - throw new Error('Given value is not an object containing an element name'); - const o = new (this.namespace.getElementClass(s.element))(); - (o.element !== s.element && (o.element = s.element), - s.meta && this.deserialiseObject(s.meta, o.meta), - s.attributes && this.deserialiseObject(s.attributes, o.attributes)); - const i = this.deserialiseContent(s.content); - return ((void 0 === i && null !== o.content) || (o.content = i), o); - } - serialiseContent(s) { - if (s instanceof this.namespace.elements.Element) return this.serialise(s); - if (s instanceof this.namespace.KeyValuePair) { - const o = { key: this.serialise(s.key) }; - return (s.value && (o.value = this.serialise(s.value)), o); - } - if (s && s.map) { - if (0 === s.length) return; - return s.map(this.serialise, this); - } - return s; - } - deserialiseContent(s) { - if (s) { - if (s.element) return this.deserialise(s); - if (s.key) { - const o = new this.namespace.KeyValuePair(this.deserialise(s.key)); - return (s.value && (o.value = this.deserialise(s.value)), o); - } - if (s.map) return s.map(this.deserialise, this); - } - return s; - } - serialiseObject(s) { - const o = {}; - if ( - (s.forEach((s, i) => { - s && (o[i.toValue()] = this.serialise(s)); - }), - 0 !== Object.keys(o).length) - ) - return o; - } - deserialiseObject(s, o) { - Object.keys(s).forEach((i) => { - o.set(i, this.deserialise(s[i])); - }); - } - }; - }, - 65606: (s) => { - var o, - i, - u = (s.exports = {}); - function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); - } - function defaultClearTimeout() { - throw new Error('clearTimeout has not been defined'); - } - function runTimeout(s) { - if (o === setTimeout) return setTimeout(s, 0); - if ((o === defaultSetTimout || !o) && setTimeout) - return ((o = setTimeout), setTimeout(s, 0)); - try { - return o(s, 0); - } catch (i) { - try { - return o.call(null, s, 0); - } catch (i) { - return o.call(this, s, 0); - } - } - } - !(function () { - try { - o = 'function' == typeof setTimeout ? setTimeout : defaultSetTimout; - } catch (s) { - o = defaultSetTimout; - } - try { - i = 'function' == typeof clearTimeout ? clearTimeout : defaultClearTimeout; - } catch (s) { - i = defaultClearTimeout; - } - })(); - var _, - w = [], - x = !1, - C = -1; - function cleanUpNextTick() { - x && _ && ((x = !1), _.length ? (w = _.concat(w)) : (C = -1), w.length && drainQueue()); - } - function drainQueue() { - if (!x) { - var s = runTimeout(cleanUpNextTick); - x = !0; - for (var o = w.length; o; ) { - for (_ = w, w = []; ++C < o; ) _ && _[C].run(); - ((C = -1), (o = w.length)); - } - ((_ = null), - (x = !1), - (function runClearTimeout(s) { - if (i === clearTimeout) return clearTimeout(s); - if ((i === defaultClearTimeout || !i) && clearTimeout) - return ((i = clearTimeout), clearTimeout(s)); - try { - return i(s); - } catch (o) { - try { - return i.call(null, s); - } catch (o) { - return i.call(this, s); - } - } - })(s)); - } - } - function Item(s, o) { - ((this.fun = s), (this.array = o)); - } - function noop() {} - ((u.nextTick = function (s) { - var o = new Array(arguments.length - 1); - if (arguments.length > 1) - for (var i = 1; i < arguments.length; i++) o[i - 1] = arguments[i]; - (w.push(new Item(s, o)), 1 !== w.length || x || runTimeout(drainQueue)); - }), - (Item.prototype.run = function () { - this.fun.apply(null, this.array); - }), - (u.title = 'browser'), - (u.browser = !0), - (u.env = {}), - (u.argv = []), - (u.version = ''), - (u.versions = {}), - (u.on = noop), - (u.addListener = noop), - (u.once = noop), - (u.off = noop), - (u.removeListener = noop), - (u.removeAllListeners = noop), - (u.emit = noop), - (u.prependListener = noop), - (u.prependOnceListener = noop), - (u.listeners = function (s) { - return []; - }), - (u.binding = function (s) { - throw new Error('process.binding is not supported'); - }), - (u.cwd = function () { - return '/'; - }), - (u.chdir = function (s) { - throw new Error('process.chdir is not supported'); - }), - (u.umask = function () { - return 0; - })); - }, - 2694: (s, o, i) => { - 'use strict'; - var u = i(6925); - function emptyFunction() {} - function emptyFunctionWithReset() {} - ((emptyFunctionWithReset.resetWarningCache = emptyFunction), - (s.exports = function () { - function shim(s, o, i, _, w, x) { - if (x !== u) { - var C = new Error( - 'Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types' - ); - throw ((C.name = 'Invariant Violation'), C); - } - } - function getShim() { - return shim; - } - shim.isRequired = shim; - var s = { - array: shim, - bigint: shim, - bool: shim, - func: shim, - number: shim, - object: shim, - string: shim, - symbol: shim, - any: shim, - arrayOf: getShim, - element: shim, - elementType: shim, - instanceOf: getShim, - node: shim, - objectOf: getShim, - oneOf: getShim, - oneOfType: getShim, - shape: getShim, - exact: getShim, - checkPropTypes: emptyFunctionWithReset, - resetWarningCache: emptyFunction - }; - return ((s.PropTypes = s), s); - })); - }, - 5556: (s, o, i) => { - s.exports = i(2694)(); - }, - 6925: (s) => { - 'use strict'; - s.exports = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - }, - 73992: (s, o) => { - 'use strict'; - var i = Object.prototype.hasOwnProperty; - function decode(s) { - try { - return decodeURIComponent(s.replace(/\+/g, ' ')); - } catch (s) { - return null; - } - } - function encode(s) { - try { - return encodeURIComponent(s); - } catch (s) { - return null; - } - } - ((o.stringify = function querystringify(s, o) { - o = o || ''; - var u, - _, - w = []; - for (_ in ('string' != typeof o && (o = '?'), s)) - if (i.call(s, _)) { - if ( - ((u = s[_]) || (null != u && !isNaN(u)) || (u = ''), - (_ = encode(_)), - (u = encode(u)), - null === _ || null === u) - ) - continue; - w.push(_ + '=' + u); - } - return w.length ? o + w.join('&') : ''; - }), - (o.parse = function querystring(s) { - for (var o, i = /([^=?#&]+)=?([^&]*)/g, u = {}; (o = i.exec(s)); ) { - var _ = decode(o[1]), - w = decode(o[2]); - null === _ || null === w || _ in u || (u[_] = w); - } - return u; - })); - }, - 41859: (s, o, i) => { - const u = i(27096), - _ = i(78004), - w = u.types; - s.exports = class RandExp { - constructor(s, o) { - if ((this._setDefaults(s), s instanceof RegExp)) - ((this.ignoreCase = s.ignoreCase), (this.multiline = s.multiline), (s = s.source)); - else { - if ('string' != typeof s) throw new Error('Expected a regexp or string'); - ((this.ignoreCase = o && -1 !== o.indexOf('i')), - (this.multiline = o && -1 !== o.indexOf('m'))); - } - this.tokens = u(s); - } - _setDefaults(s) { - ((this.max = - null != s.max - ? s.max - : null != RandExp.prototype.max - ? RandExp.prototype.max - : 100), - (this.defaultRange = s.defaultRange ? s.defaultRange : this.defaultRange.clone()), - s.randInt && (this.randInt = s.randInt)); - } - gen() { - return this._gen(this.tokens, []); - } - _gen(s, o) { - var i, u, _, x, C; - switch (s.type) { - case w.ROOT: - case w.GROUP: - if (s.followedBy || s.notFollowedBy) return ''; - for ( - s.remember && void 0 === s.groupNumber && (s.groupNumber = o.push(null) - 1), - u = '', - x = 0, - C = (i = s.options ? this._randSelect(s.options) : s.stack).length; - x < C; - x++ - ) - u += this._gen(i[x], o); - return (s.remember && (o[s.groupNumber] = u), u); - case w.POSITION: - return ''; - case w.SET: - var j = this._expand(s); - return j.length ? String.fromCharCode(this._randSelect(j)) : ''; - case w.REPETITION: - for ( - _ = this.randInt(s.min, s.max === 1 / 0 ? s.min + this.max : s.max), - u = '', - x = 0; - x < _; - x++ - ) - u += this._gen(s.value, o); - return u; - case w.REFERENCE: - return o[s.value - 1] || ''; - case w.CHAR: - var L = - this.ignoreCase && this._randBool() ? this._toOtherCase(s.value) : s.value; - return String.fromCharCode(L); - } - } - _toOtherCase(s) { - return s + (97 <= s && s <= 122 ? -32 : 65 <= s && s <= 90 ? 32 : 0); - } - _randBool() { - return !this.randInt(0, 1); - } - _randSelect(s) { - return s instanceof _ - ? s.index(this.randInt(0, s.length - 1)) - : s[this.randInt(0, s.length - 1)]; - } - _expand(s) { - if (s.type === u.types.CHAR) return new _(s.value); - if (s.type === u.types.RANGE) return new _(s.from, s.to); - { - let o = new _(); - for (let i = 0; i < s.set.length; i++) { - let u = this._expand(s.set[i]); - if ((o.add(u), this.ignoreCase)) - for (let s = 0; s < u.length; s++) { - let i = u.index(s), - _ = this._toOtherCase(i); - i !== _ && o.add(_); - } - } - return s.not - ? this.defaultRange.clone().subtract(o) - : this.defaultRange.clone().intersect(o); - } - } - randInt(s, o) { - return s + Math.floor(Math.random() * (1 + o - s)); - } - get defaultRange() { - return (this._range = this._range || new _(32, 126)); - } - set defaultRange(s) { - this._range = s; - } - static randexp(s, o) { - var i; - return ( - 'string' == typeof s && (s = new RegExp(s, o)), - void 0 === s._randexp - ? ((i = new RandExp(s, o)), (s._randexp = i)) - : (i = s._randexp)._setDefaults(s), - i.gen() - ); - } - static sugar() { - RegExp.prototype.gen = function () { - return RandExp.randexp(this); - }; - } - }; - }, - 53209: (s, o, i) => { - 'use strict'; - var u = i(65606), - _ = 65536, - w = 4294967295; - var x = i(92861).Buffer, - C = i.g.crypto || i.g.msCrypto; - C && C.getRandomValues - ? (s.exports = function randomBytes(s, o) { - if (s > w) throw new RangeError('requested too many random bytes'); - var i = x.allocUnsafe(s); - if (s > 0) - if (s > _) for (var j = 0; j < s; j += _) C.getRandomValues(i.slice(j, j + _)); - else C.getRandomValues(i); - if ('function' == typeof o) - return u.nextTick(function () { - o(null, i); - }); - return i; - }) - : (s.exports = function oldBrowser() { - throw new Error( - 'Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11' - ); - }); - }, - 25264: (s, o, i) => { - 'use strict'; - function _typeof(s) { - return ( - (_typeof = - 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator - ? function (s) { - return typeof s; - } - : function (s) { - return s && - 'function' == typeof Symbol && - s.constructor === Symbol && - s !== Symbol.prototype - ? 'symbol' - : typeof s; - }), - _typeof(s) - ); - } - (Object.defineProperty(o, '__esModule', { value: !0 }), (o.CopyToClipboard = void 0)); - var u = _interopRequireDefault(i(96540)), - _ = _interopRequireDefault(i(17965)), - w = ['text', 'onCopy', 'options', 'children']; - function _interopRequireDefault(s) { - return s && s.__esModule ? s : { default: s }; - } - function ownKeys(s, o) { - var i = Object.keys(s); - if (Object.getOwnPropertySymbols) { - var u = Object.getOwnPropertySymbols(s); - (o && - (u = u.filter(function (o) { - return Object.getOwnPropertyDescriptor(s, o).enumerable; - })), - i.push.apply(i, u)); - } - return i; - } - function _objectSpread(s) { - for (var o = 1; o < arguments.length; o++) { - var i = null != arguments[o] ? arguments[o] : {}; - o % 2 - ? ownKeys(Object(i), !0).forEach(function (o) { - _defineProperty(s, o, i[o]); - }) - : Object.getOwnPropertyDescriptors - ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(i)) - : ownKeys(Object(i)).forEach(function (o) { - Object.defineProperty(s, o, Object.getOwnPropertyDescriptor(i, o)); - }); - } - return s; - } - function _objectWithoutProperties(s, o) { - if (null == s) return {}; - var i, - u, - _ = (function _objectWithoutPropertiesLoose(s, o) { - if (null == s) return {}; - var i, - u, - _ = {}, - w = Object.keys(s); - for (u = 0; u < w.length; u++) ((i = w[u]), o.indexOf(i) >= 0 || (_[i] = s[i])); - return _; - })(s, o); - if (Object.getOwnPropertySymbols) { - var w = Object.getOwnPropertySymbols(s); - for (u = 0; u < w.length; u++) - ((i = w[u]), - o.indexOf(i) >= 0 || - (Object.prototype.propertyIsEnumerable.call(s, i) && (_[i] = s[i]))); - } - return _; - } - function _defineProperties(s, o) { - for (var i = 0; i < o.length; i++) { - var u = o[i]; - ((u.enumerable = u.enumerable || !1), - (u.configurable = !0), - 'value' in u && (u.writable = !0), - Object.defineProperty(s, u.key, u)); - } - } - function _setPrototypeOf(s, o) { - return ( - (_setPrototypeOf = - Object.setPrototypeOf || - function _setPrototypeOf(s, o) { - return ((s.__proto__ = o), s); - }), - _setPrototypeOf(s, o) - ); - } - function _createSuper(s) { - var o = (function _isNativeReflectConstruct() { - if ('undefined' == typeof Reflect || !Reflect.construct) return !1; - if (Reflect.construct.sham) return !1; - if ('function' == typeof Proxy) return !0; - try { - return ( - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})), - !0 - ); - } catch (s) { - return !1; - } - })(); - return function _createSuperInternal() { - var i, - u = _getPrototypeOf(s); - if (o) { - var _ = _getPrototypeOf(this).constructor; - i = Reflect.construct(u, arguments, _); - } else i = u.apply(this, arguments); - return (function _possibleConstructorReturn(s, o) { - if (o && ('object' === _typeof(o) || 'function' == typeof o)) return o; - if (void 0 !== o) - throw new TypeError('Derived constructors may only return object or undefined'); - return _assertThisInitialized(s); - })(this, i); - }; - } - function _assertThisInitialized(s) { - if (void 0 === s) - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return s; - } - function _getPrototypeOf(s) { - return ( - (_getPrototypeOf = Object.setPrototypeOf - ? Object.getPrototypeOf - : function _getPrototypeOf(s) { - return s.__proto__ || Object.getPrototypeOf(s); - }), - _getPrototypeOf(s) - ); - } - function _defineProperty(s, o, i) { - return ( - o in s - ? Object.defineProperty(s, o, { - value: i, - enumerable: !0, - configurable: !0, - writable: !0 - }) - : (s[o] = i), - s - ); - } - var x = (function (s) { - !(function _inherits(s, o) { - if ('function' != typeof o && null !== o) - throw new TypeError('Super expression must either be null or a function'); - ((s.prototype = Object.create(o && o.prototype, { - constructor: { value: s, writable: !0, configurable: !0 } - })), - Object.defineProperty(s, 'prototype', { writable: !1 }), - o && _setPrototypeOf(s, o)); - })(CopyToClipboard, s); - var o = _createSuper(CopyToClipboard); - function CopyToClipboard() { - var s; - !(function _classCallCheck(s, o) { - if (!(s instanceof o)) throw new TypeError('Cannot call a class as a function'); - })(this, CopyToClipboard); - for (var i = arguments.length, w = new Array(i), x = 0; x < i; x++) - w[x] = arguments[x]; - return ( - _defineProperty( - _assertThisInitialized((s = o.call.apply(o, [this].concat(w)))), - 'onClick', - function (o) { - var i = s.props, - w = i.text, - x = i.onCopy, - C = i.children, - j = i.options, - L = u.default.Children.only(C), - B = (0, _.default)(w, j); - (x && x(w, B), - L && L.props && 'function' == typeof L.props.onClick && L.props.onClick(o)); - } - ), - s - ); - } - return ( - (function _createClass(s, o, i) { - return ( - o && _defineProperties(s.prototype, o), - i && _defineProperties(s, i), - Object.defineProperty(s, 'prototype', { writable: !1 }), - s - ); - })(CopyToClipboard, [ - { - key: 'render', - value: function render() { - var s = this.props, - o = (s.text, s.onCopy, s.options, s.children), - i = _objectWithoutProperties(s, w), - _ = u.default.Children.only(o); - return u.default.cloneElement( - _, - _objectSpread(_objectSpread({}, i), {}, { onClick: this.onClick }) - ); - } - } - ]), - CopyToClipboard - ); - })(u.default.PureComponent); - ((o.CopyToClipboard = x), - _defineProperty(x, 'defaultProps', { onCopy: void 0, options: void 0 })); - }, - 59399: (s, o, i) => { - 'use strict'; - var u = i(25264).CopyToClipboard; - ((u.CopyToClipboard = u), (s.exports = u)); - }, - 81214: (s, o, i) => { - 'use strict'; - function _typeof(s) { - return ( - (_typeof = - 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator - ? function (s) { - return typeof s; - } - : function (s) { - return s && - 'function' == typeof Symbol && - s.constructor === Symbol && - s !== Symbol.prototype - ? 'symbol' - : typeof s; - }), - _typeof(s) - ); - } - (Object.defineProperty(o, '__esModule', { value: !0 }), (o.DebounceInput = void 0)); - var u = _interopRequireDefault(i(96540)), - _ = _interopRequireDefault(i(20181)), - w = [ - 'element', - 'onChange', - 'value', - 'minLength', - 'debounceTimeout', - 'forceNotifyByEnter', - 'forceNotifyOnBlur', - 'onKeyDown', - 'onBlur', - 'inputRef' - ]; - function _interopRequireDefault(s) { - return s && s.__esModule ? s : { default: s }; - } - function _objectWithoutProperties(s, o) { - if (null == s) return {}; - var i, - u, - _ = (function _objectWithoutPropertiesLoose(s, o) { - if (null == s) return {}; - var i, - u, - _ = {}, - w = Object.keys(s); - for (u = 0; u < w.length; u++) ((i = w[u]), o.indexOf(i) >= 0 || (_[i] = s[i])); - return _; - })(s, o); - if (Object.getOwnPropertySymbols) { - var w = Object.getOwnPropertySymbols(s); - for (u = 0; u < w.length; u++) - ((i = w[u]), - o.indexOf(i) >= 0 || - (Object.prototype.propertyIsEnumerable.call(s, i) && (_[i] = s[i]))); - } - return _; - } - function ownKeys(s, o) { - var i = Object.keys(s); - if (Object.getOwnPropertySymbols) { - var u = Object.getOwnPropertySymbols(s); - (o && - (u = u.filter(function (o) { - return Object.getOwnPropertyDescriptor(s, o).enumerable; - })), - i.push.apply(i, u)); - } - return i; - } - function _objectSpread(s) { - for (var o = 1; o < arguments.length; o++) { - var i = null != arguments[o] ? arguments[o] : {}; - o % 2 - ? ownKeys(Object(i), !0).forEach(function (o) { - _defineProperty(s, o, i[o]); - }) - : Object.getOwnPropertyDescriptors - ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(i)) - : ownKeys(Object(i)).forEach(function (o) { - Object.defineProperty(s, o, Object.getOwnPropertyDescriptor(i, o)); - }); - } - return s; - } - function _defineProperties(s, o) { - for (var i = 0; i < o.length; i++) { - var u = o[i]; - ((u.enumerable = u.enumerable || !1), - (u.configurable = !0), - 'value' in u && (u.writable = !0), - Object.defineProperty(s, u.key, u)); - } - } - function _setPrototypeOf(s, o) { - return ( - (_setPrototypeOf = - Object.setPrototypeOf || - function _setPrototypeOf(s, o) { - return ((s.__proto__ = o), s); - }), - _setPrototypeOf(s, o) - ); - } - function _createSuper(s) { - var o = (function _isNativeReflectConstruct() { - if ('undefined' == typeof Reflect || !Reflect.construct) return !1; - if (Reflect.construct.sham) return !1; - if ('function' == typeof Proxy) return !0; - try { - return ( - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})), - !0 - ); - } catch (s) { - return !1; - } - })(); - return function _createSuperInternal() { - var i, - u = _getPrototypeOf(s); - if (o) { - var _ = _getPrototypeOf(this).constructor; - i = Reflect.construct(u, arguments, _); - } else i = u.apply(this, arguments); - return (function _possibleConstructorReturn(s, o) { - if (o && ('object' === _typeof(o) || 'function' == typeof o)) return o; - if (void 0 !== o) - throw new TypeError('Derived constructors may only return object or undefined'); - return _assertThisInitialized(s); - })(this, i); - }; - } - function _assertThisInitialized(s) { - if (void 0 === s) - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return s; - } - function _getPrototypeOf(s) { - return ( - (_getPrototypeOf = Object.setPrototypeOf - ? Object.getPrototypeOf - : function _getPrototypeOf(s) { - return s.__proto__ || Object.getPrototypeOf(s); - }), - _getPrototypeOf(s) - ); - } - function _defineProperty(s, o, i) { - return ( - o in s - ? Object.defineProperty(s, o, { - value: i, - enumerable: !0, - configurable: !0, - writable: !0 - }) - : (s[o] = i), - s - ); - } - var x = (function (s) { - !(function _inherits(s, o) { - if ('function' != typeof o && null !== o) - throw new TypeError('Super expression must either be null or a function'); - ((s.prototype = Object.create(o && o.prototype, { - constructor: { value: s, writable: !0, configurable: !0 } - })), - Object.defineProperty(s, 'prototype', { writable: !1 }), - o && _setPrototypeOf(s, o)); - })(DebounceInput, s); - var o = _createSuper(DebounceInput); - function DebounceInput(s) { - var i; - (!(function _classCallCheck(s, o) { - if (!(s instanceof o)) throw new TypeError('Cannot call a class as a function'); - })(this, DebounceInput), - _defineProperty( - _assertThisInitialized((i = o.call(this, s))), - 'onChange', - function (s) { - s.persist(); - var o = i.state.value, - u = i.props.minLength; - i.setState({ value: s.target.value }, function () { - var _ = i.state.value; - _.length >= u - ? i.notify(s) - : o.length > _.length && - i.notify( - _objectSpread( - _objectSpread({}, s), - {}, - { - target: _objectSpread( - _objectSpread({}, s.target), - {}, - { value: '' } - ) - } - ) - ); - }); - } - ), - _defineProperty(_assertThisInitialized(i), 'onKeyDown', function (s) { - 'Enter' === s.key && i.forceNotify(s); - var o = i.props.onKeyDown; - o && (s.persist(), o(s)); - }), - _defineProperty(_assertThisInitialized(i), 'onBlur', function (s) { - i.forceNotify(s); - var o = i.props.onBlur; - o && (s.persist(), o(s)); - }), - _defineProperty(_assertThisInitialized(i), 'createNotifier', function (s) { - if (s < 0) - i.notify = function () { - return null; - }; - else if (0 === s) i.notify = i.doNotify; - else { - var o = (0, _.default)(function (s) { - ((i.isDebouncing = !1), i.doNotify(s)); - }, s); - ((i.notify = function (s) { - ((i.isDebouncing = !0), o(s)); - }), - (i.flush = function () { - return o.flush(); - }), - (i.cancel = function () { - ((i.isDebouncing = !1), o.cancel()); - })); - } - }), - _defineProperty(_assertThisInitialized(i), 'doNotify', function () { - i.props.onChange.apply(void 0, arguments); - }), - _defineProperty(_assertThisInitialized(i), 'forceNotify', function (s) { - var o = i.props.debounceTimeout; - if (i.isDebouncing || !(o > 0)) { - i.cancel && i.cancel(); - var u = i.state.value, - _ = i.props.minLength; - u.length >= _ - ? i.doNotify(s) - : i.doNotify( - _objectSpread( - _objectSpread({}, s), - {}, - { target: _objectSpread(_objectSpread({}, s.target), {}, { value: u }) } - ) - ); - } - }), - (i.isDebouncing = !1), - (i.state = { value: void 0 === s.value || null === s.value ? '' : s.value })); - var u = i.props.debounceTimeout; - return (i.createNotifier(u), i); - } - return ( - (function _createClass(s, o, i) { - return ( - o && _defineProperties(s.prototype, o), - i && _defineProperties(s, i), - Object.defineProperty(s, 'prototype', { writable: !1 }), - s - ); - })(DebounceInput, [ - { - key: 'componentDidUpdate', - value: function componentDidUpdate(s) { - if (!this.isDebouncing) { - var o = this.props, - i = o.value, - u = o.debounceTimeout, - _ = s.debounceTimeout, - w = s.value, - x = this.state.value; - (void 0 !== i && w !== i && x !== i && this.setState({ value: i }), - u !== _ && this.createNotifier(u)); - } - } - }, - { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.flush && this.flush(); - } - }, - { - key: 'render', - value: function render() { - var s, - o, - i = this.props, - _ = i.element, - x = - (i.onChange, i.value, i.minLength, i.debounceTimeout, i.forceNotifyByEnter), - C = i.forceNotifyOnBlur, - j = i.onKeyDown, - L = i.onBlur, - B = i.inputRef, - $ = _objectWithoutProperties(i, w), - V = this.state.value; - ((s = x ? { onKeyDown: this.onKeyDown } : j ? { onKeyDown: j } : {}), - (o = C ? { onBlur: this.onBlur } : L ? { onBlur: L } : {})); - var U = B ? { ref: B } : {}; - return u.default.createElement( - _, - _objectSpread( - _objectSpread( - _objectSpread( - _objectSpread({}, $), - {}, - { onChange: this.onChange, value: V }, - s - ), - o - ), - U - ) - ); - } - } - ]), - DebounceInput - ); - })(u.default.PureComponent); - ((o.DebounceInput = x), - _defineProperty(x, 'defaultProps', { - element: 'input', - type: 'text', - onKeyDown: void 0, - onBlur: void 0, - value: void 0, - minLength: 0, - debounceTimeout: 100, - forceNotifyByEnter: !0, - forceNotifyOnBlur: !0, - inputRef: void 0 - })); - }, - 24677: (s, o, i) => { - 'use strict'; - var u = i(81214).DebounceInput; - ((u.DebounceInput = u), (s.exports = u)); - }, - 22551: (s, o, i) => { - 'use strict'; - var u = i(96540), - _ = i(69982); - function p(s) { - for ( - var o = 'https://reactjs.org/docs/error-decoder.html?invariant=' + s, i = 1; - i < arguments.length; - i++ - ) - o += '&args[]=' + encodeURIComponent(arguments[i]); - return ( - 'Minified React error #' + - s + - '; visit ' + - o + - ' for the full message or use the non-minified dev environment for full errors and additional helpful warnings.' - ); - } - var w = new Set(), - x = {}; - function fa(s, o) { - (ha(s, o), ha(s + 'Capture', o)); - } - function ha(s, o) { - for (x[s] = o, s = 0; s < o.length; s++) w.add(o[s]); - } - var C = !( - 'undefined' == typeof window || - void 0 === window.document || - void 0 === window.document.createElement - ), - j = Object.prototype.hasOwnProperty, - L = - /^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/, - B = {}, - $ = {}; - function v(s, o, i, u, _, w, x) { - ((this.acceptsBooleans = 2 === o || 3 === o || 4 === o), - (this.attributeName = u), - (this.attributeNamespace = _), - (this.mustUseProperty = i), - (this.propertyName = s), - (this.type = o), - (this.sanitizeURL = w), - (this.removeEmptyString = x)); - } - var V = {}; - ('children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style' - .split(' ') - .forEach(function (s) { - V[s] = new v(s, 0, !1, s, null, !1, !1); - }), - [ - ['acceptCharset', 'accept-charset'], - ['className', 'class'], - ['htmlFor', 'for'], - ['httpEquiv', 'http-equiv'] - ].forEach(function (s) { - var o = s[0]; - V[o] = new v(o, 1, !1, s[1], null, !1, !1); - }), - ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (s) { - V[s] = new v(s, 2, !1, s.toLowerCase(), null, !1, !1); - }), - ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach( - function (s) { - V[s] = new v(s, 2, !1, s, null, !1, !1); - } - ), - 'allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope' - .split(' ') - .forEach(function (s) { - V[s] = new v(s, 3, !1, s.toLowerCase(), null, !1, !1); - }), - ['checked', 'multiple', 'muted', 'selected'].forEach(function (s) { - V[s] = new v(s, 3, !0, s, null, !1, !1); - }), - ['capture', 'download'].forEach(function (s) { - V[s] = new v(s, 4, !1, s, null, !1, !1); - }), - ['cols', 'rows', 'size', 'span'].forEach(function (s) { - V[s] = new v(s, 6, !1, s, null, !1, !1); - }), - ['rowSpan', 'start'].forEach(function (s) { - V[s] = new v(s, 5, !1, s.toLowerCase(), null, !1, !1); - })); - var U = /[\-:]([a-z])/g; - function sa(s) { - return s[1].toUpperCase(); - } - function ta(s, o, i, u) { - var _ = V.hasOwnProperty(o) ? V[o] : null; - (null !== _ - ? 0 !== _.type - : u || - !(2 < o.length) || - ('o' !== o[0] && 'O' !== o[0]) || - ('n' !== o[1] && 'N' !== o[1])) && - ((function qa(s, o, i, u) { - if ( - null == o || - (function pa(s, o, i, u) { - if (null !== i && 0 === i.type) return !1; - switch (typeof o) { - case 'function': - case 'symbol': - return !0; - case 'boolean': - return ( - !u && - (null !== i - ? !i.acceptsBooleans - : 'data-' !== (s = s.toLowerCase().slice(0, 5)) && 'aria-' !== s) - ); - default: - return !1; - } - })(s, o, i, u) - ) - return !0; - if (u) return !1; - if (null !== i) - switch (i.type) { - case 3: - return !o; - case 4: - return !1 === o; - case 5: - return isNaN(o); - case 6: - return isNaN(o) || 1 > o; - } - return !1; - })(o, i, _, u) && (i = null), - u || null === _ - ? (function oa(s) { - return ( - !!j.call($, s) || - (!j.call(B, s) && (L.test(s) ? ($[s] = !0) : ((B[s] = !0), !1))) - ); - })(o) && (null === i ? s.removeAttribute(o) : s.setAttribute(o, '' + i)) - : _.mustUseProperty - ? (s[_.propertyName] = null === i ? 3 !== _.type && '' : i) - : ((o = _.attributeName), - (u = _.attributeNamespace), - null === i - ? s.removeAttribute(o) - : ((i = 3 === (_ = _.type) || (4 === _ && !0 === i) ? '' : '' + i), - u ? s.setAttributeNS(u, o, i) : s.setAttribute(o, i)))); - } - ('accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height' - .split(' ') - .forEach(function (s) { - var o = s.replace(U, sa); - V[o] = new v(o, 1, !1, s, null, !1, !1); - }), - 'xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type' - .split(' ') - .forEach(function (s) { - var o = s.replace(U, sa); - V[o] = new v(o, 1, !1, s, 'http://www.w3.org/1999/xlink', !1, !1); - }), - ['xml:base', 'xml:lang', 'xml:space'].forEach(function (s) { - var o = s.replace(U, sa); - V[o] = new v(o, 1, !1, s, 'http://www.w3.org/XML/1998/namespace', !1, !1); - }), - ['tabIndex', 'crossOrigin'].forEach(function (s) { - V[s] = new v(s, 1, !1, s.toLowerCase(), null, !1, !1); - }), - (V.xlinkHref = new v( - 'xlinkHref', - 1, - !1, - 'xlink:href', - 'http://www.w3.org/1999/xlink', - !0, - !1 - )), - ['src', 'href', 'action', 'formAction'].forEach(function (s) { - V[s] = new v(s, 1, !1, s.toLowerCase(), null, !0, !0); - })); - var z = u.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, - Y = Symbol.for('react.element'), - Z = Symbol.for('react.portal'), - ee = Symbol.for('react.fragment'), - ie = Symbol.for('react.strict_mode'), - ae = Symbol.for('react.profiler'), - le = Symbol.for('react.provider'), - ce = Symbol.for('react.context'), - pe = Symbol.for('react.forward_ref'), - de = Symbol.for('react.suspense'), - fe = Symbol.for('react.suspense_list'), - ye = Symbol.for('react.memo'), - be = Symbol.for('react.lazy'); - (Symbol.for('react.scope'), Symbol.for('react.debug_trace_mode')); - var _e = Symbol.for('react.offscreen'); - (Symbol.for('react.legacy_hidden'), - Symbol.for('react.cache'), - Symbol.for('react.tracing_marker')); - var we = Symbol.iterator; - function Ka(s) { - return null === s || 'object' != typeof s - ? null - : 'function' == typeof (s = (we && s[we]) || s['@@iterator']) - ? s - : null; - } - var Se, - xe = Object.assign; - function Ma(s) { - if (void 0 === Se) - try { - throw Error(); - } catch (s) { - var o = s.stack.trim().match(/\n( *(at )?)/); - Se = (o && o[1]) || ''; - } - return '\n' + Se + s; - } - var Pe = !1; - function Oa(s, o) { - if (!s || Pe) return ''; - Pe = !0; - var i = Error.prepareStackTrace; - Error.prepareStackTrace = void 0; - try { - if (o) - if ( - ((o = function () { - throw Error(); - }), - Object.defineProperty(o.prototype, 'props', { - set: function () { - throw Error(); - } - }), - 'object' == typeof Reflect && Reflect.construct) - ) { - try { - Reflect.construct(o, []); - } catch (s) { - var u = s; - } - Reflect.construct(s, [], o); - } else { - try { - o.call(); - } catch (s) { - u = s; - } - s.call(o.prototype); - } - else { - try { - throw Error(); - } catch (s) { - u = s; - } - s(); - } - } catch (o) { - if (o && u && 'string' == typeof o.stack) { - for ( - var _ = o.stack.split('\n'), - w = u.stack.split('\n'), - x = _.length - 1, - C = w.length - 1; - 1 <= x && 0 <= C && _[x] !== w[C]; - ) - C--; - for (; 1 <= x && 0 <= C; x--, C--) - if (_[x] !== w[C]) { - if (1 !== x || 1 !== C) - do { - if ((x--, 0 > --C || _[x] !== w[C])) { - var j = '\n' + _[x].replace(' at new ', ' at '); - return ( - s.displayName && - j.includes('') && - (j = j.replace('', s.displayName)), - j - ); - } - } while (1 <= x && 0 <= C); - break; - } - } - } finally { - ((Pe = !1), (Error.prepareStackTrace = i)); - } - return (s = s ? s.displayName || s.name : '') ? Ma(s) : ''; - } - function Pa(s) { - switch (s.tag) { - case 5: - return Ma(s.type); - case 16: - return Ma('Lazy'); - case 13: - return Ma('Suspense'); - case 19: - return Ma('SuspenseList'); - case 0: - case 2: - case 15: - return (s = Oa(s.type, !1)); - case 11: - return (s = Oa(s.type.render, !1)); - case 1: - return (s = Oa(s.type, !0)); - default: - return ''; - } - } - function Qa(s) { - if (null == s) return null; - if ('function' == typeof s) return s.displayName || s.name || null; - if ('string' == typeof s) return s; - switch (s) { - case ee: - return 'Fragment'; - case Z: - return 'Portal'; - case ae: - return 'Profiler'; - case ie: - return 'StrictMode'; - case de: - return 'Suspense'; - case fe: - return 'SuspenseList'; - } - if ('object' == typeof s) - switch (s.$$typeof) { - case ce: - return (s.displayName || 'Context') + '.Consumer'; - case le: - return (s._context.displayName || 'Context') + '.Provider'; - case pe: - var o = s.render; - return ( - (s = s.displayName) || - (s = - '' !== (s = o.displayName || o.name || '') - ? 'ForwardRef(' + s + ')' - : 'ForwardRef'), - s - ); - case ye: - return null !== (o = s.displayName || null) ? o : Qa(s.type) || 'Memo'; - case be: - ((o = s._payload), (s = s._init)); - try { - return Qa(s(o)); - } catch (s) {} - } - return null; - } - function Ra(s) { - var o = s.type; - switch (s.tag) { - case 24: - return 'Cache'; - case 9: - return (o.displayName || 'Context') + '.Consumer'; - case 10: - return (o._context.displayName || 'Context') + '.Provider'; - case 18: - return 'DehydratedFragment'; - case 11: - return ( - (s = (s = o.render).displayName || s.name || ''), - o.displayName || ('' !== s ? 'ForwardRef(' + s + ')' : 'ForwardRef') - ); - case 7: - return 'Fragment'; - case 5: - return o; - case 4: - return 'Portal'; - case 3: - return 'Root'; - case 6: - return 'Text'; - case 16: - return Qa(o); - case 8: - return o === ie ? 'StrictMode' : 'Mode'; - case 22: - return 'Offscreen'; - case 12: - return 'Profiler'; - case 21: - return 'Scope'; - case 13: - return 'Suspense'; - case 19: - return 'SuspenseList'; - case 25: - return 'TracingMarker'; - case 1: - case 0: - case 17: - case 2: - case 14: - case 15: - if ('function' == typeof o) return o.displayName || o.name || null; - if ('string' == typeof o) return o; - } - return null; - } - function Sa(s) { - switch (typeof s) { - case 'boolean': - case 'number': - case 'string': - case 'undefined': - case 'object': - return s; - default: - return ''; - } - } - function Ta(s) { - var o = s.type; - return ( - (s = s.nodeName) && 'input' === s.toLowerCase() && ('checkbox' === o || 'radio' === o) - ); - } - function Va(s) { - s._valueTracker || - (s._valueTracker = (function Ua(s) { - var o = Ta(s) ? 'checked' : 'value', - i = Object.getOwnPropertyDescriptor(s.constructor.prototype, o), - u = '' + s[o]; - if ( - !s.hasOwnProperty(o) && - void 0 !== i && - 'function' == typeof i.get && - 'function' == typeof i.set - ) { - var _ = i.get, - w = i.set; - return ( - Object.defineProperty(s, o, { - configurable: !0, - get: function () { - return _.call(this); - }, - set: function (s) { - ((u = '' + s), w.call(this, s)); - } - }), - Object.defineProperty(s, o, { enumerable: i.enumerable }), - { - getValue: function () { - return u; - }, - setValue: function (s) { - u = '' + s; - }, - stopTracking: function () { - ((s._valueTracker = null), delete s[o]); - } - } - ); - } - })(s)); - } - function Wa(s) { - if (!s) return !1; - var o = s._valueTracker; - if (!o) return !0; - var i = o.getValue(), - u = ''; - return ( - s && (u = Ta(s) ? (s.checked ? 'true' : 'false') : s.value), - (s = u) !== i && (o.setValue(s), !0) - ); - } - function Xa(s) { - if (void 0 === (s = s || ('undefined' != typeof document ? document : void 0))) - return null; - try { - return s.activeElement || s.body; - } catch (o) { - return s.body; - } - } - function Ya(s, o) { - var i = o.checked; - return xe({}, o, { - defaultChecked: void 0, - defaultValue: void 0, - value: void 0, - checked: null != i ? i : s._wrapperState.initialChecked - }); - } - function Za(s, o) { - var i = null == o.defaultValue ? '' : o.defaultValue, - u = null != o.checked ? o.checked : o.defaultChecked; - ((i = Sa(null != o.value ? o.value : i)), - (s._wrapperState = { - initialChecked: u, - initialValue: i, - controlled: - 'checkbox' === o.type || 'radio' === o.type ? null != o.checked : null != o.value - })); - } - function ab(s, o) { - null != (o = o.checked) && ta(s, 'checked', o, !1); - } - function bb(s, o) { - ab(s, o); - var i = Sa(o.value), - u = o.type; - if (null != i) - 'number' === u - ? ((0 === i && '' === s.value) || s.value != i) && (s.value = '' + i) - : s.value !== '' + i && (s.value = '' + i); - else if ('submit' === u || 'reset' === u) return void s.removeAttribute('value'); - (o.hasOwnProperty('value') - ? cb(s, o.type, i) - : o.hasOwnProperty('defaultValue') && cb(s, o.type, Sa(o.defaultValue)), - null == o.checked && - null != o.defaultChecked && - (s.defaultChecked = !!o.defaultChecked)); - } - function db(s, o, i) { - if (o.hasOwnProperty('value') || o.hasOwnProperty('defaultValue')) { - var u = o.type; - if (!(('submit' !== u && 'reset' !== u) || (void 0 !== o.value && null !== o.value))) - return; - ((o = '' + s._wrapperState.initialValue), - i || o === s.value || (s.value = o), - (s.defaultValue = o)); - } - ('' !== (i = s.name) && (s.name = ''), - (s.defaultChecked = !!s._wrapperState.initialChecked), - '' !== i && (s.name = i)); - } - function cb(s, o, i) { - ('number' === o && Xa(s.ownerDocument) === s) || - (null == i - ? (s.defaultValue = '' + s._wrapperState.initialValue) - : s.defaultValue !== '' + i && (s.defaultValue = '' + i)); - } - var Te = Array.isArray; - function fb(s, o, i, u) { - if (((s = s.options), o)) { - o = {}; - for (var _ = 0; _ < i.length; _++) o['$' + i[_]] = !0; - for (i = 0; i < s.length; i++) - ((_ = o.hasOwnProperty('$' + s[i].value)), - s[i].selected !== _ && (s[i].selected = _), - _ && u && (s[i].defaultSelected = !0)); - } else { - for (i = '' + Sa(i), o = null, _ = 0; _ < s.length; _++) { - if (s[_].value === i) - return ((s[_].selected = !0), void (u && (s[_].defaultSelected = !0))); - null !== o || s[_].disabled || (o = s[_]); - } - null !== o && (o.selected = !0); - } - } - function gb(s, o) { - if (null != o.dangerouslySetInnerHTML) throw Error(p(91)); - return xe({}, o, { - value: void 0, - defaultValue: void 0, - children: '' + s._wrapperState.initialValue - }); - } - function hb(s, o) { - var i = o.value; - if (null == i) { - if (((i = o.children), (o = o.defaultValue), null != i)) { - if (null != o) throw Error(p(92)); - if (Te(i)) { - if (1 < i.length) throw Error(p(93)); - i = i[0]; - } - o = i; - } - (null == o && (o = ''), (i = o)); - } - s._wrapperState = { initialValue: Sa(i) }; - } - function ib(s, o) { - var i = Sa(o.value), - u = Sa(o.defaultValue); - (null != i && - ((i = '' + i) !== s.value && (s.value = i), - null == o.defaultValue && s.defaultValue !== i && (s.defaultValue = i)), - null != u && (s.defaultValue = '' + u)); - } - function jb(s) { - var o = s.textContent; - o === s._wrapperState.initialValue && '' !== o && null !== o && (s.value = o); - } - function kb(s) { - switch (s) { - case 'svg': - return 'http://www.w3.org/2000/svg'; - case 'math': - return 'http://www.w3.org/1998/Math/MathML'; - default: - return 'http://www.w3.org/1999/xhtml'; - } - } - function lb(s, o) { - return null == s || 'http://www.w3.org/1999/xhtml' === s - ? kb(o) - : 'http://www.w3.org/2000/svg' === s && 'foreignObject' === o - ? 'http://www.w3.org/1999/xhtml' - : s; - } - var Re, - qe, - $e = - ((qe = function (s, o) { - if ('http://www.w3.org/2000/svg' !== s.namespaceURI || 'innerHTML' in s) - s.innerHTML = o; - else { - for ( - (Re = Re || document.createElement('div')).innerHTML = - '' + o.valueOf().toString() + '', - o = Re.firstChild; - s.firstChild; - ) - s.removeChild(s.firstChild); - for (; o.firstChild; ) s.appendChild(o.firstChild); - } - }), - 'undefined' != typeof MSApp && MSApp.execUnsafeLocalFunction - ? function (s, o, i, u) { - MSApp.execUnsafeLocalFunction(function () { - return qe(s, o); - }); - } - : qe); - function ob(s, o) { - if (o) { - var i = s.firstChild; - if (i && i === s.lastChild && 3 === i.nodeType) return void (i.nodeValue = o); - } - s.textContent = o; - } - var ze = { - animationIterationCount: !0, - aspectRatio: !0, - borderImageOutset: !0, - borderImageSlice: !0, - borderImageWidth: !0, - boxFlex: !0, - boxFlexGroup: !0, - boxOrdinalGroup: !0, - columnCount: !0, - columns: !0, - flex: !0, - flexGrow: !0, - flexPositive: !0, - flexShrink: !0, - flexNegative: !0, - flexOrder: !0, - gridArea: !0, - gridRow: !0, - gridRowEnd: !0, - gridRowSpan: !0, - gridRowStart: !0, - gridColumn: !0, - gridColumnEnd: !0, - gridColumnSpan: !0, - gridColumnStart: !0, - fontWeight: !0, - lineClamp: !0, - lineHeight: !0, - opacity: !0, - order: !0, - orphans: !0, - tabSize: !0, - widows: !0, - zIndex: !0, - zoom: !0, - fillOpacity: !0, - floodOpacity: !0, - stopOpacity: !0, - strokeDasharray: !0, - strokeDashoffset: !0, - strokeMiterlimit: !0, - strokeOpacity: !0, - strokeWidth: !0 - }, - We = ['Webkit', 'ms', 'Moz', 'O']; - function rb(s, o, i) { - return null == o || 'boolean' == typeof o || '' === o - ? '' - : i || 'number' != typeof o || 0 === o || (ze.hasOwnProperty(s) && ze[s]) - ? ('' + o).trim() - : o + 'px'; - } - function sb(s, o) { - for (var i in ((s = s.style), o)) - if (o.hasOwnProperty(i)) { - var u = 0 === i.indexOf('--'), - _ = rb(i, o[i], u); - ('float' === i && (i = 'cssFloat'), u ? s.setProperty(i, _) : (s[i] = _)); - } - } - Object.keys(ze).forEach(function (s) { - We.forEach(function (o) { - ((o = o + s.charAt(0).toUpperCase() + s.substring(1)), (ze[o] = ze[s])); - }); - }); - var He = xe( - { menuitem: !0 }, - { - area: !0, - base: !0, - br: !0, - col: !0, - embed: !0, - hr: !0, - img: !0, - input: !0, - keygen: !0, - link: !0, - meta: !0, - param: !0, - source: !0, - track: !0, - wbr: !0 - } - ); - function ub(s, o) { - if (o) { - if (He[s] && (null != o.children || null != o.dangerouslySetInnerHTML)) - throw Error(p(137, s)); - if (null != o.dangerouslySetInnerHTML) { - if (null != o.children) throw Error(p(60)); - if ( - 'object' != typeof o.dangerouslySetInnerHTML || - !('__html' in o.dangerouslySetInnerHTML) - ) - throw Error(p(61)); - } - if (null != o.style && 'object' != typeof o.style) throw Error(p(62)); - } - } - function vb(s, o) { - if (-1 === s.indexOf('-')) return 'string' == typeof o.is; - switch (s) { - case 'annotation-xml': - case 'color-profile': - case 'font-face': - case 'font-face-src': - case 'font-face-uri': - case 'font-face-format': - case 'font-face-name': - case 'missing-glyph': - return !1; - default: - return !0; - } - } - var Ye = null; - function xb(s) { - return ( - (s = s.target || s.srcElement || window).correspondingUseElement && - (s = s.correspondingUseElement), - 3 === s.nodeType ? s.parentNode : s - ); - } - var Xe = null, - Qe = null, - et = null; - function Bb(s) { - if ((s = Cb(s))) { - if ('function' != typeof Xe) throw Error(p(280)); - var o = s.stateNode; - o && ((o = Db(o)), Xe(s.stateNode, s.type, o)); - } - } - function Eb(s) { - Qe ? (et ? et.push(s) : (et = [s])) : (Qe = s); - } - function Fb() { - if (Qe) { - var s = Qe, - o = et; - if (((et = Qe = null), Bb(s), o)) for (s = 0; s < o.length; s++) Bb(o[s]); - } - } - function Gb(s, o) { - return s(o); - } - function Hb() {} - var tt = !1; - function Jb(s, o, i) { - if (tt) return s(o, i); - tt = !0; - try { - return Gb(s, o, i); - } finally { - ((tt = !1), (null !== Qe || null !== et) && (Hb(), Fb())); - } - } - function Kb(s, o) { - var i = s.stateNode; - if (null === i) return null; - var u = Db(i); - if (null === u) return null; - i = u[o]; - e: switch (o) { - case 'onClick': - case 'onClickCapture': - case 'onDoubleClick': - case 'onDoubleClickCapture': - case 'onMouseDown': - case 'onMouseDownCapture': - case 'onMouseMove': - case 'onMouseMoveCapture': - case 'onMouseUp': - case 'onMouseUpCapture': - case 'onMouseEnter': - ((u = !u.disabled) || - (u = !( - 'button' === (s = s.type) || - 'input' === s || - 'select' === s || - 'textarea' === s - )), - (s = !u)); - break e; - default: - s = !1; - } - if (s) return null; - if (i && 'function' != typeof i) throw Error(p(231, o, typeof i)); - return i; - } - var rt = !1; - if (C) - try { - var nt = {}; - (Object.defineProperty(nt, 'passive', { - get: function () { - rt = !0; - } - }), - window.addEventListener('test', nt, nt), - window.removeEventListener('test', nt, nt)); - } catch (qe) { - rt = !1; - } - function Nb(s, o, i, u, _, w, x, C, j) { - var L = Array.prototype.slice.call(arguments, 3); - try { - o.apply(i, L); - } catch (s) { - this.onError(s); - } - } - var st = !1, - ot = null, - it = !1, - at = null, - lt = { - onError: function (s) { - ((st = !0), (ot = s)); - } - }; - function Tb(s, o, i, u, _, w, x, C, j) { - ((st = !1), (ot = null), Nb.apply(lt, arguments)); - } - function Vb(s) { - var o = s, - i = s; - if (s.alternate) for (; o.return; ) o = o.return; - else { - s = o; - do { - (!!(4098 & (o = s).flags) && (i = o.return), (s = o.return)); - } while (s); - } - return 3 === o.tag ? i : null; - } - function Wb(s) { - if (13 === s.tag) { - var o = s.memoizedState; - if ((null === o && null !== (s = s.alternate) && (o = s.memoizedState), null !== o)) - return o.dehydrated; - } - return null; - } - function Xb(s) { - if (Vb(s) !== s) throw Error(p(188)); - } - function Zb(s) { - return null !== - (s = (function Yb(s) { - var o = s.alternate; - if (!o) { - if (null === (o = Vb(s))) throw Error(p(188)); - return o !== s ? null : s; - } - for (var i = s, u = o; ; ) { - var _ = i.return; - if (null === _) break; - var w = _.alternate; - if (null === w) { - if (null !== (u = _.return)) { - i = u; - continue; - } - break; - } - if (_.child === w.child) { - for (w = _.child; w; ) { - if (w === i) return (Xb(_), s); - if (w === u) return (Xb(_), o); - w = w.sibling; - } - throw Error(p(188)); - } - if (i.return !== u.return) ((i = _), (u = w)); - else { - for (var x = !1, C = _.child; C; ) { - if (C === i) { - ((x = !0), (i = _), (u = w)); - break; - } - if (C === u) { - ((x = !0), (u = _), (i = w)); - break; - } - C = C.sibling; - } - if (!x) { - for (C = w.child; C; ) { - if (C === i) { - ((x = !0), (i = w), (u = _)); - break; - } - if (C === u) { - ((x = !0), (u = w), (i = _)); - break; - } - C = C.sibling; - } - if (!x) throw Error(p(189)); - } - } - if (i.alternate !== u) throw Error(p(190)); - } - if (3 !== i.tag) throw Error(p(188)); - return i.stateNode.current === i ? s : o; - })(s)) - ? $b(s) - : null; - } - function $b(s) { - if (5 === s.tag || 6 === s.tag) return s; - for (s = s.child; null !== s; ) { - var o = $b(s); - if (null !== o) return o; - s = s.sibling; - } - return null; - } - var ct = _.unstable_scheduleCallback, - ut = _.unstable_cancelCallback, - pt = _.unstable_shouldYield, - ht = _.unstable_requestPaint, - dt = _.unstable_now, - mt = _.unstable_getCurrentPriorityLevel, - gt = _.unstable_ImmediatePriority, - yt = _.unstable_UserBlockingPriority, - vt = _.unstable_NormalPriority, - bt = _.unstable_LowPriority, - _t = _.unstable_IdlePriority, - Et = null, - wt = null; - var St = Math.clz32 - ? Math.clz32 - : function nc(s) { - return ((s >>>= 0), 0 === s ? 32 : (31 - ((xt(s) / kt) | 0)) | 0); - }, - xt = Math.log, - kt = Math.LN2; - var Ct = 64, - Ot = 4194304; - function tc(s) { - switch (s & -s) { - case 1: - return 1; - case 2: - return 2; - case 4: - return 4; - case 8: - return 8; - case 16: - return 16; - case 32: - return 32; - case 64: - case 128: - case 256: - case 512: - case 1024: - case 2048: - case 4096: - case 8192: - case 16384: - case 32768: - case 65536: - case 131072: - case 262144: - case 524288: - case 1048576: - case 2097152: - return 4194240 & s; - case 4194304: - case 8388608: - case 16777216: - case 33554432: - case 67108864: - return 130023424 & s; - case 134217728: - return 134217728; - case 268435456: - return 268435456; - case 536870912: - return 536870912; - case 1073741824: - return 1073741824; - default: - return s; - } - } - function uc(s, o) { - var i = s.pendingLanes; - if (0 === i) return 0; - var u = 0, - _ = s.suspendedLanes, - w = s.pingedLanes, - x = 268435455 & i; - if (0 !== x) { - var C = x & ~_; - 0 !== C ? (u = tc(C)) : 0 !== (w &= x) && (u = tc(w)); - } else 0 !== (x = i & ~_) ? (u = tc(x)) : 0 !== w && (u = tc(w)); - if (0 === u) return 0; - if ( - 0 !== o && - o !== u && - !(o & _) && - ((_ = u & -u) >= (w = o & -o) || (16 === _ && 4194240 & w)) - ) - return o; - if ((4 & u && (u |= 16 & i), 0 !== (o = s.entangledLanes))) - for (s = s.entanglements, o &= u; 0 < o; ) - ((_ = 1 << (i = 31 - St(o))), (u |= s[i]), (o &= ~_)); - return u; - } - function vc(s, o) { - switch (s) { - case 1: - case 2: - case 4: - return o + 250; - case 8: - case 16: - case 32: - case 64: - case 128: - case 256: - case 512: - case 1024: - case 2048: - case 4096: - case 8192: - case 16384: - case 32768: - case 65536: - case 131072: - case 262144: - case 524288: - case 1048576: - case 2097152: - return o + 5e3; - default: - return -1; - } - } - function xc(s) { - return 0 !== (s = -1073741825 & s.pendingLanes) ? s : 1073741824 & s ? 1073741824 : 0; - } - function yc() { - var s = Ct; - return (!(4194240 & (Ct <<= 1)) && (Ct = 64), s); - } - function zc(s) { - for (var o = [], i = 0; 31 > i; i++) o.push(s); - return o; - } - function Ac(s, o, i) { - ((s.pendingLanes |= o), - 536870912 !== o && ((s.suspendedLanes = 0), (s.pingedLanes = 0)), - ((s = s.eventTimes)[(o = 31 - St(o))] = i)); - } - function Cc(s, o) { - var i = (s.entangledLanes |= o); - for (s = s.entanglements; i; ) { - var u = 31 - St(i), - _ = 1 << u; - ((_ & o) | (s[u] & o) && (s[u] |= o), (i &= ~_)); - } - } - var At = 0; - function Dc(s) { - return 1 < (s &= -s) ? (4 < s ? (268435455 & s ? 16 : 536870912) : 4) : 1; - } - var jt, - It, - Pt, - Mt, - Tt, - Nt = !1, - Rt = [], - Dt = null, - Lt = null, - Bt = null, - Ft = new Map(), - qt = new Map(), - $t = [], - Vt = - 'mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit'.split( - ' ' - ); - function Sc(s, o) { - switch (s) { - case 'focusin': - case 'focusout': - Dt = null; - break; - case 'dragenter': - case 'dragleave': - Lt = null; - break; - case 'mouseover': - case 'mouseout': - Bt = null; - break; - case 'pointerover': - case 'pointerout': - Ft.delete(o.pointerId); - break; - case 'gotpointercapture': - case 'lostpointercapture': - qt.delete(o.pointerId); - } - } - function Tc(s, o, i, u, _, w) { - return null === s || s.nativeEvent !== w - ? ((s = { - blockedOn: o, - domEventName: i, - eventSystemFlags: u, - nativeEvent: w, - targetContainers: [_] - }), - null !== o && null !== (o = Cb(o)) && It(o), - s) - : ((s.eventSystemFlags |= u), - (o = s.targetContainers), - null !== _ && -1 === o.indexOf(_) && o.push(_), - s); - } - function Vc(s) { - var o = Wc(s.target); - if (null !== o) { - var i = Vb(o); - if (null !== i) - if (13 === (o = i.tag)) { - if (null !== (o = Wb(i))) - return ( - (s.blockedOn = o), - void Tt(s.priority, function () { - Pt(i); - }) - ); - } else if (3 === o && i.stateNode.current.memoizedState.isDehydrated) - return void (s.blockedOn = 3 === i.tag ? i.stateNode.containerInfo : null); - } - s.blockedOn = null; - } - function Xc(s) { - if (null !== s.blockedOn) return !1; - for (var o = s.targetContainers; 0 < o.length; ) { - var i = Yc(s.domEventName, s.eventSystemFlags, o[0], s.nativeEvent); - if (null !== i) return (null !== (o = Cb(i)) && It(o), (s.blockedOn = i), !1); - var u = new (i = s.nativeEvent).constructor(i.type, i); - ((Ye = u), i.target.dispatchEvent(u), (Ye = null), o.shift()); - } - return !0; - } - function Zc(s, o, i) { - Xc(s) && i.delete(o); - } - function $c() { - ((Nt = !1), - null !== Dt && Xc(Dt) && (Dt = null), - null !== Lt && Xc(Lt) && (Lt = null), - null !== Bt && Xc(Bt) && (Bt = null), - Ft.forEach(Zc), - qt.forEach(Zc)); - } - function ad(s, o) { - s.blockedOn === o && - ((s.blockedOn = null), - Nt || ((Nt = !0), _.unstable_scheduleCallback(_.unstable_NormalPriority, $c))); - } - function bd(s) { - function b(o) { - return ad(o, s); - } - if (0 < Rt.length) { - ad(Rt[0], s); - for (var o = 1; o < Rt.length; o++) { - var i = Rt[o]; - i.blockedOn === s && (i.blockedOn = null); - } - } - for ( - null !== Dt && ad(Dt, s), - null !== Lt && ad(Lt, s), - null !== Bt && ad(Bt, s), - Ft.forEach(b), - qt.forEach(b), - o = 0; - o < $t.length; - o++ - ) - (i = $t[o]).blockedOn === s && (i.blockedOn = null); - for (; 0 < $t.length && null === (o = $t[0]).blockedOn; ) - (Vc(o), null === o.blockedOn && $t.shift()); - } - var Ut = z.ReactCurrentBatchConfig, - zt = !0; - function ed(s, o, i, u) { - var _ = At, - w = Ut.transition; - Ut.transition = null; - try { - ((At = 1), fd(s, o, i, u)); - } finally { - ((At = _), (Ut.transition = w)); - } - } - function gd(s, o, i, u) { - var _ = At, - w = Ut.transition; - Ut.transition = null; - try { - ((At = 4), fd(s, o, i, u)); - } finally { - ((At = _), (Ut.transition = w)); - } - } - function fd(s, o, i, u) { - if (zt) { - var _ = Yc(s, o, i, u); - if (null === _) (hd(s, o, u, Wt, i), Sc(s, u)); - else if ( - (function Uc(s, o, i, u, _) { - switch (o) { - case 'focusin': - return ((Dt = Tc(Dt, s, o, i, u, _)), !0); - case 'dragenter': - return ((Lt = Tc(Lt, s, o, i, u, _)), !0); - case 'mouseover': - return ((Bt = Tc(Bt, s, o, i, u, _)), !0); - case 'pointerover': - var w = _.pointerId; - return (Ft.set(w, Tc(Ft.get(w) || null, s, o, i, u, _)), !0); - case 'gotpointercapture': - return ( - (w = _.pointerId), - qt.set(w, Tc(qt.get(w) || null, s, o, i, u, _)), - !0 - ); - } - return !1; - })(_, s, o, i, u) - ) - u.stopPropagation(); - else if ((Sc(s, u), 4 & o && -1 < Vt.indexOf(s))) { - for (; null !== _; ) { - var w = Cb(_); - if ( - (null !== w && jt(w), - null === (w = Yc(s, o, i, u)) && hd(s, o, u, Wt, i), - w === _) - ) - break; - _ = w; - } - null !== _ && u.stopPropagation(); - } else hd(s, o, u, null, i); - } - } - var Wt = null; - function Yc(s, o, i, u) { - if (((Wt = null), null !== (s = Wc((s = xb(u)))))) - if (null === (o = Vb(s))) s = null; - else if (13 === (i = o.tag)) { - if (null !== (s = Wb(o))) return s; - s = null; - } else if (3 === i) { - if (o.stateNode.current.memoizedState.isDehydrated) - return 3 === o.tag ? o.stateNode.containerInfo : null; - s = null; - } else o !== s && (s = null); - return ((Wt = s), null); - } - function jd(s) { - switch (s) { - case 'cancel': - case 'click': - case 'close': - case 'contextmenu': - case 'copy': - case 'cut': - case 'auxclick': - case 'dblclick': - case 'dragend': - case 'dragstart': - case 'drop': - case 'focusin': - case 'focusout': - case 'input': - case 'invalid': - case 'keydown': - case 'keypress': - case 'keyup': - case 'mousedown': - case 'mouseup': - case 'paste': - case 'pause': - case 'play': - case 'pointercancel': - case 'pointerdown': - case 'pointerup': - case 'ratechange': - case 'reset': - case 'resize': - case 'seeked': - case 'submit': - case 'touchcancel': - case 'touchend': - case 'touchstart': - case 'volumechange': - case 'change': - case 'selectionchange': - case 'textInput': - case 'compositionstart': - case 'compositionend': - case 'compositionupdate': - case 'beforeblur': - case 'afterblur': - case 'beforeinput': - case 'blur': - case 'fullscreenchange': - case 'focus': - case 'hashchange': - case 'popstate': - case 'select': - case 'selectstart': - return 1; - case 'drag': - case 'dragenter': - case 'dragexit': - case 'dragleave': - case 'dragover': - case 'mousemove': - case 'mouseout': - case 'mouseover': - case 'pointermove': - case 'pointerout': - case 'pointerover': - case 'scroll': - case 'toggle': - case 'touchmove': - case 'wheel': - case 'mouseenter': - case 'mouseleave': - case 'pointerenter': - case 'pointerleave': - return 4; - case 'message': - switch (mt()) { - case gt: - return 1; - case yt: - return 4; - case vt: - case bt: - return 16; - case _t: - return 536870912; - default: - return 16; - } - default: - return 16; - } - } - var Kt = null, - Ht = null, - Jt = null; - function nd() { - if (Jt) return Jt; - var s, - o, - i = Ht, - u = i.length, - _ = 'value' in Kt ? Kt.value : Kt.textContent, - w = _.length; - for (s = 0; s < u && i[s] === _[s]; s++); - var x = u - s; - for (o = 1; o <= x && i[u - o] === _[w - o]; o++); - return (Jt = _.slice(s, 1 < o ? 1 - o : void 0)); - } - function od(s) { - var o = s.keyCode; - return ( - 'charCode' in s ? 0 === (s = s.charCode) && 13 === o && (s = 13) : (s = o), - 10 === s && (s = 13), - 32 <= s || 13 === s ? s : 0 - ); - } - function pd() { - return !0; - } - function qd() { - return !1; - } - function rd(s) { - function b(o, i, u, _, w) { - for (var x in ((this._reactName = o), - (this._targetInst = u), - (this.type = i), - (this.nativeEvent = _), - (this.target = w), - (this.currentTarget = null), - s)) - s.hasOwnProperty(x) && ((o = s[x]), (this[x] = o ? o(_) : _[x])); - return ( - (this.isDefaultPrevented = ( - null != _.defaultPrevented ? _.defaultPrevented : !1 === _.returnValue - ) - ? pd - : qd), - (this.isPropagationStopped = qd), - this - ); - } - return ( - xe(b.prototype, { - preventDefault: function () { - this.defaultPrevented = !0; - var s = this.nativeEvent; - s && - (s.preventDefault - ? s.preventDefault() - : 'unknown' != typeof s.returnValue && (s.returnValue = !1), - (this.isDefaultPrevented = pd)); - }, - stopPropagation: function () { - var s = this.nativeEvent; - s && - (s.stopPropagation - ? s.stopPropagation() - : 'unknown' != typeof s.cancelBubble && (s.cancelBubble = !0), - (this.isPropagationStopped = pd)); - }, - persist: function () {}, - isPersistent: pd - }), - b - ); - } - var Gt, - Yt, - Xt, - Zt = { - eventPhase: 0, - bubbles: 0, - cancelable: 0, - timeStamp: function (s) { - return s.timeStamp || Date.now(); - }, - defaultPrevented: 0, - isTrusted: 0 - }, - Qt = rd(Zt), - er = xe({}, Zt, { view: 0, detail: 0 }), - tr = rd(er), - rr = xe({}, er, { - screenX: 0, - screenY: 0, - clientX: 0, - clientY: 0, - pageX: 0, - pageY: 0, - ctrlKey: 0, - shiftKey: 0, - altKey: 0, - metaKey: 0, - getModifierState: zd, - button: 0, - buttons: 0, - relatedTarget: function (s) { - return void 0 === s.relatedTarget - ? s.fromElement === s.srcElement - ? s.toElement - : s.fromElement - : s.relatedTarget; - }, - movementX: function (s) { - return 'movementX' in s - ? s.movementX - : (s !== Xt && - (Xt && 'mousemove' === s.type - ? ((Gt = s.screenX - Xt.screenX), (Yt = s.screenY - Xt.screenY)) - : (Yt = Gt = 0), - (Xt = s)), - Gt); - }, - movementY: function (s) { - return 'movementY' in s ? s.movementY : Yt; - } - }), - nr = rd(rr), - sr = rd(xe({}, rr, { dataTransfer: 0 })), - ir = rd(xe({}, er, { relatedTarget: 0 })), - ar = rd(xe({}, Zt, { animationName: 0, elapsedTime: 0, pseudoElement: 0 })), - lr = xe({}, Zt, { - clipboardData: function (s) { - return 'clipboardData' in s ? s.clipboardData : window.clipboardData; - } - }), - cr = rd(lr), - ur = rd(xe({}, Zt, { data: 0 })), - pr = { - Esc: 'Escape', - Spacebar: ' ', - Left: 'ArrowLeft', - Up: 'ArrowUp', - Right: 'ArrowRight', - Down: 'ArrowDown', - Del: 'Delete', - Win: 'OS', - Menu: 'ContextMenu', - Apps: 'ContextMenu', - Scroll: 'ScrollLock', - MozPrintableKey: 'Unidentified' - }, - dr = { - 8: 'Backspace', - 9: 'Tab', - 12: 'Clear', - 13: 'Enter', - 16: 'Shift', - 17: 'Control', - 18: 'Alt', - 19: 'Pause', - 20: 'CapsLock', - 27: 'Escape', - 32: ' ', - 33: 'PageUp', - 34: 'PageDown', - 35: 'End', - 36: 'Home', - 37: 'ArrowLeft', - 38: 'ArrowUp', - 39: 'ArrowRight', - 40: 'ArrowDown', - 45: 'Insert', - 46: 'Delete', - 112: 'F1', - 113: 'F2', - 114: 'F3', - 115: 'F4', - 116: 'F5', - 117: 'F6', - 118: 'F7', - 119: 'F8', - 120: 'F9', - 121: 'F10', - 122: 'F11', - 123: 'F12', - 144: 'NumLock', - 145: 'ScrollLock', - 224: 'Meta' - }, - fr = { Alt: 'altKey', Control: 'ctrlKey', Meta: 'metaKey', Shift: 'shiftKey' }; - function Pd(s) { - var o = this.nativeEvent; - return o.getModifierState ? o.getModifierState(s) : !!(s = fr[s]) && !!o[s]; - } - function zd() { - return Pd; - } - var mr = xe({}, er, { - key: function (s) { - if (s.key) { - var o = pr[s.key] || s.key; - if ('Unidentified' !== o) return o; - } - return 'keypress' === s.type - ? 13 === (s = od(s)) - ? 'Enter' - : String.fromCharCode(s) - : 'keydown' === s.type || 'keyup' === s.type - ? dr[s.keyCode] || 'Unidentified' - : ''; - }, - code: 0, - location: 0, - ctrlKey: 0, - shiftKey: 0, - altKey: 0, - metaKey: 0, - repeat: 0, - locale: 0, - getModifierState: zd, - charCode: function (s) { - return 'keypress' === s.type ? od(s) : 0; - }, - keyCode: function (s) { - return 'keydown' === s.type || 'keyup' === s.type ? s.keyCode : 0; - }, - which: function (s) { - return 'keypress' === s.type - ? od(s) - : 'keydown' === s.type || 'keyup' === s.type - ? s.keyCode - : 0; - } - }), - gr = rd(mr), - yr = rd( - xe({}, rr, { - pointerId: 0, - width: 0, - height: 0, - pressure: 0, - tangentialPressure: 0, - tiltX: 0, - tiltY: 0, - twist: 0, - pointerType: 0, - isPrimary: 0 - }) - ), - vr = rd( - xe({}, er, { - touches: 0, - targetTouches: 0, - changedTouches: 0, - altKey: 0, - metaKey: 0, - ctrlKey: 0, - shiftKey: 0, - getModifierState: zd - }) - ), - br = rd(xe({}, Zt, { propertyName: 0, elapsedTime: 0, pseudoElement: 0 })), - _r = xe({}, rr, { - deltaX: function (s) { - return 'deltaX' in s ? s.deltaX : 'wheelDeltaX' in s ? -s.wheelDeltaX : 0; - }, - deltaY: function (s) { - return 'deltaY' in s - ? s.deltaY - : 'wheelDeltaY' in s - ? -s.wheelDeltaY - : 'wheelDelta' in s - ? -s.wheelDelta - : 0; - }, - deltaZ: 0, - deltaMode: 0 - }), - Er = rd(_r), - wr = [9, 13, 27, 32], - Sr = C && 'CompositionEvent' in window, - xr = null; - C && 'documentMode' in document && (xr = document.documentMode); - var kr = C && 'TextEvent' in window && !xr, - Cr = C && (!Sr || (xr && 8 < xr && 11 >= xr)), - Or = String.fromCharCode(32), - Ar = !1; - function ge(s, o) { - switch (s) { - case 'keyup': - return -1 !== wr.indexOf(o.keyCode); - case 'keydown': - return 229 !== o.keyCode; - case 'keypress': - case 'mousedown': - case 'focusout': - return !0; - default: - return !1; - } - } - function he(s) { - return 'object' == typeof (s = s.detail) && 'data' in s ? s.data : null; - } - var jr = !1; - var Ir = { - color: !0, - date: !0, - datetime: !0, - 'datetime-local': !0, - email: !0, - month: !0, - number: !0, - password: !0, - range: !0, - search: !0, - tel: !0, - text: !0, - time: !0, - url: !0, - week: !0 - }; - function me(s) { - var o = s && s.nodeName && s.nodeName.toLowerCase(); - return 'input' === o ? !!Ir[s.type] : 'textarea' === o; - } - function ne(s, o, i, u) { - (Eb(u), - 0 < (o = oe(o, 'onChange')).length && - ((i = new Qt('onChange', 'change', null, i, u)), - s.push({ event: i, listeners: o }))); - } - var Pr = null, - Mr = null; - function re(s) { - se(s, 0); - } - function te(s) { - if (Wa(ue(s))) return s; - } - function ve(s, o) { - if ('change' === s) return o; - } - var Tr = !1; - if (C) { - var Nr; - if (C) { - var Rr = 'oninput' in document; - if (!Rr) { - var Dr = document.createElement('div'); - (Dr.setAttribute('oninput', 'return;'), (Rr = 'function' == typeof Dr.oninput)); - } - Nr = Rr; - } else Nr = !1; - Tr = Nr && (!document.documentMode || 9 < document.documentMode); - } - function Ae() { - Pr && (Pr.detachEvent('onpropertychange', Be), (Mr = Pr = null)); - } - function Be(s) { - if ('value' === s.propertyName && te(Mr)) { - var o = []; - (ne(o, Mr, s, xb(s)), Jb(re, o)); - } - } - function Ce(s, o, i) { - 'focusin' === s - ? (Ae(), (Mr = i), (Pr = o).attachEvent('onpropertychange', Be)) - : 'focusout' === s && Ae(); - } - function De(s) { - if ('selectionchange' === s || 'keyup' === s || 'keydown' === s) return te(Mr); - } - function Ee(s, o) { - if ('click' === s) return te(o); - } - function Fe(s, o) { - if ('input' === s || 'change' === s) return te(o); - } - var Lr = - 'function' == typeof Object.is - ? Object.is - : function Ge(s, o) { - return (s === o && (0 !== s || 1 / s == 1 / o)) || (s != s && o != o); - }; - function Ie(s, o) { - if (Lr(s, o)) return !0; - if ('object' != typeof s || null === s || 'object' != typeof o || null === o) return !1; - var i = Object.keys(s), - u = Object.keys(o); - if (i.length !== u.length) return !1; - for (u = 0; u < i.length; u++) { - var _ = i[u]; - if (!j.call(o, _) || !Lr(s[_], o[_])) return !1; - } - return !0; - } - function Je(s) { - for (; s && s.firstChild; ) s = s.firstChild; - return s; - } - function Ke(s, o) { - var i, - u = Je(s); - for (s = 0; u; ) { - if (3 === u.nodeType) { - if (((i = s + u.textContent.length), s <= o && i >= o)) - return { node: u, offset: o - s }; - s = i; - } - e: { - for (; u; ) { - if (u.nextSibling) { - u = u.nextSibling; - break e; - } - u = u.parentNode; - } - u = void 0; - } - u = Je(u); - } - } - function Le(s, o) { - return ( - !(!s || !o) && - (s === o || - ((!s || 3 !== s.nodeType) && - (o && 3 === o.nodeType - ? Le(s, o.parentNode) - : 'contains' in s - ? s.contains(o) - : !!s.compareDocumentPosition && !!(16 & s.compareDocumentPosition(o))))) - ); - } - function Me() { - for (var s = window, o = Xa(); o instanceof s.HTMLIFrameElement; ) { - try { - var i = 'string' == typeof o.contentWindow.location.href; - } catch (s) { - i = !1; - } - if (!i) break; - o = Xa((s = o.contentWindow).document); - } - return o; - } - function Ne(s) { - var o = s && s.nodeName && s.nodeName.toLowerCase(); - return ( - o && - (('input' === o && - ('text' === s.type || - 'search' === s.type || - 'tel' === s.type || - 'url' === s.type || - 'password' === s.type)) || - 'textarea' === o || - 'true' === s.contentEditable) - ); - } - function Oe(s) { - var o = Me(), - i = s.focusedElem, - u = s.selectionRange; - if (o !== i && i && i.ownerDocument && Le(i.ownerDocument.documentElement, i)) { - if (null !== u && Ne(i)) - if (((o = u.start), void 0 === (s = u.end) && (s = o), 'selectionStart' in i)) - ((i.selectionStart = o), (i.selectionEnd = Math.min(s, i.value.length))); - else if ( - (s = ((o = i.ownerDocument || document) && o.defaultView) || window).getSelection - ) { - s = s.getSelection(); - var _ = i.textContent.length, - w = Math.min(u.start, _); - ((u = void 0 === u.end ? w : Math.min(u.end, _)), - !s.extend && w > u && ((_ = u), (u = w), (w = _)), - (_ = Ke(i, w))); - var x = Ke(i, u); - _ && - x && - (1 !== s.rangeCount || - s.anchorNode !== _.node || - s.anchorOffset !== _.offset || - s.focusNode !== x.node || - s.focusOffset !== x.offset) && - ((o = o.createRange()).setStart(_.node, _.offset), - s.removeAllRanges(), - w > u - ? (s.addRange(o), s.extend(x.node, x.offset)) - : (o.setEnd(x.node, x.offset), s.addRange(o))); - } - for (o = [], s = i; (s = s.parentNode); ) - 1 === s.nodeType && o.push({ element: s, left: s.scrollLeft, top: s.scrollTop }); - for ('function' == typeof i.focus && i.focus(), i = 0; i < o.length; i++) - (((s = o[i]).element.scrollLeft = s.left), (s.element.scrollTop = s.top)); - } - } - var Br = C && 'documentMode' in document && 11 >= document.documentMode, - Fr = null, - qr = null, - $r = null, - Vr = !1; - function Ue(s, o, i) { - var u = i.window === i ? i.document : 9 === i.nodeType ? i : i.ownerDocument; - Vr || - null == Fr || - Fr !== Xa(u) || - ('selectionStart' in (u = Fr) && Ne(u) - ? (u = { start: u.selectionStart, end: u.selectionEnd }) - : (u = { - anchorNode: (u = ( - (u.ownerDocument && u.ownerDocument.defaultView) || - window - ).getSelection()).anchorNode, - anchorOffset: u.anchorOffset, - focusNode: u.focusNode, - focusOffset: u.focusOffset - }), - ($r && Ie($r, u)) || - (($r = u), - 0 < (u = oe(qr, 'onSelect')).length && - ((o = new Qt('onSelect', 'select', null, o, i)), - s.push({ event: o, listeners: u }), - (o.target = Fr)))); - } - function Ve(s, o) { - var i = {}; - return ( - (i[s.toLowerCase()] = o.toLowerCase()), - (i['Webkit' + s] = 'webkit' + o), - (i['Moz' + s] = 'moz' + o), - i - ); - } - var Ur = { - animationend: Ve('Animation', 'AnimationEnd'), - animationiteration: Ve('Animation', 'AnimationIteration'), - animationstart: Ve('Animation', 'AnimationStart'), - transitionend: Ve('Transition', 'TransitionEnd') - }, - zr = {}, - Wr = {}; - function Ze(s) { - if (zr[s]) return zr[s]; - if (!Ur[s]) return s; - var o, - i = Ur[s]; - for (o in i) if (i.hasOwnProperty(o) && o in Wr) return (zr[s] = i[o]); - return s; - } - C && - ((Wr = document.createElement('div').style), - 'AnimationEvent' in window || - (delete Ur.animationend.animation, - delete Ur.animationiteration.animation, - delete Ur.animationstart.animation), - 'TransitionEvent' in window || delete Ur.transitionend.transition); - var Kr = Ze('animationend'), - Hr = Ze('animationiteration'), - Jr = Ze('animationstart'), - Gr = Ze('transitionend'), - Yr = new Map(), - Xr = - 'abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel'.split( - ' ' - ); - function ff(s, o) { - (Yr.set(s, o), fa(o, [s])); - } - for (var Zr = 0; Zr < Xr.length; Zr++) { - var Qr = Xr[Zr]; - ff(Qr.toLowerCase(), 'on' + (Qr[0].toUpperCase() + Qr.slice(1))); - } - (ff(Kr, 'onAnimationEnd'), - ff(Hr, 'onAnimationIteration'), - ff(Jr, 'onAnimationStart'), - ff('dblclick', 'onDoubleClick'), - ff('focusin', 'onFocus'), - ff('focusout', 'onBlur'), - ff(Gr, 'onTransitionEnd'), - ha('onMouseEnter', ['mouseout', 'mouseover']), - ha('onMouseLeave', ['mouseout', 'mouseover']), - ha('onPointerEnter', ['pointerout', 'pointerover']), - ha('onPointerLeave', ['pointerout', 'pointerover']), - fa( - 'onChange', - 'change click focusin focusout input keydown keyup selectionchange'.split(' ') - ), - fa( - 'onSelect', - 'focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange'.split( - ' ' - ) - ), - fa('onBeforeInput', ['compositionend', 'keypress', 'textInput', 'paste']), - fa( - 'onCompositionEnd', - 'compositionend focusout keydown keypress keyup mousedown'.split(' ') - ), - fa( - 'onCompositionStart', - 'compositionstart focusout keydown keypress keyup mousedown'.split(' ') - ), - fa( - 'onCompositionUpdate', - 'compositionupdate focusout keydown keypress keyup mousedown'.split(' ') - )); - var en = - 'abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting'.split( - ' ' - ), - tn = new Set('cancel close invalid load scroll toggle'.split(' ').concat(en)); - function nf(s, o, i) { - var u = s.type || 'unknown-event'; - ((s.currentTarget = i), - (function Ub(s, o, i, u, _, w, x, C, j) { - if ((Tb.apply(this, arguments), st)) { - if (!st) throw Error(p(198)); - var L = ot; - ((st = !1), (ot = null), it || ((it = !0), (at = L))); - } - })(u, o, void 0, s), - (s.currentTarget = null)); - } - function se(s, o) { - o = !!(4 & o); - for (var i = 0; i < s.length; i++) { - var u = s[i], - _ = u.event; - u = u.listeners; - e: { - var w = void 0; - if (o) - for (var x = u.length - 1; 0 <= x; x--) { - var C = u[x], - j = C.instance, - L = C.currentTarget; - if (((C = C.listener), j !== w && _.isPropagationStopped())) break e; - (nf(_, C, L), (w = j)); - } - else - for (x = 0; x < u.length; x++) { - if ( - ((j = (C = u[x]).instance), - (L = C.currentTarget), - (C = C.listener), - j !== w && _.isPropagationStopped()) - ) - break e; - (nf(_, C, L), (w = j)); - } - } - } - if (it) throw ((s = at), (it = !1), (at = null), s); - } - function D(s, o) { - var i = o[gn]; - void 0 === i && (i = o[gn] = new Set()); - var u = s + '__bubble'; - i.has(u) || (pf(o, s, 2, !1), i.add(u)); - } - function qf(s, o, i) { - var u = 0; - (o && (u |= 4), pf(i, s, u, o)); - } - var rn = '_reactListening' + Math.random().toString(36).slice(2); - function sf(s) { - if (!s[rn]) { - ((s[rn] = !0), - w.forEach(function (o) { - 'selectionchange' !== o && (tn.has(o) || qf(o, !1, s), qf(o, !0, s)); - })); - var o = 9 === s.nodeType ? s : s.ownerDocument; - null === o || o[rn] || ((o[rn] = !0), qf('selectionchange', !1, o)); - } - } - function pf(s, o, i, u) { - switch (jd(o)) { - case 1: - var _ = ed; - break; - case 4: - _ = gd; - break; - default: - _ = fd; - } - ((i = _.bind(null, o, i, s)), - (_ = void 0), - !rt || ('touchstart' !== o && 'touchmove' !== o && 'wheel' !== o) || (_ = !0), - u - ? void 0 !== _ - ? s.addEventListener(o, i, { capture: !0, passive: _ }) - : s.addEventListener(o, i, !0) - : void 0 !== _ - ? s.addEventListener(o, i, { passive: _ }) - : s.addEventListener(o, i, !1)); - } - function hd(s, o, i, u, _) { - var w = u; - if (!(1 & o || 2 & o || null === u)) - e: for (;;) { - if (null === u) return; - var x = u.tag; - if (3 === x || 4 === x) { - var C = u.stateNode.containerInfo; - if (C === _ || (8 === C.nodeType && C.parentNode === _)) break; - if (4 === x) - for (x = u.return; null !== x; ) { - var j = x.tag; - if ( - (3 === j || 4 === j) && - ((j = x.stateNode.containerInfo) === _ || - (8 === j.nodeType && j.parentNode === _)) - ) - return; - x = x.return; - } - for (; null !== C; ) { - if (null === (x = Wc(C))) return; - if (5 === (j = x.tag) || 6 === j) { - u = w = x; - continue e; - } - C = C.parentNode; - } - } - u = u.return; - } - Jb(function () { - var u = w, - _ = xb(i), - x = []; - e: { - var C = Yr.get(s); - if (void 0 !== C) { - var j = Qt, - L = s; - switch (s) { - case 'keypress': - if (0 === od(i)) break e; - case 'keydown': - case 'keyup': - j = gr; - break; - case 'focusin': - ((L = 'focus'), (j = ir)); - break; - case 'focusout': - ((L = 'blur'), (j = ir)); - break; - case 'beforeblur': - case 'afterblur': - j = ir; - break; - case 'click': - if (2 === i.button) break e; - case 'auxclick': - case 'dblclick': - case 'mousedown': - case 'mousemove': - case 'mouseup': - case 'mouseout': - case 'mouseover': - case 'contextmenu': - j = nr; - break; - case 'drag': - case 'dragend': - case 'dragenter': - case 'dragexit': - case 'dragleave': - case 'dragover': - case 'dragstart': - case 'drop': - j = sr; - break; - case 'touchcancel': - case 'touchend': - case 'touchmove': - case 'touchstart': - j = vr; - break; - case Kr: - case Hr: - case Jr: - j = ar; - break; - case Gr: - j = br; - break; - case 'scroll': - j = tr; - break; - case 'wheel': - j = Er; - break; - case 'copy': - case 'cut': - case 'paste': - j = cr; - break; - case 'gotpointercapture': - case 'lostpointercapture': - case 'pointercancel': - case 'pointerdown': - case 'pointermove': - case 'pointerout': - case 'pointerover': - case 'pointerup': - j = yr; - } - var B = !!(4 & o), - $ = !B && 'scroll' === s, - V = B ? (null !== C ? C + 'Capture' : null) : C; - B = []; - for (var U, z = u; null !== z; ) { - var Y = (U = z).stateNode; - if ( - (5 === U.tag && - null !== Y && - ((U = Y), null !== V && null != (Y = Kb(z, V)) && B.push(tf(z, Y, U))), - $) - ) - break; - z = z.return; - } - 0 < B.length && - ((C = new j(C, L, null, i, _)), x.push({ event: C, listeners: B })); - } - } - if (!(7 & o)) { - if ( - ((j = 'mouseout' === s || 'pointerout' === s), - (!(C = 'mouseover' === s || 'pointerover' === s) || - i === Ye || - !(L = i.relatedTarget || i.fromElement) || - (!Wc(L) && !L[mn])) && - (j || C) && - ((C = - _.window === _ - ? _ - : (C = _.ownerDocument) - ? C.defaultView || C.parentWindow - : window), - j - ? ((j = u), - null !== (L = (L = i.relatedTarget || i.toElement) ? Wc(L) : null) && - (L !== ($ = Vb(L)) || (5 !== L.tag && 6 !== L.tag)) && - (L = null)) - : ((j = null), (L = u)), - j !== L)) - ) { - if ( - ((B = nr), - (Y = 'onMouseLeave'), - (V = 'onMouseEnter'), - (z = 'mouse'), - ('pointerout' !== s && 'pointerover' !== s) || - ((B = yr), (Y = 'onPointerLeave'), (V = 'onPointerEnter'), (z = 'pointer')), - ($ = null == j ? C : ue(j)), - (U = null == L ? C : ue(L)), - ((C = new B(Y, z + 'leave', j, i, _)).target = $), - (C.relatedTarget = U), - (Y = null), - Wc(_) === u && - (((B = new B(V, z + 'enter', L, i, _)).target = U), - (B.relatedTarget = $), - (Y = B)), - ($ = Y), - j && L) - ) - e: { - for (V = L, z = 0, U = B = j; U; U = vf(U)) z++; - for (U = 0, Y = V; Y; Y = vf(Y)) U++; - for (; 0 < z - U; ) ((B = vf(B)), z--); - for (; 0 < U - z; ) ((V = vf(V)), U--); - for (; z--; ) { - if (B === V || (null !== V && B === V.alternate)) break e; - ((B = vf(B)), (V = vf(V))); - } - B = null; - } - else B = null; - (null !== j && wf(x, C, j, B, !1), - null !== L && null !== $ && wf(x, $, L, B, !0)); - } - if ( - 'select' === - (j = (C = u ? ue(u) : window).nodeName && C.nodeName.toLowerCase()) || - ('input' === j && 'file' === C.type) - ) - var Z = ve; - else if (me(C)) - if (Tr) Z = Fe; - else { - Z = De; - var ee = Ce; - } - else - (j = C.nodeName) && - 'input' === j.toLowerCase() && - ('checkbox' === C.type || 'radio' === C.type) && - (Z = Ee); - switch ( - (Z && (Z = Z(s, u)) - ? ne(x, Z, i, _) - : (ee && ee(s, C, u), - 'focusout' === s && - (ee = C._wrapperState) && - ee.controlled && - 'number' === C.type && - cb(C, 'number', C.value)), - (ee = u ? ue(u) : window), - s) - ) { - case 'focusin': - (me(ee) || 'true' === ee.contentEditable) && ((Fr = ee), (qr = u), ($r = null)); - break; - case 'focusout': - $r = qr = Fr = null; - break; - case 'mousedown': - Vr = !0; - break; - case 'contextmenu': - case 'mouseup': - case 'dragend': - ((Vr = !1), Ue(x, i, _)); - break; - case 'selectionchange': - if (Br) break; - case 'keydown': - case 'keyup': - Ue(x, i, _); - } - var ie; - if (Sr) - e: { - switch (s) { - case 'compositionstart': - var ae = 'onCompositionStart'; - break e; - case 'compositionend': - ae = 'onCompositionEnd'; - break e; - case 'compositionupdate': - ae = 'onCompositionUpdate'; - break e; - } - ae = void 0; - } - else - jr - ? ge(s, i) && (ae = 'onCompositionEnd') - : 'keydown' === s && 229 === i.keyCode && (ae = 'onCompositionStart'); - (ae && - (Cr && - 'ko' !== i.locale && - (jr || 'onCompositionStart' !== ae - ? 'onCompositionEnd' === ae && jr && (ie = nd()) - : ((Ht = 'value' in (Kt = _) ? Kt.value : Kt.textContent), (jr = !0))), - 0 < (ee = oe(u, ae)).length && - ((ae = new ur(ae, s, null, i, _)), - x.push({ event: ae, listeners: ee }), - ie ? (ae.data = ie) : null !== (ie = he(i)) && (ae.data = ie))), - (ie = kr - ? (function je(s, o) { - switch (s) { - case 'compositionend': - return he(o); - case 'keypress': - return 32 !== o.which ? null : ((Ar = !0), Or); - case 'textInput': - return (s = o.data) === Or && Ar ? null : s; - default: - return null; - } - })(s, i) - : (function ke(s, o) { - if (jr) - return 'compositionend' === s || (!Sr && ge(s, o)) - ? ((s = nd()), (Jt = Ht = Kt = null), (jr = !1), s) - : null; - switch (s) { - case 'paste': - default: - return null; - case 'keypress': - if (!(o.ctrlKey || o.altKey || o.metaKey) || (o.ctrlKey && o.altKey)) { - if (o.char && 1 < o.char.length) return o.char; - if (o.which) return String.fromCharCode(o.which); - } - return null; - case 'compositionend': - return Cr && 'ko' !== o.locale ? null : o.data; - } - })(s, i)) && - 0 < (u = oe(u, 'onBeforeInput')).length && - ((_ = new ur('onBeforeInput', 'beforeinput', null, i, _)), - x.push({ event: _, listeners: u }), - (_.data = ie))); - } - se(x, o); - }); - } - function tf(s, o, i) { - return { instance: s, listener: o, currentTarget: i }; - } - function oe(s, o) { - for (var i = o + 'Capture', u = []; null !== s; ) { - var _ = s, - w = _.stateNode; - (5 === _.tag && - null !== w && - ((_ = w), - null != (w = Kb(s, i)) && u.unshift(tf(s, w, _)), - null != (w = Kb(s, o)) && u.push(tf(s, w, _))), - (s = s.return)); - } - return u; - } - function vf(s) { - if (null === s) return null; - do { - s = s.return; - } while (s && 5 !== s.tag); - return s || null; - } - function wf(s, o, i, u, _) { - for (var w = o._reactName, x = []; null !== i && i !== u; ) { - var C = i, - j = C.alternate, - L = C.stateNode; - if (null !== j && j === u) break; - (5 === C.tag && - null !== L && - ((C = L), - _ - ? null != (j = Kb(i, w)) && x.unshift(tf(i, j, C)) - : _ || (null != (j = Kb(i, w)) && x.push(tf(i, j, C)))), - (i = i.return)); - } - 0 !== x.length && s.push({ event: o, listeners: x }); - } - var nn = /\r\n?/g, - sn = /\u0000|\uFFFD/g; - function zf(s) { - return ('string' == typeof s ? s : '' + s).replace(nn, '\n').replace(sn, ''); - } - function Af(s, o, i) { - if (((o = zf(o)), zf(s) !== o && i)) throw Error(p(425)); - } - function Bf() {} - var on = null, - an = null; - function Ef(s, o) { - return ( - 'textarea' === s || - 'noscript' === s || - 'string' == typeof o.children || - 'number' == typeof o.children || - ('object' == typeof o.dangerouslySetInnerHTML && - null !== o.dangerouslySetInnerHTML && - null != o.dangerouslySetInnerHTML.__html) - ); - } - var ln = 'function' == typeof setTimeout ? setTimeout : void 0, - cn = 'function' == typeof clearTimeout ? clearTimeout : void 0, - un = 'function' == typeof Promise ? Promise : void 0, - pn = - 'function' == typeof queueMicrotask - ? queueMicrotask - : void 0 !== un - ? function (s) { - return un.resolve(null).then(s).catch(If); - } - : ln; - function If(s) { - setTimeout(function () { - throw s; - }); - } - function Kf(s, o) { - var i = o, - u = 0; - do { - var _ = i.nextSibling; - if ((s.removeChild(i), _ && 8 === _.nodeType)) - if ('/$' === (i = _.data)) { - if (0 === u) return (s.removeChild(_), void bd(o)); - u--; - } else ('$' !== i && '$?' !== i && '$!' !== i) || u++; - i = _; - } while (i); - bd(o); - } - function Lf(s) { - for (; null != s; s = s.nextSibling) { - var o = s.nodeType; - if (1 === o || 3 === o) break; - if (8 === o) { - if ('$' === (o = s.data) || '$!' === o || '$?' === o) break; - if ('/$' === o) return null; - } - } - return s; - } - function Mf(s) { - s = s.previousSibling; - for (var o = 0; s; ) { - if (8 === s.nodeType) { - var i = s.data; - if ('$' === i || '$!' === i || '$?' === i) { - if (0 === o) return s; - o--; - } else '/$' === i && o++; - } - s = s.previousSibling; - } - return null; - } - var hn = Math.random().toString(36).slice(2), - dn = '__reactFiber$' + hn, - fn = '__reactProps$' + hn, - mn = '__reactContainer$' + hn, - gn = '__reactEvents$' + hn, - yn = '__reactListeners$' + hn, - vn = '__reactHandles$' + hn; - function Wc(s) { - var o = s[dn]; - if (o) return o; - for (var i = s.parentNode; i; ) { - if ((o = i[mn] || i[dn])) { - if (((i = o.alternate), null !== o.child || (null !== i && null !== i.child))) - for (s = Mf(s); null !== s; ) { - if ((i = s[dn])) return i; - s = Mf(s); - } - return o; - } - i = (s = i).parentNode; - } - return null; - } - function Cb(s) { - return !(s = s[dn] || s[mn]) || - (5 !== s.tag && 6 !== s.tag && 13 !== s.tag && 3 !== s.tag) - ? null - : s; - } - function ue(s) { - if (5 === s.tag || 6 === s.tag) return s.stateNode; - throw Error(p(33)); - } - function Db(s) { - return s[fn] || null; - } - var bn = [], - _n = -1; - function Uf(s) { - return { current: s }; - } - function E(s) { - 0 > _n || ((s.current = bn[_n]), (bn[_n] = null), _n--); - } - function G(s, o) { - (_n++, (bn[_n] = s.current), (s.current = o)); - } - var En = {}, - wn = Uf(En), - Sn = Uf(!1), - xn = En; - function Yf(s, o) { - var i = s.type.contextTypes; - if (!i) return En; - var u = s.stateNode; - if (u && u.__reactInternalMemoizedUnmaskedChildContext === o) - return u.__reactInternalMemoizedMaskedChildContext; - var _, - w = {}; - for (_ in i) w[_] = o[_]; - return ( - u && - (((s = s.stateNode).__reactInternalMemoizedUnmaskedChildContext = o), - (s.__reactInternalMemoizedMaskedChildContext = w)), - w - ); - } - function Zf(s) { - return null != (s = s.childContextTypes); - } - function $f() { - (E(Sn), E(wn)); - } - function ag(s, o, i) { - if (wn.current !== En) throw Error(p(168)); - (G(wn, o), G(Sn, i)); - } - function bg(s, o, i) { - var u = s.stateNode; - if (((o = o.childContextTypes), 'function' != typeof u.getChildContext)) return i; - for (var _ in (u = u.getChildContext())) - if (!(_ in o)) throw Error(p(108, Ra(s) || 'Unknown', _)); - return xe({}, i, u); - } - function cg(s) { - return ( - (s = ((s = s.stateNode) && s.__reactInternalMemoizedMergedChildContext) || En), - (xn = wn.current), - G(wn, s), - G(Sn, Sn.current), - !0 - ); - } - function dg(s, o, i) { - var u = s.stateNode; - if (!u) throw Error(p(169)); - (i - ? ((s = bg(s, o, xn)), - (u.__reactInternalMemoizedMergedChildContext = s), - E(Sn), - E(wn), - G(wn, s)) - : E(Sn), - G(Sn, i)); - } - var kn = null, - Cn = !1, - On = !1; - function hg(s) { - null === kn ? (kn = [s]) : kn.push(s); - } - function jg() { - if (!On && null !== kn) { - On = !0; - var s = 0, - o = At; - try { - var i = kn; - for (At = 1; s < i.length; s++) { - var u = i[s]; - do { - u = u(!0); - } while (null !== u); - } - ((kn = null), (Cn = !1)); - } catch (o) { - throw (null !== kn && (kn = kn.slice(s + 1)), ct(gt, jg), o); - } finally { - ((At = o), (On = !1)); - } - } - return null; - } - var An = [], - jn = 0, - In = null, - Pn = 0, - Mn = [], - Tn = 0, - Nn = null, - Rn = 1, - Dn = ''; - function tg(s, o) { - ((An[jn++] = Pn), (An[jn++] = In), (In = s), (Pn = o)); - } - function ug(s, o, i) { - ((Mn[Tn++] = Rn), (Mn[Tn++] = Dn), (Mn[Tn++] = Nn), (Nn = s)); - var u = Rn; - s = Dn; - var _ = 32 - St(u) - 1; - ((u &= ~(1 << _)), (i += 1)); - var w = 32 - St(o) + _; - if (30 < w) { - var x = _ - (_ % 5); - ((w = (u & ((1 << x) - 1)).toString(32)), - (u >>= x), - (_ -= x), - (Rn = (1 << (32 - St(o) + _)) | (i << _) | u), - (Dn = w + s)); - } else ((Rn = (1 << w) | (i << _) | u), (Dn = s)); - } - function vg(s) { - null !== s.return && (tg(s, 1), ug(s, 1, 0)); - } - function wg(s) { - for (; s === In; ) ((In = An[--jn]), (An[jn] = null), (Pn = An[--jn]), (An[jn] = null)); - for (; s === Nn; ) - ((Nn = Mn[--Tn]), - (Mn[Tn] = null), - (Dn = Mn[--Tn]), - (Mn[Tn] = null), - (Rn = Mn[--Tn]), - (Mn[Tn] = null)); - } - var Ln = null, - Bn = null, - Fn = !1, - qn = null; - function Ag(s, o) { - var i = Bg(5, null, null, 0); - ((i.elementType = 'DELETED'), - (i.stateNode = o), - (i.return = s), - null === (o = s.deletions) ? ((s.deletions = [i]), (s.flags |= 16)) : o.push(i)); - } - function Cg(s, o) { - switch (s.tag) { - case 5: - var i = s.type; - return ( - null !== - (o = - 1 !== o.nodeType || i.toLowerCase() !== o.nodeName.toLowerCase() - ? null - : o) && ((s.stateNode = o), (Ln = s), (Bn = Lf(o.firstChild)), !0) - ); - case 6: - return ( - null !== (o = '' === s.pendingProps || 3 !== o.nodeType ? null : o) && - ((s.stateNode = o), (Ln = s), (Bn = null), !0) - ); - case 13: - return ( - null !== (o = 8 !== o.nodeType ? null : o) && - ((i = null !== Nn ? { id: Rn, overflow: Dn } : null), - (s.memoizedState = { dehydrated: o, treeContext: i, retryLane: 1073741824 }), - ((i = Bg(18, null, null, 0)).stateNode = o), - (i.return = s), - (s.child = i), - (Ln = s), - (Bn = null), - !0) - ); - default: - return !1; - } - } - function Dg(s) { - return !(!(1 & s.mode) || 128 & s.flags); - } - function Eg(s) { - if (Fn) { - var o = Bn; - if (o) { - var i = o; - if (!Cg(s, o)) { - if (Dg(s)) throw Error(p(418)); - o = Lf(i.nextSibling); - var u = Ln; - o && Cg(s, o) - ? Ag(u, i) - : ((s.flags = (-4097 & s.flags) | 2), (Fn = !1), (Ln = s)); - } - } else { - if (Dg(s)) throw Error(p(418)); - ((s.flags = (-4097 & s.flags) | 2), (Fn = !1), (Ln = s)); - } - } - } - function Fg(s) { - for (s = s.return; null !== s && 5 !== s.tag && 3 !== s.tag && 13 !== s.tag; ) - s = s.return; - Ln = s; - } - function Gg(s) { - if (s !== Ln) return !1; - if (!Fn) return (Fg(s), (Fn = !0), !1); - var o; - if ( - ((o = 3 !== s.tag) && - !(o = 5 !== s.tag) && - (o = 'head' !== (o = s.type) && 'body' !== o && !Ef(s.type, s.memoizedProps)), - o && (o = Bn)) - ) { - if (Dg(s)) throw (Hg(), Error(p(418))); - for (; o; ) (Ag(s, o), (o = Lf(o.nextSibling))); - } - if ((Fg(s), 13 === s.tag)) { - if (!(s = null !== (s = s.memoizedState) ? s.dehydrated : null)) throw Error(p(317)); - e: { - for (s = s.nextSibling, o = 0; s; ) { - if (8 === s.nodeType) { - var i = s.data; - if ('/$' === i) { - if (0 === o) { - Bn = Lf(s.nextSibling); - break e; - } - o--; - } else ('$' !== i && '$!' !== i && '$?' !== i) || o++; - } - s = s.nextSibling; - } - Bn = null; - } - } else Bn = Ln ? Lf(s.stateNode.nextSibling) : null; - return !0; - } - function Hg() { - for (var s = Bn; s; ) s = Lf(s.nextSibling); - } - function Ig() { - ((Bn = Ln = null), (Fn = !1)); - } - function Jg(s) { - null === qn ? (qn = [s]) : qn.push(s); - } - var $n = z.ReactCurrentBatchConfig; - function Lg(s, o, i) { - if (null !== (s = i.ref) && 'function' != typeof s && 'object' != typeof s) { - if (i._owner) { - if ((i = i._owner)) { - if (1 !== i.tag) throw Error(p(309)); - var u = i.stateNode; - } - if (!u) throw Error(p(147, s)); - var _ = u, - w = '' + s; - return null !== o && - null !== o.ref && - 'function' == typeof o.ref && - o.ref._stringRef === w - ? o.ref - : ((o = function (s) { - var o = _.refs; - null === s ? delete o[w] : (o[w] = s); - }), - (o._stringRef = w), - o); - } - if ('string' != typeof s) throw Error(p(284)); - if (!i._owner) throw Error(p(290, s)); - } - return s; - } - function Mg(s, o) { - throw ( - (s = Object.prototype.toString.call(o)), - Error( - p( - 31, - '[object Object]' === s - ? 'object with keys {' + Object.keys(o).join(', ') + '}' - : s - ) - ) - ); - } - function Ng(s) { - return (0, s._init)(s._payload); - } - function Og(s) { - function b(o, i) { - if (s) { - var u = o.deletions; - null === u ? ((o.deletions = [i]), (o.flags |= 16)) : u.push(i); - } - } - function c(o, i) { - if (!s) return null; - for (; null !== i; ) (b(o, i), (i = i.sibling)); - return null; - } - function d(s, o) { - for (s = new Map(); null !== o; ) - (null !== o.key ? s.set(o.key, o) : s.set(o.index, o), (o = o.sibling)); - return s; - } - function e(s, o) { - return (((s = Pg(s, o)).index = 0), (s.sibling = null), s); - } - function f(o, i, u) { - return ( - (o.index = u), - s - ? null !== (u = o.alternate) - ? (u = u.index) < i - ? ((o.flags |= 2), i) - : u - : ((o.flags |= 2), i) - : ((o.flags |= 1048576), i) - ); - } - function g(o) { - return (s && null === o.alternate && (o.flags |= 2), o); - } - function h(s, o, i, u) { - return null === o || 6 !== o.tag - ? (((o = Qg(i, s.mode, u)).return = s), o) - : (((o = e(o, i)).return = s), o); - } - function k(s, o, i, u) { - var _ = i.type; - return _ === ee - ? m(s, o, i.props.children, u, i.key) - : null !== o && - (o.elementType === _ || - ('object' == typeof _ && null !== _ && _.$$typeof === be && Ng(_) === o.type)) - ? (((u = e(o, i.props)).ref = Lg(s, o, i)), (u.return = s), u) - : (((u = Rg(i.type, i.key, i.props, null, s.mode, u)).ref = Lg(s, o, i)), - (u.return = s), - u); - } - function l(s, o, i, u) { - return null === o || - 4 !== o.tag || - o.stateNode.containerInfo !== i.containerInfo || - o.stateNode.implementation !== i.implementation - ? (((o = Sg(i, s.mode, u)).return = s), o) - : (((o = e(o, i.children || [])).return = s), o); - } - function m(s, o, i, u, _) { - return null === o || 7 !== o.tag - ? (((o = Tg(i, s.mode, u, _)).return = s), o) - : (((o = e(o, i)).return = s), o); - } - function q(s, o, i) { - if (('string' == typeof o && '' !== o) || 'number' == typeof o) - return (((o = Qg('' + o, s.mode, i)).return = s), o); - if ('object' == typeof o && null !== o) { - switch (o.$$typeof) { - case Y: - return ( - ((i = Rg(o.type, o.key, o.props, null, s.mode, i)).ref = Lg(s, null, o)), - (i.return = s), - i - ); - case Z: - return (((o = Sg(o, s.mode, i)).return = s), o); - case be: - return q(s, (0, o._init)(o._payload), i); - } - if (Te(o) || Ka(o)) return (((o = Tg(o, s.mode, i, null)).return = s), o); - Mg(s, o); - } - return null; - } - function r(s, o, i, u) { - var _ = null !== o ? o.key : null; - if (('string' == typeof i && '' !== i) || 'number' == typeof i) - return null !== _ ? null : h(s, o, '' + i, u); - if ('object' == typeof i && null !== i) { - switch (i.$$typeof) { - case Y: - return i.key === _ ? k(s, o, i, u) : null; - case Z: - return i.key === _ ? l(s, o, i, u) : null; - case be: - return r(s, o, (_ = i._init)(i._payload), u); - } - if (Te(i) || Ka(i)) return null !== _ ? null : m(s, o, i, u, null); - Mg(s, i); - } - return null; - } - function y(s, o, i, u, _) { - if (('string' == typeof u && '' !== u) || 'number' == typeof u) - return h(o, (s = s.get(i) || null), '' + u, _); - if ('object' == typeof u && null !== u) { - switch (u.$$typeof) { - case Y: - return k(o, (s = s.get(null === u.key ? i : u.key) || null), u, _); - case Z: - return l(o, (s = s.get(null === u.key ? i : u.key) || null), u, _); - case be: - return y(s, o, i, (0, u._init)(u._payload), _); - } - if (Te(u) || Ka(u)) return m(o, (s = s.get(i) || null), u, _, null); - Mg(o, u); - } - return null; - } - function n(o, i, u, _) { - for ( - var w = null, x = null, C = i, j = (i = 0), L = null; - null !== C && j < u.length; - j++ - ) { - C.index > j ? ((L = C), (C = null)) : (L = C.sibling); - var B = r(o, C, u[j], _); - if (null === B) { - null === C && (C = L); - break; - } - (s && C && null === B.alternate && b(o, C), - (i = f(B, i, j)), - null === x ? (w = B) : (x.sibling = B), - (x = B), - (C = L)); - } - if (j === u.length) return (c(o, C), Fn && tg(o, j), w); - if (null === C) { - for (; j < u.length; j++) - null !== (C = q(o, u[j], _)) && - ((i = f(C, i, j)), null === x ? (w = C) : (x.sibling = C), (x = C)); - return (Fn && tg(o, j), w); - } - for (C = d(o, C); j < u.length; j++) - null !== (L = y(C, o, j, u[j], _)) && - (s && null !== L.alternate && C.delete(null === L.key ? j : L.key), - (i = f(L, i, j)), - null === x ? (w = L) : (x.sibling = L), - (x = L)); - return ( - s && - C.forEach(function (s) { - return b(o, s); - }), - Fn && tg(o, j), - w - ); - } - function t(o, i, u, _) { - var w = Ka(u); - if ('function' != typeof w) throw Error(p(150)); - if (null == (u = w.call(u))) throw Error(p(151)); - for ( - var x = (w = null), C = i, j = (i = 0), L = null, B = u.next(); - null !== C && !B.done; - j++, B = u.next() - ) { - C.index > j ? ((L = C), (C = null)) : (L = C.sibling); - var $ = r(o, C, B.value, _); - if (null === $) { - null === C && (C = L); - break; - } - (s && C && null === $.alternate && b(o, C), - (i = f($, i, j)), - null === x ? (w = $) : (x.sibling = $), - (x = $), - (C = L)); - } - if (B.done) return (c(o, C), Fn && tg(o, j), w); - if (null === C) { - for (; !B.done; j++, B = u.next()) - null !== (B = q(o, B.value, _)) && - ((i = f(B, i, j)), null === x ? (w = B) : (x.sibling = B), (x = B)); - return (Fn && tg(o, j), w); - } - for (C = d(o, C); !B.done; j++, B = u.next()) - null !== (B = y(C, o, j, B.value, _)) && - (s && null !== B.alternate && C.delete(null === B.key ? j : B.key), - (i = f(B, i, j)), - null === x ? (w = B) : (x.sibling = B), - (x = B)); - return ( - s && - C.forEach(function (s) { - return b(o, s); - }), - Fn && tg(o, j), - w - ); - } - return function J(s, o, i, u) { - if ( - ('object' == typeof i && - null !== i && - i.type === ee && - null === i.key && - (i = i.props.children), - 'object' == typeof i && null !== i) - ) { - switch (i.$$typeof) { - case Y: - e: { - for (var _ = i.key, w = o; null !== w; ) { - if (w.key === _) { - if ((_ = i.type) === ee) { - if (7 === w.tag) { - (c(s, w.sibling), ((o = e(w, i.props.children)).return = s), (s = o)); - break e; - } - } else if ( - w.elementType === _ || - ('object' == typeof _ && - null !== _ && - _.$$typeof === be && - Ng(_) === w.type) - ) { - (c(s, w.sibling), - ((o = e(w, i.props)).ref = Lg(s, w, i)), - (o.return = s), - (s = o)); - break e; - } - c(s, w); - break; - } - (b(s, w), (w = w.sibling)); - } - i.type === ee - ? (((o = Tg(i.props.children, s.mode, u, i.key)).return = s), (s = o)) - : (((u = Rg(i.type, i.key, i.props, null, s.mode, u)).ref = Lg(s, o, i)), - (u.return = s), - (s = u)); - } - return g(s); - case Z: - e: { - for (w = i.key; null !== o; ) { - if (o.key === w) { - if ( - 4 === o.tag && - o.stateNode.containerInfo === i.containerInfo && - o.stateNode.implementation === i.implementation - ) { - (c(s, o.sibling), ((o = e(o, i.children || [])).return = s), (s = o)); - break e; - } - c(s, o); - break; - } - (b(s, o), (o = o.sibling)); - } - (((o = Sg(i, s.mode, u)).return = s), (s = o)); - } - return g(s); - case be: - return J(s, o, (w = i._init)(i._payload), u); - } - if (Te(i)) return n(s, o, i, u); - if (Ka(i)) return t(s, o, i, u); - Mg(s, i); - } - return ('string' == typeof i && '' !== i) || 'number' == typeof i - ? ((i = '' + i), - null !== o && 6 === o.tag - ? (c(s, o.sibling), ((o = e(o, i)).return = s), (s = o)) - : (c(s, o), ((o = Qg(i, s.mode, u)).return = s), (s = o)), - g(s)) - : c(s, o); - }; - } - var Vn = Og(!0), - Un = Og(!1), - zn = Uf(null), - Wn = null, - Kn = null, - Hn = null; - function $g() { - Hn = Kn = Wn = null; - } - function ah(s) { - var o = zn.current; - (E(zn), (s._currentValue = o)); - } - function bh(s, o, i) { - for (; null !== s; ) { - var u = s.alternate; - if ( - ((s.childLanes & o) !== o - ? ((s.childLanes |= o), null !== u && (u.childLanes |= o)) - : null !== u && (u.childLanes & o) !== o && (u.childLanes |= o), - s === i) - ) - break; - s = s.return; - } - } - function ch(s, o) { - ((Wn = s), - (Hn = Kn = null), - null !== (s = s.dependencies) && - null !== s.firstContext && - (!!(s.lanes & o) && (_s = !0), (s.firstContext = null))); - } - function eh(s) { - var o = s._currentValue; - if (Hn !== s) - if (((s = { context: s, memoizedValue: o, next: null }), null === Kn)) { - if (null === Wn) throw Error(p(308)); - ((Kn = s), (Wn.dependencies = { lanes: 0, firstContext: s })); - } else Kn = Kn.next = s; - return o; - } - var Jn = null; - function gh(s) { - null === Jn ? (Jn = [s]) : Jn.push(s); - } - function hh(s, o, i, u) { - var _ = o.interleaved; - return ( - null === _ ? ((i.next = i), gh(o)) : ((i.next = _.next), (_.next = i)), - (o.interleaved = i), - ih(s, u) - ); - } - function ih(s, o) { - s.lanes |= o; - var i = s.alternate; - for (null !== i && (i.lanes |= o), i = s, s = s.return; null !== s; ) - ((s.childLanes |= o), - null !== (i = s.alternate) && (i.childLanes |= o), - (i = s), - (s = s.return)); - return 3 === i.tag ? i.stateNode : null; - } - var Gn = !1; - function kh(s) { - s.updateQueue = { - baseState: s.memoizedState, - firstBaseUpdate: null, - lastBaseUpdate: null, - shared: { pending: null, interleaved: null, lanes: 0 }, - effects: null - }; - } - function lh(s, o) { - ((s = s.updateQueue), - o.updateQueue === s && - (o.updateQueue = { - baseState: s.baseState, - firstBaseUpdate: s.firstBaseUpdate, - lastBaseUpdate: s.lastBaseUpdate, - shared: s.shared, - effects: s.effects - })); - } - function mh(s, o) { - return { eventTime: s, lane: o, tag: 0, payload: null, callback: null, next: null }; - } - function nh(s, o, i) { - var u = s.updateQueue; - if (null === u) return null; - if (((u = u.shared), 2 & Bs)) { - var _ = u.pending; - return ( - null === _ ? (o.next = o) : ((o.next = _.next), (_.next = o)), - (u.pending = o), - ih(s, i) - ); - } - return ( - null === (_ = u.interleaved) - ? ((o.next = o), gh(u)) - : ((o.next = _.next), (_.next = o)), - (u.interleaved = o), - ih(s, i) - ); - } - function oh(s, o, i) { - if (null !== (o = o.updateQueue) && ((o = o.shared), 4194240 & i)) { - var u = o.lanes; - ((i |= u &= s.pendingLanes), (o.lanes = i), Cc(s, i)); - } - } - function ph(s, o) { - var i = s.updateQueue, - u = s.alternate; - if (null !== u && i === (u = u.updateQueue)) { - var _ = null, - w = null; - if (null !== (i = i.firstBaseUpdate)) { - do { - var x = { - eventTime: i.eventTime, - lane: i.lane, - tag: i.tag, - payload: i.payload, - callback: i.callback, - next: null - }; - (null === w ? (_ = w = x) : (w = w.next = x), (i = i.next)); - } while (null !== i); - null === w ? (_ = w = o) : (w = w.next = o); - } else _ = w = o; - return ( - (i = { - baseState: u.baseState, - firstBaseUpdate: _, - lastBaseUpdate: w, - shared: u.shared, - effects: u.effects - }), - void (s.updateQueue = i) - ); - } - (null === (s = i.lastBaseUpdate) ? (i.firstBaseUpdate = o) : (s.next = o), - (i.lastBaseUpdate = o)); - } - function qh(s, o, i, u) { - var _ = s.updateQueue; - Gn = !1; - var w = _.firstBaseUpdate, - x = _.lastBaseUpdate, - C = _.shared.pending; - if (null !== C) { - _.shared.pending = null; - var j = C, - L = j.next; - ((j.next = null), null === x ? (w = L) : (x.next = L), (x = j)); - var B = s.alternate; - null !== B && - (C = (B = B.updateQueue).lastBaseUpdate) !== x && - (null === C ? (B.firstBaseUpdate = L) : (C.next = L), (B.lastBaseUpdate = j)); - } - if (null !== w) { - var $ = _.baseState; - for (x = 0, B = L = j = null, C = w; ; ) { - var V = C.lane, - U = C.eventTime; - if ((u & V) === V) { - null !== B && - (B = B.next = - { - eventTime: U, - lane: 0, - tag: C.tag, - payload: C.payload, - callback: C.callback, - next: null - }); - e: { - var z = s, - Y = C; - switch (((V = o), (U = i), Y.tag)) { - case 1: - if ('function' == typeof (z = Y.payload)) { - $ = z.call(U, $, V); - break e; - } - $ = z; - break e; - case 3: - z.flags = (-65537 & z.flags) | 128; - case 0: - if ( - null == (V = 'function' == typeof (z = Y.payload) ? z.call(U, $, V) : z) - ) - break e; - $ = xe({}, $, V); - break e; - case 2: - Gn = !0; - } - } - null !== C.callback && - 0 !== C.lane && - ((s.flags |= 64), null === (V = _.effects) ? (_.effects = [C]) : V.push(C)); - } else - ((U = { - eventTime: U, - lane: V, - tag: C.tag, - payload: C.payload, - callback: C.callback, - next: null - }), - null === B ? ((L = B = U), (j = $)) : (B = B.next = U), - (x |= V)); - if (null === (C = C.next)) { - if (null === (C = _.shared.pending)) break; - ((C = (V = C).next), - (V.next = null), - (_.lastBaseUpdate = V), - (_.shared.pending = null)); - } - } - if ( - (null === B && (j = $), - (_.baseState = j), - (_.firstBaseUpdate = L), - (_.lastBaseUpdate = B), - null !== (o = _.shared.interleaved)) - ) { - _ = o; - do { - ((x |= _.lane), (_ = _.next)); - } while (_ !== o); - } else null === w && (_.shared.lanes = 0); - ((Ks |= x), (s.lanes = x), (s.memoizedState = $)); - } - } - function sh(s, o, i) { - if (((s = o.effects), (o.effects = null), null !== s)) - for (o = 0; o < s.length; o++) { - var u = s[o], - _ = u.callback; - if (null !== _) { - if (((u.callback = null), (u = i), 'function' != typeof _)) - throw Error(p(191, _)); - _.call(u); - } - } - } - var Yn = {}, - Xn = Uf(Yn), - Zn = Uf(Yn), - Qn = Uf(Yn); - function xh(s) { - if (s === Yn) throw Error(p(174)); - return s; - } - function yh(s, o) { - switch ((G(Qn, o), G(Zn, s), G(Xn, Yn), (s = o.nodeType))) { - case 9: - case 11: - o = (o = o.documentElement) ? o.namespaceURI : lb(null, ''); - break; - default: - o = lb( - (o = (s = 8 === s ? o.parentNode : o).namespaceURI || null), - (s = s.tagName) - ); - } - (E(Xn), G(Xn, o)); - } - function zh() { - (E(Xn), E(Zn), E(Qn)); - } - function Ah(s) { - xh(Qn.current); - var o = xh(Xn.current), - i = lb(o, s.type); - o !== i && (G(Zn, s), G(Xn, i)); - } - function Bh(s) { - Zn.current === s && (E(Xn), E(Zn)); - } - var es = Uf(0); - function Ch(s) { - for (var o = s; null !== o; ) { - if (13 === o.tag) { - var i = o.memoizedState; - if ( - null !== i && - (null === (i = i.dehydrated) || '$?' === i.data || '$!' === i.data) - ) - return o; - } else if (19 === o.tag && void 0 !== o.memoizedProps.revealOrder) { - if (128 & o.flags) return o; - } else if (null !== o.child) { - ((o.child.return = o), (o = o.child)); - continue; - } - if (o === s) break; - for (; null === o.sibling; ) { - if (null === o.return || o.return === s) return null; - o = o.return; - } - ((o.sibling.return = o.return), (o = o.sibling)); - } - return null; - } - var ts = []; - function Eh() { - for (var s = 0; s < ts.length; s++) ts[s]._workInProgressVersionPrimary = null; - ts.length = 0; - } - var rs = z.ReactCurrentDispatcher, - ns = z.ReactCurrentBatchConfig, - ss = 0, - os = null, - as = null, - ls = null, - cs = !1, - us = !1, - ps = 0, - hs = 0; - function P() { - throw Error(p(321)); - } - function Mh(s, o) { - if (null === o) return !1; - for (var i = 0; i < o.length && i < s.length; i++) if (!Lr(s[i], o[i])) return !1; - return !0; - } - function Nh(s, o, i, u, _, w) { - if ( - ((ss = w), - (os = o), - (o.memoizedState = null), - (o.updateQueue = null), - (o.lanes = 0), - (rs.current = null === s || null === s.memoizedState ? fs : ms), - (s = i(u, _)), - us) - ) { - w = 0; - do { - if (((us = !1), (ps = 0), 25 <= w)) throw Error(p(301)); - ((w += 1), - (ls = as = null), - (o.updateQueue = null), - (rs.current = gs), - (s = i(u, _))); - } while (us); - } - if ( - ((rs.current = ds), - (o = null !== as && null !== as.next), - (ss = 0), - (ls = as = os = null), - (cs = !1), - o) - ) - throw Error(p(300)); - return s; - } - function Sh() { - var s = 0 !== ps; - return ((ps = 0), s); - } - function Th() { - var s = { - memoizedState: null, - baseState: null, - baseQueue: null, - queue: null, - next: null - }; - return (null === ls ? (os.memoizedState = ls = s) : (ls = ls.next = s), ls); - } - function Uh() { - if (null === as) { - var s = os.alternate; - s = null !== s ? s.memoizedState : null; - } else s = as.next; - var o = null === ls ? os.memoizedState : ls.next; - if (null !== o) ((ls = o), (as = s)); - else { - if (null === s) throw Error(p(310)); - ((s = { - memoizedState: (as = s).memoizedState, - baseState: as.baseState, - baseQueue: as.baseQueue, - queue: as.queue, - next: null - }), - null === ls ? (os.memoizedState = ls = s) : (ls = ls.next = s)); - } - return ls; - } - function Vh(s, o) { - return 'function' == typeof o ? o(s) : o; - } - function Wh(s) { - var o = Uh(), - i = o.queue; - if (null === i) throw Error(p(311)); - i.lastRenderedReducer = s; - var u = as, - _ = u.baseQueue, - w = i.pending; - if (null !== w) { - if (null !== _) { - var x = _.next; - ((_.next = w.next), (w.next = x)); - } - ((u.baseQueue = _ = w), (i.pending = null)); - } - if (null !== _) { - ((w = _.next), (u = u.baseState)); - var C = (x = null), - j = null, - L = w; - do { - var B = L.lane; - if ((ss & B) === B) - (null !== j && - (j = j.next = - { - lane: 0, - action: L.action, - hasEagerState: L.hasEagerState, - eagerState: L.eagerState, - next: null - }), - (u = L.hasEagerState ? L.eagerState : s(u, L.action))); - else { - var $ = { - lane: B, - action: L.action, - hasEagerState: L.hasEagerState, - eagerState: L.eagerState, - next: null - }; - (null === j ? ((C = j = $), (x = u)) : (j = j.next = $), - (os.lanes |= B), - (Ks |= B)); - } - L = L.next; - } while (null !== L && L !== w); - (null === j ? (x = u) : (j.next = C), - Lr(u, o.memoizedState) || (_s = !0), - (o.memoizedState = u), - (o.baseState = x), - (o.baseQueue = j), - (i.lastRenderedState = u)); - } - if (null !== (s = i.interleaved)) { - _ = s; - do { - ((w = _.lane), (os.lanes |= w), (Ks |= w), (_ = _.next)); - } while (_ !== s); - } else null === _ && (i.lanes = 0); - return [o.memoizedState, i.dispatch]; - } - function Xh(s) { - var o = Uh(), - i = o.queue; - if (null === i) throw Error(p(311)); - i.lastRenderedReducer = s; - var u = i.dispatch, - _ = i.pending, - w = o.memoizedState; - if (null !== _) { - i.pending = null; - var x = (_ = _.next); - do { - ((w = s(w, x.action)), (x = x.next)); - } while (x !== _); - (Lr(w, o.memoizedState) || (_s = !0), - (o.memoizedState = w), - null === o.baseQueue && (o.baseState = w), - (i.lastRenderedState = w)); - } - return [w, u]; - } - function Yh() {} - function Zh(s, o) { - var i = os, - u = Uh(), - _ = o(), - w = !Lr(u.memoizedState, _); - if ( - (w && ((u.memoizedState = _), (_s = !0)), - (u = u.queue), - $h(ai.bind(null, i, u, s), [s]), - u.getSnapshot !== o || w || (null !== ls && 1 & ls.memoizedState.tag)) - ) { - if (((i.flags |= 2048), bi(9, ci.bind(null, i, u, _, o), void 0, null), null === Fs)) - throw Error(p(349)); - 30 & ss || di(i, o, _); - } - return _; - } - function di(s, o, i) { - ((s.flags |= 16384), - (s = { getSnapshot: o, value: i }), - null === (o = os.updateQueue) - ? ((o = { lastEffect: null, stores: null }), (os.updateQueue = o), (o.stores = [s])) - : null === (i = o.stores) - ? (o.stores = [s]) - : i.push(s)); - } - function ci(s, o, i, u) { - ((o.value = i), (o.getSnapshot = u), ei(o) && fi(s)); - } - function ai(s, o, i) { - return i(function () { - ei(o) && fi(s); - }); - } - function ei(s) { - var o = s.getSnapshot; - s = s.value; - try { - var i = o(); - return !Lr(s, i); - } catch (s) { - return !0; - } - } - function fi(s) { - var o = ih(s, 1); - null !== o && gi(o, s, 1, -1); - } - function hi(s) { - var o = Th(); - return ( - 'function' == typeof s && (s = s()), - (o.memoizedState = o.baseState = s), - (s = { - pending: null, - interleaved: null, - lanes: 0, - dispatch: null, - lastRenderedReducer: Vh, - lastRenderedState: s - }), - (o.queue = s), - (s = s.dispatch = ii.bind(null, os, s)), - [o.memoizedState, s] - ); - } - function bi(s, o, i, u) { - return ( - (s = { tag: s, create: o, destroy: i, deps: u, next: null }), - null === (o = os.updateQueue) - ? ((o = { lastEffect: null, stores: null }), - (os.updateQueue = o), - (o.lastEffect = s.next = s)) - : null === (i = o.lastEffect) - ? (o.lastEffect = s.next = s) - : ((u = i.next), (i.next = s), (s.next = u), (o.lastEffect = s)), - s - ); - } - function ji() { - return Uh().memoizedState; - } - function ki(s, o, i, u) { - var _ = Th(); - ((os.flags |= s), (_.memoizedState = bi(1 | o, i, void 0, void 0 === u ? null : u))); - } - function li(s, o, i, u) { - var _ = Uh(); - u = void 0 === u ? null : u; - var w = void 0; - if (null !== as) { - var x = as.memoizedState; - if (((w = x.destroy), null !== u && Mh(u, x.deps))) - return void (_.memoizedState = bi(o, i, w, u)); - } - ((os.flags |= s), (_.memoizedState = bi(1 | o, i, w, u))); - } - function mi(s, o) { - return ki(8390656, 8, s, o); - } - function $h(s, o) { - return li(2048, 8, s, o); - } - function ni(s, o) { - return li(4, 2, s, o); - } - function oi(s, o) { - return li(4, 4, s, o); - } - function pi(s, o) { - return 'function' == typeof o - ? ((s = s()), - o(s), - function () { - o(null); - }) - : null != o - ? ((s = s()), - (o.current = s), - function () { - o.current = null; - }) - : void 0; - } - function qi(s, o, i) { - return ((i = null != i ? i.concat([s]) : null), li(4, 4, pi.bind(null, o, s), i)); - } - function ri() {} - function si(s, o) { - var i = Uh(); - o = void 0 === o ? null : o; - var u = i.memoizedState; - return null !== u && null !== o && Mh(o, u[1]) ? u[0] : ((i.memoizedState = [s, o]), s); - } - function ti(s, o) { - var i = Uh(); - o = void 0 === o ? null : o; - var u = i.memoizedState; - return null !== u && null !== o && Mh(o, u[1]) - ? u[0] - : ((s = s()), (i.memoizedState = [s, o]), s); - } - function ui(s, o, i) { - return 21 & ss - ? (Lr(i, o) || ((i = yc()), (os.lanes |= i), (Ks |= i), (s.baseState = !0)), o) - : (s.baseState && ((s.baseState = !1), (_s = !0)), (s.memoizedState = i)); - } - function vi(s, o) { - var i = At; - ((At = 0 !== i && 4 > i ? i : 4), s(!0)); - var u = ns.transition; - ns.transition = {}; - try { - (s(!1), o()); - } finally { - ((At = i), (ns.transition = u)); - } - } - function wi() { - return Uh().memoizedState; - } - function xi(s, o, i) { - var u = yi(s); - if ( - ((i = { lane: u, action: i, hasEagerState: !1, eagerState: null, next: null }), zi(s)) - ) - Ai(o, i); - else if (null !== (i = hh(s, o, i, u))) { - (gi(i, s, u, R()), Bi(i, o, u)); - } - } - function ii(s, o, i) { - var u = yi(s), - _ = { lane: u, action: i, hasEagerState: !1, eagerState: null, next: null }; - if (zi(s)) Ai(o, _); - else { - var w = s.alternate; - if ( - 0 === s.lanes && - (null === w || 0 === w.lanes) && - null !== (w = o.lastRenderedReducer) - ) - try { - var x = o.lastRenderedState, - C = w(x, i); - if (((_.hasEagerState = !0), (_.eagerState = C), Lr(C, x))) { - var j = o.interleaved; - return ( - null === j ? ((_.next = _), gh(o)) : ((_.next = j.next), (j.next = _)), - void (o.interleaved = _) - ); - } - } catch (s) {} - null !== (i = hh(s, o, _, u)) && (gi(i, s, u, (_ = R())), Bi(i, o, u)); - } - } - function zi(s) { - var o = s.alternate; - return s === os || (null !== o && o === os); - } - function Ai(s, o) { - us = cs = !0; - var i = s.pending; - (null === i ? (o.next = o) : ((o.next = i.next), (i.next = o)), (s.pending = o)); - } - function Bi(s, o, i) { - if (4194240 & i) { - var u = o.lanes; - ((i |= u &= s.pendingLanes), (o.lanes = i), Cc(s, i)); - } - } - var ds = { - readContext: eh, - useCallback: P, - useContext: P, - useEffect: P, - useImperativeHandle: P, - useInsertionEffect: P, - useLayoutEffect: P, - useMemo: P, - useReducer: P, - useRef: P, - useState: P, - useDebugValue: P, - useDeferredValue: P, - useTransition: P, - useMutableSource: P, - useSyncExternalStore: P, - useId: P, - unstable_isNewReconciler: !1 - }, - fs = { - readContext: eh, - useCallback: function (s, o) { - return ((Th().memoizedState = [s, void 0 === o ? null : o]), s); - }, - useContext: eh, - useEffect: mi, - useImperativeHandle: function (s, o, i) { - return ( - (i = null != i ? i.concat([s]) : null), - ki(4194308, 4, pi.bind(null, o, s), i) - ); - }, - useLayoutEffect: function (s, o) { - return ki(4194308, 4, s, o); - }, - useInsertionEffect: function (s, o) { - return ki(4, 2, s, o); - }, - useMemo: function (s, o) { - var i = Th(); - return ((o = void 0 === o ? null : o), (s = s()), (i.memoizedState = [s, o]), s); - }, - useReducer: function (s, o, i) { - var u = Th(); - return ( - (o = void 0 !== i ? i(o) : o), - (u.memoizedState = u.baseState = o), - (s = { - pending: null, - interleaved: null, - lanes: 0, - dispatch: null, - lastRenderedReducer: s, - lastRenderedState: o - }), - (u.queue = s), - (s = s.dispatch = xi.bind(null, os, s)), - [u.memoizedState, s] - ); - }, - useRef: function (s) { - return ((s = { current: s }), (Th().memoizedState = s)); - }, - useState: hi, - useDebugValue: ri, - useDeferredValue: function (s) { - return (Th().memoizedState = s); - }, - useTransition: function () { - var s = hi(!1), - o = s[0]; - return ((s = vi.bind(null, s[1])), (Th().memoizedState = s), [o, s]); - }, - useMutableSource: function () {}, - useSyncExternalStore: function (s, o, i) { - var u = os, - _ = Th(); - if (Fn) { - if (void 0 === i) throw Error(p(407)); - i = i(); - } else { - if (((i = o()), null === Fs)) throw Error(p(349)); - 30 & ss || di(u, o, i); - } - _.memoizedState = i; - var w = { value: i, getSnapshot: o }; - return ( - (_.queue = w), - mi(ai.bind(null, u, w, s), [s]), - (u.flags |= 2048), - bi(9, ci.bind(null, u, w, i, o), void 0, null), - i - ); - }, - useId: function () { - var s = Th(), - o = Fs.identifierPrefix; - if (Fn) { - var i = Dn; - ((o = ':' + o + 'R' + (i = (Rn & ~(1 << (32 - St(Rn) - 1))).toString(32) + i)), - 0 < (i = ps++) && (o += 'H' + i.toString(32)), - (o += ':')); - } else o = ':' + o + 'r' + (i = hs++).toString(32) + ':'; - return (s.memoizedState = o); - }, - unstable_isNewReconciler: !1 - }, - ms = { - readContext: eh, - useCallback: si, - useContext: eh, - useEffect: $h, - useImperativeHandle: qi, - useInsertionEffect: ni, - useLayoutEffect: oi, - useMemo: ti, - useReducer: Wh, - useRef: ji, - useState: function () { - return Wh(Vh); - }, - useDebugValue: ri, - useDeferredValue: function (s) { - return ui(Uh(), as.memoizedState, s); - }, - useTransition: function () { - return [Wh(Vh)[0], Uh().memoizedState]; - }, - useMutableSource: Yh, - useSyncExternalStore: Zh, - useId: wi, - unstable_isNewReconciler: !1 - }, - gs = { - readContext: eh, - useCallback: si, - useContext: eh, - useEffect: $h, - useImperativeHandle: qi, - useInsertionEffect: ni, - useLayoutEffect: oi, - useMemo: ti, - useReducer: Xh, - useRef: ji, - useState: function () { - return Xh(Vh); - }, - useDebugValue: ri, - useDeferredValue: function (s) { - var o = Uh(); - return null === as ? (o.memoizedState = s) : ui(o, as.memoizedState, s); - }, - useTransition: function () { - return [Xh(Vh)[0], Uh().memoizedState]; - }, - useMutableSource: Yh, - useSyncExternalStore: Zh, - useId: wi, - unstable_isNewReconciler: !1 - }; - function Ci(s, o) { - if (s && s.defaultProps) { - for (var i in ((o = xe({}, o)), (s = s.defaultProps))) - void 0 === o[i] && (o[i] = s[i]); - return o; - } - return o; - } - function Di(s, o, i, u) { - ((i = null == (i = i(u, (o = s.memoizedState))) ? o : xe({}, o, i)), - (s.memoizedState = i), - 0 === s.lanes && (s.updateQueue.baseState = i)); - } - var ys = { - isMounted: function (s) { - return !!(s = s._reactInternals) && Vb(s) === s; - }, - enqueueSetState: function (s, o, i) { - s = s._reactInternals; - var u = R(), - _ = yi(s), - w = mh(u, _); - ((w.payload = o), - null != i && (w.callback = i), - null !== (o = nh(s, w, _)) && (gi(o, s, _, u), oh(o, s, _))); - }, - enqueueReplaceState: function (s, o, i) { - s = s._reactInternals; - var u = R(), - _ = yi(s), - w = mh(u, _); - ((w.tag = 1), - (w.payload = o), - null != i && (w.callback = i), - null !== (o = nh(s, w, _)) && (gi(o, s, _, u), oh(o, s, _))); - }, - enqueueForceUpdate: function (s, o) { - s = s._reactInternals; - var i = R(), - u = yi(s), - _ = mh(i, u); - ((_.tag = 2), - null != o && (_.callback = o), - null !== (o = nh(s, _, u)) && (gi(o, s, u, i), oh(o, s, u))); - } - }; - function Fi(s, o, i, u, _, w, x) { - return 'function' == typeof (s = s.stateNode).shouldComponentUpdate - ? s.shouldComponentUpdate(u, w, x) - : !o.prototype || !o.prototype.isPureReactComponent || !Ie(i, u) || !Ie(_, w); - } - function Gi(s, o, i) { - var u = !1, - _ = En, - w = o.contextType; - return ( - 'object' == typeof w && null !== w - ? (w = eh(w)) - : ((_ = Zf(o) ? xn : wn.current), - (w = (u = null != (u = o.contextTypes)) ? Yf(s, _) : En)), - (o = new o(i, w)), - (s.memoizedState = null !== o.state && void 0 !== o.state ? o.state : null), - (o.updater = ys), - (s.stateNode = o), - (o._reactInternals = s), - u && - (((s = s.stateNode).__reactInternalMemoizedUnmaskedChildContext = _), - (s.__reactInternalMemoizedMaskedChildContext = w)), - o - ); - } - function Hi(s, o, i, u) { - ((s = o.state), - 'function' == typeof o.componentWillReceiveProps && o.componentWillReceiveProps(i, u), - 'function' == typeof o.UNSAFE_componentWillReceiveProps && - o.UNSAFE_componentWillReceiveProps(i, u), - o.state !== s && ys.enqueueReplaceState(o, o.state, null)); - } - function Ii(s, o, i, u) { - var _ = s.stateNode; - ((_.props = i), (_.state = s.memoizedState), (_.refs = {}), kh(s)); - var w = o.contextType; - ('object' == typeof w && null !== w - ? (_.context = eh(w)) - : ((w = Zf(o) ? xn : wn.current), (_.context = Yf(s, w))), - (_.state = s.memoizedState), - 'function' == typeof (w = o.getDerivedStateFromProps) && - (Di(s, o, w, i), (_.state = s.memoizedState)), - 'function' == typeof o.getDerivedStateFromProps || - 'function' == typeof _.getSnapshotBeforeUpdate || - ('function' != typeof _.UNSAFE_componentWillMount && - 'function' != typeof _.componentWillMount) || - ((o = _.state), - 'function' == typeof _.componentWillMount && _.componentWillMount(), - 'function' == typeof _.UNSAFE_componentWillMount && _.UNSAFE_componentWillMount(), - o !== _.state && ys.enqueueReplaceState(_, _.state, null), - qh(s, i, _, u), - (_.state = s.memoizedState)), - 'function' == typeof _.componentDidMount && (s.flags |= 4194308)); - } - function Ji(s, o) { - try { - var i = '', - u = o; - do { - ((i += Pa(u)), (u = u.return)); - } while (u); - var _ = i; - } catch (s) { - _ = '\nError generating stack: ' + s.message + '\n' + s.stack; - } - return { value: s, source: o, stack: _, digest: null }; - } - function Ki(s, o, i) { - return { - value: s, - source: null, - stack: null != i ? i : null, - digest: null != o ? o : null - }; - } - function Li(s, o) { - try { - console.error(o.value); - } catch (s) { - setTimeout(function () { - throw s; - }); - } - } - var vs = 'function' == typeof WeakMap ? WeakMap : Map; - function Ni(s, o, i) { - (((i = mh(-1, i)).tag = 3), (i.payload = { element: null })); - var u = o.value; - return ( - (i.callback = function () { - (eo || ((eo = !0), (to = u)), Li(0, o)); - }), - i - ); - } - function Qi(s, o, i) { - (i = mh(-1, i)).tag = 3; - var u = s.type.getDerivedStateFromError; - if ('function' == typeof u) { - var _ = o.value; - ((i.payload = function () { - return u(_); - }), - (i.callback = function () { - Li(0, o); - })); - } - var w = s.stateNode; - return ( - null !== w && - 'function' == typeof w.componentDidCatch && - (i.callback = function () { - (Li(0, o), - 'function' != typeof u && - (null === ro ? (ro = new Set([this])) : ro.add(this))); - var s = o.stack; - this.componentDidCatch(o.value, { componentStack: null !== s ? s : '' }); - }), - i - ); - } - function Si(s, o, i) { - var u = s.pingCache; - if (null === u) { - u = s.pingCache = new vs(); - var _ = new Set(); - u.set(o, _); - } else void 0 === (_ = u.get(o)) && ((_ = new Set()), u.set(o, _)); - _.has(i) || (_.add(i), (s = Ti.bind(null, s, o, i)), o.then(s, s)); - } - function Ui(s) { - do { - var o; - if ( - ((o = 13 === s.tag) && - (o = null === (o = s.memoizedState) || null !== o.dehydrated), - o) - ) - return s; - s = s.return; - } while (null !== s); - return null; - } - function Vi(s, o, i, u, _) { - return 1 & s.mode - ? ((s.flags |= 65536), (s.lanes = _), s) - : (s === o - ? (s.flags |= 65536) - : ((s.flags |= 128), - (i.flags |= 131072), - (i.flags &= -52805), - 1 === i.tag && - (null === i.alternate - ? (i.tag = 17) - : (((o = mh(-1, 1)).tag = 2), nh(i, o, 1))), - (i.lanes |= 1)), - s); - } - var bs = z.ReactCurrentOwner, - _s = !1; - function Xi(s, o, i, u) { - o.child = null === s ? Un(o, null, i, u) : Vn(o, s.child, i, u); - } - function Yi(s, o, i, u, _) { - i = i.render; - var w = o.ref; - return ( - ch(o, _), - (u = Nh(s, o, i, u, w, _)), - (i = Sh()), - null === s || _s - ? (Fn && i && vg(o), (o.flags |= 1), Xi(s, o, u, _), o.child) - : ((o.updateQueue = s.updateQueue), - (o.flags &= -2053), - (s.lanes &= ~_), - Zi(s, o, _)) - ); - } - function $i(s, o, i, u, _) { - if (null === s) { - var w = i.type; - return 'function' != typeof w || - aj(w) || - void 0 !== w.defaultProps || - null !== i.compare || - void 0 !== i.defaultProps - ? (((s = Rg(i.type, null, u, o, o.mode, _)).ref = o.ref), - (s.return = o), - (o.child = s)) - : ((o.tag = 15), (o.type = w), bj(s, o, w, u, _)); - } - if (((w = s.child), !(s.lanes & _))) { - var x = w.memoizedProps; - if ((i = null !== (i = i.compare) ? i : Ie)(x, u) && s.ref === o.ref) - return Zi(s, o, _); - } - return ((o.flags |= 1), ((s = Pg(w, u)).ref = o.ref), (s.return = o), (o.child = s)); - } - function bj(s, o, i, u, _) { - if (null !== s) { - var w = s.memoizedProps; - if (Ie(w, u) && s.ref === o.ref) { - if (((_s = !1), (o.pendingProps = u = w), !(s.lanes & _))) - return ((o.lanes = s.lanes), Zi(s, o, _)); - 131072 & s.flags && (_s = !0); - } - } - return cj(s, o, i, u, _); - } - function dj(s, o, i) { - var u = o.pendingProps, - _ = u.children, - w = null !== s ? s.memoizedState : null; - if ('hidden' === u.mode) - if (1 & o.mode) { - if (!(1073741824 & i)) - return ( - (s = null !== w ? w.baseLanes | i : i), - (o.lanes = o.childLanes = 1073741824), - (o.memoizedState = { baseLanes: s, cachePool: null, transitions: null }), - (o.updateQueue = null), - G(Us, Vs), - (Vs |= s), - null - ); - ((o.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }), - (u = null !== w ? w.baseLanes : i), - G(Us, Vs), - (Vs |= u)); - } else - ((o.memoizedState = { baseLanes: 0, cachePool: null, transitions: null }), - G(Us, Vs), - (Vs |= i)); - else - (null !== w ? ((u = w.baseLanes | i), (o.memoizedState = null)) : (u = i), - G(Us, Vs), - (Vs |= u)); - return (Xi(s, o, _, i), o.child); - } - function gj(s, o) { - var i = o.ref; - ((null === s && null !== i) || (null !== s && s.ref !== i)) && - ((o.flags |= 512), (o.flags |= 2097152)); - } - function cj(s, o, i, u, _) { - var w = Zf(i) ? xn : wn.current; - return ( - (w = Yf(o, w)), - ch(o, _), - (i = Nh(s, o, i, u, w, _)), - (u = Sh()), - null === s || _s - ? (Fn && u && vg(o), (o.flags |= 1), Xi(s, o, i, _), o.child) - : ((o.updateQueue = s.updateQueue), - (o.flags &= -2053), - (s.lanes &= ~_), - Zi(s, o, _)) - ); - } - function hj(s, o, i, u, _) { - if (Zf(i)) { - var w = !0; - cg(o); - } else w = !1; - if ((ch(o, _), null === o.stateNode)) (ij(s, o), Gi(o, i, u), Ii(o, i, u, _), (u = !0)); - else if (null === s) { - var x = o.stateNode, - C = o.memoizedProps; - x.props = C; - var j = x.context, - L = i.contextType; - 'object' == typeof L && null !== L - ? (L = eh(L)) - : (L = Yf(o, (L = Zf(i) ? xn : wn.current))); - var B = i.getDerivedStateFromProps, - $ = 'function' == typeof B || 'function' == typeof x.getSnapshotBeforeUpdate; - ($ || - ('function' != typeof x.UNSAFE_componentWillReceiveProps && - 'function' != typeof x.componentWillReceiveProps) || - ((C !== u || j !== L) && Hi(o, x, u, L)), - (Gn = !1)); - var V = o.memoizedState; - ((x.state = V), - qh(o, u, x, _), - (j = o.memoizedState), - C !== u || V !== j || Sn.current || Gn - ? ('function' == typeof B && (Di(o, i, B, u), (j = o.memoizedState)), - (C = Gn || Fi(o, i, C, u, V, j, L)) - ? ($ || - ('function' != typeof x.UNSAFE_componentWillMount && - 'function' != typeof x.componentWillMount) || - ('function' == typeof x.componentWillMount && x.componentWillMount(), - 'function' == typeof x.UNSAFE_componentWillMount && - x.UNSAFE_componentWillMount()), - 'function' == typeof x.componentDidMount && (o.flags |= 4194308)) - : ('function' == typeof x.componentDidMount && (o.flags |= 4194308), - (o.memoizedProps = u), - (o.memoizedState = j)), - (x.props = u), - (x.state = j), - (x.context = L), - (u = C)) - : ('function' == typeof x.componentDidMount && (o.flags |= 4194308), (u = !1))); - } else { - ((x = o.stateNode), - lh(s, o), - (C = o.memoizedProps), - (L = o.type === o.elementType ? C : Ci(o.type, C)), - (x.props = L), - ($ = o.pendingProps), - (V = x.context), - 'object' == typeof (j = i.contextType) && null !== j - ? (j = eh(j)) - : (j = Yf(o, (j = Zf(i) ? xn : wn.current)))); - var U = i.getDerivedStateFromProps; - ((B = 'function' == typeof U || 'function' == typeof x.getSnapshotBeforeUpdate) || - ('function' != typeof x.UNSAFE_componentWillReceiveProps && - 'function' != typeof x.componentWillReceiveProps) || - ((C !== $ || V !== j) && Hi(o, x, u, j)), - (Gn = !1), - (V = o.memoizedState), - (x.state = V), - qh(o, u, x, _)); - var z = o.memoizedState; - C !== $ || V !== z || Sn.current || Gn - ? ('function' == typeof U && (Di(o, i, U, u), (z = o.memoizedState)), - (L = Gn || Fi(o, i, L, u, V, z, j) || !1) - ? (B || - ('function' != typeof x.UNSAFE_componentWillUpdate && - 'function' != typeof x.componentWillUpdate) || - ('function' == typeof x.componentWillUpdate && - x.componentWillUpdate(u, z, j), - 'function' == typeof x.UNSAFE_componentWillUpdate && - x.UNSAFE_componentWillUpdate(u, z, j)), - 'function' == typeof x.componentDidUpdate && (o.flags |= 4), - 'function' == typeof x.getSnapshotBeforeUpdate && (o.flags |= 1024)) - : ('function' != typeof x.componentDidUpdate || - (C === s.memoizedProps && V === s.memoizedState) || - (o.flags |= 4), - 'function' != typeof x.getSnapshotBeforeUpdate || - (C === s.memoizedProps && V === s.memoizedState) || - (o.flags |= 1024), - (o.memoizedProps = u), - (o.memoizedState = z)), - (x.props = u), - (x.state = z), - (x.context = j), - (u = L)) - : ('function' != typeof x.componentDidUpdate || - (C === s.memoizedProps && V === s.memoizedState) || - (o.flags |= 4), - 'function' != typeof x.getSnapshotBeforeUpdate || - (C === s.memoizedProps && V === s.memoizedState) || - (o.flags |= 1024), - (u = !1)); - } - return jj(s, o, i, u, w, _); - } - function jj(s, o, i, u, _, w) { - gj(s, o); - var x = !!(128 & o.flags); - if (!u && !x) return (_ && dg(o, i, !1), Zi(s, o, w)); - ((u = o.stateNode), (bs.current = o)); - var C = x && 'function' != typeof i.getDerivedStateFromError ? null : u.render(); - return ( - (o.flags |= 1), - null !== s && x - ? ((o.child = Vn(o, s.child, null, w)), (o.child = Vn(o, null, C, w))) - : Xi(s, o, C, w), - (o.memoizedState = u.state), - _ && dg(o, i, !0), - o.child - ); - } - function kj(s) { - var o = s.stateNode; - (o.pendingContext - ? ag(0, o.pendingContext, o.pendingContext !== o.context) - : o.context && ag(0, o.context, !1), - yh(s, o.containerInfo)); - } - function lj(s, o, i, u, _) { - return (Ig(), Jg(_), (o.flags |= 256), Xi(s, o, i, u), o.child); - } - var Es, - ws, - Ss, - xs, - ks = { dehydrated: null, treeContext: null, retryLane: 0 }; - function nj(s) { - return { baseLanes: s, cachePool: null, transitions: null }; - } - function oj(s, o, i) { - var u, - _ = o.pendingProps, - w = es.current, - x = !1, - C = !!(128 & o.flags); - if ( - ((u = C) || (u = (null === s || null !== s.memoizedState) && !!(2 & w)), - u - ? ((x = !0), (o.flags &= -129)) - : (null !== s && null === s.memoizedState) || (w |= 1), - G(es, 1 & w), - null === s) - ) - return ( - Eg(o), - null !== (s = o.memoizedState) && null !== (s = s.dehydrated) - ? (1 & o.mode - ? '$!' === s.data - ? (o.lanes = 8) - : (o.lanes = 1073741824) - : (o.lanes = 1), - null) - : ((C = _.children), - (s = _.fallback), - x - ? ((_ = o.mode), - (x = o.child), - (C = { mode: 'hidden', children: C }), - 1 & _ || null === x - ? (x = pj(C, _, 0, null)) - : ((x.childLanes = 0), (x.pendingProps = C)), - (s = Tg(s, _, i, null)), - (x.return = o), - (s.return = o), - (x.sibling = s), - (o.child = x), - (o.child.memoizedState = nj(i)), - (o.memoizedState = ks), - s) - : qj(o, C)) - ); - if (null !== (w = s.memoizedState) && null !== (u = w.dehydrated)) - return (function rj(s, o, i, u, _, w, x) { - if (i) - return 256 & o.flags - ? ((o.flags &= -257), sj(s, o, x, (u = Ki(Error(p(422)))))) - : null !== o.memoizedState - ? ((o.child = s.child), (o.flags |= 128), null) - : ((w = u.fallback), - (_ = o.mode), - (u = pj({ mode: 'visible', children: u.children }, _, 0, null)), - ((w = Tg(w, _, x, null)).flags |= 2), - (u.return = o), - (w.return = o), - (u.sibling = w), - (o.child = u), - 1 & o.mode && Vn(o, s.child, null, x), - (o.child.memoizedState = nj(x)), - (o.memoizedState = ks), - w); - if (!(1 & o.mode)) return sj(s, o, x, null); - if ('$!' === _.data) { - if ((u = _.nextSibling && _.nextSibling.dataset)) var C = u.dgst; - return ((u = C), sj(s, o, x, (u = Ki((w = Error(p(419))), u, void 0)))); - } - if (((C = !!(x & s.childLanes)), _s || C)) { - if (null !== (u = Fs)) { - switch (x & -x) { - case 4: - _ = 2; - break; - case 16: - _ = 8; - break; - case 64: - case 128: - case 256: - case 512: - case 1024: - case 2048: - case 4096: - case 8192: - case 16384: - case 32768: - case 65536: - case 131072: - case 262144: - case 524288: - case 1048576: - case 2097152: - case 4194304: - case 8388608: - case 16777216: - case 33554432: - case 67108864: - _ = 32; - break; - case 536870912: - _ = 268435456; - break; - default: - _ = 0; - } - 0 !== (_ = _ & (u.suspendedLanes | x) ? 0 : _) && - _ !== w.retryLane && - ((w.retryLane = _), ih(s, _), gi(u, s, _, -1)); - } - return (tj(), sj(s, o, x, (u = Ki(Error(p(421)))))); - } - return '$?' === _.data - ? ((o.flags |= 128), - (o.child = s.child), - (o = uj.bind(null, s)), - (_._reactRetry = o), - null) - : ((s = w.treeContext), - (Bn = Lf(_.nextSibling)), - (Ln = o), - (Fn = !0), - (qn = null), - null !== s && - ((Mn[Tn++] = Rn), - (Mn[Tn++] = Dn), - (Mn[Tn++] = Nn), - (Rn = s.id), - (Dn = s.overflow), - (Nn = o)), - (o = qj(o, u.children)), - (o.flags |= 4096), - o); - })(s, o, C, _, u, w, i); - if (x) { - ((x = _.fallback), (C = o.mode), (u = (w = s.child).sibling)); - var j = { mode: 'hidden', children: _.children }; - return ( - 1 & C || o.child === w - ? ((_ = Pg(w, j)).subtreeFlags = 14680064 & w.subtreeFlags) - : (((_ = o.child).childLanes = 0), (_.pendingProps = j), (o.deletions = null)), - null !== u ? (x = Pg(u, x)) : ((x = Tg(x, C, i, null)).flags |= 2), - (x.return = o), - (_.return = o), - (_.sibling = x), - (o.child = _), - (_ = x), - (x = o.child), - (C = - null === (C = s.child.memoizedState) - ? nj(i) - : { baseLanes: C.baseLanes | i, cachePool: null, transitions: C.transitions }), - (x.memoizedState = C), - (x.childLanes = s.childLanes & ~i), - (o.memoizedState = ks), - _ - ); - } - return ( - (s = (x = s.child).sibling), - (_ = Pg(x, { mode: 'visible', children: _.children })), - !(1 & o.mode) && (_.lanes = i), - (_.return = o), - (_.sibling = null), - null !== s && - (null === (i = o.deletions) ? ((o.deletions = [s]), (o.flags |= 16)) : i.push(s)), - (o.child = _), - (o.memoizedState = null), - _ - ); - } - function qj(s, o) { - return ( - ((o = pj({ mode: 'visible', children: o }, s.mode, 0, null)).return = s), - (s.child = o) - ); - } - function sj(s, o, i, u) { - return ( - null !== u && Jg(u), - Vn(o, s.child, null, i), - ((s = qj(o, o.pendingProps.children)).flags |= 2), - (o.memoizedState = null), - s - ); - } - function vj(s, o, i) { - s.lanes |= o; - var u = s.alternate; - (null !== u && (u.lanes |= o), bh(s.return, o, i)); - } - function wj(s, o, i, u, _) { - var w = s.memoizedState; - null === w - ? (s.memoizedState = { - isBackwards: o, - rendering: null, - renderingStartTime: 0, - last: u, - tail: i, - tailMode: _ - }) - : ((w.isBackwards = o), - (w.rendering = null), - (w.renderingStartTime = 0), - (w.last = u), - (w.tail = i), - (w.tailMode = _)); - } - function xj(s, o, i) { - var u = o.pendingProps, - _ = u.revealOrder, - w = u.tail; - if ((Xi(s, o, u.children, i), 2 & (u = es.current))) - ((u = (1 & u) | 2), (o.flags |= 128)); - else { - if (null !== s && 128 & s.flags) - e: for (s = o.child; null !== s; ) { - if (13 === s.tag) null !== s.memoizedState && vj(s, i, o); - else if (19 === s.tag) vj(s, i, o); - else if (null !== s.child) { - ((s.child.return = s), (s = s.child)); - continue; - } - if (s === o) break e; - for (; null === s.sibling; ) { - if (null === s.return || s.return === o) break e; - s = s.return; - } - ((s.sibling.return = s.return), (s = s.sibling)); - } - u &= 1; - } - if ((G(es, u), 1 & o.mode)) - switch (_) { - case 'forwards': - for (i = o.child, _ = null; null !== i; ) - (null !== (s = i.alternate) && null === Ch(s) && (_ = i), (i = i.sibling)); - (null === (i = _) - ? ((_ = o.child), (o.child = null)) - : ((_ = i.sibling), (i.sibling = null)), - wj(o, !1, _, i, w)); - break; - case 'backwards': - for (i = null, _ = o.child, o.child = null; null !== _; ) { - if (null !== (s = _.alternate) && null === Ch(s)) { - o.child = _; - break; - } - ((s = _.sibling), (_.sibling = i), (i = _), (_ = s)); - } - wj(o, !0, i, null, w); - break; - case 'together': - wj(o, !1, null, null, void 0); - break; - default: - o.memoizedState = null; - } - else o.memoizedState = null; - return o.child; - } - function ij(s, o) { - !(1 & o.mode) && - null !== s && - ((s.alternate = null), (o.alternate = null), (o.flags |= 2)); - } - function Zi(s, o, i) { - if ( - (null !== s && (o.dependencies = s.dependencies), - (Ks |= o.lanes), - !(i & o.childLanes)) - ) - return null; - if (null !== s && o.child !== s.child) throw Error(p(153)); - if (null !== o.child) { - for ( - i = Pg((s = o.child), s.pendingProps), o.child = i, i.return = o; - null !== s.sibling; - ) - ((s = s.sibling), ((i = i.sibling = Pg(s, s.pendingProps)).return = o)); - i.sibling = null; - } - return o.child; - } - function Dj(s, o) { - if (!Fn) - switch (s.tailMode) { - case 'hidden': - o = s.tail; - for (var i = null; null !== o; ) - (null !== o.alternate && (i = o), (o = o.sibling)); - null === i ? (s.tail = null) : (i.sibling = null); - break; - case 'collapsed': - i = s.tail; - for (var u = null; null !== i; ) - (null !== i.alternate && (u = i), (i = i.sibling)); - null === u - ? o || null === s.tail - ? (s.tail = null) - : (s.tail.sibling = null) - : (u.sibling = null); - } - } - function S(s) { - var o = null !== s.alternate && s.alternate.child === s.child, - i = 0, - u = 0; - if (o) - for (var _ = s.child; null !== _; ) - ((i |= _.lanes | _.childLanes), - (u |= 14680064 & _.subtreeFlags), - (u |= 14680064 & _.flags), - (_.return = s), - (_ = _.sibling)); - else - for (_ = s.child; null !== _; ) - ((i |= _.lanes | _.childLanes), - (u |= _.subtreeFlags), - (u |= _.flags), - (_.return = s), - (_ = _.sibling)); - return ((s.subtreeFlags |= u), (s.childLanes = i), o); - } - function Ej(s, o, i) { - var u = o.pendingProps; - switch ((wg(o), o.tag)) { - case 2: - case 16: - case 15: - case 0: - case 11: - case 7: - case 8: - case 12: - case 9: - case 14: - return (S(o), null); - case 1: - case 17: - return (Zf(o.type) && $f(), S(o), null); - case 3: - return ( - (u = o.stateNode), - zh(), - E(Sn), - E(wn), - Eh(), - u.pendingContext && ((u.context = u.pendingContext), (u.pendingContext = null)), - (null !== s && null !== s.child) || - (Gg(o) - ? (o.flags |= 4) - : null === s || - (s.memoizedState.isDehydrated && !(256 & o.flags)) || - ((o.flags |= 1024), null !== qn && (Fj(qn), (qn = null)))), - ws(s, o), - S(o), - null - ); - case 5: - Bh(o); - var _ = xh(Qn.current); - if (((i = o.type), null !== s && null != o.stateNode)) - (Ss(s, o, i, u, _), s.ref !== o.ref && ((o.flags |= 512), (o.flags |= 2097152))); - else { - if (!u) { - if (null === o.stateNode) throw Error(p(166)); - return (S(o), null); - } - if (((s = xh(Xn.current)), Gg(o))) { - ((u = o.stateNode), (i = o.type)); - var w = o.memoizedProps; - switch (((u[dn] = o), (u[fn] = w), (s = !!(1 & o.mode)), i)) { - case 'dialog': - (D('cancel', u), D('close', u)); - break; - case 'iframe': - case 'object': - case 'embed': - D('load', u); - break; - case 'video': - case 'audio': - for (_ = 0; _ < en.length; _++) D(en[_], u); - break; - case 'source': - D('error', u); - break; - case 'img': - case 'image': - case 'link': - (D('error', u), D('load', u)); - break; - case 'details': - D('toggle', u); - break; - case 'input': - (Za(u, w), D('invalid', u)); - break; - case 'select': - ((u._wrapperState = { wasMultiple: !!w.multiple }), D('invalid', u)); - break; - case 'textarea': - (hb(u, w), D('invalid', u)); - } - for (var C in (ub(i, w), (_ = null), w)) - if (w.hasOwnProperty(C)) { - var j = w[C]; - 'children' === C - ? 'string' == typeof j - ? u.textContent !== j && - (!0 !== w.suppressHydrationWarning && Af(u.textContent, j, s), - (_ = ['children', j])) - : 'number' == typeof j && - u.textContent !== '' + j && - (!0 !== w.suppressHydrationWarning && Af(u.textContent, j, s), - (_ = ['children', '' + j])) - : x.hasOwnProperty(C) && null != j && 'onScroll' === C && D('scroll', u); - } - switch (i) { - case 'input': - (Va(u), db(u, w, !0)); - break; - case 'textarea': - (Va(u), jb(u)); - break; - case 'select': - case 'option': - break; - default: - 'function' == typeof w.onClick && (u.onclick = Bf); - } - ((u = _), (o.updateQueue = u), null !== u && (o.flags |= 4)); - } else { - ((C = 9 === _.nodeType ? _ : _.ownerDocument), - 'http://www.w3.org/1999/xhtml' === s && (s = kb(i)), - 'http://www.w3.org/1999/xhtml' === s - ? 'script' === i - ? (((s = C.createElement('div')).innerHTML = ''), - (s = s.removeChild(s.firstChild))) - : 'string' == typeof u.is - ? (s = C.createElement(i, { is: u.is })) - : ((s = C.createElement(i)), - 'select' === i && - ((C = s), - u.multiple ? (C.multiple = !0) : u.size && (C.size = u.size))) - : (s = C.createElementNS(s, i)), - (s[dn] = o), - (s[fn] = u), - Es(s, o, !1, !1), - (o.stateNode = s)); - e: { - switch (((C = vb(i, u)), i)) { - case 'dialog': - (D('cancel', s), D('close', s), (_ = u)); - break; - case 'iframe': - case 'object': - case 'embed': - (D('load', s), (_ = u)); - break; - case 'video': - case 'audio': - for (_ = 0; _ < en.length; _++) D(en[_], s); - _ = u; - break; - case 'source': - (D('error', s), (_ = u)); - break; - case 'img': - case 'image': - case 'link': - (D('error', s), D('load', s), (_ = u)); - break; - case 'details': - (D('toggle', s), (_ = u)); - break; - case 'input': - (Za(s, u), (_ = Ya(s, u)), D('invalid', s)); - break; - case 'option': - default: - _ = u; - break; - case 'select': - ((s._wrapperState = { wasMultiple: !!u.multiple }), - (_ = xe({}, u, { value: void 0 })), - D('invalid', s)); - break; - case 'textarea': - (hb(s, u), (_ = gb(s, u)), D('invalid', s)); - } - for (w in (ub(i, _), (j = _))) - if (j.hasOwnProperty(w)) { - var L = j[w]; - 'style' === w - ? sb(s, L) - : 'dangerouslySetInnerHTML' === w - ? null != (L = L ? L.__html : void 0) && $e(s, L) - : 'children' === w - ? 'string' == typeof L - ? ('textarea' !== i || '' !== L) && ob(s, L) - : 'number' == typeof L && ob(s, '' + L) - : 'suppressContentEditableWarning' !== w && - 'suppressHydrationWarning' !== w && - 'autoFocus' !== w && - (x.hasOwnProperty(w) - ? null != L && 'onScroll' === w && D('scroll', s) - : null != L && ta(s, w, L, C)); - } - switch (i) { - case 'input': - (Va(s), db(s, u, !1)); - break; - case 'textarea': - (Va(s), jb(s)); - break; - case 'option': - null != u.value && s.setAttribute('value', '' + Sa(u.value)); - break; - case 'select': - ((s.multiple = !!u.multiple), - null != (w = u.value) - ? fb(s, !!u.multiple, w, !1) - : null != u.defaultValue && fb(s, !!u.multiple, u.defaultValue, !0)); - break; - default: - 'function' == typeof _.onClick && (s.onclick = Bf); - } - switch (i) { - case 'button': - case 'input': - case 'select': - case 'textarea': - u = !!u.autoFocus; - break e; - case 'img': - u = !0; - break e; - default: - u = !1; - } - } - u && (o.flags |= 4); - } - null !== o.ref && ((o.flags |= 512), (o.flags |= 2097152)); - } - return (S(o), null); - case 6: - if (s && null != o.stateNode) xs(s, o, s.memoizedProps, u); - else { - if ('string' != typeof u && null === o.stateNode) throw Error(p(166)); - if (((i = xh(Qn.current)), xh(Xn.current), Gg(o))) { - if ( - ((u = o.stateNode), - (i = o.memoizedProps), - (u[dn] = o), - (w = u.nodeValue !== i) && null !== (s = Ln)) - ) - switch (s.tag) { - case 3: - Af(u.nodeValue, i, !!(1 & s.mode)); - break; - case 5: - !0 !== s.memoizedProps.suppressHydrationWarning && - Af(u.nodeValue, i, !!(1 & s.mode)); - } - w && (o.flags |= 4); - } else - (((u = (9 === i.nodeType ? i : i.ownerDocument).createTextNode(u))[dn] = o), - (o.stateNode = u)); - } - return (S(o), null); - case 13: - if ( - (E(es), - (u = o.memoizedState), - null === s || (null !== s.memoizedState && null !== s.memoizedState.dehydrated)) - ) { - if (Fn && null !== Bn && 1 & o.mode && !(128 & o.flags)) - (Hg(), Ig(), (o.flags |= 98560), (w = !1)); - else if (((w = Gg(o)), null !== u && null !== u.dehydrated)) { - if (null === s) { - if (!w) throw Error(p(318)); - if (!(w = null !== (w = o.memoizedState) ? w.dehydrated : null)) - throw Error(p(317)); - w[dn] = o; - } else (Ig(), !(128 & o.flags) && (o.memoizedState = null), (o.flags |= 4)); - (S(o), (w = !1)); - } else (null !== qn && (Fj(qn), (qn = null)), (w = !0)); - if (!w) return 65536 & o.flags ? o : null; - } - return 128 & o.flags - ? ((o.lanes = i), o) - : ((u = null !== u) !== (null !== s && null !== s.memoizedState) && - u && - ((o.child.flags |= 8192), - 1 & o.mode && (null === s || 1 & es.current ? 0 === zs && (zs = 3) : tj())), - null !== o.updateQueue && (o.flags |= 4), - S(o), - null); - case 4: - return (zh(), ws(s, o), null === s && sf(o.stateNode.containerInfo), S(o), null); - case 10: - return (ah(o.type._context), S(o), null); - case 19: - if ((E(es), null === (w = o.memoizedState))) return (S(o), null); - if (((u = !!(128 & o.flags)), null === (C = w.rendering))) - if (u) Dj(w, !1); - else { - if (0 !== zs || (null !== s && 128 & s.flags)) - for (s = o.child; null !== s; ) { - if (null !== (C = Ch(s))) { - for ( - o.flags |= 128, - Dj(w, !1), - null !== (u = C.updateQueue) && ((o.updateQueue = u), (o.flags |= 4)), - o.subtreeFlags = 0, - u = i, - i = o.child; - null !== i; - ) - ((s = u), - ((w = i).flags &= 14680066), - null === (C = w.alternate) - ? ((w.childLanes = 0), - (w.lanes = s), - (w.child = null), - (w.subtreeFlags = 0), - (w.memoizedProps = null), - (w.memoizedState = null), - (w.updateQueue = null), - (w.dependencies = null), - (w.stateNode = null)) - : ((w.childLanes = C.childLanes), - (w.lanes = C.lanes), - (w.child = C.child), - (w.subtreeFlags = 0), - (w.deletions = null), - (w.memoizedProps = C.memoizedProps), - (w.memoizedState = C.memoizedState), - (w.updateQueue = C.updateQueue), - (w.type = C.type), - (s = C.dependencies), - (w.dependencies = - null === s - ? null - : { lanes: s.lanes, firstContext: s.firstContext })), - (i = i.sibling)); - return (G(es, (1 & es.current) | 2), o.child); - } - s = s.sibling; - } - null !== w.tail && - dt() > Zs && - ((o.flags |= 128), (u = !0), Dj(w, !1), (o.lanes = 4194304)); - } - else { - if (!u) - if (null !== (s = Ch(C))) { - if ( - ((o.flags |= 128), - (u = !0), - null !== (i = s.updateQueue) && ((o.updateQueue = i), (o.flags |= 4)), - Dj(w, !0), - null === w.tail && 'hidden' === w.tailMode && !C.alternate && !Fn) - ) - return (S(o), null); - } else - 2 * dt() - w.renderingStartTime > Zs && - 1073741824 !== i && - ((o.flags |= 128), (u = !0), Dj(w, !1), (o.lanes = 4194304)); - w.isBackwards - ? ((C.sibling = o.child), (o.child = C)) - : (null !== (i = w.last) ? (i.sibling = C) : (o.child = C), (w.last = C)); - } - return null !== w.tail - ? ((o = w.tail), - (w.rendering = o), - (w.tail = o.sibling), - (w.renderingStartTime = dt()), - (o.sibling = null), - (i = es.current), - G(es, u ? (1 & i) | 2 : 1 & i), - o) - : (S(o), null); - case 22: - case 23: - return ( - Hj(), - (u = null !== o.memoizedState), - null !== s && (null !== s.memoizedState) !== u && (o.flags |= 8192), - u && 1 & o.mode - ? !!(1073741824 & Vs) && (S(o), 6 & o.subtreeFlags && (o.flags |= 8192)) - : S(o), - null - ); - case 24: - case 25: - return null; - } - throw Error(p(156, o.tag)); - } - function Ij(s, o) { - switch ((wg(o), o.tag)) { - case 1: - return ( - Zf(o.type) && $f(), - 65536 & (s = o.flags) ? ((o.flags = (-65537 & s) | 128), o) : null - ); - case 3: - return ( - zh(), - E(Sn), - E(wn), - Eh(), - 65536 & (s = o.flags) && !(128 & s) ? ((o.flags = (-65537 & s) | 128), o) : null - ); - case 5: - return (Bh(o), null); - case 13: - if ((E(es), null !== (s = o.memoizedState) && null !== s.dehydrated)) { - if (null === o.alternate) throw Error(p(340)); - Ig(); - } - return 65536 & (s = o.flags) ? ((o.flags = (-65537 & s) | 128), o) : null; - case 19: - return (E(es), null); - case 4: - return (zh(), null); - case 10: - return (ah(o.type._context), null); - case 22: - case 23: - return (Hj(), null); - default: - return null; - } - } - ((Es = function (s, o) { - for (var i = o.child; null !== i; ) { - if (5 === i.tag || 6 === i.tag) s.appendChild(i.stateNode); - else if (4 !== i.tag && null !== i.child) { - ((i.child.return = i), (i = i.child)); - continue; - } - if (i === o) break; - for (; null === i.sibling; ) { - if (null === i.return || i.return === o) return; - i = i.return; - } - ((i.sibling.return = i.return), (i = i.sibling)); - } - }), - (ws = function () {}), - (Ss = function (s, o, i, u) { - var _ = s.memoizedProps; - if (_ !== u) { - ((s = o.stateNode), xh(Xn.current)); - var w, - C = null; - switch (i) { - case 'input': - ((_ = Ya(s, _)), (u = Ya(s, u)), (C = [])); - break; - case 'select': - ((_ = xe({}, _, { value: void 0 })), - (u = xe({}, u, { value: void 0 })), - (C = [])); - break; - case 'textarea': - ((_ = gb(s, _)), (u = gb(s, u)), (C = [])); - break; - default: - 'function' != typeof _.onClick && - 'function' == typeof u.onClick && - (s.onclick = Bf); - } - for (B in (ub(i, u), (i = null), _)) - if (!u.hasOwnProperty(B) && _.hasOwnProperty(B) && null != _[B]) - if ('style' === B) { - var j = _[B]; - for (w in j) j.hasOwnProperty(w) && (i || (i = {}), (i[w] = '')); - } else - 'dangerouslySetInnerHTML' !== B && - 'children' !== B && - 'suppressContentEditableWarning' !== B && - 'suppressHydrationWarning' !== B && - 'autoFocus' !== B && - (x.hasOwnProperty(B) ? C || (C = []) : (C = C || []).push(B, null)); - for (B in u) { - var L = u[B]; - if ( - ((j = null != _ ? _[B] : void 0), - u.hasOwnProperty(B) && L !== j && (null != L || null != j)) - ) - if ('style' === B) - if (j) { - for (w in j) - !j.hasOwnProperty(w) || - (L && L.hasOwnProperty(w)) || - (i || (i = {}), (i[w] = '')); - for (w in L) - L.hasOwnProperty(w) && j[w] !== L[w] && (i || (i = {}), (i[w] = L[w])); - } else (i || (C || (C = []), C.push(B, i)), (i = L)); - else - 'dangerouslySetInnerHTML' === B - ? ((L = L ? L.__html : void 0), - (j = j ? j.__html : void 0), - null != L && j !== L && (C = C || []).push(B, L)) - : 'children' === B - ? ('string' != typeof L && 'number' != typeof L) || - (C = C || []).push(B, '' + L) - : 'suppressContentEditableWarning' !== B && - 'suppressHydrationWarning' !== B && - (x.hasOwnProperty(B) - ? (null != L && 'onScroll' === B && D('scroll', s), - C || j === L || (C = [])) - : (C = C || []).push(B, L)); - } - i && (C = C || []).push('style', i); - var B = C; - (o.updateQueue = B) && (o.flags |= 4); - } - }), - (xs = function (s, o, i, u) { - i !== u && (o.flags |= 4); - })); - var Cs = !1, - Os = !1, - As = 'function' == typeof WeakSet ? WeakSet : Set, - js = null; - function Lj(s, o) { - var i = s.ref; - if (null !== i) - if ('function' == typeof i) - try { - i(null); - } catch (i) { - W(s, o, i); - } - else i.current = null; - } - function Mj(s, o, i) { - try { - i(); - } catch (i) { - W(s, o, i); - } - } - var Is = !1; - function Pj(s, o, i) { - var u = o.updateQueue; - if (null !== (u = null !== u ? u.lastEffect : null)) { - var _ = (u = u.next); - do { - if ((_.tag & s) === s) { - var w = _.destroy; - ((_.destroy = void 0), void 0 !== w && Mj(o, i, w)); - } - _ = _.next; - } while (_ !== u); - } - } - function Qj(s, o) { - if (null !== (o = null !== (o = o.updateQueue) ? o.lastEffect : null)) { - var i = (o = o.next); - do { - if ((i.tag & s) === s) { - var u = i.create; - i.destroy = u(); - } - i = i.next; - } while (i !== o); - } - } - function Rj(s) { - var o = s.ref; - if (null !== o) { - var i = s.stateNode; - (s.tag, (s = i), 'function' == typeof o ? o(s) : (o.current = s)); - } - } - function Sj(s) { - var o = s.alternate; - (null !== o && ((s.alternate = null), Sj(o)), - (s.child = null), - (s.deletions = null), - (s.sibling = null), - 5 === s.tag && - null !== (o = s.stateNode) && - (delete o[dn], delete o[fn], delete o[gn], delete o[yn], delete o[vn]), - (s.stateNode = null), - (s.return = null), - (s.dependencies = null), - (s.memoizedProps = null), - (s.memoizedState = null), - (s.pendingProps = null), - (s.stateNode = null), - (s.updateQueue = null)); - } - function Tj(s) { - return 5 === s.tag || 3 === s.tag || 4 === s.tag; - } - function Uj(s) { - e: for (;;) { - for (; null === s.sibling; ) { - if (null === s.return || Tj(s.return)) return null; - s = s.return; - } - for ( - s.sibling.return = s.return, s = s.sibling; - 5 !== s.tag && 6 !== s.tag && 18 !== s.tag; - ) { - if (2 & s.flags) continue e; - if (null === s.child || 4 === s.tag) continue e; - ((s.child.return = s), (s = s.child)); - } - if (!(2 & s.flags)) return s.stateNode; - } - } - function Vj(s, o, i) { - var u = s.tag; - if (5 === u || 6 === u) - ((s = s.stateNode), - o - ? 8 === i.nodeType - ? i.parentNode.insertBefore(s, o) - : i.insertBefore(s, o) - : (8 === i.nodeType - ? (o = i.parentNode).insertBefore(s, i) - : (o = i).appendChild(s), - null != (i = i._reactRootContainer) || null !== o.onclick || (o.onclick = Bf))); - else if (4 !== u && null !== (s = s.child)) - for (Vj(s, o, i), s = s.sibling; null !== s; ) (Vj(s, o, i), (s = s.sibling)); - } - function Wj(s, o, i) { - var u = s.tag; - if (5 === u || 6 === u) - ((s = s.stateNode), o ? i.insertBefore(s, o) : i.appendChild(s)); - else if (4 !== u && null !== (s = s.child)) - for (Wj(s, o, i), s = s.sibling; null !== s; ) (Wj(s, o, i), (s = s.sibling)); - } - var Ps = null, - Ms = !1; - function Yj(s, o, i) { - for (i = i.child; null !== i; ) (Zj(s, o, i), (i = i.sibling)); - } - function Zj(s, o, i) { - if (wt && 'function' == typeof wt.onCommitFiberUnmount) - try { - wt.onCommitFiberUnmount(Et, i); - } catch (s) {} - switch (i.tag) { - case 5: - Os || Lj(i, o); - case 6: - var u = Ps, - _ = Ms; - ((Ps = null), - Yj(s, o, i), - (Ms = _), - null !== (Ps = u) && - (Ms - ? ((s = Ps), - (i = i.stateNode), - 8 === s.nodeType ? s.parentNode.removeChild(i) : s.removeChild(i)) - : Ps.removeChild(i.stateNode))); - break; - case 18: - null !== Ps && - (Ms - ? ((s = Ps), - (i = i.stateNode), - 8 === s.nodeType ? Kf(s.parentNode, i) : 1 === s.nodeType && Kf(s, i), - bd(s)) - : Kf(Ps, i.stateNode)); - break; - case 4: - ((u = Ps), - (_ = Ms), - (Ps = i.stateNode.containerInfo), - (Ms = !0), - Yj(s, o, i), - (Ps = u), - (Ms = _)); - break; - case 0: - case 11: - case 14: - case 15: - if (!Os && null !== (u = i.updateQueue) && null !== (u = u.lastEffect)) { - _ = u = u.next; - do { - var w = _, - x = w.destroy; - ((w = w.tag), void 0 !== x && (2 & w || 4 & w) && Mj(i, o, x), (_ = _.next)); - } while (_ !== u); - } - Yj(s, o, i); - break; - case 1: - if (!Os && (Lj(i, o), 'function' == typeof (u = i.stateNode).componentWillUnmount)) - try { - ((u.props = i.memoizedProps), - (u.state = i.memoizedState), - u.componentWillUnmount()); - } catch (s) { - W(i, o, s); - } - Yj(s, o, i); - break; - case 21: - Yj(s, o, i); - break; - case 22: - 1 & i.mode - ? ((Os = (u = Os) || null !== i.memoizedState), Yj(s, o, i), (Os = u)) - : Yj(s, o, i); - break; - default: - Yj(s, o, i); - } - } - function ak(s) { - var o = s.updateQueue; - if (null !== o) { - s.updateQueue = null; - var i = s.stateNode; - (null === i && (i = s.stateNode = new As()), - o.forEach(function (o) { - var u = bk.bind(null, s, o); - i.has(o) || (i.add(o), o.then(u, u)); - })); - } - } - function ck(s, o) { - var i = o.deletions; - if (null !== i) - for (var u = 0; u < i.length; u++) { - var _ = i[u]; - try { - var w = s, - x = o, - C = x; - e: for (; null !== C; ) { - switch (C.tag) { - case 5: - ((Ps = C.stateNode), (Ms = !1)); - break e; - case 3: - case 4: - ((Ps = C.stateNode.containerInfo), (Ms = !0)); - break e; - } - C = C.return; - } - if (null === Ps) throw Error(p(160)); - (Zj(w, x, _), (Ps = null), (Ms = !1)); - var j = _.alternate; - (null !== j && (j.return = null), (_.return = null)); - } catch (s) { - W(_, o, s); - } - } - if (12854 & o.subtreeFlags) for (o = o.child; null !== o; ) (dk(o, s), (o = o.sibling)); - } - function dk(s, o) { - var i = s.alternate, - u = s.flags; - switch (s.tag) { - case 0: - case 11: - case 14: - case 15: - if ((ck(o, s), ek(s), 4 & u)) { - try { - (Pj(3, s, s.return), Qj(3, s)); - } catch (o) { - W(s, s.return, o); - } - try { - Pj(5, s, s.return); - } catch (o) { - W(s, s.return, o); - } - } - break; - case 1: - (ck(o, s), ek(s), 512 & u && null !== i && Lj(i, i.return)); - break; - case 5: - if ((ck(o, s), ek(s), 512 & u && null !== i && Lj(i, i.return), 32 & s.flags)) { - var _ = s.stateNode; - try { - ob(_, ''); - } catch (o) { - W(s, s.return, o); - } - } - if (4 & u && null != (_ = s.stateNode)) { - var w = s.memoizedProps, - x = null !== i ? i.memoizedProps : w, - C = s.type, - j = s.updateQueue; - if (((s.updateQueue = null), null !== j)) - try { - ('input' === C && 'radio' === w.type && null != w.name && ab(_, w), vb(C, x)); - var L = vb(C, w); - for (x = 0; x < j.length; x += 2) { - var B = j[x], - $ = j[x + 1]; - 'style' === B - ? sb(_, $) - : 'dangerouslySetInnerHTML' === B - ? $e(_, $) - : 'children' === B - ? ob(_, $) - : ta(_, B, $, L); - } - switch (C) { - case 'input': - bb(_, w); - break; - case 'textarea': - ib(_, w); - break; - case 'select': - var V = _._wrapperState.wasMultiple; - _._wrapperState.wasMultiple = !!w.multiple; - var U = w.value; - null != U - ? fb(_, !!w.multiple, U, !1) - : V !== !!w.multiple && - (null != w.defaultValue - ? fb(_, !!w.multiple, w.defaultValue, !0) - : fb(_, !!w.multiple, w.multiple ? [] : '', !1)); - } - _[fn] = w; - } catch (o) { - W(s, s.return, o); - } - } - break; - case 6: - if ((ck(o, s), ek(s), 4 & u)) { - if (null === s.stateNode) throw Error(p(162)); - ((_ = s.stateNode), (w = s.memoizedProps)); - try { - _.nodeValue = w; - } catch (o) { - W(s, s.return, o); - } - } - break; - case 3: - if ((ck(o, s), ek(s), 4 & u && null !== i && i.memoizedState.isDehydrated)) - try { - bd(o.containerInfo); - } catch (o) { - W(s, s.return, o); - } - break; - case 4: - default: - (ck(o, s), ek(s)); - break; - case 13: - (ck(o, s), - ek(s), - 8192 & (_ = s.child).flags && - ((w = null !== _.memoizedState), - (_.stateNode.isHidden = w), - !w || - (null !== _.alternate && null !== _.alternate.memoizedState) || - (Xs = dt())), - 4 & u && ak(s)); - break; - case 22: - if ( - ((B = null !== i && null !== i.memoizedState), - 1 & s.mode ? ((Os = (L = Os) || B), ck(o, s), (Os = L)) : ck(o, s), - ek(s), - 8192 & u) - ) { - if ( - ((L = null !== s.memoizedState), (s.stateNode.isHidden = L) && !B && 1 & s.mode) - ) - for (js = s, B = s.child; null !== B; ) { - for ($ = js = B; null !== js; ) { - switch (((U = (V = js).child), V.tag)) { - case 0: - case 11: - case 14: - case 15: - Pj(4, V, V.return); - break; - case 1: - Lj(V, V.return); - var z = V.stateNode; - if ('function' == typeof z.componentWillUnmount) { - ((u = V), (i = V.return)); - try { - ((o = u), - (z.props = o.memoizedProps), - (z.state = o.memoizedState), - z.componentWillUnmount()); - } catch (s) { - W(u, i, s); - } - } - break; - case 5: - Lj(V, V.return); - break; - case 22: - if (null !== V.memoizedState) { - gk($); - continue; - } - } - null !== U ? ((U.return = V), (js = U)) : gk($); - } - B = B.sibling; - } - e: for (B = null, $ = s; ; ) { - if (5 === $.tag) { - if (null === B) { - B = $; - try { - ((_ = $.stateNode), - L - ? 'function' == typeof (w = _.style).setProperty - ? w.setProperty('display', 'none', 'important') - : (w.display = 'none') - : ((C = $.stateNode), - (x = - null != (j = $.memoizedProps.style) && j.hasOwnProperty('display') - ? j.display - : null), - (C.style.display = rb('display', x)))); - } catch (o) { - W(s, s.return, o); - } - } - } else if (6 === $.tag) { - if (null === B) - try { - $.stateNode.nodeValue = L ? '' : $.memoizedProps; - } catch (o) { - W(s, s.return, o); - } - } else if ( - ((22 !== $.tag && 23 !== $.tag) || null === $.memoizedState || $ === s) && - null !== $.child - ) { - (($.child.return = $), ($ = $.child)); - continue; - } - if ($ === s) break e; - for (; null === $.sibling; ) { - if (null === $.return || $.return === s) break e; - (B === $ && (B = null), ($ = $.return)); - } - (B === $ && (B = null), ($.sibling.return = $.return), ($ = $.sibling)); - } - } - break; - case 19: - (ck(o, s), ek(s), 4 & u && ak(s)); - case 21: - } - } - function ek(s) { - var o = s.flags; - if (2 & o) { - try { - e: { - for (var i = s.return; null !== i; ) { - if (Tj(i)) { - var u = i; - break e; - } - i = i.return; - } - throw Error(p(160)); - } - switch (u.tag) { - case 5: - var _ = u.stateNode; - (32 & u.flags && (ob(_, ''), (u.flags &= -33)), Wj(s, Uj(s), _)); - break; - case 3: - case 4: - var w = u.stateNode.containerInfo; - Vj(s, Uj(s), w); - break; - default: - throw Error(p(161)); - } - } catch (o) { - W(s, s.return, o); - } - s.flags &= -3; - } - 4096 & o && (s.flags &= -4097); - } - function hk(s, o, i) { - ((js = s), ik(s, o, i)); - } - function ik(s, o, i) { - for (var u = !!(1 & s.mode); null !== js; ) { - var _ = js, - w = _.child; - if (22 === _.tag && u) { - var x = null !== _.memoizedState || Cs; - if (!x) { - var C = _.alternate, - j = (null !== C && null !== C.memoizedState) || Os; - C = Cs; - var L = Os; - if (((Cs = x), (Os = j) && !L)) - for (js = _; null !== js; ) - ((j = (x = js).child), - 22 === x.tag && null !== x.memoizedState - ? jk(_) - : null !== j - ? ((j.return = x), (js = j)) - : jk(_)); - for (; null !== w; ) ((js = w), ik(w, o, i), (w = w.sibling)); - ((js = _), (Cs = C), (Os = L)); - } - kk(s); - } else 8772 & _.subtreeFlags && null !== w ? ((w.return = _), (js = w)) : kk(s); - } - } - function kk(s) { - for (; null !== js; ) { - var o = js; - if (8772 & o.flags) { - var i = o.alternate; - try { - if (8772 & o.flags) - switch (o.tag) { - case 0: - case 11: - case 15: - Os || Qj(5, o); - break; - case 1: - var u = o.stateNode; - if (4 & o.flags && !Os) - if (null === i) u.componentDidMount(); - else { - var _ = - o.elementType === o.type - ? i.memoizedProps - : Ci(o.type, i.memoizedProps); - u.componentDidUpdate( - _, - i.memoizedState, - u.__reactInternalSnapshotBeforeUpdate - ); - } - var w = o.updateQueue; - null !== w && sh(o, w, u); - break; - case 3: - var x = o.updateQueue; - if (null !== x) { - if (((i = null), null !== o.child)) - switch (o.child.tag) { - case 5: - case 1: - i = o.child.stateNode; - } - sh(o, x, i); - } - break; - case 5: - var C = o.stateNode; - if (null === i && 4 & o.flags) { - i = C; - var j = o.memoizedProps; - switch (o.type) { - case 'button': - case 'input': - case 'select': - case 'textarea': - j.autoFocus && i.focus(); - break; - case 'img': - j.src && (i.src = j.src); - } - } - break; - case 6: - case 4: - case 12: - case 19: - case 17: - case 21: - case 22: - case 23: - case 25: - break; - case 13: - if (null === o.memoizedState) { - var L = o.alternate; - if (null !== L) { - var B = L.memoizedState; - if (null !== B) { - var $ = B.dehydrated; - null !== $ && bd($); - } - } - } - break; - default: - throw Error(p(163)); - } - Os || (512 & o.flags && Rj(o)); - } catch (s) { - W(o, o.return, s); - } - } - if (o === s) { - js = null; - break; - } - if (null !== (i = o.sibling)) { - ((i.return = o.return), (js = i)); - break; - } - js = o.return; - } - } - function gk(s) { - for (; null !== js; ) { - var o = js; - if (o === s) { - js = null; - break; - } - var i = o.sibling; - if (null !== i) { - ((i.return = o.return), (js = i)); - break; - } - js = o.return; - } - } - function jk(s) { - for (; null !== js; ) { - var o = js; - try { - switch (o.tag) { - case 0: - case 11: - case 15: - var i = o.return; - try { - Qj(4, o); - } catch (s) { - W(o, i, s); - } - break; - case 1: - var u = o.stateNode; - if ('function' == typeof u.componentDidMount) { - var _ = o.return; - try { - u.componentDidMount(); - } catch (s) { - W(o, _, s); - } - } - var w = o.return; - try { - Rj(o); - } catch (s) { - W(o, w, s); - } - break; - case 5: - var x = o.return; - try { - Rj(o); - } catch (s) { - W(o, x, s); - } - } - } catch (s) { - W(o, o.return, s); - } - if (o === s) { - js = null; - break; - } - var C = o.sibling; - if (null !== C) { - ((C.return = o.return), (js = C)); - break; - } - js = o.return; - } - } - var Ts, - Ns = Math.ceil, - Rs = z.ReactCurrentDispatcher, - Ds = z.ReactCurrentOwner, - Ls = z.ReactCurrentBatchConfig, - Bs = 0, - Fs = null, - qs = null, - $s = 0, - Vs = 0, - Us = Uf(0), - zs = 0, - Ws = null, - Ks = 0, - Hs = 0, - Js = 0, - Gs = null, - Ys = null, - Xs = 0, - Zs = 1 / 0, - Qs = null, - eo = !1, - to = null, - ro = null, - no = !1, - so = null, - oo = 0, - io = 0, - ao = null, - lo = -1, - co = 0; - function R() { - return 6 & Bs ? dt() : -1 !== lo ? lo : (lo = dt()); - } - function yi(s) { - return 1 & s.mode - ? 2 & Bs && 0 !== $s - ? $s & -$s - : null !== $n.transition - ? (0 === co && (co = yc()), co) - : 0 !== (s = At) - ? s - : (s = void 0 === (s = window.event) ? 16 : jd(s.type)) - : 1; - } - function gi(s, o, i, u) { - if (50 < io) throw ((io = 0), (ao = null), Error(p(185))); - (Ac(s, i, u), - (2 & Bs && s === Fs) || - (s === Fs && (!(2 & Bs) && (Hs |= i), 4 === zs && Ck(s, $s)), - Dk(s, u), - 1 === i && 0 === Bs && !(1 & o.mode) && ((Zs = dt() + 500), Cn && jg()))); - } - function Dk(s, o) { - var i = s.callbackNode; - !(function wc(s, o) { - for ( - var i = s.suspendedLanes, - u = s.pingedLanes, - _ = s.expirationTimes, - w = s.pendingLanes; - 0 < w; - ) { - var x = 31 - St(w), - C = 1 << x, - j = _[x]; - (-1 === j - ? (C & i && !(C & u)) || (_[x] = vc(C, o)) - : j <= o && (s.expiredLanes |= C), - (w &= ~C)); - } - })(s, o); - var u = uc(s, s === Fs ? $s : 0); - if (0 === u) (null !== i && ut(i), (s.callbackNode = null), (s.callbackPriority = 0)); - else if (((o = u & -u), s.callbackPriority !== o)) { - if ((null != i && ut(i), 1 === o)) - (0 === s.tag - ? (function ig(s) { - ((Cn = !0), hg(s)); - })(Ek.bind(null, s)) - : hg(Ek.bind(null, s)), - pn(function () { - !(6 & Bs) && jg(); - }), - (i = null)); - else { - switch (Dc(u)) { - case 1: - i = gt; - break; - case 4: - i = yt; - break; - case 16: - default: - i = vt; - break; - case 536870912: - i = _t; - } - i = Fk(i, Gk.bind(null, s)); - } - ((s.callbackPriority = o), (s.callbackNode = i)); - } - } - function Gk(s, o) { - if (((lo = -1), (co = 0), 6 & Bs)) throw Error(p(327)); - var i = s.callbackNode; - if (Hk() && s.callbackNode !== i) return null; - var u = uc(s, s === Fs ? $s : 0); - if (0 === u) return null; - if (30 & u || u & s.expiredLanes || o) o = Ik(s, u); - else { - o = u; - var _ = Bs; - Bs |= 2; - var w = Jk(); - for ((Fs === s && $s === o) || ((Qs = null), (Zs = dt() + 500), Kk(s, o)); ; ) - try { - Lk(); - break; - } catch (o) { - Mk(s, o); - } - ($g(), - (Rs.current = w), - (Bs = _), - null !== qs ? (o = 0) : ((Fs = null), ($s = 0), (o = zs))); - } - if (0 !== o) { - if ((2 === o && 0 !== (_ = xc(s)) && ((u = _), (o = Nk(s, _))), 1 === o)) - throw ((i = Ws), Kk(s, 0), Ck(s, u), Dk(s, dt()), i); - if (6 === o) Ck(s, u); - else { - if ( - ((_ = s.current.alternate), - !( - 30 & u || - (function Ok(s) { - for (var o = s; ; ) { - if (16384 & o.flags) { - var i = o.updateQueue; - if (null !== i && null !== (i = i.stores)) - for (var u = 0; u < i.length; u++) { - var _ = i[u], - w = _.getSnapshot; - _ = _.value; - try { - if (!Lr(w(), _)) return !1; - } catch (s) { - return !1; - } - } - } - if (((i = o.child), 16384 & o.subtreeFlags && null !== i)) - ((i.return = o), (o = i)); - else { - if (o === s) break; - for (; null === o.sibling; ) { - if (null === o.return || o.return === s) return !0; - o = o.return; - } - ((o.sibling.return = o.return), (o = o.sibling)); - } - } - return !0; - })(_) || - ((o = Ik(s, u)), - 2 === o && ((w = xc(s)), 0 !== w && ((u = w), (o = Nk(s, w)))), - 1 !== o) - )) - ) - throw ((i = Ws), Kk(s, 0), Ck(s, u), Dk(s, dt()), i); - switch (((s.finishedWork = _), (s.finishedLanes = u), o)) { - case 0: - case 1: - throw Error(p(345)); - case 2: - case 5: - Pk(s, Ys, Qs); - break; - case 3: - if ((Ck(s, u), (130023424 & u) === u && 10 < (o = Xs + 500 - dt()))) { - if (0 !== uc(s, 0)) break; - if (((_ = s.suspendedLanes) & u) !== u) { - (R(), (s.pingedLanes |= s.suspendedLanes & _)); - break; - } - s.timeoutHandle = ln(Pk.bind(null, s, Ys, Qs), o); - break; - } - Pk(s, Ys, Qs); - break; - case 4: - if ((Ck(s, u), (4194240 & u) === u)) break; - for (o = s.eventTimes, _ = -1; 0 < u; ) { - var x = 31 - St(u); - ((w = 1 << x), (x = o[x]) > _ && (_ = x), (u &= ~w)); - } - if ( - ((u = _), - 10 < - (u = - (120 > (u = dt() - u) - ? 120 - : 480 > u - ? 480 - : 1080 > u - ? 1080 - : 1920 > u - ? 1920 - : 3e3 > u - ? 3e3 - : 4320 > u - ? 4320 - : 1960 * Ns(u / 1960)) - u)) - ) { - s.timeoutHandle = ln(Pk.bind(null, s, Ys, Qs), u); - break; - } - Pk(s, Ys, Qs); - break; - default: - throw Error(p(329)); - } - } - } - return (Dk(s, dt()), s.callbackNode === i ? Gk.bind(null, s) : null); - } - function Nk(s, o) { - var i = Gs; - return ( - s.current.memoizedState.isDehydrated && (Kk(s, o).flags |= 256), - 2 !== (s = Ik(s, o)) && ((o = Ys), (Ys = i), null !== o && Fj(o)), - s - ); - } - function Fj(s) { - null === Ys ? (Ys = s) : Ys.push.apply(Ys, s); - } - function Ck(s, o) { - for ( - o &= ~Js, o &= ~Hs, s.suspendedLanes |= o, s.pingedLanes &= ~o, s = s.expirationTimes; - 0 < o; - ) { - var i = 31 - St(o), - u = 1 << i; - ((s[i] = -1), (o &= ~u)); - } - } - function Ek(s) { - if (6 & Bs) throw Error(p(327)); - Hk(); - var o = uc(s, 0); - if (!(1 & o)) return (Dk(s, dt()), null); - var i = Ik(s, o); - if (0 !== s.tag && 2 === i) { - var u = xc(s); - 0 !== u && ((o = u), (i = Nk(s, u))); - } - if (1 === i) throw ((i = Ws), Kk(s, 0), Ck(s, o), Dk(s, dt()), i); - if (6 === i) throw Error(p(345)); - return ( - (s.finishedWork = s.current.alternate), - (s.finishedLanes = o), - Pk(s, Ys, Qs), - Dk(s, dt()), - null - ); - } - function Qk(s, o) { - var i = Bs; - Bs |= 1; - try { - return s(o); - } finally { - 0 === (Bs = i) && ((Zs = dt() + 500), Cn && jg()); - } - } - function Rk(s) { - null !== so && 0 === so.tag && !(6 & Bs) && Hk(); - var o = Bs; - Bs |= 1; - var i = Ls.transition, - u = At; - try { - if (((Ls.transition = null), (At = 1), s)) return s(); - } finally { - ((At = u), (Ls.transition = i), !(6 & (Bs = o)) && jg()); - } - } - function Hj() { - ((Vs = Us.current), E(Us)); - } - function Kk(s, o) { - ((s.finishedWork = null), (s.finishedLanes = 0)); - var i = s.timeoutHandle; - if ((-1 !== i && ((s.timeoutHandle = -1), cn(i)), null !== qs)) - for (i = qs.return; null !== i; ) { - var u = i; - switch ((wg(u), u.tag)) { - case 1: - null != (u = u.type.childContextTypes) && $f(); - break; - case 3: - (zh(), E(Sn), E(wn), Eh()); - break; - case 5: - Bh(u); - break; - case 4: - zh(); - break; - case 13: - case 19: - E(es); - break; - case 10: - ah(u.type._context); - break; - case 22: - case 23: - Hj(); - } - i = i.return; - } - if ( - ((Fs = s), - (qs = s = Pg(s.current, null)), - ($s = Vs = o), - (zs = 0), - (Ws = null), - (Js = Hs = Ks = 0), - (Ys = Gs = null), - null !== Jn) - ) { - for (o = 0; o < Jn.length; o++) - if (null !== (u = (i = Jn[o]).interleaved)) { - i.interleaved = null; - var _ = u.next, - w = i.pending; - if (null !== w) { - var x = w.next; - ((w.next = _), (u.next = x)); - } - i.pending = u; - } - Jn = null; - } - return s; - } - function Mk(s, o) { - for (;;) { - var i = qs; - try { - if (($g(), (rs.current = ds), cs)) { - for (var u = os.memoizedState; null !== u; ) { - var _ = u.queue; - (null !== _ && (_.pending = null), (u = u.next)); - } - cs = !1; - } - if ( - ((ss = 0), - (ls = as = os = null), - (us = !1), - (ps = 0), - (Ds.current = null), - null === i || null === i.return) - ) { - ((zs = 1), (Ws = o), (qs = null)); - break; - } - e: { - var w = s, - x = i.return, - C = i, - j = o; - if ( - ((o = $s), - (C.flags |= 32768), - null !== j && 'object' == typeof j && 'function' == typeof j.then) - ) { - var L = j, - B = C, - $ = B.tag; - if (!(1 & B.mode || (0 !== $ && 11 !== $ && 15 !== $))) { - var V = B.alternate; - V - ? ((B.updateQueue = V.updateQueue), - (B.memoizedState = V.memoizedState), - (B.lanes = V.lanes)) - : ((B.updateQueue = null), (B.memoizedState = null)); - } - var U = Ui(x); - if (null !== U) { - ((U.flags &= -257), Vi(U, x, C, 0, o), 1 & U.mode && Si(w, L, o), (j = L)); - var z = (o = U).updateQueue; - if (null === z) { - var Y = new Set(); - (Y.add(j), (o.updateQueue = Y)); - } else z.add(j); - break e; - } - if (!(1 & o)) { - (Si(w, L, o), tj()); - break e; - } - j = Error(p(426)); - } else if (Fn && 1 & C.mode) { - var Z = Ui(x); - if (null !== Z) { - (!(65536 & Z.flags) && (Z.flags |= 256), Vi(Z, x, C, 0, o), Jg(Ji(j, C))); - break e; - } - } - ((w = j = Ji(j, C)), - 4 !== zs && (zs = 2), - null === Gs ? (Gs = [w]) : Gs.push(w), - (w = x)); - do { - switch (w.tag) { - case 3: - ((w.flags |= 65536), (o &= -o), (w.lanes |= o), ph(w, Ni(0, j, o))); - break e; - case 1: - C = j; - var ee = w.type, - ie = w.stateNode; - if ( - !( - 128 & w.flags || - ('function' != typeof ee.getDerivedStateFromError && - (null === ie || - 'function' != typeof ie.componentDidCatch || - (null !== ro && ro.has(ie)))) - ) - ) { - ((w.flags |= 65536), (o &= -o), (w.lanes |= o), ph(w, Qi(w, C, o))); - break e; - } - } - w = w.return; - } while (null !== w); - } - Sk(i); - } catch (s) { - ((o = s), qs === i && null !== i && (qs = i = i.return)); - continue; - } - break; - } - } - function Jk() { - var s = Rs.current; - return ((Rs.current = ds), null === s ? ds : s); - } - function tj() { - ((0 !== zs && 3 !== zs && 2 !== zs) || (zs = 4), - null === Fs || (!(268435455 & Ks) && !(268435455 & Hs)) || Ck(Fs, $s)); - } - function Ik(s, o) { - var i = Bs; - Bs |= 2; - var u = Jk(); - for ((Fs === s && $s === o) || ((Qs = null), Kk(s, o)); ; ) - try { - Tk(); - break; - } catch (o) { - Mk(s, o); - } - if (($g(), (Bs = i), (Rs.current = u), null !== qs)) throw Error(p(261)); - return ((Fs = null), ($s = 0), zs); - } - function Tk() { - for (; null !== qs; ) Uk(qs); - } - function Lk() { - for (; null !== qs && !pt(); ) Uk(qs); - } - function Uk(s) { - var o = Ts(s.alternate, s, Vs); - ((s.memoizedProps = s.pendingProps), - null === o ? Sk(s) : (qs = o), - (Ds.current = null)); - } - function Sk(s) { - var o = s; - do { - var i = o.alternate; - if (((s = o.return), 32768 & o.flags)) { - if (null !== (i = Ij(i, o))) return ((i.flags &= 32767), void (qs = i)); - if (null === s) return ((zs = 6), void (qs = null)); - ((s.flags |= 32768), (s.subtreeFlags = 0), (s.deletions = null)); - } else if (null !== (i = Ej(i, o, Vs))) return void (qs = i); - if (null !== (o = o.sibling)) return void (qs = o); - qs = o = s; - } while (null !== o); - 0 === zs && (zs = 5); - } - function Pk(s, o, i) { - var u = At, - _ = Ls.transition; - try { - ((Ls.transition = null), - (At = 1), - (function Wk(s, o, i, u) { - do { - Hk(); - } while (null !== so); - if (6 & Bs) throw Error(p(327)); - i = s.finishedWork; - var _ = s.finishedLanes; - if (null === i) return null; - if (((s.finishedWork = null), (s.finishedLanes = 0), i === s.current)) - throw Error(p(177)); - ((s.callbackNode = null), (s.callbackPriority = 0)); - var w = i.lanes | i.childLanes; - if ( - ((function Bc(s, o) { - var i = s.pendingLanes & ~o; - ((s.pendingLanes = o), - (s.suspendedLanes = 0), - (s.pingedLanes = 0), - (s.expiredLanes &= o), - (s.mutableReadLanes &= o), - (s.entangledLanes &= o), - (o = s.entanglements)); - var u = s.eventTimes; - for (s = s.expirationTimes; 0 < i; ) { - var _ = 31 - St(i), - w = 1 << _; - ((o[_] = 0), (u[_] = -1), (s[_] = -1), (i &= ~w)); - } - })(s, w), - s === Fs && ((qs = Fs = null), ($s = 0)), - (!(2064 & i.subtreeFlags) && !(2064 & i.flags)) || - no || - ((no = !0), - Fk(vt, function () { - return (Hk(), null); - })), - (w = !!(15990 & i.flags)), - !!(15990 & i.subtreeFlags) || w) - ) { - ((w = Ls.transition), (Ls.transition = null)); - var x = At; - At = 1; - var C = Bs; - ((Bs |= 4), - (Ds.current = null), - (function Oj(s, o) { - if (((on = zt), Ne((s = Me())))) { - if ('selectionStart' in s) - var i = { start: s.selectionStart, end: s.selectionEnd }; - else - e: { - var u = - (i = ((i = s.ownerDocument) && i.defaultView) || window) - .getSelection && i.getSelection(); - if (u && 0 !== u.rangeCount) { - i = u.anchorNode; - var _ = u.anchorOffset, - w = u.focusNode; - u = u.focusOffset; - try { - (i.nodeType, w.nodeType); - } catch (s) { - i = null; - break e; - } - var x = 0, - C = -1, - j = -1, - L = 0, - B = 0, - $ = s, - V = null; - t: for (;;) { - for ( - var U; - $ !== i || (0 !== _ && 3 !== $.nodeType) || (C = x + _), - $ !== w || (0 !== u && 3 !== $.nodeType) || (j = x + u), - 3 === $.nodeType && (x += $.nodeValue.length), - null !== (U = $.firstChild); - ) - ((V = $), ($ = U)); - for (;;) { - if ($ === s) break t; - if ( - (V === i && ++L === _ && (C = x), - V === w && ++B === u && (j = x), - null !== (U = $.nextSibling)) - ) - break; - V = ($ = V).parentNode; - } - $ = U; - } - i = -1 === C || -1 === j ? null : { start: C, end: j }; - } else i = null; - } - i = i || { start: 0, end: 0 }; - } else i = null; - for ( - an = { focusedElem: s, selectionRange: i }, zt = !1, js = o; - null !== js; - ) - if (((s = (o = js).child), 1028 & o.subtreeFlags && null !== s)) - ((s.return = o), (js = s)); - else - for (; null !== js; ) { - o = js; - try { - var z = o.alternate; - if (1024 & o.flags) - switch (o.tag) { - case 0: - case 11: - case 15: - case 5: - case 6: - case 4: - case 17: - break; - case 1: - if (null !== z) { - var Y = z.memoizedProps, - Z = z.memoizedState, - ee = o.stateNode, - ie = ee.getSnapshotBeforeUpdate( - o.elementType === o.type ? Y : Ci(o.type, Y), - Z - ); - ee.__reactInternalSnapshotBeforeUpdate = ie; - } - break; - case 3: - var ae = o.stateNode.containerInfo; - 1 === ae.nodeType - ? (ae.textContent = '') - : 9 === ae.nodeType && - ae.documentElement && - ae.removeChild(ae.documentElement); - break; - default: - throw Error(p(163)); - } - } catch (s) { - W(o, o.return, s); - } - if (null !== (s = o.sibling)) { - ((s.return = o.return), (js = s)); - break; - } - js = o.return; - } - return ((z = Is), (Is = !1), z); - })(s, i), - dk(i, s), - Oe(an), - (zt = !!on), - (an = on = null), - (s.current = i), - hk(i, s, _), - ht(), - (Bs = C), - (At = x), - (Ls.transition = w)); - } else s.current = i; - if ( - (no && ((no = !1), (so = s), (oo = _)), - (w = s.pendingLanes), - 0 === w && (ro = null), - (function mc(s) { - if (wt && 'function' == typeof wt.onCommitFiberRoot) - try { - wt.onCommitFiberRoot(Et, s, void 0, !(128 & ~s.current.flags)); - } catch (s) {} - })(i.stateNode), - Dk(s, dt()), - null !== o) - ) - for (u = s.onRecoverableError, i = 0; i < o.length; i++) - ((_ = o[i]), u(_.value, { componentStack: _.stack, digest: _.digest })); - if (eo) throw ((eo = !1), (s = to), (to = null), s); - return ( - !!(1 & oo) && 0 !== s.tag && Hk(), - (w = s.pendingLanes), - 1 & w ? (s === ao ? io++ : ((io = 0), (ao = s))) : (io = 0), - jg(), - null - ); - })(s, o, i, u)); - } finally { - ((Ls.transition = _), (At = u)); - } - return null; - } - function Hk() { - if (null !== so) { - var s = Dc(oo), - o = Ls.transition, - i = At; - try { - if (((Ls.transition = null), (At = 16 > s ? 16 : s), null === so)) var u = !1; - else { - if (((s = so), (so = null), (oo = 0), 6 & Bs)) throw Error(p(331)); - var _ = Bs; - for (Bs |= 4, js = s.current; null !== js; ) { - var w = js, - x = w.child; - if (16 & js.flags) { - var C = w.deletions; - if (null !== C) { - for (var j = 0; j < C.length; j++) { - var L = C[j]; - for (js = L; null !== js; ) { - var B = js; - switch (B.tag) { - case 0: - case 11: - case 15: - Pj(8, B, w); - } - var $ = B.child; - if (null !== $) (($.return = B), (js = $)); - else - for (; null !== js; ) { - var V = (B = js).sibling, - U = B.return; - if ((Sj(B), B === L)) { - js = null; - break; - } - if (null !== V) { - ((V.return = U), (js = V)); - break; - } - js = U; - } - } - } - var z = w.alternate; - if (null !== z) { - var Y = z.child; - if (null !== Y) { - z.child = null; - do { - var Z = Y.sibling; - ((Y.sibling = null), (Y = Z)); - } while (null !== Y); - } - } - js = w; - } - } - if (2064 & w.subtreeFlags && null !== x) ((x.return = w), (js = x)); - else - e: for (; null !== js; ) { - if (2048 & (w = js).flags) - switch (w.tag) { - case 0: - case 11: - case 15: - Pj(9, w, w.return); - } - var ee = w.sibling; - if (null !== ee) { - ((ee.return = w.return), (js = ee)); - break e; - } - js = w.return; - } - } - var ie = s.current; - for (js = ie; null !== js; ) { - var ae = (x = js).child; - if (2064 & x.subtreeFlags && null !== ae) ((ae.return = x), (js = ae)); - else - e: for (x = ie; null !== js; ) { - if (2048 & (C = js).flags) - try { - switch (C.tag) { - case 0: - case 11: - case 15: - Qj(9, C); - } - } catch (s) { - W(C, C.return, s); - } - if (C === x) { - js = null; - break e; - } - var le = C.sibling; - if (null !== le) { - ((le.return = C.return), (js = le)); - break e; - } - js = C.return; - } - } - if (((Bs = _), jg(), wt && 'function' == typeof wt.onPostCommitFiberRoot)) - try { - wt.onPostCommitFiberRoot(Et, s); - } catch (s) {} - u = !0; - } - return u; - } finally { - ((At = i), (Ls.transition = o)); - } - } - return !1; - } - function Xk(s, o, i) { - ((s = nh(s, (o = Ni(0, (o = Ji(i, o)), 1)), 1)), - (o = R()), - null !== s && (Ac(s, 1, o), Dk(s, o))); - } - function W(s, o, i) { - if (3 === s.tag) Xk(s, s, i); - else - for (; null !== o; ) { - if (3 === o.tag) { - Xk(o, s, i); - break; - } - if (1 === o.tag) { - var u = o.stateNode; - if ( - 'function' == typeof o.type.getDerivedStateFromError || - ('function' == typeof u.componentDidCatch && (null === ro || !ro.has(u))) - ) { - ((o = nh(o, (s = Qi(o, (s = Ji(i, s)), 1)), 1)), - (s = R()), - null !== o && (Ac(o, 1, s), Dk(o, s))); - break; - } - } - o = o.return; - } - } - function Ti(s, o, i) { - var u = s.pingCache; - (null !== u && u.delete(o), - (o = R()), - (s.pingedLanes |= s.suspendedLanes & i), - Fs === s && - ($s & i) === i && - (4 === zs || (3 === zs && (130023424 & $s) === $s && 500 > dt() - Xs) - ? Kk(s, 0) - : (Js |= i)), - Dk(s, o)); - } - function Yk(s, o) { - 0 === o && - (1 & s.mode ? ((o = Ot), !(130023424 & (Ot <<= 1)) && (Ot = 4194304)) : (o = 1)); - var i = R(); - null !== (s = ih(s, o)) && (Ac(s, o, i), Dk(s, i)); - } - function uj(s) { - var o = s.memoizedState, - i = 0; - (null !== o && (i = o.retryLane), Yk(s, i)); - } - function bk(s, o) { - var i = 0; - switch (s.tag) { - case 13: - var u = s.stateNode, - _ = s.memoizedState; - null !== _ && (i = _.retryLane); - break; - case 19: - u = s.stateNode; - break; - default: - throw Error(p(314)); - } - (null !== u && u.delete(o), Yk(s, i)); - } - function Fk(s, o) { - return ct(s, o); - } - function $k(s, o, i, u) { - ((this.tag = s), - (this.key = i), - (this.sibling = - this.child = - this.return = - this.stateNode = - this.type = - this.elementType = - null), - (this.index = 0), - (this.ref = null), - (this.pendingProps = o), - (this.dependencies = - this.memoizedState = - this.updateQueue = - this.memoizedProps = - null), - (this.mode = u), - (this.subtreeFlags = this.flags = 0), - (this.deletions = null), - (this.childLanes = this.lanes = 0), - (this.alternate = null)); - } - function Bg(s, o, i, u) { - return new $k(s, o, i, u); - } - function aj(s) { - return !(!(s = s.prototype) || !s.isReactComponent); - } - function Pg(s, o) { - var i = s.alternate; - return ( - null === i - ? (((i = Bg(s.tag, o, s.key, s.mode)).elementType = s.elementType), - (i.type = s.type), - (i.stateNode = s.stateNode), - (i.alternate = s), - (s.alternate = i)) - : ((i.pendingProps = o), - (i.type = s.type), - (i.flags = 0), - (i.subtreeFlags = 0), - (i.deletions = null)), - (i.flags = 14680064 & s.flags), - (i.childLanes = s.childLanes), - (i.lanes = s.lanes), - (i.child = s.child), - (i.memoizedProps = s.memoizedProps), - (i.memoizedState = s.memoizedState), - (i.updateQueue = s.updateQueue), - (o = s.dependencies), - (i.dependencies = - null === o ? null : { lanes: o.lanes, firstContext: o.firstContext }), - (i.sibling = s.sibling), - (i.index = s.index), - (i.ref = s.ref), - i - ); - } - function Rg(s, o, i, u, _, w) { - var x = 2; - if (((u = s), 'function' == typeof s)) aj(s) && (x = 1); - else if ('string' == typeof s) x = 5; - else - e: switch (s) { - case ee: - return Tg(i.children, _, w, o); - case ie: - ((x = 8), (_ |= 8)); - break; - case ae: - return (((s = Bg(12, i, o, 2 | _)).elementType = ae), (s.lanes = w), s); - case de: - return (((s = Bg(13, i, o, _)).elementType = de), (s.lanes = w), s); - case fe: - return (((s = Bg(19, i, o, _)).elementType = fe), (s.lanes = w), s); - case _e: - return pj(i, _, w, o); - default: - if ('object' == typeof s && null !== s) - switch (s.$$typeof) { - case le: - x = 10; - break e; - case ce: - x = 9; - break e; - case pe: - x = 11; - break e; - case ye: - x = 14; - break e; - case be: - ((x = 16), (u = null)); - break e; - } - throw Error(p(130, null == s ? s : typeof s, '')); - } - return (((o = Bg(x, i, o, _)).elementType = s), (o.type = u), (o.lanes = w), o); - } - function Tg(s, o, i, u) { - return (((s = Bg(7, s, u, o)).lanes = i), s); - } - function pj(s, o, i, u) { - return ( - ((s = Bg(22, s, u, o)).elementType = _e), - (s.lanes = i), - (s.stateNode = { isHidden: !1 }), - s - ); - } - function Qg(s, o, i) { - return (((s = Bg(6, s, null, o)).lanes = i), s); - } - function Sg(s, o, i) { - return ( - ((o = Bg(4, null !== s.children ? s.children : [], s.key, o)).lanes = i), - (o.stateNode = { - containerInfo: s.containerInfo, - pendingChildren: null, - implementation: s.implementation - }), - o - ); - } - function al(s, o, i, u, _) { - ((this.tag = o), - (this.containerInfo = s), - (this.finishedWork = this.pingCache = this.current = this.pendingChildren = null), - (this.timeoutHandle = -1), - (this.callbackNode = this.pendingContext = this.context = null), - (this.callbackPriority = 0), - (this.eventTimes = zc(0)), - (this.expirationTimes = zc(-1)), - (this.entangledLanes = - this.finishedLanes = - this.mutableReadLanes = - this.expiredLanes = - this.pingedLanes = - this.suspendedLanes = - this.pendingLanes = - 0), - (this.entanglements = zc(0)), - (this.identifierPrefix = u), - (this.onRecoverableError = _), - (this.mutableSourceEagerHydrationData = null)); - } - function bl(s, o, i, u, _, w, x, C, j) { - return ( - (s = new al(s, o, i, C, j)), - 1 === o ? ((o = 1), !0 === w && (o |= 8)) : (o = 0), - (w = Bg(3, null, null, o)), - (s.current = w), - (w.stateNode = s), - (w.memoizedState = { - element: u, - isDehydrated: i, - cache: null, - transitions: null, - pendingSuspenseBoundaries: null - }), - kh(w), - s - ); - } - function dl(s) { - if (!s) return En; - e: { - if (Vb((s = s._reactInternals)) !== s || 1 !== s.tag) throw Error(p(170)); - var o = s; - do { - switch (o.tag) { - case 3: - o = o.stateNode.context; - break e; - case 1: - if (Zf(o.type)) { - o = o.stateNode.__reactInternalMemoizedMergedChildContext; - break e; - } - } - o = o.return; - } while (null !== o); - throw Error(p(171)); - } - if (1 === s.tag) { - var i = s.type; - if (Zf(i)) return bg(s, i, o); - } - return o; - } - function el(s, o, i, u, _, w, x, C, j) { - return ( - ((s = bl(i, u, !0, s, 0, w, 0, C, j)).context = dl(null)), - (i = s.current), - ((w = mh((u = R()), (_ = yi(i)))).callback = null != o ? o : null), - nh(i, w, _), - (s.current.lanes = _), - Ac(s, _, u), - Dk(s, u), - s - ); - } - function fl(s, o, i, u) { - var _ = o.current, - w = R(), - x = yi(_); - return ( - (i = dl(i)), - null === o.context ? (o.context = i) : (o.pendingContext = i), - ((o = mh(w, x)).payload = { element: s }), - null !== (u = void 0 === u ? null : u) && (o.callback = u), - null !== (s = nh(_, o, x)) && (gi(s, _, x, w), oh(s, _, x)), - x - ); - } - function gl(s) { - return (s = s.current).child ? (s.child.tag, s.child.stateNode) : null; - } - function hl(s, o) { - if (null !== (s = s.memoizedState) && null !== s.dehydrated) { - var i = s.retryLane; - s.retryLane = 0 !== i && i < o ? i : o; - } - } - function il(s, o) { - (hl(s, o), (s = s.alternate) && hl(s, o)); - } - Ts = function (s, o, i) { - if (null !== s) - if (s.memoizedProps !== o.pendingProps || Sn.current) _s = !0; - else { - if (!(s.lanes & i || 128 & o.flags)) - return ( - (_s = !1), - (function yj(s, o, i) { - switch (o.tag) { - case 3: - (kj(o), Ig()); - break; - case 5: - Ah(o); - break; - case 1: - Zf(o.type) && cg(o); - break; - case 4: - yh(o, o.stateNode.containerInfo); - break; - case 10: - var u = o.type._context, - _ = o.memoizedProps.value; - (G(zn, u._currentValue), (u._currentValue = _)); - break; - case 13: - if (null !== (u = o.memoizedState)) - return null !== u.dehydrated - ? (G(es, 1 & es.current), (o.flags |= 128), null) - : i & o.child.childLanes - ? oj(s, o, i) - : (G(es, 1 & es.current), - null !== (s = Zi(s, o, i)) ? s.sibling : null); - G(es, 1 & es.current); - break; - case 19: - if (((u = !!(i & o.childLanes)), 128 & s.flags)) { - if (u) return xj(s, o, i); - o.flags |= 128; - } - if ( - (null !== (_ = o.memoizedState) && - ((_.rendering = null), (_.tail = null), (_.lastEffect = null)), - G(es, es.current), - u) - ) - break; - return null; - case 22: - case 23: - return ((o.lanes = 0), dj(s, o, i)); - } - return Zi(s, o, i); - })(s, o, i) - ); - _s = !!(131072 & s.flags); - } - else ((_s = !1), Fn && 1048576 & o.flags && ug(o, Pn, o.index)); - switch (((o.lanes = 0), o.tag)) { - case 2: - var u = o.type; - (ij(s, o), (s = o.pendingProps)); - var _ = Yf(o, wn.current); - (ch(o, i), (_ = Nh(null, o, u, s, _, i))); - var w = Sh(); - return ( - (o.flags |= 1), - 'object' == typeof _ && - null !== _ && - 'function' == typeof _.render && - void 0 === _.$$typeof - ? ((o.tag = 1), - (o.memoizedState = null), - (o.updateQueue = null), - Zf(u) ? ((w = !0), cg(o)) : (w = !1), - (o.memoizedState = null !== _.state && void 0 !== _.state ? _.state : null), - kh(o), - (_.updater = ys), - (o.stateNode = _), - (_._reactInternals = o), - Ii(o, u, s, i), - (o = jj(null, o, u, !0, w, i))) - : ((o.tag = 0), Fn && w && vg(o), Xi(null, o, _, i), (o = o.child)), - o - ); - case 16: - u = o.elementType; - e: { - switch ( - (ij(s, o), - (s = o.pendingProps), - (u = (_ = u._init)(u._payload)), - (o.type = u), - (_ = o.tag = - (function Zk(s) { - if ('function' == typeof s) return aj(s) ? 1 : 0; - if (null != s) { - if ((s = s.$$typeof) === pe) return 11; - if (s === ye) return 14; - } - return 2; - })(u)), - (s = Ci(u, s)), - _) - ) { - case 0: - o = cj(null, o, u, s, i); - break e; - case 1: - o = hj(null, o, u, s, i); - break e; - case 11: - o = Yi(null, o, u, s, i); - break e; - case 14: - o = $i(null, o, u, Ci(u.type, s), i); - break e; - } - throw Error(p(306, u, '')); - } - return o; - case 0: - return ( - (u = o.type), - (_ = o.pendingProps), - cj(s, o, u, (_ = o.elementType === u ? _ : Ci(u, _)), i) - ); - case 1: - return ( - (u = o.type), - (_ = o.pendingProps), - hj(s, o, u, (_ = o.elementType === u ? _ : Ci(u, _)), i) - ); - case 3: - e: { - if ((kj(o), null === s)) throw Error(p(387)); - ((u = o.pendingProps), - (_ = (w = o.memoizedState).element), - lh(s, o), - qh(o, u, null, i)); - var x = o.memoizedState; - if (((u = x.element), w.isDehydrated)) { - if ( - ((w = { - element: u, - isDehydrated: !1, - cache: x.cache, - pendingSuspenseBoundaries: x.pendingSuspenseBoundaries, - transitions: x.transitions - }), - (o.updateQueue.baseState = w), - (o.memoizedState = w), - 256 & o.flags) - ) { - o = lj(s, o, u, i, (_ = Ji(Error(p(423)), o))); - break e; - } - if (u !== _) { - o = lj(s, o, u, i, (_ = Ji(Error(p(424)), o))); - break e; - } - for ( - Bn = Lf(o.stateNode.containerInfo.firstChild), - Ln = o, - Fn = !0, - qn = null, - i = Un(o, null, u, i), - o.child = i; - i; - ) - ((i.flags = (-3 & i.flags) | 4096), (i = i.sibling)); - } else { - if ((Ig(), u === _)) { - o = Zi(s, o, i); - break e; - } - Xi(s, o, u, i); - } - o = o.child; - } - return o; - case 5: - return ( - Ah(o), - null === s && Eg(o), - (u = o.type), - (_ = o.pendingProps), - (w = null !== s ? s.memoizedProps : null), - (x = _.children), - Ef(u, _) ? (x = null) : null !== w && Ef(u, w) && (o.flags |= 32), - gj(s, o), - Xi(s, o, x, i), - o.child - ); - case 6: - return (null === s && Eg(o), null); - case 13: - return oj(s, o, i); - case 4: - return ( - yh(o, o.stateNode.containerInfo), - (u = o.pendingProps), - null === s ? (o.child = Vn(o, null, u, i)) : Xi(s, o, u, i), - o.child - ); - case 11: - return ( - (u = o.type), - (_ = o.pendingProps), - Yi(s, o, u, (_ = o.elementType === u ? _ : Ci(u, _)), i) - ); - case 7: - return (Xi(s, o, o.pendingProps, i), o.child); - case 8: - case 12: - return (Xi(s, o, o.pendingProps.children, i), o.child); - case 10: - e: { - if ( - ((u = o.type._context), - (_ = o.pendingProps), - (w = o.memoizedProps), - (x = _.value), - G(zn, u._currentValue), - (u._currentValue = x), - null !== w) - ) - if (Lr(w.value, x)) { - if (w.children === _.children && !Sn.current) { - o = Zi(s, o, i); - break e; - } - } else - for (null !== (w = o.child) && (w.return = o); null !== w; ) { - var C = w.dependencies; - if (null !== C) { - x = w.child; - for (var j = C.firstContext; null !== j; ) { - if (j.context === u) { - if (1 === w.tag) { - (j = mh(-1, i & -i)).tag = 2; - var L = w.updateQueue; - if (null !== L) { - var B = (L = L.shared).pending; - (null === B ? (j.next = j) : ((j.next = B.next), (B.next = j)), - (L.pending = j)); - } - } - ((w.lanes |= i), - null !== (j = w.alternate) && (j.lanes |= i), - bh(w.return, i, o), - (C.lanes |= i)); - break; - } - j = j.next; - } - } else if (10 === w.tag) x = w.type === o.type ? null : w.child; - else if (18 === w.tag) { - if (null === (x = w.return)) throw Error(p(341)); - ((x.lanes |= i), - null !== (C = x.alternate) && (C.lanes |= i), - bh(x, i, o), - (x = w.sibling)); - } else x = w.child; - if (null !== x) x.return = w; - else - for (x = w; null !== x; ) { - if (x === o) { - x = null; - break; - } - if (null !== (w = x.sibling)) { - ((w.return = x.return), (x = w)); - break; - } - x = x.return; - } - w = x; - } - (Xi(s, o, _.children, i), (o = o.child)); - } - return o; - case 9: - return ( - (_ = o.type), - (u = o.pendingProps.children), - ch(o, i), - (u = u((_ = eh(_)))), - (o.flags |= 1), - Xi(s, o, u, i), - o.child - ); - case 14: - return ( - (_ = Ci((u = o.type), o.pendingProps)), - $i(s, o, u, (_ = Ci(u.type, _)), i) - ); - case 15: - return bj(s, o, o.type, o.pendingProps, i); - case 17: - return ( - (u = o.type), - (_ = o.pendingProps), - (_ = o.elementType === u ? _ : Ci(u, _)), - ij(s, o), - (o.tag = 1), - Zf(u) ? ((s = !0), cg(o)) : (s = !1), - ch(o, i), - Gi(o, u, _), - Ii(o, u, _, i), - jj(null, o, u, !0, s, i) - ); - case 19: - return xj(s, o, i); - case 22: - return dj(s, o, i); - } - throw Error(p(156, o.tag)); - }; - var uo = - 'function' == typeof reportError - ? reportError - : function (s) { - console.error(s); - }; - function ll(s) { - this._internalRoot = s; - } - function ml(s) { - this._internalRoot = s; - } - function nl(s) { - return !(!s || (1 !== s.nodeType && 9 !== s.nodeType && 11 !== s.nodeType)); - } - function ol(s) { - return !( - !s || - (1 !== s.nodeType && - 9 !== s.nodeType && - 11 !== s.nodeType && - (8 !== s.nodeType || ' react-mount-point-unstable ' !== s.nodeValue)) - ); - } - function pl() {} - function rl(s, o, i, u, _) { - var w = i._reactRootContainer; - if (w) { - var x = w; - if ('function' == typeof _) { - var C = _; - _ = function () { - var s = gl(x); - C.call(s); - }; - } - fl(o, x, s, _); - } else - x = (function ql(s, o, i, u, _) { - if (_) { - if ('function' == typeof u) { - var w = u; - u = function () { - var s = gl(x); - w.call(s); - }; - } - var x = el(o, u, s, 0, null, !1, 0, '', pl); - return ( - (s._reactRootContainer = x), - (s[mn] = x.current), - sf(8 === s.nodeType ? s.parentNode : s), - Rk(), - x - ); - } - for (; (_ = s.lastChild); ) s.removeChild(_); - if ('function' == typeof u) { - var C = u; - u = function () { - var s = gl(j); - C.call(s); - }; - } - var j = bl(s, 0, !1, null, 0, !1, 0, '', pl); - return ( - (s._reactRootContainer = j), - (s[mn] = j.current), - sf(8 === s.nodeType ? s.parentNode : s), - Rk(function () { - fl(o, j, i, u); - }), - j - ); - })(i, o, s, _, u); - return gl(x); - } - ((ml.prototype.render = ll.prototype.render = - function (s) { - var o = this._internalRoot; - if (null === o) throw Error(p(409)); - fl(s, o, null, null); - }), - (ml.prototype.unmount = ll.prototype.unmount = - function () { - var s = this._internalRoot; - if (null !== s) { - this._internalRoot = null; - var o = s.containerInfo; - (Rk(function () { - fl(null, s, null, null); - }), - (o[mn] = null)); - } - }), - (ml.prototype.unstable_scheduleHydration = function (s) { - if (s) { - var o = Mt(); - s = { blockedOn: null, target: s, priority: o }; - for (var i = 0; i < $t.length && 0 !== o && o < $t[i].priority; i++); - ($t.splice(i, 0, s), 0 === i && Vc(s)); - } - }), - (jt = function (s) { - switch (s.tag) { - case 3: - var o = s.stateNode; - if (o.current.memoizedState.isDehydrated) { - var i = tc(o.pendingLanes); - 0 !== i && (Cc(o, 1 | i), Dk(o, dt()), !(6 & Bs) && ((Zs = dt() + 500), jg())); - } - break; - case 13: - (Rk(function () { - var o = ih(s, 1); - if (null !== o) { - var i = R(); - gi(o, s, 1, i); - } - }), - il(s, 1)); - } - }), - (It = function (s) { - if (13 === s.tag) { - var o = ih(s, 134217728); - if (null !== o) gi(o, s, 134217728, R()); - il(s, 134217728); - } - }), - (Pt = function (s) { - if (13 === s.tag) { - var o = yi(s), - i = ih(s, o); - if (null !== i) gi(i, s, o, R()); - il(s, o); - } - }), - (Mt = function () { - return At; - }), - (Tt = function (s, o) { - var i = At; - try { - return ((At = s), o()); - } finally { - At = i; - } - }), - (Xe = function (s, o, i) { - switch (o) { - case 'input': - if ((bb(s, i), (o = i.name), 'radio' === i.type && null != o)) { - for (i = s; i.parentNode; ) i = i.parentNode; - for ( - i = i.querySelectorAll( - 'input[name=' + JSON.stringify('' + o) + '][type="radio"]' - ), - o = 0; - o < i.length; - o++ - ) { - var u = i[o]; - if (u !== s && u.form === s.form) { - var _ = Db(u); - if (!_) throw Error(p(90)); - (Wa(u), bb(u, _)); - } - } - } - break; - case 'textarea': - ib(s, i); - break; - case 'select': - null != (o = i.value) && fb(s, !!i.multiple, o, !1); - } - }), - (Gb = Qk), - (Hb = Rk)); - var po = { usingClientEntryPoint: !1, Events: [Cb, ue, Db, Eb, Fb, Qk] }, - ho = { - findFiberByHostInstance: Wc, - bundleType: 0, - version: '18.3.1', - rendererPackageName: 'react-dom' - }, - fo = { - bundleType: ho.bundleType, - version: ho.version, - rendererPackageName: ho.rendererPackageName, - rendererConfig: ho.rendererConfig, - overrideHookState: null, - overrideHookStateDeletePath: null, - overrideHookStateRenamePath: null, - overrideProps: null, - overridePropsDeletePath: null, - overridePropsRenamePath: null, - setErrorHandler: null, - setSuspenseHandler: null, - scheduleUpdate: null, - currentDispatcherRef: z.ReactCurrentDispatcher, - findHostInstanceByFiber: function (s) { - return null === (s = Zb(s)) ? null : s.stateNode; - }, - findFiberByHostInstance: - ho.findFiberByHostInstance || - function jl() { - return null; - }, - findHostInstancesForRefresh: null, - scheduleRefresh: null, - scheduleRoot: null, - setRefreshHandler: null, - getCurrentFiber: null, - reconcilerVersion: '18.3.1-next-f1338f8080-20240426' - }; - if ('undefined' != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) { - var mo = __REACT_DEVTOOLS_GLOBAL_HOOK__; - if (!mo.isDisabled && mo.supportsFiber) - try { - ((Et = mo.inject(fo)), (wt = mo)); - } catch (qe) {} - } - ((o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = po), - (o.createPortal = function (s, o) { - var i = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null; - if (!nl(o)) throw Error(p(200)); - return (function cl(s, o, i) { - var u = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null; - return { - $$typeof: Z, - key: null == u ? null : '' + u, - children: s, - containerInfo: o, - implementation: i - }; - })(s, o, null, i); - }), - (o.createRoot = function (s, o) { - if (!nl(s)) throw Error(p(299)); - var i = !1, - u = '', - _ = uo; - return ( - null != o && - (!0 === o.unstable_strictMode && (i = !0), - void 0 !== o.identifierPrefix && (u = o.identifierPrefix), - void 0 !== o.onRecoverableError && (_ = o.onRecoverableError)), - (o = bl(s, 1, !1, null, 0, i, 0, u, _)), - (s[mn] = o.current), - sf(8 === s.nodeType ? s.parentNode : s), - new ll(o) - ); - }), - (o.findDOMNode = function (s) { - if (null == s) return null; - if (1 === s.nodeType) return s; - var o = s._reactInternals; - if (void 0 === o) { - if ('function' == typeof s.render) throw Error(p(188)); - throw ((s = Object.keys(s).join(',')), Error(p(268, s))); - } - return (s = null === (s = Zb(o)) ? null : s.stateNode); - }), - (o.flushSync = function (s) { - return Rk(s); - }), - (o.hydrate = function (s, o, i) { - if (!ol(o)) throw Error(p(200)); - return rl(null, s, o, !0, i); - }), - (o.hydrateRoot = function (s, o, i) { - if (!nl(s)) throw Error(p(405)); - var u = (null != i && i.hydratedSources) || null, - _ = !1, - w = '', - x = uo; - if ( - (null != i && - (!0 === i.unstable_strictMode && (_ = !0), - void 0 !== i.identifierPrefix && (w = i.identifierPrefix), - void 0 !== i.onRecoverableError && (x = i.onRecoverableError)), - (o = el(o, null, s, 1, null != i ? i : null, _, 0, w, x)), - (s[mn] = o.current), - sf(s), - u) - ) - for (s = 0; s < u.length; s++) - ((_ = (_ = (i = u[s])._getVersion)(i._source)), - null == o.mutableSourceEagerHydrationData - ? (o.mutableSourceEagerHydrationData = [i, _]) - : o.mutableSourceEagerHydrationData.push(i, _)); - return new ml(o); - }), - (o.render = function (s, o, i) { - if (!ol(o)) throw Error(p(200)); - return rl(null, s, o, !1, i); - }), - (o.unmountComponentAtNode = function (s) { - if (!ol(s)) throw Error(p(40)); - return ( - !!s._reactRootContainer && - (Rk(function () { - rl(null, null, s, !1, function () { - ((s._reactRootContainer = null), (s[mn] = null)); - }); - }), - !0) - ); - }), - (o.unstable_batchedUpdates = Qk), - (o.unstable_renderSubtreeIntoContainer = function (s, o, i, u) { - if (!ol(i)) throw Error(p(200)); - if (null == s || void 0 === s._reactInternals) throw Error(p(38)); - return rl(s, o, i, !1, u); - }), - (o.version = '18.3.1-next-f1338f8080-20240426')); - }, - 40961: (s, o, i) => { - 'use strict'; - (!(function checkDCE() { - if ( - 'undefined' != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && - 'function' == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE - ) - try { - __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); - } catch (s) { - console.error(s); - } - })(), - (s.exports = i(22551))); - }, - 2209: (s, o, i) => { - 'use strict'; - var u, - _ = i(9404), - w = function productionTypeChecker() { - invariant(!1, 'ImmutablePropTypes type checking code is stripped in production.'); - }; - w.isRequired = w; - var x = function getProductionTypeChecker() { - return w; - }; - function getPropType(s) { - var o = typeof s; - return Array.isArray(s) - ? 'array' - : s instanceof RegExp - ? 'object' - : s instanceof _.Iterable - ? 'Immutable.' + s.toSource().split(' ')[0] - : o; - } - function createChainableTypeChecker(s) { - function checkType(o, i, u, _, w, x) { - for (var C = arguments.length, j = Array(C > 6 ? C - 6 : 0), L = 6; L < C; L++) - j[L - 6] = arguments[L]; - return ( - (x = x || u), - (_ = _ || '<>'), - null != i[u] - ? s.apply(void 0, [i, u, _, w, x].concat(j)) - : o - ? new Error('Required ' + w + ' `' + x + '` was not specified in `' + _ + '`.') - : void 0 - ); - } - var o = checkType.bind(null, !1); - return ((o.isRequired = checkType.bind(null, !0)), o); - } - function createIterableSubclassTypeChecker(s, o) { - return (function createImmutableTypeChecker(s, o) { - return createChainableTypeChecker(function validate(i, u, _, w, x) { - var C = i[u]; - if (!o(C)) { - var j = getPropType(C); - return new Error( - 'Invalid ' + - w + - ' `' + - x + - '` of type `' + - j + - '` supplied to `' + - _ + - '`, expected `' + - s + - '`.' - ); - } - return null; - }); - })('Iterable.' + s, function (s) { - return _.Iterable.isIterable(s) && o(s); - }); - } - (((u = { - listOf: x, - mapOf: x, - orderedMapOf: x, - setOf: x, - orderedSetOf: x, - stackOf: x, - iterableOf: x, - recordOf: x, - shape: x, - contains: x, - mapContains: x, - orderedMapContains: x, - list: w, - map: w, - orderedMap: w, - set: w, - orderedSet: w, - stack: w, - seq: w, - record: w, - iterable: w - }).iterable.indexed = createIterableSubclassTypeChecker('Indexed', _.Iterable.isIndexed)), - (u.iterable.keyed = createIterableSubclassTypeChecker('Keyed', _.Iterable.isKeyed)), - (s.exports = u)); - }, - 15287: (s, o) => { - 'use strict'; - var i = Symbol.for('react.element'), - u = Symbol.for('react.portal'), - _ = Symbol.for('react.fragment'), - w = Symbol.for('react.strict_mode'), - x = Symbol.for('react.profiler'), - C = Symbol.for('react.provider'), - j = Symbol.for('react.context'), - L = Symbol.for('react.forward_ref'), - B = Symbol.for('react.suspense'), - $ = Symbol.for('react.memo'), - V = Symbol.for('react.lazy'), - U = Symbol.iterator; - var z = { - isMounted: function () { - return !1; - }, - enqueueForceUpdate: function () {}, - enqueueReplaceState: function () {}, - enqueueSetState: function () {} - }, - Y = Object.assign, - Z = {}; - function E(s, o, i) { - ((this.props = s), (this.context = o), (this.refs = Z), (this.updater = i || z)); - } - function F() {} - function G(s, o, i) { - ((this.props = s), (this.context = o), (this.refs = Z), (this.updater = i || z)); - } - ((E.prototype.isReactComponent = {}), - (E.prototype.setState = function (s, o) { - if ('object' != typeof s && 'function' != typeof s && null != s) - throw Error( - 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.' - ); - this.updater.enqueueSetState(this, s, o, 'setState'); - }), - (E.prototype.forceUpdate = function (s) { - this.updater.enqueueForceUpdate(this, s, 'forceUpdate'); - }), - (F.prototype = E.prototype)); - var ee = (G.prototype = new F()); - ((ee.constructor = G), Y(ee, E.prototype), (ee.isPureReactComponent = !0)); - var ie = Array.isArray, - ae = Object.prototype.hasOwnProperty, - le = { current: null }, - ce = { key: !0, ref: !0, __self: !0, __source: !0 }; - function M(s, o, u) { - var _, - w = {}, - x = null, - C = null; - if (null != o) - for (_ in (void 0 !== o.ref && (C = o.ref), void 0 !== o.key && (x = '' + o.key), o)) - ae.call(o, _) && !ce.hasOwnProperty(_) && (w[_] = o[_]); - var j = arguments.length - 2; - if (1 === j) w.children = u; - else if (1 < j) { - for (var L = Array(j), B = 0; B < j; B++) L[B] = arguments[B + 2]; - w.children = L; - } - if (s && s.defaultProps) - for (_ in (j = s.defaultProps)) void 0 === w[_] && (w[_] = j[_]); - return { $$typeof: i, type: s, key: x, ref: C, props: w, _owner: le.current }; - } - function O(s) { - return 'object' == typeof s && null !== s && s.$$typeof === i; - } - var pe = /\/+/g; - function Q(s, o) { - return 'object' == typeof s && null !== s && null != s.key - ? (function escape(s) { - var o = { '=': '=0', ':': '=2' }; - return ( - '$' + - s.replace(/[=:]/g, function (s) { - return o[s]; - }) - ); - })('' + s.key) - : o.toString(36); - } - function R(s, o, _, w, x) { - var C = typeof s; - ('undefined' !== C && 'boolean' !== C) || (s = null); - var j = !1; - if (null === s) j = !0; - else - switch (C) { - case 'string': - case 'number': - j = !0; - break; - case 'object': - switch (s.$$typeof) { - case i: - case u: - j = !0; - } - } - if (j) - return ( - (x = x((j = s))), - (s = '' === w ? '.' + Q(j, 0) : w), - ie(x) - ? ((_ = ''), - null != s && (_ = s.replace(pe, '$&/') + '/'), - R(x, o, _, '', function (s) { - return s; - })) - : null != x && - (O(x) && - (x = (function N(s, o) { - return { - $$typeof: i, - type: s.type, - key: o, - ref: s.ref, - props: s.props, - _owner: s._owner - }; - })( - x, - _ + - (!x.key || (j && j.key === x.key) - ? '' - : ('' + x.key).replace(pe, '$&/') + '/') + - s - )), - o.push(x)), - 1 - ); - if (((j = 0), (w = '' === w ? '.' : w + ':'), ie(s))) - for (var L = 0; L < s.length; L++) { - var B = w + Q((C = s[L]), L); - j += R(C, o, _, B, x); - } - else if ( - ((B = (function A(s) { - return null === s || 'object' != typeof s - ? null - : 'function' == typeof (s = (U && s[U]) || s['@@iterator']) - ? s - : null; - })(s)), - 'function' == typeof B) - ) - for (s = B.call(s), L = 0; !(C = s.next()).done; ) - j += R((C = C.value), o, _, (B = w + Q(C, L++)), x); - else if ('object' === C) - throw ( - (o = String(s)), - Error( - 'Objects are not valid as a React child (found: ' + - ('[object Object]' === o - ? 'object with keys {' + Object.keys(s).join(', ') + '}' - : o) + - '). If you meant to render a collection of children, use an array instead.' - ) - ); - return j; - } - function S(s, o, i) { - if (null == s) return s; - var u = [], - _ = 0; - return ( - R(s, u, '', '', function (s) { - return o.call(i, s, _++); - }), - u - ); - } - function T(s) { - if (-1 === s._status) { - var o = s._result; - ((o = o()).then( - function (o) { - (0 !== s._status && -1 !== s._status) || ((s._status = 1), (s._result = o)); - }, - function (o) { - (0 !== s._status && -1 !== s._status) || ((s._status = 2), (s._result = o)); - } - ), - -1 === s._status && ((s._status = 0), (s._result = o))); - } - if (1 === s._status) return s._result.default; - throw s._result; - } - var de = { current: null }, - fe = { transition: null }, - ye = { ReactCurrentDispatcher: de, ReactCurrentBatchConfig: fe, ReactCurrentOwner: le }; - function X() { - throw Error('act(...) is not supported in production builds of React.'); - } - ((o.Children = { - map: S, - forEach: function (s, o, i) { - S( - s, - function () { - o.apply(this, arguments); - }, - i - ); - }, - count: function (s) { - var o = 0; - return ( - S(s, function () { - o++; - }), - o - ); - }, - toArray: function (s) { - return ( - S(s, function (s) { - return s; - }) || [] - ); - }, - only: function (s) { - if (!O(s)) - throw Error( - 'React.Children.only expected to receive a single React element child.' - ); - return s; - } - }), - (o.Component = E), - (o.Fragment = _), - (o.Profiler = x), - (o.PureComponent = G), - (o.StrictMode = w), - (o.Suspense = B), - (o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ye), - (o.act = X), - (o.cloneElement = function (s, o, u) { - if (null == s) - throw Error( - 'React.cloneElement(...): The argument must be a React element, but you passed ' + - s + - '.' - ); - var _ = Y({}, s.props), - w = s.key, - x = s.ref, - C = s._owner; - if (null != o) { - if ( - (void 0 !== o.ref && ((x = o.ref), (C = le.current)), - void 0 !== o.key && (w = '' + o.key), - s.type && s.type.defaultProps) - ) - var j = s.type.defaultProps; - for (L in o) - ae.call(o, L) && - !ce.hasOwnProperty(L) && - (_[L] = void 0 === o[L] && void 0 !== j ? j[L] : o[L]); - } - var L = arguments.length - 2; - if (1 === L) _.children = u; - else if (1 < L) { - j = Array(L); - for (var B = 0; B < L; B++) j[B] = arguments[B + 2]; - _.children = j; - } - return { $$typeof: i, type: s.type, key: w, ref: x, props: _, _owner: C }; - }), - (o.createContext = function (s) { - return ( - ((s = { - $$typeof: j, - _currentValue: s, - _currentValue2: s, - _threadCount: 0, - Provider: null, - Consumer: null, - _defaultValue: null, - _globalName: null - }).Provider = { $$typeof: C, _context: s }), - (s.Consumer = s) - ); - }), - (o.createElement = M), - (o.createFactory = function (s) { - var o = M.bind(null, s); - return ((o.type = s), o); - }), - (o.createRef = function () { - return { current: null }; - }), - (o.forwardRef = function (s) { - return { $$typeof: L, render: s }; - }), - (o.isValidElement = O), - (o.lazy = function (s) { - return { $$typeof: V, _payload: { _status: -1, _result: s }, _init: T }; - }), - (o.memo = function (s, o) { - return { $$typeof: $, type: s, compare: void 0 === o ? null : o }; - }), - (o.startTransition = function (s) { - var o = fe.transition; - fe.transition = {}; - try { - s(); - } finally { - fe.transition = o; - } - }), - (o.unstable_act = X), - (o.useCallback = function (s, o) { - return de.current.useCallback(s, o); - }), - (o.useContext = function (s) { - return de.current.useContext(s); - }), - (o.useDebugValue = function () {}), - (o.useDeferredValue = function (s) { - return de.current.useDeferredValue(s); - }), - (o.useEffect = function (s, o) { - return de.current.useEffect(s, o); - }), - (o.useId = function () { - return de.current.useId(); - }), - (o.useImperativeHandle = function (s, o, i) { - return de.current.useImperativeHandle(s, o, i); - }), - (o.useInsertionEffect = function (s, o) { - return de.current.useInsertionEffect(s, o); - }), - (o.useLayoutEffect = function (s, o) { - return de.current.useLayoutEffect(s, o); - }), - (o.useMemo = function (s, o) { - return de.current.useMemo(s, o); - }), - (o.useReducer = function (s, o, i) { - return de.current.useReducer(s, o, i); - }), - (o.useRef = function (s) { - return de.current.useRef(s); - }), - (o.useState = function (s) { - return de.current.useState(s); - }), - (o.useSyncExternalStore = function (s, o, i) { - return de.current.useSyncExternalStore(s, o, i); - }), - (o.useTransition = function () { - return de.current.useTransition(); - }), - (o.version = '18.3.1')); - }, - 96540: (s, o, i) => { - 'use strict'; - s.exports = i(15287); - }, - 86048: (s) => { - 'use strict'; - var o = {}; - function createErrorType(s, i, u) { - u || (u = Error); - var _ = (function (s) { - function NodeError(o, u, _) { - return ( - s.call( - this, - (function getMessage(s, o, u) { - return 'string' == typeof i ? i : i(s, o, u); - })(o, u, _) - ) || this - ); - } - return ( - (function _inheritsLoose(s, o) { - ((s.prototype = Object.create(o.prototype)), - (s.prototype.constructor = s), - (s.__proto__ = o)); - })(NodeError, s), - NodeError - ); - })(u); - ((_.prototype.name = u.name), (_.prototype.code = s), (o[s] = _)); - } - function oneOf(s, o) { - if (Array.isArray(s)) { - var i = s.length; - return ( - (s = s.map(function (s) { - return String(s); - })), - i > 2 - ? 'one of '.concat(o, ' ').concat(s.slice(0, i - 1).join(', '), ', or ') + - s[i - 1] - : 2 === i - ? 'one of '.concat(o, ' ').concat(s[0], ' or ').concat(s[1]) - : 'of '.concat(o, ' ').concat(s[0]) - ); - } - return 'of '.concat(o, ' ').concat(String(s)); - } - (createErrorType( - 'ERR_INVALID_OPT_VALUE', - function (s, o) { - return 'The value "' + o + '" is invalid for option "' + s + '"'; - }, - TypeError - ), - createErrorType( - 'ERR_INVALID_ARG_TYPE', - function (s, o, i) { - var u, _; - if ( - ('string' == typeof o && - (function startsWith(s, o, i) { - return s.substr(!i || i < 0 ? 0 : +i, o.length) === o; - })(o, 'not ') - ? ((u = 'must not be'), (o = o.replace(/^not /, ''))) - : (u = 'must be'), - (function endsWith(s, o, i) { - return ( - (void 0 === i || i > s.length) && (i = s.length), - s.substring(i - o.length, i) === o - ); - })(s, ' argument')) - ) - _ = 'The '.concat(s, ' ').concat(u, ' ').concat(oneOf(o, 'type')); - else { - var w = (function includes(s, o, i) { - return ( - 'number' != typeof i && (i = 0), - !(i + o.length > s.length) && -1 !== s.indexOf(o, i) - ); - })(s, '.') - ? 'property' - : 'argument'; - _ = 'The "' - .concat(s, '" ') - .concat(w, ' ') - .concat(u, ' ') - .concat(oneOf(o, 'type')); - } - return (_ += '. Received type '.concat(typeof i)); - }, - TypeError - ), - createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'), - createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (s) { - return 'The ' + s + ' method is not implemented'; - }), - createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'), - createErrorType('ERR_STREAM_DESTROYED', function (s) { - return 'Cannot call ' + s + ' after a stream was destroyed'; - }), - createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'), - createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'), - createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'), - createErrorType( - 'ERR_STREAM_NULL_VALUES', - 'May not write null values to stream', - TypeError - ), - createErrorType( - 'ERR_UNKNOWN_ENCODING', - function (s) { - return 'Unknown encoding: ' + s; - }, - TypeError - ), - createErrorType( - 'ERR_STREAM_UNSHIFT_AFTER_END_EVENT', - 'stream.unshift() after end event' - ), - (s.exports.F = o)); - }, - 25382: (s, o, i) => { - 'use strict'; - var u = i(65606), - _ = - Object.keys || - function (s) { - var o = []; - for (var i in s) o.push(i); - return o; - }; - s.exports = Duplex; - var w = i(45412), - x = i(16708); - i(56698)(Duplex, w); - for (var C = _(x.prototype), j = 0; j < C.length; j++) { - var L = C[j]; - Duplex.prototype[L] || (Duplex.prototype[L] = x.prototype[L]); - } - function Duplex(s) { - if (!(this instanceof Duplex)) return new Duplex(s); - (w.call(this, s), - x.call(this, s), - (this.allowHalfOpen = !0), - s && - (!1 === s.readable && (this.readable = !1), - !1 === s.writable && (this.writable = !1), - !1 === s.allowHalfOpen && ((this.allowHalfOpen = !1), this.once('end', onend)))); - } - function onend() { - this._writableState.ended || u.nextTick(onEndNT, this); - } - function onEndNT(s) { - s.end(); - } - (Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - enumerable: !1, - get: function get() { - return this._writableState.highWaterMark; - } - }), - Object.defineProperty(Duplex.prototype, 'writableBuffer', { - enumerable: !1, - get: function get() { - return this._writableState && this._writableState.getBuffer(); - } - }), - Object.defineProperty(Duplex.prototype, 'writableLength', { - enumerable: !1, - get: function get() { - return this._writableState.length; - } - }), - Object.defineProperty(Duplex.prototype, 'destroyed', { - enumerable: !1, - get: function get() { - return ( - void 0 !== this._readableState && - void 0 !== this._writableState && - this._readableState.destroyed && - this._writableState.destroyed - ); - }, - set: function set(s) { - void 0 !== this._readableState && - void 0 !== this._writableState && - ((this._readableState.destroyed = s), (this._writableState.destroyed = s)); - } - })); - }, - 63600: (s, o, i) => { - 'use strict'; - s.exports = PassThrough; - var u = i(74610); - function PassThrough(s) { - if (!(this instanceof PassThrough)) return new PassThrough(s); - u.call(this, s); - } - (i(56698)(PassThrough, u), - (PassThrough.prototype._transform = function (s, o, i) { - i(null, s); - })); - }, - 45412: (s, o, i) => { - 'use strict'; - var u, - _ = i(65606); - ((s.exports = Readable), (Readable.ReadableState = ReadableState)); - i(37007).EventEmitter; - var w = function EElistenerCount(s, o) { - return s.listeners(o).length; - }, - x = i(40345), - C = i(48287).Buffer, - j = - (void 0 !== i.g - ? i.g - : 'undefined' != typeof window - ? window - : 'undefined' != typeof self - ? self - : {} - ).Uint8Array || function () {}; - var L, - B = i(79838); - L = B && B.debuglog ? B.debuglog('stream') : function debug() {}; - var $, - V, - U, - z = i(80345), - Y = i(75896), - Z = i(65291).getHighWaterMark, - ee = i(86048).F, - ie = ee.ERR_INVALID_ARG_TYPE, - ae = ee.ERR_STREAM_PUSH_AFTER_EOF, - le = ee.ERR_METHOD_NOT_IMPLEMENTED, - ce = ee.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; - i(56698)(Readable, x); - var pe = Y.errorOrDestroy, - de = ['error', 'close', 'destroy', 'pause', 'resume']; - function ReadableState(s, o, _) { - ((u = u || i(25382)), - (s = s || {}), - 'boolean' != typeof _ && (_ = o instanceof u), - (this.objectMode = !!s.objectMode), - _ && (this.objectMode = this.objectMode || !!s.readableObjectMode), - (this.highWaterMark = Z(this, s, 'readableHighWaterMark', _)), - (this.buffer = new z()), - (this.length = 0), - (this.pipes = null), - (this.pipesCount = 0), - (this.flowing = null), - (this.ended = !1), - (this.endEmitted = !1), - (this.reading = !1), - (this.sync = !0), - (this.needReadable = !1), - (this.emittedReadable = !1), - (this.readableListening = !1), - (this.resumeScheduled = !1), - (this.paused = !0), - (this.emitClose = !1 !== s.emitClose), - (this.autoDestroy = !!s.autoDestroy), - (this.destroyed = !1), - (this.defaultEncoding = s.defaultEncoding || 'utf8'), - (this.awaitDrain = 0), - (this.readingMore = !1), - (this.decoder = null), - (this.encoding = null), - s.encoding && - ($ || ($ = i(83141).I), - (this.decoder = new $(s.encoding)), - (this.encoding = s.encoding))); - } - function Readable(s) { - if (((u = u || i(25382)), !(this instanceof Readable))) return new Readable(s); - var o = this instanceof u; - ((this._readableState = new ReadableState(s, this, o)), - (this.readable = !0), - s && - ('function' == typeof s.read && (this._read = s.read), - 'function' == typeof s.destroy && (this._destroy = s.destroy)), - x.call(this)); - } - function readableAddChunk(s, o, i, u, _) { - L('readableAddChunk', o); - var w, - x = s._readableState; - if (null === o) - ((x.reading = !1), - (function onEofChunk(s, o) { - if ((L('onEofChunk'), o.ended)) return; - if (o.decoder) { - var i = o.decoder.end(); - i && i.length && (o.buffer.push(i), (o.length += o.objectMode ? 1 : i.length)); - } - ((o.ended = !0), - o.sync - ? emitReadable(s) - : ((o.needReadable = !1), - o.emittedReadable || ((o.emittedReadable = !0), emitReadable_(s)))); - })(s, x)); - else if ( - (_ || - (w = (function chunkInvalid(s, o) { - var i; - (function _isUint8Array(s) { - return C.isBuffer(s) || s instanceof j; - })(o) || - 'string' == typeof o || - void 0 === o || - s.objectMode || - (i = new ie('chunk', ['string', 'Buffer', 'Uint8Array'], o)); - return i; - })(x, o)), - w) - ) - pe(s, w); - else if (x.objectMode || (o && o.length > 0)) - if ( - ('string' == typeof o || - x.objectMode || - Object.getPrototypeOf(o) === C.prototype || - (o = (function _uint8ArrayToBuffer(s) { - return C.from(s); - })(o)), - u) - ) - x.endEmitted ? pe(s, new ce()) : addChunk(s, x, o, !0); - else if (x.ended) pe(s, new ae()); - else { - if (x.destroyed) return !1; - ((x.reading = !1), - x.decoder && !i - ? ((o = x.decoder.write(o)), - x.objectMode || 0 !== o.length ? addChunk(s, x, o, !1) : maybeReadMore(s, x)) - : addChunk(s, x, o, !1)); - } - else u || ((x.reading = !1), maybeReadMore(s, x)); - return !x.ended && (x.length < x.highWaterMark || 0 === x.length); - } - function addChunk(s, o, i, u) { - (o.flowing && 0 === o.length && !o.sync - ? ((o.awaitDrain = 0), s.emit('data', i)) - : ((o.length += o.objectMode ? 1 : i.length), - u ? o.buffer.unshift(i) : o.buffer.push(i), - o.needReadable && emitReadable(s)), - maybeReadMore(s, o)); - } - (Object.defineProperty(Readable.prototype, 'destroyed', { - enumerable: !1, - get: function get() { - return void 0 !== this._readableState && this._readableState.destroyed; - }, - set: function set(s) { - this._readableState && (this._readableState.destroyed = s); - } - }), - (Readable.prototype.destroy = Y.destroy), - (Readable.prototype._undestroy = Y.undestroy), - (Readable.prototype._destroy = function (s, o) { - o(s); - }), - (Readable.prototype.push = function (s, o) { - var i, - u = this._readableState; - return ( - u.objectMode - ? (i = !0) - : 'string' == typeof s && - ((o = o || u.defaultEncoding) !== u.encoding && ((s = C.from(s, o)), (o = '')), - (i = !0)), - readableAddChunk(this, s, o, !1, i) - ); - }), - (Readable.prototype.unshift = function (s) { - return readableAddChunk(this, s, null, !0, !1); - }), - (Readable.prototype.isPaused = function () { - return !1 === this._readableState.flowing; - }), - (Readable.prototype.setEncoding = function (s) { - $ || ($ = i(83141).I); - var o = new $(s); - ((this._readableState.decoder = o), - (this._readableState.encoding = this._readableState.decoder.encoding)); - for (var u = this._readableState.buffer.head, _ = ''; null !== u; ) - ((_ += o.write(u.data)), (u = u.next)); - return ( - this._readableState.buffer.clear(), - '' !== _ && this._readableState.buffer.push(_), - (this._readableState.length = _.length), - this - ); - })); - var fe = 1073741824; - function howMuchToRead(s, o) { - return s <= 0 || (0 === o.length && o.ended) - ? 0 - : o.objectMode - ? 1 - : s != s - ? o.flowing && o.length - ? o.buffer.head.data.length - : o.length - : (s > o.highWaterMark && - (o.highWaterMark = (function computeNewHighWaterMark(s) { - return ( - s >= fe - ? (s = fe) - : (s--, - (s |= s >>> 1), - (s |= s >>> 2), - (s |= s >>> 4), - (s |= s >>> 8), - (s |= s >>> 16), - s++), - s - ); - })(s)), - s <= o.length ? s : o.ended ? o.length : ((o.needReadable = !0), 0)); - } - function emitReadable(s) { - var o = s._readableState; - (L('emitReadable', o.needReadable, o.emittedReadable), - (o.needReadable = !1), - o.emittedReadable || - (L('emitReadable', o.flowing), - (o.emittedReadable = !0), - _.nextTick(emitReadable_, s))); - } - function emitReadable_(s) { - var o = s._readableState; - (L('emitReadable_', o.destroyed, o.length, o.ended), - o.destroyed || - (!o.length && !o.ended) || - (s.emit('readable'), (o.emittedReadable = !1)), - (o.needReadable = !o.flowing && !o.ended && o.length <= o.highWaterMark), - flow(s)); - } - function maybeReadMore(s, o) { - o.readingMore || ((o.readingMore = !0), _.nextTick(maybeReadMore_, s, o)); - } - function maybeReadMore_(s, o) { - for ( - ; - !o.reading && - !o.ended && - (o.length < o.highWaterMark || (o.flowing && 0 === o.length)); - ) { - var i = o.length; - if ((L('maybeReadMore read 0'), s.read(0), i === o.length)) break; - } - o.readingMore = !1; - } - function updateReadableListening(s) { - var o = s._readableState; - ((o.readableListening = s.listenerCount('readable') > 0), - o.resumeScheduled && !o.paused - ? (o.flowing = !0) - : s.listenerCount('data') > 0 && s.resume()); - } - function nReadingNextTick(s) { - (L('readable nexttick read 0'), s.read(0)); - } - function resume_(s, o) { - (L('resume', o.reading), - o.reading || s.read(0), - (o.resumeScheduled = !1), - s.emit('resume'), - flow(s), - o.flowing && !o.reading && s.read(0)); - } - function flow(s) { - var o = s._readableState; - for (L('flow', o.flowing); o.flowing && null !== s.read(); ); - } - function fromList(s, o) { - return 0 === o.length - ? null - : (o.objectMode - ? (i = o.buffer.shift()) - : !s || s >= o.length - ? ((i = o.decoder - ? o.buffer.join('') - : 1 === o.buffer.length - ? o.buffer.first() - : o.buffer.concat(o.length)), - o.buffer.clear()) - : (i = o.buffer.consume(s, o.decoder)), - i); - var i; - } - function endReadable(s) { - var o = s._readableState; - (L('endReadable', o.endEmitted), - o.endEmitted || ((o.ended = !0), _.nextTick(endReadableNT, o, s))); - } - function endReadableNT(s, o) { - if ( - (L('endReadableNT', s.endEmitted, s.length), - !s.endEmitted && - 0 === s.length && - ((s.endEmitted = !0), (o.readable = !1), o.emit('end'), s.autoDestroy)) - ) { - var i = o._writableState; - (!i || (i.autoDestroy && i.finished)) && o.destroy(); - } - } - function indexOf(s, o) { - for (var i = 0, u = s.length; i < u; i++) if (s[i] === o) return i; - return -1; - } - ((Readable.prototype.read = function (s) { - (L('read', s), (s = parseInt(s, 10))); - var o = this._readableState, - i = s; - if ( - (0 !== s && (o.emittedReadable = !1), - 0 === s && - o.needReadable && - ((0 !== o.highWaterMark ? o.length >= o.highWaterMark : o.length > 0) || o.ended)) - ) - return ( - L('read: emitReadable', o.length, o.ended), - 0 === o.length && o.ended ? endReadable(this) : emitReadable(this), - null - ); - if (0 === (s = howMuchToRead(s, o)) && o.ended) - return (0 === o.length && endReadable(this), null); - var u, - _ = o.needReadable; - return ( - L('need readable', _), - (0 === o.length || o.length - s < o.highWaterMark) && - L('length less than watermark', (_ = !0)), - o.ended || o.reading - ? L('reading or ended', (_ = !1)) - : _ && - (L('do read'), - (o.reading = !0), - (o.sync = !0), - 0 === o.length && (o.needReadable = !0), - this._read(o.highWaterMark), - (o.sync = !1), - o.reading || (s = howMuchToRead(i, o))), - null === (u = s > 0 ? fromList(s, o) : null) - ? ((o.needReadable = o.length <= o.highWaterMark), (s = 0)) - : ((o.length -= s), (o.awaitDrain = 0)), - 0 === o.length && - (o.ended || (o.needReadable = !0), i !== s && o.ended && endReadable(this)), - null !== u && this.emit('data', u), - u - ); - }), - (Readable.prototype._read = function (s) { - pe(this, new le('_read()')); - }), - (Readable.prototype.pipe = function (s, o) { - var i = this, - u = this._readableState; - switch (u.pipesCount) { - case 0: - u.pipes = s; - break; - case 1: - u.pipes = [u.pipes, s]; - break; - default: - u.pipes.push(s); - } - ((u.pipesCount += 1), L('pipe count=%d opts=%j', u.pipesCount, o)); - var x = (!o || !1 !== o.end) && s !== _.stdout && s !== _.stderr ? onend : unpipe; - function onunpipe(o, _) { - (L('onunpipe'), - o === i && - _ && - !1 === _.hasUnpiped && - ((_.hasUnpiped = !0), - (function cleanup() { - (L('cleanup'), - s.removeListener('close', onclose), - s.removeListener('finish', onfinish), - s.removeListener('drain', C), - s.removeListener('error', onerror), - s.removeListener('unpipe', onunpipe), - i.removeListener('end', onend), - i.removeListener('end', unpipe), - i.removeListener('data', ondata), - (j = !0), - !u.awaitDrain || (s._writableState && !s._writableState.needDrain) || C()); - })())); - } - function onend() { - (L('onend'), s.end()); - } - (u.endEmitted ? _.nextTick(x) : i.once('end', x), s.on('unpipe', onunpipe)); - var C = (function pipeOnDrain(s) { - return function pipeOnDrainFunctionResult() { - var o = s._readableState; - (L('pipeOnDrain', o.awaitDrain), - o.awaitDrain && o.awaitDrain--, - 0 === o.awaitDrain && w(s, 'data') && ((o.flowing = !0), flow(s))); - }; - })(i); - s.on('drain', C); - var j = !1; - function ondata(o) { - L('ondata'); - var _ = s.write(o); - (L('dest.write', _), - !1 === _ && - (((1 === u.pipesCount && u.pipes === s) || - (u.pipesCount > 1 && -1 !== indexOf(u.pipes, s))) && - !j && - (L('false write response, pause', u.awaitDrain), u.awaitDrain++), - i.pause())); - } - function onerror(o) { - (L('onerror', o), - unpipe(), - s.removeListener('error', onerror), - 0 === w(s, 'error') && pe(s, o)); - } - function onclose() { - (s.removeListener('finish', onfinish), unpipe()); - } - function onfinish() { - (L('onfinish'), s.removeListener('close', onclose), unpipe()); - } - function unpipe() { - (L('unpipe'), i.unpipe(s)); - } - return ( - i.on('data', ondata), - (function prependListener(s, o, i) { - if ('function' == typeof s.prependListener) return s.prependListener(o, i); - s._events && s._events[o] - ? Array.isArray(s._events[o]) - ? s._events[o].unshift(i) - : (s._events[o] = [i, s._events[o]]) - : s.on(o, i); - })(s, 'error', onerror), - s.once('close', onclose), - s.once('finish', onfinish), - s.emit('pipe', i), - u.flowing || (L('pipe resume'), i.resume()), - s - ); - }), - (Readable.prototype.unpipe = function (s) { - var o = this._readableState, - i = { hasUnpiped: !1 }; - if (0 === o.pipesCount) return this; - if (1 === o.pipesCount) - return ( - (s && s !== o.pipes) || - (s || (s = o.pipes), - (o.pipes = null), - (o.pipesCount = 0), - (o.flowing = !1), - s && s.emit('unpipe', this, i)), - this - ); - if (!s) { - var u = o.pipes, - _ = o.pipesCount; - ((o.pipes = null), (o.pipesCount = 0), (o.flowing = !1)); - for (var w = 0; w < _; w++) u[w].emit('unpipe', this, { hasUnpiped: !1 }); - return this; - } - var x = indexOf(o.pipes, s); - return ( - -1 === x || - (o.pipes.splice(x, 1), - (o.pipesCount -= 1), - 1 === o.pipesCount && (o.pipes = o.pipes[0]), - s.emit('unpipe', this, i)), - this - ); - }), - (Readable.prototype.on = function (s, o) { - var i = x.prototype.on.call(this, s, o), - u = this._readableState; - return ( - 'data' === s - ? ((u.readableListening = this.listenerCount('readable') > 0), - !1 !== u.flowing && this.resume()) - : 'readable' === s && - (u.endEmitted || - u.readableListening || - ((u.readableListening = u.needReadable = !0), - (u.flowing = !1), - (u.emittedReadable = !1), - L('on readable', u.length, u.reading), - u.length - ? emitReadable(this) - : u.reading || _.nextTick(nReadingNextTick, this))), - i - ); - }), - (Readable.prototype.addListener = Readable.prototype.on), - (Readable.prototype.removeListener = function (s, o) { - var i = x.prototype.removeListener.call(this, s, o); - return ('readable' === s && _.nextTick(updateReadableListening, this), i); - }), - (Readable.prototype.removeAllListeners = function (s) { - var o = x.prototype.removeAllListeners.apply(this, arguments); - return ( - ('readable' !== s && void 0 !== s) || _.nextTick(updateReadableListening, this), - o - ); - }), - (Readable.prototype.resume = function () { - var s = this._readableState; - return ( - s.flowing || - (L('resume'), - (s.flowing = !s.readableListening), - (function resume(s, o) { - o.resumeScheduled || ((o.resumeScheduled = !0), _.nextTick(resume_, s, o)); - })(this, s)), - (s.paused = !1), - this - ); - }), - (Readable.prototype.pause = function () { - return ( - L('call pause flowing=%j', this._readableState.flowing), - !1 !== this._readableState.flowing && - (L('pause'), (this._readableState.flowing = !1), this.emit('pause')), - (this._readableState.paused = !0), - this - ); - }), - (Readable.prototype.wrap = function (s) { - var o = this, - i = this._readableState, - u = !1; - for (var _ in (s.on('end', function () { - if ((L('wrapped end'), i.decoder && !i.ended)) { - var s = i.decoder.end(); - s && s.length && o.push(s); - } - o.push(null); - }), - s.on('data', function (_) { - (L('wrapped data'), - i.decoder && (_ = i.decoder.write(_)), - i.objectMode && null == _) || - ((i.objectMode || (_ && _.length)) && (o.push(_) || ((u = !0), s.pause()))); - }), - s)) - void 0 === this[_] && - 'function' == typeof s[_] && - (this[_] = (function methodWrap(o) { - return function methodWrapReturnFunction() { - return s[o].apply(s, arguments); - }; - })(_)); - for (var w = 0; w < de.length; w++) s.on(de[w], this.emit.bind(this, de[w])); - return ( - (this._read = function (o) { - (L('wrapped _read', o), u && ((u = !1), s.resume())); - }), - this - ); - }), - 'function' == typeof Symbol && - (Readable.prototype[Symbol.asyncIterator] = function () { - return (void 0 === V && (V = i(2955)), V(this)); - }), - Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - enumerable: !1, - get: function get() { - return this._readableState.highWaterMark; - } - }), - Object.defineProperty(Readable.prototype, 'readableBuffer', { - enumerable: !1, - get: function get() { - return this._readableState && this._readableState.buffer; - } - }), - Object.defineProperty(Readable.prototype, 'readableFlowing', { - enumerable: !1, - get: function get() { - return this._readableState.flowing; - }, - set: function set(s) { - this._readableState && (this._readableState.flowing = s); - } - }), - (Readable._fromList = fromList), - Object.defineProperty(Readable.prototype, 'readableLength', { - enumerable: !1, - get: function get() { - return this._readableState.length; - } - }), - 'function' == typeof Symbol && - (Readable.from = function (s, o) { - return (void 0 === U && (U = i(55157)), U(Readable, s, o)); - })); - }, - 74610: (s, o, i) => { - 'use strict'; - s.exports = Transform; - var u = i(86048).F, - _ = u.ERR_METHOD_NOT_IMPLEMENTED, - w = u.ERR_MULTIPLE_CALLBACK, - x = u.ERR_TRANSFORM_ALREADY_TRANSFORMING, - C = u.ERR_TRANSFORM_WITH_LENGTH_0, - j = i(25382); - function afterTransform(s, o) { - var i = this._transformState; - i.transforming = !1; - var u = i.writecb; - if (null === u) return this.emit('error', new w()); - ((i.writechunk = null), (i.writecb = null), null != o && this.push(o), u(s)); - var _ = this._readableState; - ((_.reading = !1), - (_.needReadable || _.length < _.highWaterMark) && this._read(_.highWaterMark)); - } - function Transform(s) { - if (!(this instanceof Transform)) return new Transform(s); - (j.call(this, s), - (this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: !1, - transforming: !1, - writecb: null, - writechunk: null, - writeencoding: null - }), - (this._readableState.needReadable = !0), - (this._readableState.sync = !1), - s && - ('function' == typeof s.transform && (this._transform = s.transform), - 'function' == typeof s.flush && (this._flush = s.flush)), - this.on('prefinish', prefinish)); - } - function prefinish() { - var s = this; - 'function' != typeof this._flush || this._readableState.destroyed - ? done(this, null, null) - : this._flush(function (o, i) { - done(s, o, i); - }); - } - function done(s, o, i) { - if (o) return s.emit('error', o); - if ((null != i && s.push(i), s._writableState.length)) throw new C(); - if (s._transformState.transforming) throw new x(); - return s.push(null); - } - (i(56698)(Transform, j), - (Transform.prototype.push = function (s, o) { - return ((this._transformState.needTransform = !1), j.prototype.push.call(this, s, o)); - }), - (Transform.prototype._transform = function (s, o, i) { - i(new _('_transform()')); - }), - (Transform.prototype._write = function (s, o, i) { - var u = this._transformState; - if (((u.writecb = i), (u.writechunk = s), (u.writeencoding = o), !u.transforming)) { - var _ = this._readableState; - (u.needTransform || _.needReadable || _.length < _.highWaterMark) && - this._read(_.highWaterMark); - } - }), - (Transform.prototype._read = function (s) { - var o = this._transformState; - null === o.writechunk || o.transforming - ? (o.needTransform = !0) - : ((o.transforming = !0), - this._transform(o.writechunk, o.writeencoding, o.afterTransform)); - }), - (Transform.prototype._destroy = function (s, o) { - j.prototype._destroy.call(this, s, function (s) { - o(s); - }); - })); - }, - 16708: (s, o, i) => { - 'use strict'; - var u, - _ = i(65606); - function CorkedRequest(s) { - var o = this; - ((this.next = null), - (this.entry = null), - (this.finish = function () { - !(function onCorkedFinish(s, o, i) { - var u = s.entry; - s.entry = null; - for (; u; ) { - var _ = u.callback; - (o.pendingcb--, _(i), (u = u.next)); - } - o.corkedRequestsFree.next = s; - })(o, s); - })); - } - ((s.exports = Writable), (Writable.WritableState = WritableState)); - var w = { deprecate: i(94643) }, - x = i(40345), - C = i(48287).Buffer, - j = - (void 0 !== i.g - ? i.g - : 'undefined' != typeof window - ? window - : 'undefined' != typeof self - ? self - : {} - ).Uint8Array || function () {}; - var L, - B = i(75896), - $ = i(65291).getHighWaterMark, - V = i(86048).F, - U = V.ERR_INVALID_ARG_TYPE, - z = V.ERR_METHOD_NOT_IMPLEMENTED, - Y = V.ERR_MULTIPLE_CALLBACK, - Z = V.ERR_STREAM_CANNOT_PIPE, - ee = V.ERR_STREAM_DESTROYED, - ie = V.ERR_STREAM_NULL_VALUES, - ae = V.ERR_STREAM_WRITE_AFTER_END, - le = V.ERR_UNKNOWN_ENCODING, - ce = B.errorOrDestroy; - function nop() {} - function WritableState(s, o, w) { - ((u = u || i(25382)), - (s = s || {}), - 'boolean' != typeof w && (w = o instanceof u), - (this.objectMode = !!s.objectMode), - w && (this.objectMode = this.objectMode || !!s.writableObjectMode), - (this.highWaterMark = $(this, s, 'writableHighWaterMark', w)), - (this.finalCalled = !1), - (this.needDrain = !1), - (this.ending = !1), - (this.ended = !1), - (this.finished = !1), - (this.destroyed = !1)); - var x = !1 === s.decodeStrings; - ((this.decodeStrings = !x), - (this.defaultEncoding = s.defaultEncoding || 'utf8'), - (this.length = 0), - (this.writing = !1), - (this.corked = 0), - (this.sync = !0), - (this.bufferProcessing = !1), - (this.onwrite = function (s) { - !(function onwrite(s, o) { - var i = s._writableState, - u = i.sync, - w = i.writecb; - if ('function' != typeof w) throw new Y(); - if ( - ((function onwriteStateUpdate(s) { - ((s.writing = !1), - (s.writecb = null), - (s.length -= s.writelen), - (s.writelen = 0)); - })(i), - o) - ) - !(function onwriteError(s, o, i, u, w) { - (--o.pendingcb, - i - ? (_.nextTick(w, u), - _.nextTick(finishMaybe, s, o), - (s._writableState.errorEmitted = !0), - ce(s, u)) - : (w(u), - (s._writableState.errorEmitted = !0), - ce(s, u), - finishMaybe(s, o))); - })(s, i, u, o, w); - else { - var x = needFinish(i) || s.destroyed; - (x || i.corked || i.bufferProcessing || !i.bufferedRequest || clearBuffer(s, i), - u ? _.nextTick(afterWrite, s, i, x, w) : afterWrite(s, i, x, w)); - } - })(o, s); - }), - (this.writecb = null), - (this.writelen = 0), - (this.bufferedRequest = null), - (this.lastBufferedRequest = null), - (this.pendingcb = 0), - (this.prefinished = !1), - (this.errorEmitted = !1), - (this.emitClose = !1 !== s.emitClose), - (this.autoDestroy = !!s.autoDestroy), - (this.bufferedRequestCount = 0), - (this.corkedRequestsFree = new CorkedRequest(this))); - } - function Writable(s) { - var o = this instanceof (u = u || i(25382)); - if (!o && !L.call(Writable, this)) return new Writable(s); - ((this._writableState = new WritableState(s, this, o)), - (this.writable = !0), - s && - ('function' == typeof s.write && (this._write = s.write), - 'function' == typeof s.writev && (this._writev = s.writev), - 'function' == typeof s.destroy && (this._destroy = s.destroy), - 'function' == typeof s.final && (this._final = s.final)), - x.call(this)); - } - function doWrite(s, o, i, u, _, w, x) { - ((o.writelen = u), - (o.writecb = x), - (o.writing = !0), - (o.sync = !0), - o.destroyed - ? o.onwrite(new ee('write')) - : i - ? s._writev(_, o.onwrite) - : s._write(_, w, o.onwrite), - (o.sync = !1)); - } - function afterWrite(s, o, i, u) { - (i || - (function onwriteDrain(s, o) { - 0 === o.length && o.needDrain && ((o.needDrain = !1), s.emit('drain')); - })(s, o), - o.pendingcb--, - u(), - finishMaybe(s, o)); - } - function clearBuffer(s, o) { - o.bufferProcessing = !0; - var i = o.bufferedRequest; - if (s._writev && i && i.next) { - var u = o.bufferedRequestCount, - _ = new Array(u), - w = o.corkedRequestsFree; - w.entry = i; - for (var x = 0, C = !0; i; ) - ((_[x] = i), i.isBuf || (C = !1), (i = i.next), (x += 1)); - ((_.allBuffers = C), - doWrite(s, o, !0, o.length, _, '', w.finish), - o.pendingcb++, - (o.lastBufferedRequest = null), - w.next - ? ((o.corkedRequestsFree = w.next), (w.next = null)) - : (o.corkedRequestsFree = new CorkedRequest(o)), - (o.bufferedRequestCount = 0)); - } else { - for (; i; ) { - var j = i.chunk, - L = i.encoding, - B = i.callback; - if ( - (doWrite(s, o, !1, o.objectMode ? 1 : j.length, j, L, B), - (i = i.next), - o.bufferedRequestCount--, - o.writing) - ) - break; - } - null === i && (o.lastBufferedRequest = null); - } - ((o.bufferedRequest = i), (o.bufferProcessing = !1)); - } - function needFinish(s) { - return ( - s.ending && 0 === s.length && null === s.bufferedRequest && !s.finished && !s.writing - ); - } - function callFinal(s, o) { - s._final(function (i) { - (o.pendingcb--, - i && ce(s, i), - (o.prefinished = !0), - s.emit('prefinish'), - finishMaybe(s, o)); - }); - } - function finishMaybe(s, o) { - var i = needFinish(o); - if ( - i && - ((function prefinish(s, o) { - o.prefinished || - o.finalCalled || - ('function' != typeof s._final || o.destroyed - ? ((o.prefinished = !0), s.emit('prefinish')) - : (o.pendingcb++, (o.finalCalled = !0), _.nextTick(callFinal, s, o))); - })(s, o), - 0 === o.pendingcb && ((o.finished = !0), s.emit('finish'), o.autoDestroy)) - ) { - var u = s._readableState; - (!u || (u.autoDestroy && u.endEmitted)) && s.destroy(); - } - return i; - } - (i(56698)(Writable, x), - (WritableState.prototype.getBuffer = function getBuffer() { - for (var s = this.bufferedRequest, o = []; s; ) (o.push(s), (s = s.next)); - return o; - }), - (function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: w.deprecate( - function writableStateBufferGetter() { - return this.getBuffer(); - }, - '_writableState.buffer is deprecated. Use _writableState.getBuffer instead.', - 'DEP0003' - ) - }); - } catch (s) {} - })(), - 'function' == typeof Symbol && - Symbol.hasInstance && - 'function' == typeof Function.prototype[Symbol.hasInstance] - ? ((L = Function.prototype[Symbol.hasInstance]), - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function value(s) { - return ( - !!L.call(this, s) || - (this === Writable && s && s._writableState instanceof WritableState) - ); - } - })) - : (L = function realHasInstance(s) { - return s instanceof this; - }), - (Writable.prototype.pipe = function () { - ce(this, new Z()); - }), - (Writable.prototype.write = function (s, o, i) { - var u = this._writableState, - w = !1, - x = - !u.objectMode && - (function _isUint8Array(s) { - return C.isBuffer(s) || s instanceof j; - })(s); - return ( - x && - !C.isBuffer(s) && - (s = (function _uint8ArrayToBuffer(s) { - return C.from(s); - })(s)), - 'function' == typeof o && ((i = o), (o = null)), - x ? (o = 'buffer') : o || (o = u.defaultEncoding), - 'function' != typeof i && (i = nop), - u.ending - ? (function writeAfterEnd(s, o) { - var i = new ae(); - (ce(s, i), _.nextTick(o, i)); - })(this, i) - : (x || - (function validChunk(s, o, i, u) { - var w; - return ( - null === i - ? (w = new ie()) - : 'string' == typeof i || - o.objectMode || - (w = new U('chunk', ['string', 'Buffer'], i)), - !w || (ce(s, w), _.nextTick(u, w), !1) - ); - })(this, u, s, i)) && - (u.pendingcb++, - (w = (function writeOrBuffer(s, o, i, u, _, w) { - if (!i) { - var x = (function decodeChunk(s, o, i) { - s.objectMode || - !1 === s.decodeStrings || - 'string' != typeof o || - (o = C.from(o, i)); - return o; - })(o, u, _); - u !== x && ((i = !0), (_ = 'buffer'), (u = x)); - } - var j = o.objectMode ? 1 : u.length; - o.length += j; - var L = o.length < o.highWaterMark; - L || (o.needDrain = !0); - if (o.writing || o.corked) { - var B = o.lastBufferedRequest; - ((o.lastBufferedRequest = { - chunk: u, - encoding: _, - isBuf: i, - callback: w, - next: null - }), - B - ? (B.next = o.lastBufferedRequest) - : (o.bufferedRequest = o.lastBufferedRequest), - (o.bufferedRequestCount += 1)); - } else doWrite(s, o, !1, j, u, _, w); - return L; - })(this, u, x, s, o, i))), - w - ); - }), - (Writable.prototype.cork = function () { - this._writableState.corked++; - }), - (Writable.prototype.uncork = function () { - var s = this._writableState; - s.corked && - (s.corked--, - s.writing || - s.corked || - s.bufferProcessing || - !s.bufferedRequest || - clearBuffer(this, s)); - }), - (Writable.prototype.setDefaultEncoding = function setDefaultEncoding(s) { - if ( - ('string' == typeof s && (s = s.toLowerCase()), - !( - [ - 'hex', - 'utf8', - 'utf-8', - 'ascii', - 'binary', - 'base64', - 'ucs2', - 'ucs-2', - 'utf16le', - 'utf-16le', - 'raw' - ].indexOf((s + '').toLowerCase()) > -1 - )) - ) - throw new le(s); - return ((this._writableState.defaultEncoding = s), this); - }), - Object.defineProperty(Writable.prototype, 'writableBuffer', { - enumerable: !1, - get: function get() { - return this._writableState && this._writableState.getBuffer(); - } - }), - Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - enumerable: !1, - get: function get() { - return this._writableState.highWaterMark; - } - }), - (Writable.prototype._write = function (s, o, i) { - i(new z('_write()')); - }), - (Writable.prototype._writev = null), - (Writable.prototype.end = function (s, o, i) { - var u = this._writableState; - return ( - 'function' == typeof s - ? ((i = s), (s = null), (o = null)) - : 'function' == typeof o && ((i = o), (o = null)), - null != s && this.write(s, o), - u.corked && ((u.corked = 1), this.uncork()), - u.ending || - (function endWritable(s, o, i) { - ((o.ending = !0), - finishMaybe(s, o), - i && (o.finished ? _.nextTick(i) : s.once('finish', i))); - ((o.ended = !0), (s.writable = !1)); - })(this, u, i), - this - ); - }), - Object.defineProperty(Writable.prototype, 'writableLength', { - enumerable: !1, - get: function get() { - return this._writableState.length; - } - }), - Object.defineProperty(Writable.prototype, 'destroyed', { - enumerable: !1, - get: function get() { - return void 0 !== this._writableState && this._writableState.destroyed; - }, - set: function set(s) { - this._writableState && (this._writableState.destroyed = s); - } - }), - (Writable.prototype.destroy = B.destroy), - (Writable.prototype._undestroy = B.undestroy), - (Writable.prototype._destroy = function (s, o) { - o(s); - })); - }, - 2955: (s, o, i) => { - 'use strict'; - var u, - _ = i(65606); - function _defineProperty(s, o, i) { - return ( - (o = (function _toPropertyKey(s) { - var o = (function _toPrimitive(s, o) { - if ('object' != typeof s || null === s) return s; - var i = s[Symbol.toPrimitive]; - if (void 0 !== i) { - var u = i.call(s, o || 'default'); - if ('object' != typeof u) return u; - throw new TypeError('@@toPrimitive must return a primitive value.'); - } - return ('string' === o ? String : Number)(s); - })(s, 'string'); - return 'symbol' == typeof o ? o : String(o); - })(o)) in s - ? Object.defineProperty(s, o, { - value: i, - enumerable: !0, - configurable: !0, - writable: !0 - }) - : (s[o] = i), - s - ); - } - var w = i(86238), - x = Symbol('lastResolve'), - C = Symbol('lastReject'), - j = Symbol('error'), - L = Symbol('ended'), - B = Symbol('lastPromise'), - $ = Symbol('handlePromise'), - V = Symbol('stream'); - function createIterResult(s, o) { - return { value: s, done: o }; - } - function readAndResolve(s) { - var o = s[x]; - if (null !== o) { - var i = s[V].read(); - null !== i && - ((s[B] = null), (s[x] = null), (s[C] = null), o(createIterResult(i, !1))); - } - } - function onReadable(s) { - _.nextTick(readAndResolve, s); - } - var U = Object.getPrototypeOf(function () {}), - z = Object.setPrototypeOf( - (_defineProperty( - (u = { - get stream() { - return this[V]; - }, - next: function next() { - var s = this, - o = this[j]; - if (null !== o) return Promise.reject(o); - if (this[L]) return Promise.resolve(createIterResult(void 0, !0)); - if (this[V].destroyed) - return new Promise(function (o, i) { - _.nextTick(function () { - s[j] ? i(s[j]) : o(createIterResult(void 0, !0)); - }); - }); - var i, - u = this[B]; - if (u) - i = new Promise( - (function wrapForNext(s, o) { - return function (i, u) { - s.then(function () { - o[L] ? i(createIterResult(void 0, !0)) : o[$](i, u); - }, u); - }; - })(u, this) - ); - else { - var w = this[V].read(); - if (null !== w) return Promise.resolve(createIterResult(w, !1)); - i = new Promise(this[$]); - } - return ((this[B] = i), i); - } - }), - Symbol.asyncIterator, - function () { - return this; - } - ), - _defineProperty(u, 'return', function _return() { - var s = this; - return new Promise(function (o, i) { - s[V].destroy(null, function (s) { - s ? i(s) : o(createIterResult(void 0, !0)); - }); - }); - }), - u), - U - ); - s.exports = function createReadableStreamAsyncIterator(s) { - var o, - i = Object.create( - z, - (_defineProperty((o = {}), V, { value: s, writable: !0 }), - _defineProperty(o, x, { value: null, writable: !0 }), - _defineProperty(o, C, { value: null, writable: !0 }), - _defineProperty(o, j, { value: null, writable: !0 }), - _defineProperty(o, L, { value: s._readableState.endEmitted, writable: !0 }), - _defineProperty(o, $, { - value: function value(s, o) { - var u = i[V].read(); - u - ? ((i[B] = null), (i[x] = null), (i[C] = null), s(createIterResult(u, !1))) - : ((i[x] = s), (i[C] = o)); - }, - writable: !0 - }), - o) - ); - return ( - (i[B] = null), - w(s, function (s) { - if (s && 'ERR_STREAM_PREMATURE_CLOSE' !== s.code) { - var o = i[C]; - return ( - null !== o && ((i[B] = null), (i[x] = null), (i[C] = null), o(s)), - void (i[j] = s) - ); - } - var u = i[x]; - (null !== u && - ((i[B] = null), (i[x] = null), (i[C] = null), u(createIterResult(void 0, !0))), - (i[L] = !0)); - }), - s.on('readable', onReadable.bind(null, i)), - i - ); - }; - }, - 80345: (s, o, i) => { - 'use strict'; - function ownKeys(s, o) { - var i = Object.keys(s); - if (Object.getOwnPropertySymbols) { - var u = Object.getOwnPropertySymbols(s); - (o && - (u = u.filter(function (o) { - return Object.getOwnPropertyDescriptor(s, o).enumerable; - })), - i.push.apply(i, u)); - } - return i; - } - function _objectSpread(s) { - for (var o = 1; o < arguments.length; o++) { - var i = null != arguments[o] ? arguments[o] : {}; - o % 2 - ? ownKeys(Object(i), !0).forEach(function (o) { - _defineProperty(s, o, i[o]); - }) - : Object.getOwnPropertyDescriptors - ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(i)) - : ownKeys(Object(i)).forEach(function (o) { - Object.defineProperty(s, o, Object.getOwnPropertyDescriptor(i, o)); - }); - } - return s; - } - function _defineProperty(s, o, i) { - return ( - (o = _toPropertyKey(o)) in s - ? Object.defineProperty(s, o, { - value: i, - enumerable: !0, - configurable: !0, - writable: !0 - }) - : (s[o] = i), - s - ); - } - function _defineProperties(s, o) { - for (var i = 0; i < o.length; i++) { - var u = o[i]; - ((u.enumerable = u.enumerable || !1), - (u.configurable = !0), - 'value' in u && (u.writable = !0), - Object.defineProperty(s, _toPropertyKey(u.key), u)); - } - } - function _toPropertyKey(s) { - var o = (function _toPrimitive(s, o) { - if ('object' != typeof s || null === s) return s; - var i = s[Symbol.toPrimitive]; - if (void 0 !== i) { - var u = i.call(s, o || 'default'); - if ('object' != typeof u) return u; - throw new TypeError('@@toPrimitive must return a primitive value.'); - } - return ('string' === o ? String : Number)(s); - })(s, 'string'); - return 'symbol' == typeof o ? o : String(o); - } - var u = i(48287).Buffer, - _ = i(15340).inspect, - w = (_ && _.custom) || 'inspect'; - s.exports = (function () { - function BufferList() { - (!(function _classCallCheck(s, o) { - if (!(s instanceof o)) throw new TypeError('Cannot call a class as a function'); - })(this, BufferList), - (this.head = null), - (this.tail = null), - (this.length = 0)); - } - return ( - (function _createClass(s, o, i) { - return ( - o && _defineProperties(s.prototype, o), - i && _defineProperties(s, i), - Object.defineProperty(s, 'prototype', { writable: !1 }), - s - ); - })(BufferList, [ - { - key: 'push', - value: function push(s) { - var o = { data: s, next: null }; - (this.length > 0 ? (this.tail.next = o) : (this.head = o), - (this.tail = o), - ++this.length); - } - }, - { - key: 'unshift', - value: function unshift(s) { - var o = { data: s, next: this.head }; - (0 === this.length && (this.tail = o), (this.head = o), ++this.length); - } - }, - { - key: 'shift', - value: function shift() { - if (0 !== this.length) { - var s = this.head.data; - return ( - 1 === this.length - ? (this.head = this.tail = null) - : (this.head = this.head.next), - --this.length, - s - ); - } - } - }, - { - key: 'clear', - value: function clear() { - ((this.head = this.tail = null), (this.length = 0)); - } - }, - { - key: 'join', - value: function join(s) { - if (0 === this.length) return ''; - for (var o = this.head, i = '' + o.data; (o = o.next); ) i += s + o.data; - return i; - } - }, - { - key: 'concat', - value: function concat(s) { - if (0 === this.length) return u.alloc(0); - for (var o, i, _, w = u.allocUnsafe(s >>> 0), x = this.head, C = 0; x; ) - ((o = x.data), - (i = w), - (_ = C), - u.prototype.copy.call(o, i, _), - (C += x.data.length), - (x = x.next)); - return w; - } - }, - { - key: 'consume', - value: function consume(s, o) { - var i; - return ( - s < this.head.data.length - ? ((i = this.head.data.slice(0, s)), - (this.head.data = this.head.data.slice(s))) - : (i = - s === this.head.data.length - ? this.shift() - : o - ? this._getString(s) - : this._getBuffer(s)), - i - ); - } - }, - { - key: 'first', - value: function first() { - return this.head.data; - } - }, - { - key: '_getString', - value: function _getString(s) { - var o = this.head, - i = 1, - u = o.data; - for (s -= u.length; (o = o.next); ) { - var _ = o.data, - w = s > _.length ? _.length : s; - if ((w === _.length ? (u += _) : (u += _.slice(0, s)), 0 === (s -= w))) { - w === _.length - ? (++i, o.next ? (this.head = o.next) : (this.head = this.tail = null)) - : ((this.head = o), (o.data = _.slice(w))); - break; - } - ++i; - } - return ((this.length -= i), u); - } - }, - { - key: '_getBuffer', - value: function _getBuffer(s) { - var o = u.allocUnsafe(s), - i = this.head, - _ = 1; - for (i.data.copy(o), s -= i.data.length; (i = i.next); ) { - var w = i.data, - x = s > w.length ? w.length : s; - if ((w.copy(o, o.length - s, 0, x), 0 === (s -= x))) { - x === w.length - ? (++_, i.next ? (this.head = i.next) : (this.head = this.tail = null)) - : ((this.head = i), (i.data = w.slice(x))); - break; - } - ++_; - } - return ((this.length -= _), o); - } - }, - { - key: w, - value: function value(s, o) { - return _( - this, - _objectSpread(_objectSpread({}, o), {}, { depth: 0, customInspect: !1 }) - ); - } - } - ]), - BufferList - ); - })(); - }, - 75896: (s, o, i) => { - 'use strict'; - var u = i(65606); - function emitErrorAndCloseNT(s, o) { - (emitErrorNT(s, o), emitCloseNT(s)); - } - function emitCloseNT(s) { - (s._writableState && !s._writableState.emitClose) || - (s._readableState && !s._readableState.emitClose) || - s.emit('close'); - } - function emitErrorNT(s, o) { - s.emit('error', o); - } - s.exports = { - destroy: function destroy(s, o) { - var i = this, - _ = this._readableState && this._readableState.destroyed, - w = this._writableState && this._writableState.destroyed; - return _ || w - ? (o - ? o(s) - : s && - (this._writableState - ? this._writableState.errorEmitted || - ((this._writableState.errorEmitted = !0), - u.nextTick(emitErrorNT, this, s)) - : u.nextTick(emitErrorNT, this, s)), - this) - : (this._readableState && (this._readableState.destroyed = !0), - this._writableState && (this._writableState.destroyed = !0), - this._destroy(s || null, function (s) { - !o && s - ? i._writableState - ? i._writableState.errorEmitted - ? u.nextTick(emitCloseNT, i) - : ((i._writableState.errorEmitted = !0), - u.nextTick(emitErrorAndCloseNT, i, s)) - : u.nextTick(emitErrorAndCloseNT, i, s) - : o - ? (u.nextTick(emitCloseNT, i), o(s)) - : u.nextTick(emitCloseNT, i); - }), - this); - }, - undestroy: function undestroy() { - (this._readableState && - ((this._readableState.destroyed = !1), - (this._readableState.reading = !1), - (this._readableState.ended = !1), - (this._readableState.endEmitted = !1)), - this._writableState && - ((this._writableState.destroyed = !1), - (this._writableState.ended = !1), - (this._writableState.ending = !1), - (this._writableState.finalCalled = !1), - (this._writableState.prefinished = !1), - (this._writableState.finished = !1), - (this._writableState.errorEmitted = !1))); - }, - errorOrDestroy: function errorOrDestroy(s, o) { - var i = s._readableState, - u = s._writableState; - (i && i.autoDestroy) || (u && u.autoDestroy) ? s.destroy(o) : s.emit('error', o); - } - }; - }, - 86238: (s, o, i) => { - 'use strict'; - var u = i(86048).F.ERR_STREAM_PREMATURE_CLOSE; - function noop() {} - s.exports = function eos(s, o, i) { - if ('function' == typeof o) return eos(s, null, o); - (o || (o = {}), - (i = (function once(s) { - var o = !1; - return function () { - if (!o) { - o = !0; - for (var i = arguments.length, u = new Array(i), _ = 0; _ < i; _++) - u[_] = arguments[_]; - s.apply(this, u); - } - }; - })(i || noop))); - var _ = o.readable || (!1 !== o.readable && s.readable), - w = o.writable || (!1 !== o.writable && s.writable), - x = function onlegacyfinish() { - s.writable || j(); - }, - C = s._writableState && s._writableState.finished, - j = function onfinish() { - ((w = !1), (C = !0), _ || i.call(s)); - }, - L = s._readableState && s._readableState.endEmitted, - B = function onend() { - ((_ = !1), (L = !0), w || i.call(s)); - }, - $ = function onerror(o) { - i.call(s, o); - }, - V = function onclose() { - var o; - return _ && !L - ? ((s._readableState && s._readableState.ended) || (o = new u()), i.call(s, o)) - : w && !C - ? ((s._writableState && s._writableState.ended) || (o = new u()), i.call(s, o)) - : void 0; - }, - U = function onrequest() { - s.req.on('finish', j); - }; - return ( - !(function isRequest(s) { - return s.setHeader && 'function' == typeof s.abort; - })(s) - ? w && !s._writableState && (s.on('end', x), s.on('close', x)) - : (s.on('complete', j), s.on('abort', V), s.req ? U() : s.on('request', U)), - s.on('end', B), - s.on('finish', j), - !1 !== o.error && s.on('error', $), - s.on('close', V), - function () { - (s.removeListener('complete', j), - s.removeListener('abort', V), - s.removeListener('request', U), - s.req && s.req.removeListener('finish', j), - s.removeListener('end', x), - s.removeListener('close', x), - s.removeListener('finish', j), - s.removeListener('end', B), - s.removeListener('error', $), - s.removeListener('close', V)); - } - ); - }; - }, - 55157: (s) => { - s.exports = function () { - throw new Error('Readable.from is not available in the browser'); - }; - }, - 57758: (s, o, i) => { - 'use strict'; - var u; - var _ = i(86048).F, - w = _.ERR_MISSING_ARGS, - x = _.ERR_STREAM_DESTROYED; - function noop(s) { - if (s) throw s; - } - function call(s) { - s(); - } - function pipe(s, o) { - return s.pipe(o); - } - s.exports = function pipeline() { - for (var s = arguments.length, o = new Array(s), _ = 0; _ < s; _++) o[_] = arguments[_]; - var C, - j = (function popCallback(s) { - return s.length ? ('function' != typeof s[s.length - 1] ? noop : s.pop()) : noop; - })(o); - if ((Array.isArray(o[0]) && (o = o[0]), o.length < 2)) throw new w('streams'); - var L = o.map(function (s, _) { - var w = _ < o.length - 1; - return (function destroyer(s, o, _, w) { - w = (function once(s) { - var o = !1; - return function () { - o || ((o = !0), s.apply(void 0, arguments)); - }; - })(w); - var C = !1; - (s.on('close', function () { - C = !0; - }), - void 0 === u && (u = i(86238)), - u(s, { readable: o, writable: _ }, function (s) { - if (s) return w(s); - ((C = !0), w()); - })); - var j = !1; - return function (o) { - if (!C && !j) - return ( - (j = !0), - (function isRequest(s) { - return s.setHeader && 'function' == typeof s.abort; - })(s) - ? s.abort() - : 'function' == typeof s.destroy - ? s.destroy() - : void w(o || new x('pipe')) - ); - }; - })(s, w, _ > 0, function (s) { - (C || (C = s), s && L.forEach(call), w || (L.forEach(call), j(C))); - }); - }); - return o.reduce(pipe); - }; - }, - 65291: (s, o, i) => { - 'use strict'; - var u = i(86048).F.ERR_INVALID_OPT_VALUE; - s.exports = { - getHighWaterMark: function getHighWaterMark(s, o, i, _) { - var w = (function highWaterMarkFrom(s, o, i) { - return null != s.highWaterMark ? s.highWaterMark : o ? s[i] : null; - })(o, _, i); - if (null != w) { - if (!isFinite(w) || Math.floor(w) !== w || w < 0) - throw new u(_ ? i : 'highWaterMark', w); - return Math.floor(w); - } - return s.objectMode ? 16 : 16384; - } - }; - }, - 40345: (s, o, i) => { - s.exports = i(37007).EventEmitter; - }, - 84977: (s, o, i) => { - 'use strict'; - Object.defineProperty(o, '__esModule', { value: !0 }); - var u = (function _interopRequireDefault(s) { - return s && s.__esModule ? s : { default: s }; - })(i(9404)), - _ = i(55674); - ((o.default = function (s) { - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : u.default.Map, - i = Object.keys(s); - return function () { - var u = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : o(), - w = arguments[1]; - return u.withMutations(function (o) { - i.forEach(function (i) { - var u = (0, s[i])(o.get(i), w); - ((0, _.validateNextState)(u, i, w), o.set(i, u)); - }); - }); - }; - }), - (s.exports = o.default)); - }, - 89593: (s, o, i) => { - 'use strict'; - o.H = void 0; - var u = (function _interopRequireDefault(s) { - return s && s.__esModule ? s : { default: s }; - })(i(84977)); - o.H = u.default; - }, - 48590: (s, o) => { - 'use strict'; - (Object.defineProperty(o, '__esModule', { value: !0 }), - (o.default = function (s) { - return s && '@@redux/INIT' === s.type - ? 'initialState argument passed to createStore' - : 'previous state received by the reducer'; - }), - (s.exports = o.default)); - }, - 82261: (s, o, i) => { - 'use strict'; - Object.defineProperty(o, '__esModule', { value: !0 }); - var u = _interopRequireDefault(i(9404)), - _ = _interopRequireDefault(i(48590)); - function _interopRequireDefault(s) { - return s && s.__esModule ? s : { default: s }; - } - ((o.default = function (s, o, i) { - var w = Object.keys(o); - if (!w.length) - return 'Store does not have a valid reducer. Make sure the argument passed to combineReducers is an object whose values are reducers.'; - var x = (0, _.default)(i); - if ( - u.default.isImmutable ? !u.default.isImmutable(s) : !u.default.Iterable.isIterable(s) - ) - return ( - 'The ' + - x + - ' is of unexpected type. Expected argument to be an instance of Immutable.Collection or Immutable.Record with the following properties: "' + - w.join('", "') + - '".' - ); - var C = s - .toSeq() - .keySeq() - .toArray() - .filter(function (s) { - return !o.hasOwnProperty(s); - }); - return C.length > 0 - ? 'Unexpected ' + - (1 === C.length ? 'property' : 'properties') + - ' "' + - C.join('", "') + - '" found in ' + - x + - '. Expected to find one of the known reducer property names instead: "' + - w.join('", "') + - '". Unexpected properties will be ignored.' - : null; - }), - (s.exports = o.default)); - }, - 55674: (s, o, i) => { - 'use strict'; - (Object.defineProperty(o, '__esModule', { value: !0 }), - (o.validateNextState = - o.getUnexpectedInvocationParameterMessage = - o.getStateName = - void 0)); - var u = _interopRequireDefault(i(48590)), - _ = _interopRequireDefault(i(82261)), - w = _interopRequireDefault(i(27374)); - function _interopRequireDefault(s) { - return s && s.__esModule ? s : { default: s }; - } - ((o.getStateName = u.default), - (o.getUnexpectedInvocationParameterMessage = _.default), - (o.validateNextState = w.default)); - }, - 27374: (s, o) => { - 'use strict'; - (Object.defineProperty(o, '__esModule', { value: !0 }), - (o.default = function (s, o, i) { - if (void 0 === s) - throw new Error( - 'Reducer "' + - o + - '" returned undefined when handling "' + - i.type + - '" action. To ignore an action, you must explicitly return the previous state.' - ); - }), - (s.exports = o.default)); - }, - 75208: (s) => { - 'use strict'; - var o, - i = ''; - s.exports = function repeat(s, u) { - if ('string' != typeof s) throw new TypeError('expected a string'); - if (1 === u) return s; - if (2 === u) return s + s; - var _ = s.length * u; - if (o !== s || void 0 === o) ((o = s), (i = '')); - else if (i.length >= _) return i.substr(0, _); - for (; _ > i.length && u > 1; ) (1 & u && (i += s), (u >>= 1), (s += s)); - return (i = (i += s).substr(0, _)); - }; - }, - 92063: (s) => { - 'use strict'; - s.exports = function required(s, o) { - if (((o = o.split(':')[0]), !(s = +s))) return !1; - switch (o) { - case 'http': - case 'ws': - return 80 !== s; - case 'https': - case 'wss': - return 443 !== s; - case 'ftp': - return 21 !== s; - case 'gopher': - return 70 !== s; - case 'file': - return !1; - } - return 0 !== s; - }; - }, - 27096: (s, o, i) => { - const u = i(87586), - _ = i(6205), - w = i(10023), - x = i(8048); - ((s.exports = (s) => { - var o, - i, - C = 0, - j = { type: _.ROOT, stack: [] }, - L = j, - B = j.stack, - $ = [], - repeatErr = (o) => { - u.error(s, 'Nothing to repeat at column ' + (o - 1)); - }, - V = u.strToChars(s); - for (o = V.length; C < o; ) - switch ((i = V[C++])) { - case '\\': - switch ((i = V[C++])) { - case 'b': - B.push(x.wordBoundary()); - break; - case 'B': - B.push(x.nonWordBoundary()); - break; - case 'w': - B.push(w.words()); - break; - case 'W': - B.push(w.notWords()); - break; - case 'd': - B.push(w.ints()); - break; - case 'D': - B.push(w.notInts()); - break; - case 's': - B.push(w.whitespace()); - break; - case 'S': - B.push(w.notWhitespace()); - break; - default: - /\d/.test(i) - ? B.push({ type: _.REFERENCE, value: parseInt(i, 10) }) - : B.push({ type: _.CHAR, value: i.charCodeAt(0) }); - } - break; - case '^': - B.push(x.begin()); - break; - case '$': - B.push(x.end()); - break; - case '[': - var U; - '^' === V[C] ? ((U = !0), C++) : (U = !1); - var z = u.tokenizeClass(V.slice(C), s); - ((C += z[1]), B.push({ type: _.SET, set: z[0], not: U })); - break; - case '.': - B.push(w.anyChar()); - break; - case '(': - var Y = { type: _.GROUP, stack: [], remember: !0 }; - ('?' === (i = V[C]) && - ((i = V[C + 1]), - (C += 2), - '=' === i - ? (Y.followedBy = !0) - : '!' === i - ? (Y.notFollowedBy = !0) - : ':' !== i && - u.error( - s, - `Invalid group, character '${i}' after '?' at column ` + (C - 1) - ), - (Y.remember = !1)), - B.push(Y), - $.push(L), - (L = Y), - (B = Y.stack)); - break; - case ')': - (0 === $.length && u.error(s, 'Unmatched ) at column ' + (C - 1)), - (B = (L = $.pop()).options ? L.options[L.options.length - 1] : L.stack)); - break; - case '|': - L.options || ((L.options = [L.stack]), delete L.stack); - var Z = []; - (L.options.push(Z), (B = Z)); - break; - case '{': - var ee, - ie, - ae = /^(\d+)(,(\d+)?)?\}/.exec(V.slice(C)); - null !== ae - ? (0 === B.length && repeatErr(C), - (ee = parseInt(ae[1], 10)), - (ie = ae[2] ? (ae[3] ? parseInt(ae[3], 10) : 1 / 0) : ee), - (C += ae[0].length), - B.push({ type: _.REPETITION, min: ee, max: ie, value: B.pop() })) - : B.push({ type: _.CHAR, value: 123 }); - break; - case '?': - (0 === B.length && repeatErr(C), - B.push({ type: _.REPETITION, min: 0, max: 1, value: B.pop() })); - break; - case '+': - (0 === B.length && repeatErr(C), - B.push({ type: _.REPETITION, min: 1, max: 1 / 0, value: B.pop() })); - break; - case '*': - (0 === B.length && repeatErr(C), - B.push({ type: _.REPETITION, min: 0, max: 1 / 0, value: B.pop() })); - break; - default: - B.push({ type: _.CHAR, value: i.charCodeAt(0) }); - } - return (0 !== $.length && u.error(s, 'Unterminated group'), j); - }), - (s.exports.types = _)); - }, - 8048: (s, o, i) => { - const u = i(6205); - ((o.wordBoundary = () => ({ type: u.POSITION, value: 'b' })), - (o.nonWordBoundary = () => ({ type: u.POSITION, value: 'B' })), - (o.begin = () => ({ type: u.POSITION, value: '^' })), - (o.end = () => ({ type: u.POSITION, value: '$' }))); - }, - 10023: (s, o, i) => { - const u = i(6205), - INTS = () => [{ type: u.RANGE, from: 48, to: 57 }], - WORDS = () => - [ - { type: u.CHAR, value: 95 }, - { type: u.RANGE, from: 97, to: 122 }, - { type: u.RANGE, from: 65, to: 90 } - ].concat(INTS()), - WHITESPACE = () => [ - { type: u.CHAR, value: 9 }, - { type: u.CHAR, value: 10 }, - { type: u.CHAR, value: 11 }, - { type: u.CHAR, value: 12 }, - { type: u.CHAR, value: 13 }, - { type: u.CHAR, value: 32 }, - { type: u.CHAR, value: 160 }, - { type: u.CHAR, value: 5760 }, - { type: u.RANGE, from: 8192, to: 8202 }, - { type: u.CHAR, value: 8232 }, - { type: u.CHAR, value: 8233 }, - { type: u.CHAR, value: 8239 }, - { type: u.CHAR, value: 8287 }, - { type: u.CHAR, value: 12288 }, - { type: u.CHAR, value: 65279 } - ]; - ((o.words = () => ({ type: u.SET, set: WORDS(), not: !1 })), - (o.notWords = () => ({ type: u.SET, set: WORDS(), not: !0 })), - (o.ints = () => ({ type: u.SET, set: INTS(), not: !1 })), - (o.notInts = () => ({ type: u.SET, set: INTS(), not: !0 })), - (o.whitespace = () => ({ type: u.SET, set: WHITESPACE(), not: !1 })), - (o.notWhitespace = () => ({ type: u.SET, set: WHITESPACE(), not: !0 })), - (o.anyChar = () => ({ - type: u.SET, - set: [ - { type: u.CHAR, value: 10 }, - { type: u.CHAR, value: 13 }, - { type: u.CHAR, value: 8232 }, - { type: u.CHAR, value: 8233 } - ], - not: !0 - }))); - }, - 6205: (s) => { - s.exports = { - ROOT: 0, - GROUP: 1, - POSITION: 2, - SET: 3, - RANGE: 4, - REPETITION: 5, - REFERENCE: 6, - CHAR: 7 - }; - }, - 87586: (s, o, i) => { - const u = i(6205), - _ = i(10023), - w = { 0: 0, t: 9, n: 10, v: 11, f: 12, r: 13 }; - ((o.strToChars = function (s) { - return (s = s.replace( - /(\[\\b\])|(\\)?\\(?:u([A-F0-9]{4})|x([A-F0-9]{2})|(0?[0-7]{2})|c([@A-Z[\\\]^?])|([0tnvfr]))/g, - function (s, o, i, u, _, x, C, j) { - if (i) return s; - var L = o - ? 8 - : u - ? parseInt(u, 16) - : _ - ? parseInt(_, 16) - : x - ? parseInt(x, 8) - : C - ? '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ ?'.indexOf(C) - : w[j], - B = String.fromCharCode(L); - return (/[[\]{}^$.|?*+()]/.test(B) && (B = '\\' + B), B); - } - )); - }), - (o.tokenizeClass = (s, i) => { - for ( - var w, - x, - C = [], - j = - /\\(?:(w)|(d)|(s)|(W)|(D)|(S))|((?:(?:\\)(.)|([^\]\\]))-(?:\\)?([^\]]))|(\])|(?:\\)?([^])/g; - null != (w = j.exec(s)); - ) - if (w[1]) C.push(_.words()); - else if (w[2]) C.push(_.ints()); - else if (w[3]) C.push(_.whitespace()); - else if (w[4]) C.push(_.notWords()); - else if (w[5]) C.push(_.notInts()); - else if (w[6]) C.push(_.notWhitespace()); - else if (w[7]) - C.push({ - type: u.RANGE, - from: (w[8] || w[9]).charCodeAt(0), - to: w[10].charCodeAt(0) - }); - else { - if (!(x = w[12])) return [C, j.lastIndex]; - C.push({ type: u.CHAR, value: x.charCodeAt(0) }); - } - o.error(i, 'Unterminated character class'); - }), - (o.error = (s, o) => { - throw new SyntaxError('Invalid regular expression: /' + s + '/: ' + o); - })); - }, - 92861: (s, o, i) => { - var u = i(48287), - _ = u.Buffer; - function copyProps(s, o) { - for (var i in s) o[i] = s[i]; - } - function SafeBuffer(s, o, i) { - return _(s, o, i); - } - (_.from && _.alloc && _.allocUnsafe && _.allocUnsafeSlow - ? (s.exports = u) - : (copyProps(u, o), (o.Buffer = SafeBuffer)), - (SafeBuffer.prototype = Object.create(_.prototype)), - copyProps(_, SafeBuffer), - (SafeBuffer.from = function (s, o, i) { - if ('number' == typeof s) throw new TypeError('Argument must not be a number'); - return _(s, o, i); - }), - (SafeBuffer.alloc = function (s, o, i) { - if ('number' != typeof s) throw new TypeError('Argument must be a number'); - var u = _(s); - return ( - void 0 !== o ? ('string' == typeof i ? u.fill(o, i) : u.fill(o)) : u.fill(0), - u - ); - }), - (SafeBuffer.allocUnsafe = function (s) { - if ('number' != typeof s) throw new TypeError('Argument must be a number'); - return _(s); - }), - (SafeBuffer.allocUnsafeSlow = function (s) { - if ('number' != typeof s) throw new TypeError('Argument must be a number'); - return u.SlowBuffer(s); - })); - }, - 29844: (s, o) => { - 'use strict'; - function f(s, o) { - var i = s.length; - s.push(o); - e: for (; 0 < i; ) { - var u = (i - 1) >>> 1, - _ = s[u]; - if (!(0 < g(_, o))) break e; - ((s[u] = o), (s[i] = _), (i = u)); - } - } - function h(s) { - return 0 === s.length ? null : s[0]; - } - function k(s) { - if (0 === s.length) return null; - var o = s[0], - i = s.pop(); - if (i !== o) { - s[0] = i; - e: for (var u = 0, _ = s.length, w = _ >>> 1; u < w; ) { - var x = 2 * (u + 1) - 1, - C = s[x], - j = x + 1, - L = s[j]; - if (0 > g(C, i)) - j < _ && 0 > g(L, C) - ? ((s[u] = L), (s[j] = i), (u = j)) - : ((s[u] = C), (s[x] = i), (u = x)); - else { - if (!(j < _ && 0 > g(L, i))) break e; - ((s[u] = L), (s[j] = i), (u = j)); - } - } - } - return o; - } - function g(s, o) { - var i = s.sortIndex - o.sortIndex; - return 0 !== i ? i : s.id - o.id; - } - if ('object' == typeof performance && 'function' == typeof performance.now) { - var i = performance; - o.unstable_now = function () { - return i.now(); - }; - } else { - var u = Date, - _ = u.now(); - o.unstable_now = function () { - return u.now() - _; - }; - } - var w = [], - x = [], - C = 1, - j = null, - L = 3, - B = !1, - $ = !1, - V = !1, - U = 'function' == typeof setTimeout ? setTimeout : null, - z = 'function' == typeof clearTimeout ? clearTimeout : null, - Y = 'undefined' != typeof setImmediate ? setImmediate : null; - function G(s) { - for (var o = h(x); null !== o; ) { - if (null === o.callback) k(x); - else { - if (!(o.startTime <= s)) break; - (k(x), (o.sortIndex = o.expirationTime), f(w, o)); - } - o = h(x); - } - } - function H(s) { - if (((V = !1), G(s), !$)) - if (null !== h(w)) (($ = !0), I(J)); - else { - var o = h(x); - null !== o && K(H, o.startTime - s); - } - } - function J(s, i) { - (($ = !1), V && ((V = !1), z(ae), (ae = -1)), (B = !0)); - var u = L; - try { - for (G(i), j = h(w); null !== j && (!(j.expirationTime > i) || (s && !M())); ) { - var _ = j.callback; - if ('function' == typeof _) { - ((j.callback = null), (L = j.priorityLevel)); - var C = _(j.expirationTime <= i); - ((i = o.unstable_now()), - 'function' == typeof C ? (j.callback = C) : j === h(w) && k(w), - G(i)); - } else k(w); - j = h(w); - } - if (null !== j) var U = !0; - else { - var Y = h(x); - (null !== Y && K(H, Y.startTime - i), (U = !1)); - } - return U; - } finally { - ((j = null), (L = u), (B = !1)); - } - } - 'undefined' != typeof navigator && - void 0 !== navigator.scheduling && - void 0 !== navigator.scheduling.isInputPending && - navigator.scheduling.isInputPending.bind(navigator.scheduling); - var Z, - ee = !1, - ie = null, - ae = -1, - le = 5, - ce = -1; - function M() { - return !(o.unstable_now() - ce < le); - } - function R() { - if (null !== ie) { - var s = o.unstable_now(); - ce = s; - var i = !0; - try { - i = ie(!0, s); - } finally { - i ? Z() : ((ee = !1), (ie = null)); - } - } else ee = !1; - } - if ('function' == typeof Y) - Z = function () { - Y(R); - }; - else if ('undefined' != typeof MessageChannel) { - var pe = new MessageChannel(), - de = pe.port2; - ((pe.port1.onmessage = R), - (Z = function () { - de.postMessage(null); - })); - } else - Z = function () { - U(R, 0); - }; - function I(s) { - ((ie = s), ee || ((ee = !0), Z())); - } - function K(s, i) { - ae = U(function () { - s(o.unstable_now()); - }, i); - } - ((o.unstable_IdlePriority = 5), - (o.unstable_ImmediatePriority = 1), - (o.unstable_LowPriority = 4), - (o.unstable_NormalPriority = 3), - (o.unstable_Profiling = null), - (o.unstable_UserBlockingPriority = 2), - (o.unstable_cancelCallback = function (s) { - s.callback = null; - }), - (o.unstable_continueExecution = function () { - $ || B || (($ = !0), I(J)); - }), - (o.unstable_forceFrameRate = function (s) { - 0 > s || 125 < s - ? console.error( - 'forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported' - ) - : (le = 0 < s ? Math.floor(1e3 / s) : 5); - }), - (o.unstable_getCurrentPriorityLevel = function () { - return L; - }), - (o.unstable_getFirstCallbackNode = function () { - return h(w); - }), - (o.unstable_next = function (s) { - switch (L) { - case 1: - case 2: - case 3: - var o = 3; - break; - default: - o = L; - } - var i = L; - L = o; - try { - return s(); - } finally { - L = i; - } - }), - (o.unstable_pauseExecution = function () {}), - (o.unstable_requestPaint = function () {}), - (o.unstable_runWithPriority = function (s, o) { - switch (s) { - case 1: - case 2: - case 3: - case 4: - case 5: - break; - default: - s = 3; - } - var i = L; - L = s; - try { - return o(); - } finally { - L = i; - } - }), - (o.unstable_scheduleCallback = function (s, i, u) { - var _ = o.unstable_now(); - switch ( - ('object' == typeof u && null !== u - ? (u = 'number' == typeof (u = u.delay) && 0 < u ? _ + u : _) - : (u = _), - s) - ) { - case 1: - var j = -1; - break; - case 2: - j = 250; - break; - case 5: - j = 1073741823; - break; - case 4: - j = 1e4; - break; - default: - j = 5e3; - } - return ( - (s = { - id: C++, - callback: i, - priorityLevel: s, - startTime: u, - expirationTime: (j = u + j), - sortIndex: -1 - }), - u > _ - ? ((s.sortIndex = u), - f(x, s), - null === h(w) && s === h(x) && (V ? (z(ae), (ae = -1)) : (V = !0), K(H, u - _))) - : ((s.sortIndex = j), f(w, s), $ || B || (($ = !0), I(J))), - s - ); - }), - (o.unstable_shouldYield = M), - (o.unstable_wrapCallback = function (s) { - var o = L; - return function () { - var i = L; - L = o; - try { - return s.apply(this, arguments); - } finally { - L = i; - } - }; - })); - }, - 69982: (s, o, i) => { - 'use strict'; - s.exports = i(29844); - }, - 20334: (s, o, i) => { - 'use strict'; - var u = i(48287).Buffer; - class NonError extends Error { - constructor(s) { - (super(NonError._prepareSuperMessage(s)), - Object.defineProperty(this, 'name', { - value: 'NonError', - configurable: !0, - writable: !0 - }), - Error.captureStackTrace && Error.captureStackTrace(this, NonError)); - } - static _prepareSuperMessage(s) { - try { - return JSON.stringify(s); - } catch { - return String(s); - } - } - } - const _ = [ - { property: 'name', enumerable: !1 }, - { property: 'message', enumerable: !1 }, - { property: 'stack', enumerable: !1 }, - { property: 'code', enumerable: !0 } - ], - w = Symbol('.toJSON called'), - destroyCircular = ({ - from: s, - seen: o, - to_: i, - forceEnumerable: x, - maxDepth: C, - depth: j - }) => { - const L = i || (Array.isArray(s) ? [] : {}); - if ((o.push(s), j >= C)) return L; - if ('function' == typeof s.toJSON && !0 !== s[w]) - return ((s) => { - s[w] = !0; - const o = s.toJSON(); - return (delete s[w], o); - })(s); - for (const [i, _] of Object.entries(s)) - 'function' == typeof u && u.isBuffer(_) - ? (L[i] = '[object Buffer]') - : 'function' != typeof _ && - (_ && 'object' == typeof _ - ? o.includes(s[i]) - ? (L[i] = '[Circular]') - : (j++, - (L[i] = destroyCircular({ - from: s[i], - seen: o.slice(), - forceEnumerable: x, - maxDepth: C, - depth: j - }))) - : (L[i] = _)); - for (const { property: o, enumerable: i } of _) - 'string' == typeof s[o] && - Object.defineProperty(L, o, { - value: s[o], - enumerable: !!x || i, - configurable: !0, - writable: !0 - }); - return L; - }; - s.exports = { - serializeError: (s, o = {}) => { - const { maxDepth: i = Number.POSITIVE_INFINITY } = o; - return 'object' == typeof s && null !== s - ? destroyCircular({ from: s, seen: [], forceEnumerable: !0, maxDepth: i, depth: 0 }) - : 'function' == typeof s - ? `[Function: ${s.name || 'anonymous'}]` - : s; - }, - deserializeError: (s, o = {}) => { - const { maxDepth: i = Number.POSITIVE_INFINITY } = o; - if (s instanceof Error) return s; - if ('object' == typeof s && null !== s && !Array.isArray(s)) { - const o = new Error(); - return (destroyCircular({ from: s, seen: [], to_: o, maxDepth: i, depth: 0 }), o); - } - return new NonError(s); - } - }; - }, - 90392: (s, o, i) => { - var u = i(92861).Buffer; - function Hash(s, o) { - ((this._block = u.alloc(s)), - (this._finalSize = o), - (this._blockSize = s), - (this._len = 0)); - } - ((Hash.prototype.update = function (s, o) { - 'string' == typeof s && ((o = o || 'utf8'), (s = u.from(s, o))); - for ( - var i = this._block, _ = this._blockSize, w = s.length, x = this._len, C = 0; - C < w; - ) { - for (var j = x % _, L = Math.min(w - C, _ - j), B = 0; B < L; B++) - i[j + B] = s[C + B]; - ((C += L), (x += L) % _ == 0 && this._update(i)); - } - return ((this._len += w), this); - }), - (Hash.prototype.digest = function (s) { - var o = this._len % this._blockSize; - ((this._block[o] = 128), - this._block.fill(0, o + 1), - o >= this._finalSize && (this._update(this._block), this._block.fill(0))); - var i = 8 * this._len; - if (i <= 4294967295) this._block.writeUInt32BE(i, this._blockSize - 4); - else { - var u = (4294967295 & i) >>> 0, - _ = (i - u) / 4294967296; - (this._block.writeUInt32BE(_, this._blockSize - 8), - this._block.writeUInt32BE(u, this._blockSize - 4)); - } - this._update(this._block); - var w = this._hash(); - return s ? w.toString(s) : w; - }), - (Hash.prototype._update = function () { - throw new Error('_update must be implemented by subclass'); - }), - (s.exports = Hash)); - }, - 62802: (s, o, i) => { - var u = (s.exports = function SHA(s) { - s = s.toLowerCase(); - var o = u[s]; - if (!o) throw new Error(s + ' is not supported (we accept pull requests)'); - return new o(); - }); - ((u.sha = i(27816)), - (u.sha1 = i(63737)), - (u.sha224 = i(26710)), - (u.sha256 = i(24107)), - (u.sha384 = i(32827)), - (u.sha512 = i(82890))); - }, - 27816: (s, o, i) => { - var u = i(56698), - _ = i(90392), - w = i(92861).Buffer, - x = [1518500249, 1859775393, -1894007588, -899497514], - C = new Array(80); - function Sha() { - (this.init(), (this._w = C), _.call(this, 64, 56)); - } - function rotl30(s) { - return (s << 30) | (s >>> 2); - } - function ft(s, o, i, u) { - return 0 === s ? (o & i) | (~o & u) : 2 === s ? (o & i) | (o & u) | (i & u) : o ^ i ^ u; - } - (u(Sha, _), - (Sha.prototype.init = function () { - return ( - (this._a = 1732584193), - (this._b = 4023233417), - (this._c = 2562383102), - (this._d = 271733878), - (this._e = 3285377520), - this - ); - }), - (Sha.prototype._update = function (s) { - for ( - var o, - i = this._w, - u = 0 | this._a, - _ = 0 | this._b, - w = 0 | this._c, - C = 0 | this._d, - j = 0 | this._e, - L = 0; - L < 16; - ++L - ) - i[L] = s.readInt32BE(4 * L); - for (; L < 80; ++L) i[L] = i[L - 3] ^ i[L - 8] ^ i[L - 14] ^ i[L - 16]; - for (var B = 0; B < 80; ++B) { - var $ = ~~(B / 20), - V = 0 | ((((o = u) << 5) | (o >>> 27)) + ft($, _, w, C) + j + i[B] + x[$]); - ((j = C), (C = w), (w = rotl30(_)), (_ = u), (u = V)); - } - ((this._a = (u + this._a) | 0), - (this._b = (_ + this._b) | 0), - (this._c = (w + this._c) | 0), - (this._d = (C + this._d) | 0), - (this._e = (j + this._e) | 0)); - }), - (Sha.prototype._hash = function () { - var s = w.allocUnsafe(20); - return ( - s.writeInt32BE(0 | this._a, 0), - s.writeInt32BE(0 | this._b, 4), - s.writeInt32BE(0 | this._c, 8), - s.writeInt32BE(0 | this._d, 12), - s.writeInt32BE(0 | this._e, 16), - s - ); - }), - (s.exports = Sha)); - }, - 63737: (s, o, i) => { - var u = i(56698), - _ = i(90392), - w = i(92861).Buffer, - x = [1518500249, 1859775393, -1894007588, -899497514], - C = new Array(80); - function Sha1() { - (this.init(), (this._w = C), _.call(this, 64, 56)); - } - function rotl5(s) { - return (s << 5) | (s >>> 27); - } - function rotl30(s) { - return (s << 30) | (s >>> 2); - } - function ft(s, o, i, u) { - return 0 === s ? (o & i) | (~o & u) : 2 === s ? (o & i) | (o & u) | (i & u) : o ^ i ^ u; - } - (u(Sha1, _), - (Sha1.prototype.init = function () { - return ( - (this._a = 1732584193), - (this._b = 4023233417), - (this._c = 2562383102), - (this._d = 271733878), - (this._e = 3285377520), - this - ); - }), - (Sha1.prototype._update = function (s) { - for ( - var o, - i = this._w, - u = 0 | this._a, - _ = 0 | this._b, - w = 0 | this._c, - C = 0 | this._d, - j = 0 | this._e, - L = 0; - L < 16; - ++L - ) - i[L] = s.readInt32BE(4 * L); - for (; L < 80; ++L) - i[L] = ((o = i[L - 3] ^ i[L - 8] ^ i[L - 14] ^ i[L - 16]) << 1) | (o >>> 31); - for (var B = 0; B < 80; ++B) { - var $ = ~~(B / 20), - V = (rotl5(u) + ft($, _, w, C) + j + i[B] + x[$]) | 0; - ((j = C), (C = w), (w = rotl30(_)), (_ = u), (u = V)); - } - ((this._a = (u + this._a) | 0), - (this._b = (_ + this._b) | 0), - (this._c = (w + this._c) | 0), - (this._d = (C + this._d) | 0), - (this._e = (j + this._e) | 0)); - }), - (Sha1.prototype._hash = function () { - var s = w.allocUnsafe(20); - return ( - s.writeInt32BE(0 | this._a, 0), - s.writeInt32BE(0 | this._b, 4), - s.writeInt32BE(0 | this._c, 8), - s.writeInt32BE(0 | this._d, 12), - s.writeInt32BE(0 | this._e, 16), - s - ); - }), - (s.exports = Sha1)); - }, - 26710: (s, o, i) => { - var u = i(56698), - _ = i(24107), - w = i(90392), - x = i(92861).Buffer, - C = new Array(64); - function Sha224() { - (this.init(), (this._w = C), w.call(this, 64, 56)); - } - (u(Sha224, _), - (Sha224.prototype.init = function () { - return ( - (this._a = 3238371032), - (this._b = 914150663), - (this._c = 812702999), - (this._d = 4144912697), - (this._e = 4290775857), - (this._f = 1750603025), - (this._g = 1694076839), - (this._h = 3204075428), - this - ); - }), - (Sha224.prototype._hash = function () { - var s = x.allocUnsafe(28); - return ( - s.writeInt32BE(this._a, 0), - s.writeInt32BE(this._b, 4), - s.writeInt32BE(this._c, 8), - s.writeInt32BE(this._d, 12), - s.writeInt32BE(this._e, 16), - s.writeInt32BE(this._f, 20), - s.writeInt32BE(this._g, 24), - s - ); - }), - (s.exports = Sha224)); - }, - 24107: (s, o, i) => { - var u = i(56698), - _ = i(90392), - w = i(92861).Buffer, - x = [ - 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, - 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, - 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, - 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, - 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, - 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, - 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, - 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, - 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, - 3329325298 - ], - C = new Array(64); - function Sha256() { - (this.init(), (this._w = C), _.call(this, 64, 56)); - } - function ch(s, o, i) { - return i ^ (s & (o ^ i)); - } - function maj(s, o, i) { - return (s & o) | (i & (s | o)); - } - function sigma0(s) { - return ((s >>> 2) | (s << 30)) ^ ((s >>> 13) | (s << 19)) ^ ((s >>> 22) | (s << 10)); - } - function sigma1(s) { - return ((s >>> 6) | (s << 26)) ^ ((s >>> 11) | (s << 21)) ^ ((s >>> 25) | (s << 7)); - } - function gamma0(s) { - return ((s >>> 7) | (s << 25)) ^ ((s >>> 18) | (s << 14)) ^ (s >>> 3); - } - (u(Sha256, _), - (Sha256.prototype.init = function () { - return ( - (this._a = 1779033703), - (this._b = 3144134277), - (this._c = 1013904242), - (this._d = 2773480762), - (this._e = 1359893119), - (this._f = 2600822924), - (this._g = 528734635), - (this._h = 1541459225), - this - ); - }), - (Sha256.prototype._update = function (s) { - for ( - var o, - i = this._w, - u = 0 | this._a, - _ = 0 | this._b, - w = 0 | this._c, - C = 0 | this._d, - j = 0 | this._e, - L = 0 | this._f, - B = 0 | this._g, - $ = 0 | this._h, - V = 0; - V < 16; - ++V - ) - i[V] = s.readInt32BE(4 * V); - for (; V < 64; ++V) - i[V] = - 0 | - (((((o = i[V - 2]) >>> 17) | (o << 15)) ^ ((o >>> 19) | (o << 13)) ^ (o >>> 10)) + - i[V - 7] + - gamma0(i[V - 15]) + - i[V - 16]); - for (var U = 0; U < 64; ++U) { - var z = ($ + sigma1(j) + ch(j, L, B) + x[U] + i[U]) | 0, - Y = (sigma0(u) + maj(u, _, w)) | 0; - (($ = B), - (B = L), - (L = j), - (j = (C + z) | 0), - (C = w), - (w = _), - (_ = u), - (u = (z + Y) | 0)); - } - ((this._a = (u + this._a) | 0), - (this._b = (_ + this._b) | 0), - (this._c = (w + this._c) | 0), - (this._d = (C + this._d) | 0), - (this._e = (j + this._e) | 0), - (this._f = (L + this._f) | 0), - (this._g = (B + this._g) | 0), - (this._h = ($ + this._h) | 0)); - }), - (Sha256.prototype._hash = function () { - var s = w.allocUnsafe(32); - return ( - s.writeInt32BE(this._a, 0), - s.writeInt32BE(this._b, 4), - s.writeInt32BE(this._c, 8), - s.writeInt32BE(this._d, 12), - s.writeInt32BE(this._e, 16), - s.writeInt32BE(this._f, 20), - s.writeInt32BE(this._g, 24), - s.writeInt32BE(this._h, 28), - s - ); - }), - (s.exports = Sha256)); - }, - 32827: (s, o, i) => { - var u = i(56698), - _ = i(82890), - w = i(90392), - x = i(92861).Buffer, - C = new Array(160); - function Sha384() { - (this.init(), (this._w = C), w.call(this, 128, 112)); - } - (u(Sha384, _), - (Sha384.prototype.init = function () { - return ( - (this._ah = 3418070365), - (this._bh = 1654270250), - (this._ch = 2438529370), - (this._dh = 355462360), - (this._eh = 1731405415), - (this._fh = 2394180231), - (this._gh = 3675008525), - (this._hh = 1203062813), - (this._al = 3238371032), - (this._bl = 914150663), - (this._cl = 812702999), - (this._dl = 4144912697), - (this._el = 4290775857), - (this._fl = 1750603025), - (this._gl = 1694076839), - (this._hl = 3204075428), - this - ); - }), - (Sha384.prototype._hash = function () { - var s = x.allocUnsafe(48); - function writeInt64BE(o, i, u) { - (s.writeInt32BE(o, u), s.writeInt32BE(i, u + 4)); - } - return ( - writeInt64BE(this._ah, this._al, 0), - writeInt64BE(this._bh, this._bl, 8), - writeInt64BE(this._ch, this._cl, 16), - writeInt64BE(this._dh, this._dl, 24), - writeInt64BE(this._eh, this._el, 32), - writeInt64BE(this._fh, this._fl, 40), - s - ); - }), - (s.exports = Sha384)); - }, - 82890: (s, o, i) => { - var u = i(56698), - _ = i(90392), - w = i(92861).Buffer, - x = [ - 1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, - 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, - 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, - 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, - 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, - 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, - 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, - 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, - 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, - 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, - 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, - 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, - 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, - 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, - 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, - 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, - 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, - 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, - 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, - 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, - 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, - 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, - 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591 - ], - C = new Array(160); - function Sha512() { - (this.init(), (this._w = C), _.call(this, 128, 112)); - } - function Ch(s, o, i) { - return i ^ (s & (o ^ i)); - } - function maj(s, o, i) { - return (s & o) | (i & (s | o)); - } - function sigma0(s, o) { - return ((s >>> 28) | (o << 4)) ^ ((o >>> 2) | (s << 30)) ^ ((o >>> 7) | (s << 25)); - } - function sigma1(s, o) { - return ((s >>> 14) | (o << 18)) ^ ((s >>> 18) | (o << 14)) ^ ((o >>> 9) | (s << 23)); - } - function Gamma0(s, o) { - return ((s >>> 1) | (o << 31)) ^ ((s >>> 8) | (o << 24)) ^ (s >>> 7); - } - function Gamma0l(s, o) { - return ((s >>> 1) | (o << 31)) ^ ((s >>> 8) | (o << 24)) ^ ((s >>> 7) | (o << 25)); - } - function Gamma1(s, o) { - return ((s >>> 19) | (o << 13)) ^ ((o >>> 29) | (s << 3)) ^ (s >>> 6); - } - function Gamma1l(s, o) { - return ((s >>> 19) | (o << 13)) ^ ((o >>> 29) | (s << 3)) ^ ((s >>> 6) | (o << 26)); - } - function getCarry(s, o) { - return s >>> 0 < o >>> 0 ? 1 : 0; - } - (u(Sha512, _), - (Sha512.prototype.init = function () { - return ( - (this._ah = 1779033703), - (this._bh = 3144134277), - (this._ch = 1013904242), - (this._dh = 2773480762), - (this._eh = 1359893119), - (this._fh = 2600822924), - (this._gh = 528734635), - (this._hh = 1541459225), - (this._al = 4089235720), - (this._bl = 2227873595), - (this._cl = 4271175723), - (this._dl = 1595750129), - (this._el = 2917565137), - (this._fl = 725511199), - (this._gl = 4215389547), - (this._hl = 327033209), - this - ); - }), - (Sha512.prototype._update = function (s) { - for ( - var o = this._w, - i = 0 | this._ah, - u = 0 | this._bh, - _ = 0 | this._ch, - w = 0 | this._dh, - C = 0 | this._eh, - j = 0 | this._fh, - L = 0 | this._gh, - B = 0 | this._hh, - $ = 0 | this._al, - V = 0 | this._bl, - U = 0 | this._cl, - z = 0 | this._dl, - Y = 0 | this._el, - Z = 0 | this._fl, - ee = 0 | this._gl, - ie = 0 | this._hl, - ae = 0; - ae < 32; - ae += 2 - ) - ((o[ae] = s.readInt32BE(4 * ae)), (o[ae + 1] = s.readInt32BE(4 * ae + 4))); - for (; ae < 160; ae += 2) { - var le = o[ae - 30], - ce = o[ae - 30 + 1], - pe = Gamma0(le, ce), - de = Gamma0l(ce, le), - fe = Gamma1((le = o[ae - 4]), (ce = o[ae - 4 + 1])), - ye = Gamma1l(ce, le), - be = o[ae - 14], - _e = o[ae - 14 + 1], - we = o[ae - 32], - Se = o[ae - 32 + 1], - xe = (de + _e) | 0, - Pe = (pe + be + getCarry(xe, de)) | 0; - ((Pe = - ((Pe = (Pe + fe + getCarry((xe = (xe + ye) | 0), ye)) | 0) + - we + - getCarry((xe = (xe + Se) | 0), Se)) | - 0), - (o[ae] = Pe), - (o[ae + 1] = xe)); - } - for (var Te = 0; Te < 160; Te += 2) { - ((Pe = o[Te]), (xe = o[Te + 1])); - var Re = maj(i, u, _), - qe = maj($, V, U), - $e = sigma0(i, $), - ze = sigma0($, i), - We = sigma1(C, Y), - He = sigma1(Y, C), - Ye = x[Te], - Xe = x[Te + 1], - Qe = Ch(C, j, L), - et = Ch(Y, Z, ee), - tt = (ie + He) | 0, - rt = (B + We + getCarry(tt, ie)) | 0; - rt = - ((rt = - ((rt = (rt + Qe + getCarry((tt = (tt + et) | 0), et)) | 0) + - Ye + - getCarry((tt = (tt + Xe) | 0), Xe)) | - 0) + - Pe + - getCarry((tt = (tt + xe) | 0), xe)) | - 0; - var nt = (ze + qe) | 0, - st = ($e + Re + getCarry(nt, ze)) | 0; - ((B = L), - (ie = ee), - (L = j), - (ee = Z), - (j = C), - (Z = Y), - (C = (w + rt + getCarry((Y = (z + tt) | 0), z)) | 0), - (w = _), - (z = U), - (_ = u), - (U = V), - (u = i), - (V = $), - (i = (rt + st + getCarry(($ = (tt + nt) | 0), tt)) | 0)); - } - ((this._al = (this._al + $) | 0), - (this._bl = (this._bl + V) | 0), - (this._cl = (this._cl + U) | 0), - (this._dl = (this._dl + z) | 0), - (this._el = (this._el + Y) | 0), - (this._fl = (this._fl + Z) | 0), - (this._gl = (this._gl + ee) | 0), - (this._hl = (this._hl + ie) | 0), - (this._ah = (this._ah + i + getCarry(this._al, $)) | 0), - (this._bh = (this._bh + u + getCarry(this._bl, V)) | 0), - (this._ch = (this._ch + _ + getCarry(this._cl, U)) | 0), - (this._dh = (this._dh + w + getCarry(this._dl, z)) | 0), - (this._eh = (this._eh + C + getCarry(this._el, Y)) | 0), - (this._fh = (this._fh + j + getCarry(this._fl, Z)) | 0), - (this._gh = (this._gh + L + getCarry(this._gl, ee)) | 0), - (this._hh = (this._hh + B + getCarry(this._hl, ie)) | 0)); - }), - (Sha512.prototype._hash = function () { - var s = w.allocUnsafe(64); - function writeInt64BE(o, i, u) { - (s.writeInt32BE(o, u), s.writeInt32BE(i, u + 4)); - } - return ( - writeInt64BE(this._ah, this._al, 0), - writeInt64BE(this._bh, this._bl, 8), - writeInt64BE(this._ch, this._cl, 16), - writeInt64BE(this._dh, this._dl, 24), - writeInt64BE(this._eh, this._el, 32), - writeInt64BE(this._fh, this._fl, 40), - writeInt64BE(this._gh, this._gl, 48), - writeInt64BE(this._hh, this._hl, 56), - s - ); - }), - (s.exports = Sha512)); - }, - 8068: (s) => { - 'use strict'; - var o = (() => { - var s = Object.defineProperty, - o = Object.getOwnPropertyDescriptor, - i = Object.getOwnPropertyNames, - u = Object.getOwnPropertySymbols, - _ = Object.prototype.hasOwnProperty, - w = Object.prototype.propertyIsEnumerable, - __defNormalProp = (o, i, u) => - i in o - ? s(o, i, { enumerable: !0, configurable: !0, writable: !0, value: u }) - : (o[i] = u), - __spreadValues = (s, o) => { - for (var i in o || (o = {})) _.call(o, i) && __defNormalProp(s, i, o[i]); - if (u) for (var i of u(o)) w.call(o, i) && __defNormalProp(s, i, o[i]); - return s; - }, - __publicField = (s, o, i) => ( - __defNormalProp(s, 'symbol' != typeof o ? o + '' : o, i), - i - ), - x = {}; - ((o, i) => { - for (var u in i) s(o, u, { get: i[u], enumerable: !0 }); - })(x, { DEFAULT_OPTIONS: () => j, DEFAULT_UUID_LENGTH: () => C, default: () => $ }); - var C = 6, - j = { dictionary: 'alphanum', shuffle: !0, debug: !1, length: C, counter: 0 }, - L = class _ShortUniqueId { - constructor(s = {}) { - (__publicField(this, 'counter'), - __publicField(this, 'debug'), - __publicField(this, 'dict'), - __publicField(this, 'version'), - __publicField(this, 'dictIndex', 0), - __publicField(this, 'dictRange', []), - __publicField(this, 'lowerBound', 0), - __publicField(this, 'upperBound', 0), - __publicField(this, 'dictLength', 0), - __publicField(this, 'uuidLength'), - __publicField(this, '_digit_first_ascii', 48), - __publicField(this, '_digit_last_ascii', 58), - __publicField(this, '_alpha_lower_first_ascii', 97), - __publicField(this, '_alpha_lower_last_ascii', 123), - __publicField(this, '_hex_last_ascii', 103), - __publicField(this, '_alpha_upper_first_ascii', 65), - __publicField(this, '_alpha_upper_last_ascii', 91), - __publicField(this, '_number_dict_ranges', { - digits: [this._digit_first_ascii, this._digit_last_ascii] - }), - __publicField(this, '_alpha_dict_ranges', { - lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii], - upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii] - }), - __publicField(this, '_alpha_lower_dict_ranges', { - lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii] - }), - __publicField(this, '_alpha_upper_dict_ranges', { - upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii] - }), - __publicField(this, '_alphanum_dict_ranges', { - digits: [this._digit_first_ascii, this._digit_last_ascii], - lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii], - upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii] - }), - __publicField(this, '_alphanum_lower_dict_ranges', { - digits: [this._digit_first_ascii, this._digit_last_ascii], - lowerCase: [this._alpha_lower_first_ascii, this._alpha_lower_last_ascii] - }), - __publicField(this, '_alphanum_upper_dict_ranges', { - digits: [this._digit_first_ascii, this._digit_last_ascii], - upperCase: [this._alpha_upper_first_ascii, this._alpha_upper_last_ascii] - }), - __publicField(this, '_hex_dict_ranges', { - decDigits: [this._digit_first_ascii, this._digit_last_ascii], - alphaDigits: [this._alpha_lower_first_ascii, this._hex_last_ascii] - }), - __publicField(this, '_dict_ranges', { - _number_dict_ranges: this._number_dict_ranges, - _alpha_dict_ranges: this._alpha_dict_ranges, - _alpha_lower_dict_ranges: this._alpha_lower_dict_ranges, - _alpha_upper_dict_ranges: this._alpha_upper_dict_ranges, - _alphanum_dict_ranges: this._alphanum_dict_ranges, - _alphanum_lower_dict_ranges: this._alphanum_lower_dict_ranges, - _alphanum_upper_dict_ranges: this._alphanum_upper_dict_ranges, - _hex_dict_ranges: this._hex_dict_ranges - }), - __publicField(this, 'log', (...s) => { - const o = [...s]; - if ( - ((o[0] = `[short-unique-id] ${s[0]}`), - !0 === this.debug && 'undefined' != typeof console && null !== console) - ) - return console.log(...o); - }), - __publicField(this, '_normalizeDictionary', (s, o) => { - let i; - if (s && Array.isArray(s) && s.length > 1) i = s; - else { - let o; - ((i = []), (this.dictIndex = o = 0)); - const u = `_${s}_dict_ranges`, - _ = this._dict_ranges[u]; - Object.keys(_).forEach((s) => { - const u = s; - for ( - this.dictRange = _[u], - this.lowerBound = this.dictRange[0], - this.upperBound = this.dictRange[1], - this.dictIndex = o = this.lowerBound; - this.lowerBound <= this.upperBound - ? o < this.upperBound - : o > this.upperBound; - this.dictIndex = - this.lowerBound <= this.upperBound ? (o += 1) : (o -= 1) - ) - i.push(String.fromCharCode(this.dictIndex)); - }); - } - if (o) { - const s = 0.5; - i = i.sort(() => Math.random() - s); - } - return i; - }), - __publicField(this, 'setDictionary', (s, o) => { - ((this.dict = this._normalizeDictionary(s, o)), - (this.dictLength = this.dict.length), - this.setCounter(0)); - }), - __publicField(this, 'seq', () => this.sequentialUUID()), - __publicField(this, 'sequentialUUID', () => { - let s, - o, - i = ''; - s = this.counter; - do { - ((o = s % this.dictLength), - (s = Math.trunc(s / this.dictLength)), - (i += this.dict[o])); - } while (0 !== s); - return ((this.counter += 1), i); - }), - __publicField(this, 'rnd', (s = this.uuidLength || C) => this.randomUUID(s)), - __publicField(this, 'randomUUID', (s = this.uuidLength || C) => { - let o, i, u; - if (null == s || s < 1) throw new Error('Invalid UUID Length Provided'); - for (o = '', u = 0; u < s; u += 1) - ((i = - parseInt((Math.random() * this.dictLength).toFixed(0), 10) % - this.dictLength), - (o += this.dict[i])); - return o; - }), - __publicField(this, 'fmt', (s, o) => this.formattedUUID(s, o)), - __publicField(this, 'formattedUUID', (s, o) => { - const i = { $r: this.randomUUID, $s: this.sequentialUUID, $t: this.stamp }; - return s.replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g, (s) => { - const u = s.slice(0, 2), - _ = parseInt(s.slice(2), 10); - return '$s' === u - ? i[u]().padStart(_, '0') - : '$t' === u && o - ? i[u](_, o) - : i[u](_); - }); - }), - __publicField(this, 'availableUUIDs', (s = this.uuidLength) => - parseFloat(Math.pow([...new Set(this.dict)].length, s).toFixed(0)) - ), - __publicField( - this, - 'approxMaxBeforeCollision', - (s = this.availableUUIDs(this.uuidLength)) => - parseFloat(Math.sqrt((Math.PI / 2) * s).toFixed(20)) - ), - __publicField( - this, - 'collisionProbability', - (s = this.availableUUIDs(this.uuidLength), o = this.uuidLength) => - parseFloat( - (this.approxMaxBeforeCollision(s) / this.availableUUIDs(o)).toFixed(20) - ) - ), - __publicField( - this, - 'uniqueness', - (s = this.availableUUIDs(this.uuidLength)) => { - const o = parseFloat( - (1 - this.approxMaxBeforeCollision(s) / s).toFixed(20) - ); - return o > 1 ? 1 : o < 0 ? 0 : o; - } - ), - __publicField(this, 'getVersion', () => this.version), - __publicField(this, 'stamp', (s, o) => { - const i = Math.floor(+(o || new Date()) / 1e3).toString(16); - if ('number' == typeof s && 0 === s) return i; - if ('number' != typeof s || s < 10) - throw new Error( - [ - 'Param finalLength must be a number greater than or equal to 10,', - 'or 0 if you want the raw hexadecimal timestamp' - ].join('\n') - ); - const u = s - 9, - _ = Math.round(Math.random() * (u > 15 ? 15 : u)), - w = this.randomUUID(u); - return `${w.substring(0, _)}${i}${w.substring(_)}${_.toString(16)}`; - }), - __publicField(this, 'parseStamp', (s, o) => { - if (o && !/t0|t[1-9]\d{1,}/.test(o)) - throw new Error( - 'Cannot extract date from a formated UUID with no timestamp in the format' - ); - const i = o - ? o - .replace(/\$[rs]\d{0,}|\$t0|\$t[1-9]\d{1,}/g, (s) => { - const o = { - $r: (s) => [...Array(s)].map(() => 'r').join(''), - $s: (s) => [...Array(s)].map(() => 's').join(''), - $t: (s) => [...Array(s)].map(() => 't').join('') - }, - i = s.slice(0, 2), - u = parseInt(s.slice(2), 10); - return o[i](u); - }) - .replace(/^(.*?)(t{8,})(.*)$/g, (o, i, u) => - s.substring(i.length, i.length + u.length) - ) - : s; - if (8 === i.length) return new Date(1e3 * parseInt(i, 16)); - if (i.length < 10) throw new Error('Stamp length invalid'); - const u = parseInt(i.substring(i.length - 1), 16); - return new Date(1e3 * parseInt(i.substring(u, u + 8), 16)); - }), - __publicField(this, 'setCounter', (s) => { - this.counter = s; - }), - __publicField(this, 'validate', (s, o) => { - const i = o ? this._normalizeDictionary(o) : this.dict; - return s.split('').every((s) => i.includes(s)); - })); - const o = __spreadValues(__spreadValues({}, j), s); - ((this.counter = 0), - (this.debug = !1), - (this.dict = []), - (this.version = '5.2.0')); - const { dictionary: i, shuffle: u, length: _, counter: w } = o; - return ( - (this.uuidLength = _), - this.setDictionary(i, u), - this.setCounter(w), - (this.debug = o.debug), - this.log(this.dict), - this.log( - `Generator instantiated with Dictionary Size ${this.dictLength} and counter set to ${this.counter}` - ), - (this.log = this.log.bind(this)), - (this.setDictionary = this.setDictionary.bind(this)), - (this.setCounter = this.setCounter.bind(this)), - (this.seq = this.seq.bind(this)), - (this.sequentialUUID = this.sequentialUUID.bind(this)), - (this.rnd = this.rnd.bind(this)), - (this.randomUUID = this.randomUUID.bind(this)), - (this.fmt = this.fmt.bind(this)), - (this.formattedUUID = this.formattedUUID.bind(this)), - (this.availableUUIDs = this.availableUUIDs.bind(this)), - (this.approxMaxBeforeCollision = this.approxMaxBeforeCollision.bind(this)), - (this.collisionProbability = this.collisionProbability.bind(this)), - (this.uniqueness = this.uniqueness.bind(this)), - (this.getVersion = this.getVersion.bind(this)), - (this.stamp = this.stamp.bind(this)), - (this.parseStamp = this.parseStamp.bind(this)), - this - ); - } - }; - __publicField(L, 'default', L); - var B, - $ = L; - return ( - (B = x), - ((u, w, x, C) => { - if ((w && 'object' == typeof w) || 'function' == typeof w) - for (let j of i(w)) - _.call(u, j) || - j === x || - s(u, j, { get: () => w[j], enumerable: !(C = o(w, j)) || C.enumerable }); - return u; - })(s({}, '__esModule', { value: !0 }), B) - ); - })(); - ((s.exports = o.default), 'undefined' != typeof window && (o = o.default)); - }, - 88310: (s, o, i) => { - s.exports = Stream; - var u = i(37007).EventEmitter; - function Stream() { - u.call(this); - } - (i(56698)(Stream, u), - (Stream.Readable = i(45412)), - (Stream.Writable = i(16708)), - (Stream.Duplex = i(25382)), - (Stream.Transform = i(74610)), - (Stream.PassThrough = i(63600)), - (Stream.finished = i(86238)), - (Stream.pipeline = i(57758)), - (Stream.Stream = Stream), - (Stream.prototype.pipe = function (s, o) { - var i = this; - function ondata(o) { - s.writable && !1 === s.write(o) && i.pause && i.pause(); - } - function ondrain() { - i.readable && i.resume && i.resume(); - } - (i.on('data', ondata), - s.on('drain', ondrain), - s._isStdio || (o && !1 === o.end) || (i.on('end', onend), i.on('close', onclose))); - var _ = !1; - function onend() { - _ || ((_ = !0), s.end()); - } - function onclose() { - _ || ((_ = !0), 'function' == typeof s.destroy && s.destroy()); - } - function onerror(s) { - if ((cleanup(), 0 === u.listenerCount(this, 'error'))) throw s; - } - function cleanup() { - (i.removeListener('data', ondata), - s.removeListener('drain', ondrain), - i.removeListener('end', onend), - i.removeListener('close', onclose), - i.removeListener('error', onerror), - s.removeListener('error', onerror), - i.removeListener('end', cleanup), - i.removeListener('close', cleanup), - s.removeListener('close', cleanup)); - } - return ( - i.on('error', onerror), - s.on('error', onerror), - i.on('end', cleanup), - i.on('close', cleanup), - s.on('close', cleanup), - s.emit('pipe', i), - s - ); - })); - }, - 83141: (s, o, i) => { - 'use strict'; - var u = i(92861).Buffer, - _ = - u.isEncoding || - function (s) { - switch ((s = '' + s) && s.toLowerCase()) { - case 'hex': - case 'utf8': - case 'utf-8': - case 'ascii': - case 'binary': - case 'base64': - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - case 'raw': - return !0; - default: - return !1; - } - }; - function StringDecoder(s) { - var o; - switch ( - ((this.encoding = (function normalizeEncoding(s) { - var o = (function _normalizeEncoding(s) { - if (!s) return 'utf8'; - for (var o; ; ) - switch (s) { - case 'utf8': - case 'utf-8': - return 'utf8'; - case 'ucs2': - case 'ucs-2': - case 'utf16le': - case 'utf-16le': - return 'utf16le'; - case 'latin1': - case 'binary': - return 'latin1'; - case 'base64': - case 'ascii': - case 'hex': - return s; - default: - if (o) return; - ((s = ('' + s).toLowerCase()), (o = !0)); - } - })(s); - if ('string' != typeof o && (u.isEncoding === _ || !_(s))) - throw new Error('Unknown encoding: ' + s); - return o || s; - })(s)), - this.encoding) - ) { - case 'utf16le': - ((this.text = utf16Text), (this.end = utf16End), (o = 4)); - break; - case 'utf8': - ((this.fillLast = utf8FillLast), (o = 4)); - break; - case 'base64': - ((this.text = base64Text), (this.end = base64End), (o = 3)); - break; - default: - return ((this.write = simpleWrite), void (this.end = simpleEnd)); - } - ((this.lastNeed = 0), (this.lastTotal = 0), (this.lastChar = u.allocUnsafe(o))); - } - function utf8CheckByte(s) { - return s <= 127 - ? 0 - : s >> 5 == 6 - ? 2 - : s >> 4 == 14 - ? 3 - : s >> 3 == 30 - ? 4 - : s >> 6 == 2 - ? -1 - : -2; - } - function utf8FillLast(s) { - var o = this.lastTotal - this.lastNeed, - i = (function utf8CheckExtraBytes(s, o, i) { - if (128 != (192 & o[0])) return ((s.lastNeed = 0), '�'); - if (s.lastNeed > 1 && o.length > 1) { - if (128 != (192 & o[1])) return ((s.lastNeed = 1), '�'); - if (s.lastNeed > 2 && o.length > 2 && 128 != (192 & o[2])) - return ((s.lastNeed = 2), '�'); - } - })(this, s); - return void 0 !== i - ? i - : this.lastNeed <= s.length - ? (s.copy(this.lastChar, o, 0, this.lastNeed), - this.lastChar.toString(this.encoding, 0, this.lastTotal)) - : (s.copy(this.lastChar, o, 0, s.length), void (this.lastNeed -= s.length)); - } - function utf16Text(s, o) { - if ((s.length - o) % 2 == 0) { - var i = s.toString('utf16le', o); - if (i) { - var u = i.charCodeAt(i.length - 1); - if (u >= 55296 && u <= 56319) - return ( - (this.lastNeed = 2), - (this.lastTotal = 4), - (this.lastChar[0] = s[s.length - 2]), - (this.lastChar[1] = s[s.length - 1]), - i.slice(0, -1) - ); - } - return i; - } - return ( - (this.lastNeed = 1), - (this.lastTotal = 2), - (this.lastChar[0] = s[s.length - 1]), - s.toString('utf16le', o, s.length - 1) - ); - } - function utf16End(s) { - var o = s && s.length ? this.write(s) : ''; - if (this.lastNeed) { - var i = this.lastTotal - this.lastNeed; - return o + this.lastChar.toString('utf16le', 0, i); - } - return o; - } - function base64Text(s, o) { - var i = (s.length - o) % 3; - return 0 === i - ? s.toString('base64', o) - : ((this.lastNeed = 3 - i), - (this.lastTotal = 3), - 1 === i - ? (this.lastChar[0] = s[s.length - 1]) - : ((this.lastChar[0] = s[s.length - 2]), (this.lastChar[1] = s[s.length - 1])), - s.toString('base64', o, s.length - i)); - } - function base64End(s) { - var o = s && s.length ? this.write(s) : ''; - return this.lastNeed ? o + this.lastChar.toString('base64', 0, 3 - this.lastNeed) : o; - } - function simpleWrite(s) { - return s.toString(this.encoding); - } - function simpleEnd(s) { - return s && s.length ? this.write(s) : ''; - } - ((o.I = StringDecoder), - (StringDecoder.prototype.write = function (s) { - if (0 === s.length) return ''; - var o, i; - if (this.lastNeed) { - if (void 0 === (o = this.fillLast(s))) return ''; - ((i = this.lastNeed), (this.lastNeed = 0)); - } else i = 0; - return i < s.length ? (o ? o + this.text(s, i) : this.text(s, i)) : o || ''; - }), - (StringDecoder.prototype.end = function utf8End(s) { - var o = s && s.length ? this.write(s) : ''; - return this.lastNeed ? o + '�' : o; - }), - (StringDecoder.prototype.text = function utf8Text(s, o) { - var i = (function utf8CheckIncomplete(s, o, i) { - var u = o.length - 1; - if (u < i) return 0; - var _ = utf8CheckByte(o[u]); - if (_ >= 0) return (_ > 0 && (s.lastNeed = _ - 1), _); - if (--u < i || -2 === _) return 0; - if (((_ = utf8CheckByte(o[u])), _ >= 0)) return (_ > 0 && (s.lastNeed = _ - 2), _); - if (--u < i || -2 === _) return 0; - if (((_ = utf8CheckByte(o[u])), _ >= 0)) - return (_ > 0 && (2 === _ ? (_ = 0) : (s.lastNeed = _ - 3)), _); - return 0; - })(this, s, o); - if (!this.lastNeed) return s.toString('utf8', o); - this.lastTotal = i; - var u = s.length - (i - this.lastNeed); - return (s.copy(this.lastChar, 0, u), s.toString('utf8', o, u)); - }), - (StringDecoder.prototype.fillLast = function (s) { - if (this.lastNeed <= s.length) - return ( - s.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed), - this.lastChar.toString(this.encoding, 0, this.lastTotal) - ); - (s.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, s.length), - (this.lastNeed -= s.length)); - })); - }, - 69883: (s, o) => { - 'use strict'; - ((o.parse = function parse(s, o) { - if ('string' != typeof s) throw new TypeError('argument str must be a string'); - var i = {}, - _ = s.length; - if (_ < 2) return i; - var w = (o && o.decode) || decode, - x = 0, - C = 0, - j = 0; - do { - if (-1 === (C = s.indexOf('=', x))) break; - if (-1 === (j = s.indexOf(';', x))) j = _; - else if (C > j) { - x = s.lastIndexOf(';', C - 1) + 1; - continue; - } - var L = startIndex(s, x, C), - B = endIndex(s, C, L), - $ = s.slice(L, B); - if (!u.call(i, $)) { - var V = startIndex(s, C + 1, j), - U = endIndex(s, j, V); - 34 === s.charCodeAt(V) && 34 === s.charCodeAt(U - 1) && (V++, U--); - var z = s.slice(V, U); - i[$] = tryDecode(z, w); - } - x = j + 1; - } while (x < _); - return i; - }), - (o.serialize = function serialize(s, o, u) { - var j = (u && u.encode) || encodeURIComponent; - if ('function' != typeof j) throw new TypeError('option encode is invalid'); - if (!_.test(s)) throw new TypeError('argument name is invalid'); - var L = j(o); - if (!w.test(L)) throw new TypeError('argument val is invalid'); - var B = s + '=' + L; - if (!u) return B; - if (null != u.maxAge) { - var $ = Math.floor(u.maxAge); - if (!isFinite($)) throw new TypeError('option maxAge is invalid'); - B += '; Max-Age=' + $; - } - if (u.domain) { - if (!x.test(u.domain)) throw new TypeError('option domain is invalid'); - B += '; Domain=' + u.domain; - } - if (u.path) { - if (!C.test(u.path)) throw new TypeError('option path is invalid'); - B += '; Path=' + u.path; - } - if (u.expires) { - var V = u.expires; - if ( - !(function isDate(s) { - return '[object Date]' === i.call(s); - })(V) || - isNaN(V.valueOf()) - ) - throw new TypeError('option expires is invalid'); - B += '; Expires=' + V.toUTCString(); - } - u.httpOnly && (B += '; HttpOnly'); - u.secure && (B += '; Secure'); - u.partitioned && (B += '; Partitioned'); - if (u.priority) { - switch ('string' == typeof u.priority ? u.priority.toLowerCase() : u.priority) { - case 'low': - B += '; Priority=Low'; - break; - case 'medium': - B += '; Priority=Medium'; - break; - case 'high': - B += '; Priority=High'; - break; - default: - throw new TypeError('option priority is invalid'); - } - } - if (u.sameSite) { - switch ('string' == typeof u.sameSite ? u.sameSite.toLowerCase() : u.sameSite) { - case !0: - B += '; SameSite=Strict'; - break; - case 'lax': - B += '; SameSite=Lax'; - break; - case 'strict': - B += '; SameSite=Strict'; - break; - case 'none': - B += '; SameSite=None'; - break; - default: - throw new TypeError('option sameSite is invalid'); - } - } - return B; - })); - var i = Object.prototype.toString, - u = Object.prototype.hasOwnProperty, - _ = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/, - w = /^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/, - x = - /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i, - C = /^[\u0020-\u003A\u003D-\u007E]*$/; - function startIndex(s, o, i) { - do { - var u = s.charCodeAt(o); - if (32 !== u && 9 !== u) return o; - } while (++o < i); - return i; - } - function endIndex(s, o, i) { - for (; o > i; ) { - var u = s.charCodeAt(--o); - if (32 !== u && 9 !== u) return o + 1; - } - return i; - } - function decode(s) { - return -1 !== s.indexOf('%') ? decodeURIComponent(s) : s; - } - function tryDecode(s, o) { - try { - return o(s); - } catch (o) { - return s; - } - } - }, - 16426: (s) => { - s.exports = function () { - var s = document.getSelection(); - if (!s.rangeCount) return function () {}; - for (var o = document.activeElement, i = [], u = 0; u < s.rangeCount; u++) - i.push(s.getRangeAt(u)); - switch (o.tagName.toUpperCase()) { - case 'INPUT': - case 'TEXTAREA': - o.blur(); - break; - default: - o = null; - } - return ( - s.removeAllRanges(), - function () { - ('Caret' === s.type && s.removeAllRanges(), - s.rangeCount || - i.forEach(function (o) { - s.addRange(o); - }), - o && o.focus()); - } - ); - }; - }, - 61160: (s, o, i) => { - 'use strict'; - var u = i(92063), - _ = i(73992), - w = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/, - x = /[\n\r\t]/g, - C = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//, - j = /:\d+$/, - L = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i, - B = /^[a-zA-Z]:/; - function trimLeft(s) { - return (s || '').toString().replace(w, ''); - } - var $ = [ - ['#', 'hash'], - ['?', 'query'], - function sanitize(s, o) { - return isSpecial(o.protocol) ? s.replace(/\\/g, '/') : s; - }, - ['/', 'pathname'], - ['@', 'auth', 1], - [NaN, 'host', void 0, 1, 1], - [/:(\d*)$/, 'port', void 0, 1], - [NaN, 'hostname', void 0, 1, 1] - ], - V = { hash: 1, query: 1 }; - function lolcation(s) { - var o, - u = - ('undefined' != typeof window - ? window - : void 0 !== i.g - ? i.g - : 'undefined' != typeof self - ? self - : {} - ).location || {}, - _ = {}, - w = typeof (s = s || u); - if ('blob:' === s.protocol) _ = new Url(unescape(s.pathname), {}); - else if ('string' === w) for (o in ((_ = new Url(s, {})), V)) delete _[o]; - else if ('object' === w) { - for (o in s) o in V || (_[o] = s[o]); - void 0 === _.slashes && (_.slashes = C.test(s.href)); - } - return _; - } - function isSpecial(s) { - return ( - 'file:' === s || - 'ftp:' === s || - 'http:' === s || - 'https:' === s || - 'ws:' === s || - 'wss:' === s - ); - } - function extractProtocol(s, o) { - ((s = (s = trimLeft(s)).replace(x, '')), (o = o || {})); - var i, - u = L.exec(s), - _ = u[1] ? u[1].toLowerCase() : '', - w = !!u[2], - C = !!u[3], - j = 0; - return ( - w - ? C - ? ((i = u[2] + u[3] + u[4]), (j = u[2].length + u[3].length)) - : ((i = u[2] + u[4]), (j = u[2].length)) - : C - ? ((i = u[3] + u[4]), (j = u[3].length)) - : (i = u[4]), - 'file:' === _ - ? j >= 2 && (i = i.slice(2)) - : isSpecial(_) - ? (i = u[4]) - : _ - ? w && (i = i.slice(2)) - : j >= 2 && isSpecial(o.protocol) && (i = u[4]), - { protocol: _, slashes: w || isSpecial(_), slashesCount: j, rest: i } - ); - } - function Url(s, o, i) { - if (((s = (s = trimLeft(s)).replace(x, '')), !(this instanceof Url))) - return new Url(s, o, i); - var w, - C, - j, - L, - V, - U, - z = $.slice(), - Y = typeof o, - Z = this, - ee = 0; - for ( - 'object' !== Y && 'string' !== Y && ((i = o), (o = null)), - i && 'function' != typeof i && (i = _.parse), - w = !(C = extractProtocol(s || '', (o = lolcation(o)))).protocol && !C.slashes, - Z.slashes = C.slashes || (w && o.slashes), - Z.protocol = C.protocol || o.protocol || '', - s = C.rest, - (('file:' === C.protocol && (2 !== C.slashesCount || B.test(s))) || - (!C.slashes && (C.protocol || C.slashesCount < 2 || !isSpecial(Z.protocol)))) && - (z[3] = [/(.*)/, 'pathname']); - ee < z.length; - ee++ - ) - 'function' != typeof (L = z[ee]) - ? ((j = L[0]), - (U = L[1]), - j != j - ? (Z[U] = s) - : 'string' == typeof j - ? ~(V = '@' === j ? s.lastIndexOf(j) : s.indexOf(j)) && - ('number' == typeof L[2] - ? ((Z[U] = s.slice(0, V)), (s = s.slice(V + L[2]))) - : ((Z[U] = s.slice(V)), (s = s.slice(0, V)))) - : (V = j.exec(s)) && ((Z[U] = V[1]), (s = s.slice(0, V.index))), - (Z[U] = Z[U] || (w && L[3] && o[U]) || ''), - L[4] && (Z[U] = Z[U].toLowerCase())) - : (s = L(s, Z)); - (i && (Z.query = i(Z.query)), - w && - o.slashes && - '/' !== Z.pathname.charAt(0) && - ('' !== Z.pathname || '' !== o.pathname) && - (Z.pathname = (function resolve(s, o) { - if ('' === s) return o; - for ( - var i = (o || '/').split('/').slice(0, -1).concat(s.split('/')), - u = i.length, - _ = i[u - 1], - w = !1, - x = 0; - u--; - ) - '.' === i[u] - ? i.splice(u, 1) - : '..' === i[u] - ? (i.splice(u, 1), x++) - : x && (0 === u && (w = !0), i.splice(u, 1), x--); - return (w && i.unshift(''), ('.' !== _ && '..' !== _) || i.push(''), i.join('/')); - })(Z.pathname, o.pathname)), - '/' !== Z.pathname.charAt(0) && - isSpecial(Z.protocol) && - (Z.pathname = '/' + Z.pathname), - u(Z.port, Z.protocol) || ((Z.host = Z.hostname), (Z.port = '')), - (Z.username = Z.password = ''), - Z.auth && - (~(V = Z.auth.indexOf(':')) - ? ((Z.username = Z.auth.slice(0, V)), - (Z.username = encodeURIComponent(decodeURIComponent(Z.username))), - (Z.password = Z.auth.slice(V + 1)), - (Z.password = encodeURIComponent(decodeURIComponent(Z.password)))) - : (Z.username = encodeURIComponent(decodeURIComponent(Z.auth))), - (Z.auth = Z.password ? Z.username + ':' + Z.password : Z.username)), - (Z.origin = - 'file:' !== Z.protocol && isSpecial(Z.protocol) && Z.host - ? Z.protocol + '//' + Z.host - : 'null'), - (Z.href = Z.toString())); - } - ((Url.prototype = { - set: function set(s, o, i) { - var w = this; - switch (s) { - case 'query': - ('string' == typeof o && o.length && (o = (i || _.parse)(o)), (w[s] = o)); - break; - case 'port': - ((w[s] = o), - u(o, w.protocol) - ? o && (w.host = w.hostname + ':' + o) - : ((w.host = w.hostname), (w[s] = ''))); - break; - case 'hostname': - ((w[s] = o), w.port && (o += ':' + w.port), (w.host = o)); - break; - case 'host': - ((w[s] = o), - j.test(o) - ? ((o = o.split(':')), (w.port = o.pop()), (w.hostname = o.join(':'))) - : ((w.hostname = o), (w.port = ''))); - break; - case 'protocol': - ((w.protocol = o.toLowerCase()), (w.slashes = !i)); - break; - case 'pathname': - case 'hash': - if (o) { - var x = 'pathname' === s ? '/' : '#'; - w[s] = o.charAt(0) !== x ? x + o : o; - } else w[s] = o; - break; - case 'username': - case 'password': - w[s] = encodeURIComponent(o); - break; - case 'auth': - var C = o.indexOf(':'); - ~C - ? ((w.username = o.slice(0, C)), - (w.username = encodeURIComponent(decodeURIComponent(w.username))), - (w.password = o.slice(C + 1)), - (w.password = encodeURIComponent(decodeURIComponent(w.password)))) - : (w.username = encodeURIComponent(decodeURIComponent(o))); - } - for (var L = 0; L < $.length; L++) { - var B = $[L]; - B[4] && (w[B[1]] = w[B[1]].toLowerCase()); - } - return ( - (w.auth = w.password ? w.username + ':' + w.password : w.username), - (w.origin = - 'file:' !== w.protocol && isSpecial(w.protocol) && w.host - ? w.protocol + '//' + w.host - : 'null'), - (w.href = w.toString()), - w - ); - }, - toString: function toString(s) { - (s && 'function' == typeof s) || (s = _.stringify); - var o, - i = this, - u = i.host, - w = i.protocol; - w && ':' !== w.charAt(w.length - 1) && (w += ':'); - var x = w + ((i.protocol && i.slashes) || isSpecial(i.protocol) ? '//' : ''); - return ( - i.username - ? ((x += i.username), i.password && (x += ':' + i.password), (x += '@')) - : i.password - ? ((x += ':' + i.password), (x += '@')) - : 'file:' !== i.protocol && - isSpecial(i.protocol) && - !u && - '/' !== i.pathname && - (x += '@'), - (':' === u[u.length - 1] || (j.test(i.hostname) && !i.port)) && (u += ':'), - (x += u + i.pathname), - (o = 'object' == typeof i.query ? s(i.query) : i.query) && - (x += '?' !== o.charAt(0) ? '?' + o : o), - i.hash && (x += i.hash), - x - ); - } - }), - (Url.extractProtocol = extractProtocol), - (Url.location = lolcation), - (Url.trimLeft = trimLeft), - (Url.qs = _), - (s.exports = Url)); - }, - 77154: (s, o, i) => { - 'use strict'; - var u = i(96540); - var _ = - 'function' == typeof Object.is - ? Object.is - : function n(s, o) { - return (s === o && (0 !== s || 1 / s == 1 / o)) || (s != s && o != o); - }, - w = u.useSyncExternalStore, - x = u.useRef, - C = u.useEffect, - j = u.useMemo, - L = u.useDebugValue; - o.useSyncExternalStoreWithSelector = function (s, o, i, u, B) { - var $ = x(null); - if (null === $.current) { - var V = { hasValue: !1, value: null }; - $.current = V; - } else V = $.current; - $ = j( - function () { - function a(o) { - if (!x) { - if (((x = !0), (s = o), (o = u(o)), void 0 !== B && V.hasValue)) { - var i = V.value; - if (B(i, o)) return (w = i); - } - return (w = o); - } - if (((i = w), _(s, o))) return i; - var C = u(o); - return void 0 !== B && B(i, C) ? i : ((s = o), (w = C)); - } - var s, - w, - x = !1, - C = void 0 === i ? null : i; - return [ - function () { - return a(o()); - }, - null === C - ? void 0 - : function () { - return a(C()); - } - ]; - }, - [o, i, u, B] - ); - var U = w(s, $[0], $[1]); - return ( - C( - function () { - ((V.hasValue = !0), (V.value = U)); - }, - [U] - ), - L(U), - U - ); - }; - }, - 78418: (s, o, i) => { - 'use strict'; - s.exports = i(77154); - }, - 94643: (s, o, i) => { - function config(s) { - try { - if (!i.g.localStorage) return !1; - } catch (s) { - return !1; - } - var o = i.g.localStorage[s]; - return null != o && 'true' === String(o).toLowerCase(); - } - s.exports = function deprecate(s, o) { - if (config('noDeprecation')) return s; - var i = !1; - return function deprecated() { - if (!i) { - if (config('throwDeprecation')) throw new Error(o); - (config('traceDeprecation') ? console.trace(o) : console.warn(o), (i = !0)); - } - return s.apply(this, arguments); - }; - }; - }, - 26657: (s, o, i) => { - 'use strict'; - var u = i(75208), - _ = function isClosingTag(s) { - return /<\/+[^>]+>/.test(s); - }, - w = function isSelfClosingTag(s) { - return /<[^>]+\/>/.test(s); - }; - function getType(s) { - return _(s) - ? 'ClosingTag' - : (function isOpeningTag(s) { - return ( - (function isTag(s) { - return /<[^>!]+>/.test(s); - })(s) && - !_(s) && - !w(s) - ); - })(s) - ? 'OpeningTag' - : w(s) - ? 'SelfClosingTag' - : 'Text'; - } - s.exports = function (s) { - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, - i = o.indentor, - _ = o.textNodesOnSameLine, - w = 0, - x = []; - i = i || ' '; - var C = (function lexer(s) { - return (function splitOnTags(s) { - return s.split(/(<\/?[^>]+>)/g).filter(function (s) { - return '' !== s.trim(); - }); - })(s).map(function (s) { - return { value: s, type: getType(s) }; - }); - })(s).map(function (s, o, C) { - var j = s.value, - L = s.type; - 'ClosingTag' === L && w--; - var B = u(i, w), - $ = B + j; - if (('OpeningTag' === L && w++, _)) { - var V = C[o - 1], - U = C[o - 2]; - 'ClosingTag' === L && - 'Text' === V.type && - 'OpeningTag' === U.type && - (($ = '' + B + U.value + V.value + j), x.push(o - 2, o - 1)); - } - return $; - }); - return ( - x.forEach(function (s) { - return (C[s] = null); - }), - C.filter(function (s) { - return !!s; - }).join('\n') - ); - }; - }, - 31499: (s) => { - var o = { '&': '&', '"': '"', "'": ''', '<': '<', '>': '>' }; - s.exports = function escapeForXML(s) { - return s && s.replace - ? s.replace(/([&"<>'])/g, function (s, i) { - return o[i]; - }) - : s; - }; - }, - 19123: (s, o, i) => { - var u = i(65606), - _ = i(31499), - w = i(88310).Stream; - function resolve(s, o, i) { - var u, - w = (function create_indent(s, o) { - return new Array(o || 0).join(s || ''); - })(o, (i = i || 0)), - x = s; - if ('object' == typeof s && (x = s[(u = Object.keys(s)[0])]) && x._elem) - return ( - (x._elem.name = u), - (x._elem.icount = i), - (x._elem.indent = o), - (x._elem.indents = w), - (x._elem.interrupt = x), - x._elem - ); - var C, - j = [], - L = []; - function get_attributes(s) { - Object.keys(s).forEach(function (o) { - j.push( - (function attribute(s, o) { - return s + '="' + _(o) + '"'; - })(o, s[o]) - ); - }); - } - switch (typeof x) { - case 'object': - if (null === x) break; - (x._attr && get_attributes(x._attr), - x._cdata && - L.push(('/g, ']]]]>') + ']]>'), - x.forEach && - ((C = !1), - L.push(''), - x.forEach(function (s) { - 'object' == typeof s - ? '_attr' == Object.keys(s)[0] - ? get_attributes(s._attr) - : L.push(resolve(s, o, i + 1)) - : (L.pop(), (C = !0), L.push(_(s))); - }), - C || L.push(''))); - break; - default: - L.push(_(x)); - } - return { - name: u, - interrupt: !1, - attributes: j, - content: L, - icount: i, - indents: w, - indent: o - }; - } - function format(s, o, i) { - if ('object' != typeof o) return s(!1, o); - var u = o.interrupt ? 1 : o.content.length; - function proceed() { - for (; o.content.length; ) { - var _ = o.content.shift(); - if (void 0 !== _) { - if (interrupt(_)) return; - format(s, _); - } - } - (s( - !1, - (u > 1 ? o.indents : '') + - (o.name ? '' : '') + - (o.indent && !i ? '\n' : '') - ), - i && i()); - } - function interrupt(o) { - return ( - !!o.interrupt && - ((o.interrupt.append = s), - (o.interrupt.end = proceed), - (o.interrupt = !1), - s(!0), - !0) - ); - } - if ( - (s( - !1, - o.indents + - (o.name ? '<' + o.name : '') + - (o.attributes.length ? ' ' + o.attributes.join(' ') : '') + - (u ? (o.name ? '>' : '') : o.name ? '/>' : '') + - (o.indent && u > 1 ? '\n' : '') - ), - !u) - ) - return s(!1, o.indent ? '\n' : ''); - interrupt(o) || proceed(); - } - ((s.exports = function xml(s, o) { - 'object' != typeof o && (o = { indent: o }); - var i = o.stream ? new w() : null, - _ = '', - x = !1, - C = o.indent ? (!0 === o.indent ? ' ' : o.indent) : '', - j = !0; - function delay(s) { - j ? u.nextTick(s) : s(); - } - function append(s, o) { - if ((void 0 !== o && (_ += o), s && !x && ((i = i || new w()), (x = !0)), s && x)) { - var u = _; - (delay(function () { - i.emit('data', u); - }), - (_ = '')); - } - } - function add(s, o) { - format(append, resolve(s, C, C ? 1 : 0), o); - } - function end() { - if (i) { - var s = _; - delay(function () { - (i.emit('data', s), i.emit('end'), (i.readable = !1), i.emit('close')); - }); - } - } - return ( - delay(function () { - j = !1; - }), - o.declaration && - (function addXmlDeclaration(s) { - var o = { version: '1.0', encoding: s.encoding || 'UTF-8' }; - (s.standalone && (o.standalone = s.standalone), - add({ '?xml': { _attr: o } }), - (_ = _.replace('/>', '?>'))); - })(o.declaration), - s && s.forEach - ? s.forEach(function (o, i) { - var u; - (i + 1 === s.length && (u = end), add(o, u)); - }) - : add(s, end), - i ? ((i.readable = !0), i) : _ - ); - }), - (s.exports.element = s.exports.Element = - function element() { - var s = { - _elem: resolve(Array.prototype.slice.call(arguments)), - push: function (s) { - if (!this.append) throw new Error('not assigned to a parent!'); - var o = this, - i = this._elem.indent; - format( - this.append, - resolve(s, i, this._elem.icount + (i ? 1 : 0)), - function () { - o.append(!0); - } - ); - }, - close: function (s) { - (void 0 !== s && this.push(s), this.end && this.end()); - } - }; - return s; - })); - }, - 86215: function (s, o) { - var i, u, _; - ((u = []), - (i = (function () { - 'use strict'; - var isNativeSmoothScrollEnabledOn = function (s) { - return ( - s && - 'getComputedStyle' in window && - 'smooth' === window.getComputedStyle(s)['scroll-behavior'] - ); - }; - if ('undefined' == typeof window || !('document' in window)) return {}; - var makeScroller = function (s, o, i) { - var u; - ((o = o || 999), i || 0 === i || (i = 9)); - var setScrollTimeoutId = function (s) { - u = s; - }, - stopScroll = function () { - (clearTimeout(u), setScrollTimeoutId(0)); - }, - getTopWithEdgeOffset = function (o) { - return Math.max(0, s.getTopOf(o) - i); - }, - scrollToY = function (i, u, _) { - if ( - (stopScroll(), - 0 === u || (u && u < 0) || isNativeSmoothScrollEnabledOn(s.body)) - ) - (s.toY(i), _ && _()); - else { - var w = s.getY(), - x = Math.max(0, i) - w, - C = new Date().getTime(); - ((u = u || Math.min(Math.abs(x), o)), - (function loopScroll() { - setScrollTimeoutId( - setTimeout(function () { - var o = Math.min(1, (new Date().getTime() - C) / u), - i = Math.max( - 0, - Math.floor(w + x * (o < 0.5 ? 2 * o * o : o * (4 - 2 * o) - 1)) - ); - (s.toY(i), - o < 1 && s.getHeight() + i < s.body.scrollHeight - ? loopScroll() - : (setTimeout(stopScroll, 99), _ && _())); - }, 9) - ); - })()); - } - }, - scrollToElem = function (s, o, i) { - scrollToY(getTopWithEdgeOffset(s), o, i); - }, - scrollIntoView = function (o, u, _) { - var w = o.getBoundingClientRect().height, - x = s.getTopOf(o) + w, - C = s.getHeight(), - j = s.getY(), - L = j + C; - getTopWithEdgeOffset(o) < j || w + i > C - ? scrollToElem(o, u, _) - : x + i > L - ? scrollToY(x - C + i, u, _) - : _ && _(); - }, - scrollToCenterOf = function (o, i, u, _) { - scrollToY( - Math.max( - 0, - s.getTopOf(o) - - s.getHeight() / 2 + - (u || o.getBoundingClientRect().height / 2) - ), - i, - _ - ); - }; - return { - setup: function (s, u) { - return ( - (0 === s || s) && (o = s), - (0 === u || u) && (i = u), - { defaultDuration: o, edgeOffset: i } - ); - }, - to: scrollToElem, - toY: scrollToY, - intoView: scrollIntoView, - center: scrollToCenterOf, - stop: stopScroll, - moving: function () { - return !!u; - }, - getY: s.getY, - getTopOf: s.getTopOf - }; - }, - s = document.documentElement, - getDocY = function () { - return window.scrollY || s.scrollTop; - }, - o = makeScroller({ - body: document.scrollingElement || document.body, - toY: function (s) { - window.scrollTo(0, s); - }, - getY: getDocY, - getHeight: function () { - return window.innerHeight || s.clientHeight; - }, - getTopOf: function (o) { - return o.getBoundingClientRect().top + getDocY() - s.offsetTop; - } - }); - if ( - ((o.createScroller = function (o, i, u) { - return makeScroller( - { - body: o, - toY: function (s) { - o.scrollTop = s; - }, - getY: function () { - return o.scrollTop; - }, - getHeight: function () { - return Math.min(o.clientHeight, window.innerHeight || s.clientHeight); - }, - getTopOf: function (s) { - return s.offsetTop; - } - }, - i, - u - ); - }), - 'addEventListener' in window && - !window.noZensmooth && - !isNativeSmoothScrollEnabledOn(document.body)) - ) { - var i = 'history' in window && 'pushState' in history, - u = i && 'scrollRestoration' in history; - (u && (history.scrollRestoration = 'auto'), - window.addEventListener( - 'load', - function () { - (u && - (setTimeout(function () { - history.scrollRestoration = 'manual'; - }, 9), - window.addEventListener( - 'popstate', - function (s) { - s.state && 'zenscrollY' in s.state && o.toY(s.state.zenscrollY); - }, - !1 - )), - window.location.hash && - setTimeout(function () { - var s = o.setup().edgeOffset; - if (s) { - var i = document.getElementById(window.location.href.split('#')[1]); - if (i) { - var u = Math.max(0, o.getTopOf(i) - s), - _ = o.getY() - u; - 0 <= _ && _ < 9 && window.scrollTo(0, u); - } - } - }, 9)); - }, - !1 - )); - var _ = new RegExp('(^|\\s)noZensmooth(\\s|$)'); - window.addEventListener( - 'click', - function (s) { - for (var w = s.target; w && 'A' !== w.tagName; ) w = w.parentNode; - if ( - !(!w || 1 !== s.which || s.shiftKey || s.metaKey || s.ctrlKey || s.altKey) - ) { - if (u) { - var x = - history.state && 'object' == typeof history.state ? history.state : {}; - x.zenscrollY = o.getY(); - try { - history.replaceState(x, ''); - } catch (s) {} - } - var C = w.getAttribute('href') || ''; - if (0 === C.indexOf('#') && !_.test(w.className)) { - var j = 0, - L = document.getElementById(C.substring(1)); - if ('#' !== C) { - if (!L) return; - j = o.getTopOf(L); - } - s.preventDefault(); - var onDone = function () { - window.location = C; - }, - B = o.setup().edgeOffset; - (B && - ((j = Math.max(0, j - B)), - i && - (onDone = function () { - history.pushState({}, '', C); - })), - o.toY(j, null, onDone)); - } - } - }, - !1 - ); - } - return o; - })()), - void 0 === (_ = 'function' == typeof i ? i.apply(o, u) : i) || (s.exports = _)); - }, - 15340: () => {}, - 79838: () => {}, - 48675: (s, o, i) => { - s.exports = i(20850); - }, - 7666: (s, o, i) => { - var u = i(84851), - _ = i(953); - function _extends() { - var o; - return ( - (s.exports = _extends = - u - ? _((o = u)).call(o) - : function (s) { - for (var o = 1; o < arguments.length; o++) { - var i = arguments[o]; - for (var u in i) ({}).hasOwnProperty.call(i, u) && (s[u] = i[u]); - } - return s; - }), - (s.exports.__esModule = !0), - (s.exports.default = s.exports), - _extends.apply(null, arguments) - ); - } - ((s.exports = _extends), (s.exports.__esModule = !0), (s.exports.default = s.exports)); - }, - 46942: (s, o) => { - var i; - !(function () { - 'use strict'; - var u = {}.hasOwnProperty; - function classNames() { - for (var s = '', o = 0; o < arguments.length; o++) { - var i = arguments[o]; - i && (s = appendClass(s, parseValue(i))); - } - return s; - } - function parseValue(s) { - if ('string' == typeof s || 'number' == typeof s) return s; - if ('object' != typeof s) return ''; - if (Array.isArray(s)) return classNames.apply(null, s); - if ( - s.toString !== Object.prototype.toString && - !s.toString.toString().includes('[native code]') - ) - return s.toString(); - var o = ''; - for (var i in s) u.call(s, i) && s[i] && (o = appendClass(o, i)); - return o; - } - function appendClass(s, o) { - return o ? (s ? s + ' ' + o : s + o) : s; - } - s.exports - ? ((classNames.default = classNames), (s.exports = classNames)) - : void 0 === - (i = function () { - return classNames; - }.apply(o, [])) || (s.exports = i); - })(); - }, - 68623: (s, o, i) => { - 'use strict'; - var u = i(694); - s.exports = u; - }, - 93700: (s, o, i) => { - 'use strict'; - var u = i(19709); - s.exports = u; - }, - 462: (s, o, i) => { - 'use strict'; - var u = i(40975); - s.exports = u; - }, - 37257: (s, o, i) => { - 'use strict'; - (i(96605), i(64502), i(36371), i(99363), i(7057)); - var u = i(92046); - s.exports = u.AggregateError; - }, - 32567: (s, o, i) => { - 'use strict'; - i(79307); - var u = i(61747); - s.exports = u('Function', 'bind'); - }, - 23034: (s, o, i) => { - 'use strict'; - var u = i(88280), - _ = i(32567), - w = Function.prototype; - s.exports = function (s) { - var o = s.bind; - return s === w || (u(w, s) && o === w.bind) ? _ : o; - }; - }, - 9748: (s, o, i) => { - 'use strict'; - i(71340); - var u = i(92046); - s.exports = u.Object.assign; - }, - 20850: (s, o, i) => { - 'use strict'; - s.exports = i(46076); - }, - 953: (s, o, i) => { - 'use strict'; - s.exports = i(53375); - }, - 84851: (s, o, i) => { - 'use strict'; - s.exports = i(85401); - }, - 46076: (s, o, i) => { - 'use strict'; - i(91599); - var u = i(68623); - s.exports = u; - }, - 53375: (s, o, i) => { - 'use strict'; - var u = i(93700); - s.exports = u; - }, - 85401: (s, o, i) => { - 'use strict'; - var u = i(462); - s.exports = u; - }, - 82159: (s, o, i) => { - 'use strict'; - var u = i(62250), - _ = i(4640), - w = TypeError; - s.exports = function (s) { - if (u(s)) return s; - throw new w(_(s) + ' is not a function'); - }; - }, - 10043: (s, o, i) => { - 'use strict'; - var u = i(54018), - _ = String, - w = TypeError; - s.exports = function (s) { - if (u(s)) return s; - throw new w("Can't set " + _(s) + ' as a prototype'); - }; - }, - 42156: (s) => { - 'use strict'; - s.exports = function () {}; - }, - 36624: (s, o, i) => { - 'use strict'; - var u = i(46285), - _ = String, - w = TypeError; - s.exports = function (s) { - if (u(s)) return s; - throw new w(_(s) + ' is not an object'); - }; - }, - 74436: (s, o, i) => { - 'use strict'; - var u = i(4993), - _ = i(34849), - w = i(20575), - createMethod = function (s) { - return function (o, i, x) { - var C = u(o), - j = w(C); - if (0 === j) return !s && -1; - var L, - B = _(x, j); - if (s && i != i) { - for (; j > B; ) if ((L = C[B++]) != L) return !0; - } else for (; j > B; B++) if ((s || B in C) && C[B] === i) return s || B || 0; - return !s && -1; - }; - }; - s.exports = { includes: createMethod(!0), indexOf: createMethod(!1) }; - }, - 93427: (s, o, i) => { - 'use strict'; - var u = i(1907); - s.exports = u([].slice); - }, - 45807: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = u({}.toString), - w = u(''.slice); - s.exports = function (s) { - return w(_(s), 8, -1); - }; - }, - 73948: (s, o, i) => { - 'use strict'; - var u = i(52623), - _ = i(62250), - w = i(45807), - x = i(76264)('toStringTag'), - C = Object, - j = - 'Arguments' === - w( - (function () { - return arguments; - })() - ); - s.exports = u - ? w - : function (s) { - var o, i, u; - return void 0 === s - ? 'Undefined' - : null === s - ? 'Null' - : 'string' == - typeof (i = (function (s, o) { - try { - return s[o]; - } catch (s) {} - })((o = C(s)), x)) - ? i - : j - ? w(o) - : 'Object' === (u = w(o)) && _(o.callee) - ? 'Arguments' - : u; - }; - }, - 19595: (s, o, i) => { - 'use strict'; - var u = i(49724), - _ = i(11042), - w = i(13846), - x = i(74284); - s.exports = function (s, o, i) { - for (var C = _(o), j = x.f, L = w.f, B = 0; B < C.length; B++) { - var $ = C[B]; - u(s, $) || (i && u(i, $)) || j(s, $, L(o, $)); - } - }; - }, - 57382: (s, o, i) => { - 'use strict'; - var u = i(98828); - s.exports = !u(function () { - function F() {} - return ( - (F.prototype.constructor = null), - Object.getPrototypeOf(new F()) !== F.prototype - ); - }); - }, - 59550: (s) => { - 'use strict'; - s.exports = function (s, o) { - return { value: s, done: o }; - }; - }, - 61626: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(74284), - w = i(75817); - s.exports = u - ? function (s, o, i) { - return _.f(s, o, w(1, i)); - } - : function (s, o, i) { - return ((s[o] = i), s); - }; - }, - 75817: (s) => { - 'use strict'; - s.exports = function (s, o) { - return { enumerable: !(1 & s), configurable: !(2 & s), writable: !(4 & s), value: o }; - }; - }, - 68055: (s, o, i) => { - 'use strict'; - var u = i(61626); - s.exports = function (s, o, i, _) { - return (_ && _.enumerable ? (s[o] = i) : u(s, o, i), s); - }; - }, - 2532: (s, o, i) => { - 'use strict'; - var u = i(45951), - _ = Object.defineProperty; - s.exports = function (s, o) { - try { - _(u, s, { value: o, configurable: !0, writable: !0 }); - } catch (i) { - u[s] = o; - } - return o; - }; - }, - 39447: (s, o, i) => { - 'use strict'; - var u = i(98828); - s.exports = !u(function () { - return ( - 7 !== - Object.defineProperty({}, 1, { - get: function () { - return 7; - } - })[1] - ); - }); - }, - 49552: (s, o, i) => { - 'use strict'; - var u = i(45951), - _ = i(46285), - w = u.document, - x = _(w) && _(w.createElement); - s.exports = function (s) { - return x ? w.createElement(s) : {}; - }; - }, - 19287: (s) => { - 'use strict'; - s.exports = { - CSSRuleList: 0, - CSSStyleDeclaration: 0, - CSSValueList: 0, - ClientRectList: 0, - DOMRectList: 0, - DOMStringList: 0, - DOMTokenList: 1, - DataTransferItemList: 0, - FileList: 0, - HTMLAllCollection: 0, - HTMLCollection: 0, - HTMLFormElement: 0, - HTMLSelectElement: 0, - MediaList: 0, - MimeTypeArray: 0, - NamedNodeMap: 0, - NodeList: 1, - PaintRequestList: 0, - Plugin: 0, - PluginArray: 0, - SVGLengthList: 0, - SVGNumberList: 0, - SVGPathSegList: 0, - SVGPointList: 0, - SVGStringList: 0, - SVGTransformList: 0, - SourceBufferList: 0, - StyleSheetList: 0, - TextTrackCueList: 0, - TextTrackList: 0, - TouchList: 0 - }; - }, - 80376: (s) => { - 'use strict'; - s.exports = [ - 'constructor', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'toLocaleString', - 'toString', - 'valueOf' - ]; - }, - 96794: (s, o, i) => { - 'use strict'; - var u = i(45951).navigator, - _ = u && u.userAgent; - s.exports = _ ? String(_) : ''; - }, - 20798: (s, o, i) => { - 'use strict'; - var u, - _, - w = i(45951), - x = i(96794), - C = w.process, - j = w.Deno, - L = (C && C.versions) || (j && j.version), - B = L && L.v8; - (B && (_ = (u = B.split('.'))[0] > 0 && u[0] < 4 ? 1 : +(u[0] + u[1])), - !_ && - x && - (!(u = x.match(/Edge\/(\d+)/)) || u[1] >= 74) && - (u = x.match(/Chrome\/(\d+)/)) && - (_ = +u[1]), - (s.exports = _)); - }, - 85762: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = Error, - w = u(''.replace), - x = String(new _('zxcasd').stack), - C = /\n\s*at [^:]*:[^\n]*/, - j = C.test(x); - s.exports = function (s, o) { - if (j && 'string' == typeof s && !_.prepareStackTrace) for (; o--; ) s = w(s, C, ''); - return s; - }; - }, - 85884: (s, o, i) => { - 'use strict'; - var u = i(61626), - _ = i(85762), - w = i(23888), - x = Error.captureStackTrace; - s.exports = function (s, o, i, C) { - w && (x ? x(s, o) : u(s, 'stack', _(i, C))); - }; - }, - 23888: (s, o, i) => { - 'use strict'; - var u = i(98828), - _ = i(75817); - s.exports = !u(function () { - var s = new Error('a'); - return !('stack' in s) || (Object.defineProperty(s, 'stack', _(1, 7)), 7 !== s.stack); - }); - }, - 11091: (s, o, i) => { - 'use strict'; - var u = i(45951), - _ = i(76024), - w = i(92361), - x = i(62250), - C = i(13846).f, - j = i(7463), - L = i(92046), - B = i(28311), - $ = i(61626), - V = i(49724); - i(36128); - var wrapConstructor = function (s) { - var Wrapper = function (o, i, u) { - if (this instanceof Wrapper) { - switch (arguments.length) { - case 0: - return new s(); - case 1: - return new s(o); - case 2: - return new s(o, i); - } - return new s(o, i, u); - } - return _(s, this, arguments); - }; - return ((Wrapper.prototype = s.prototype), Wrapper); - }; - s.exports = function (s, o) { - var i, - _, - U, - z, - Y, - Z, - ee, - ie, - ae, - le = s.target, - ce = s.global, - pe = s.stat, - de = s.proto, - fe = ce ? u : pe ? u[le] : u[le] && u[le].prototype, - ye = ce ? L : L[le] || $(L, le, {})[le], - be = ye.prototype; - for (z in o) - ((_ = !(i = j(ce ? z : le + (pe ? '.' : '#') + z, s.forced)) && fe && V(fe, z)), - (Z = ye[z]), - _ && (ee = s.dontCallGetSet ? (ae = C(fe, z)) && ae.value : fe[z]), - (Y = _ && ee ? ee : o[z]), - (i || de || typeof Z != typeof Y) && - ((ie = - s.bind && _ - ? B(Y, u) - : s.wrap && _ - ? wrapConstructor(Y) - : de && x(Y) - ? w(Y) - : Y), - (s.sham || (Y && Y.sham) || (Z && Z.sham)) && $(ie, 'sham', !0), - $(ye, z, ie), - de && - (V(L, (U = le + 'Prototype')) || $(L, U, {}), - $(L[U], z, Y), - s.real && be && (i || !be[z]) && $(be, z, Y)))); - }; - }, - 98828: (s) => { - 'use strict'; - s.exports = function (s) { - try { - return !!s(); - } catch (s) { - return !0; - } - }; - }, - 76024: (s, o, i) => { - 'use strict'; - var u = i(41505), - _ = Function.prototype, - w = _.apply, - x = _.call; - s.exports = - ('object' == typeof Reflect && Reflect.apply) || - (u - ? x.bind(w) - : function () { - return x.apply(w, arguments); - }); - }, - 28311: (s, o, i) => { - 'use strict'; - var u = i(92361), - _ = i(82159), - w = i(41505), - x = u(u.bind); - s.exports = function (s, o) { - return ( - _(s), - void 0 === o - ? s - : w - ? x(s, o) - : function () { - return s.apply(o, arguments); - } - ); - }; - }, - 41505: (s, o, i) => { - 'use strict'; - var u = i(98828); - s.exports = !u(function () { - var s = function () {}.bind(); - return 'function' != typeof s || s.hasOwnProperty('prototype'); - }); - }, - 44673: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = i(82159), - w = i(46285), - x = i(49724), - C = i(93427), - j = i(41505), - L = Function, - B = u([].concat), - $ = u([].join), - V = {}; - s.exports = j - ? L.bind - : function bind(s) { - var o = _(this), - i = o.prototype, - u = C(arguments, 1), - j = function bound() { - var i = B(u, C(arguments)); - return this instanceof j - ? (function (s, o, i) { - if (!x(V, o)) { - for (var u = [], _ = 0; _ < o; _++) u[_] = 'a[' + _ + ']'; - V[o] = L('C,a', 'return new C(' + $(u, ',') + ')'); - } - return V[o](s, i); - })(o, i.length, i) - : o.apply(s, i); - }; - return (w(i) && (j.prototype = i), j); - }; - }, - 13930: (s, o, i) => { - 'use strict'; - var u = i(41505), - _ = Function.prototype.call; - s.exports = u - ? _.bind(_) - : function () { - return _.apply(_, arguments); - }; - }, - 36833: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(49724), - w = Function.prototype, - x = u && Object.getOwnPropertyDescriptor, - C = _(w, 'name'), - j = C && 'something' === function something() {}.name, - L = C && (!u || (u && x(w, 'name').configurable)); - s.exports = { EXISTS: C, PROPER: j, CONFIGURABLE: L }; - }, - 51871: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = i(82159); - s.exports = function (s, o, i) { - try { - return u(_(Object.getOwnPropertyDescriptor(s, o)[i])); - } catch (s) {} - }; - }, - 92361: (s, o, i) => { - 'use strict'; - var u = i(45807), - _ = i(1907); - s.exports = function (s) { - if ('Function' === u(s)) return _(s); - }; - }, - 1907: (s, o, i) => { - 'use strict'; - var u = i(41505), - _ = Function.prototype, - w = _.call, - x = u && _.bind.bind(w, w); - s.exports = u - ? x - : function (s) { - return function () { - return w.apply(s, arguments); - }; - }; - }, - 61747: (s, o, i) => { - 'use strict'; - var u = i(45951), - _ = i(92046); - s.exports = function (s, o) { - var i = _[s + 'Prototype'], - w = i && i[o]; - if (w) return w; - var x = u[s], - C = x && x.prototype; - return C && C[o]; - }; - }, - 85582: (s, o, i) => { - 'use strict'; - var u = i(92046), - _ = i(45951), - w = i(62250), - aFunction = function (s) { - return w(s) ? s : void 0; - }; - s.exports = function (s, o) { - return arguments.length < 2 - ? aFunction(u[s]) || aFunction(_[s]) - : (u[s] && u[s][o]) || (_[s] && _[s][o]); - }; - }, - 73448: (s, o, i) => { - 'use strict'; - var u = i(73948), - _ = i(29367), - w = i(87136), - x = i(93742), - C = i(76264)('iterator'); - s.exports = function (s) { - if (!w(s)) return _(s, C) || _(s, '@@iterator') || x[u(s)]; - }; - }, - 10300: (s, o, i) => { - 'use strict'; - var u = i(13930), - _ = i(82159), - w = i(36624), - x = i(4640), - C = i(73448), - j = TypeError; - s.exports = function (s, o) { - var i = arguments.length < 2 ? C(s) : o; - if (_(i)) return w(u(i, s)); - throw new j(x(s) + ' is not iterable'); - }; - }, - 29367: (s, o, i) => { - 'use strict'; - var u = i(82159), - _ = i(87136); - s.exports = function (s, o) { - var i = s[o]; - return _(i) ? void 0 : u(i); - }; - }, - 45951: function (s, o, i) { - 'use strict'; - var check = function (s) { - return s && s.Math === Math && s; - }; - s.exports = - check('object' == typeof globalThis && globalThis) || - check('object' == typeof window && window) || - check('object' == typeof self && self) || - check('object' == typeof i.g && i.g) || - check('object' == typeof this && this) || - (function () { - return this; - })() || - Function('return this')(); - }, - 49724: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = i(39298), - w = u({}.hasOwnProperty); - s.exports = - Object.hasOwn || - function hasOwn(s, o) { - return w(_(s), o); - }; - }, - 38530: (s) => { - 'use strict'; - s.exports = {}; - }, - 62416: (s, o, i) => { - 'use strict'; - var u = i(85582); - s.exports = u('document', 'documentElement'); - }, - 73648: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(98828), - w = i(49552); - s.exports = - !u && - !_(function () { - return ( - 7 !== - Object.defineProperty(w('div'), 'a', { - get: function () { - return 7; - } - }).a - ); - }); - }, - 16946: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = i(98828), - w = i(45807), - x = Object, - C = u(''.split); - s.exports = _(function () { - return !x('z').propertyIsEnumerable(0); - }) - ? function (s) { - return 'String' === w(s) ? C(s, '') : x(s); - } - : x; - }, - 34084: (s, o, i) => { - 'use strict'; - var u = i(62250), - _ = i(46285), - w = i(79192); - s.exports = function (s, o, i) { - var x, C; - return ( - w && - u((x = o.constructor)) && - x !== i && - _((C = x.prototype)) && - C !== i.prototype && - w(s, C), - s - ); - }; - }, - 39259: (s, o, i) => { - 'use strict'; - var u = i(46285), - _ = i(61626); - s.exports = function (s, o) { - u(o) && 'cause' in o && _(s, 'cause', o.cause); - }; - }, - 64932: (s, o, i) => { - 'use strict'; - var u, - _, - w, - x = i(40551), - C = i(45951), - j = i(46285), - L = i(61626), - B = i(49724), - $ = i(36128), - V = i(92522), - U = i(38530), - z = 'Object already initialized', - Y = C.TypeError, - Z = C.WeakMap; - if (x || $.state) { - var ee = $.state || ($.state = new Z()); - ((ee.get = ee.get), - (ee.has = ee.has), - (ee.set = ee.set), - (u = function (s, o) { - if (ee.has(s)) throw new Y(z); - return ((o.facade = s), ee.set(s, o), o); - }), - (_ = function (s) { - return ee.get(s) || {}; - }), - (w = function (s) { - return ee.has(s); - })); - } else { - var ie = V('state'); - ((U[ie] = !0), - (u = function (s, o) { - if (B(s, ie)) throw new Y(z); - return ((o.facade = s), L(s, ie, o), o); - }), - (_ = function (s) { - return B(s, ie) ? s[ie] : {}; - }), - (w = function (s) { - return B(s, ie); - })); - } - s.exports = { - set: u, - get: _, - has: w, - enforce: function (s) { - return w(s) ? _(s) : u(s, {}); - }, - getterFor: function (s) { - return function (o) { - var i; - if (!j(o) || (i = _(o)).type !== s) - throw new Y('Incompatible receiver, ' + s + ' required'); - return i; - }; - } - }; - }, - 37812: (s, o, i) => { - 'use strict'; - var u = i(76264), - _ = i(93742), - w = u('iterator'), - x = Array.prototype; - s.exports = function (s) { - return void 0 !== s && (_.Array === s || x[w] === s); - }; - }, - 62250: (s) => { - 'use strict'; - var o = 'object' == typeof document && document.all; - s.exports = - void 0 === o && void 0 !== o - ? function (s) { - return 'function' == typeof s || s === o; - } - : function (s) { - return 'function' == typeof s; - }; - }, - 7463: (s, o, i) => { - 'use strict'; - var u = i(98828), - _ = i(62250), - w = /#|\.prototype\./, - isForced = function (s, o) { - var i = C[x(s)]; - return i === L || (i !== j && (_(o) ? u(o) : !!o)); - }, - x = (isForced.normalize = function (s) { - return String(s).replace(w, '.').toLowerCase(); - }), - C = (isForced.data = {}), - j = (isForced.NATIVE = 'N'), - L = (isForced.POLYFILL = 'P'); - s.exports = isForced; - }, - 87136: (s) => { - 'use strict'; - s.exports = function (s) { - return null == s; - }; - }, - 46285: (s, o, i) => { - 'use strict'; - var u = i(62250); - s.exports = function (s) { - return 'object' == typeof s ? null !== s : u(s); - }; - }, - 54018: (s, o, i) => { - 'use strict'; - var u = i(46285); - s.exports = function (s) { - return u(s) || null === s; - }; - }, - 7376: (s) => { - 'use strict'; - s.exports = !0; - }, - 25594: (s, o, i) => { - 'use strict'; - var u = i(85582), - _ = i(62250), - w = i(88280), - x = i(51175), - C = Object; - s.exports = x - ? function (s) { - return 'symbol' == typeof s; - } - : function (s) { - var o = u('Symbol'); - return _(o) && w(o.prototype, C(s)); - }; - }, - 24823: (s, o, i) => { - 'use strict'; - var u = i(28311), - _ = i(13930), - w = i(36624), - x = i(4640), - C = i(37812), - j = i(20575), - L = i(88280), - B = i(10300), - $ = i(73448), - V = i(40154), - U = TypeError, - Result = function (s, o) { - ((this.stopped = s), (this.result = o)); - }, - z = Result.prototype; - s.exports = function (s, o, i) { - var Y, - Z, - ee, - ie, - ae, - le, - ce, - pe = i && i.that, - de = !(!i || !i.AS_ENTRIES), - fe = !(!i || !i.IS_RECORD), - ye = !(!i || !i.IS_ITERATOR), - be = !(!i || !i.INTERRUPTED), - _e = u(o, pe), - stop = function (s) { - return (Y && V(Y, 'normal', s), new Result(!0, s)); - }, - callFn = function (s) { - return de - ? (w(s), be ? _e(s[0], s[1], stop) : _e(s[0], s[1])) - : be - ? _e(s, stop) - : _e(s); - }; - if (fe) Y = s.iterator; - else if (ye) Y = s; - else { - if (!(Z = $(s))) throw new U(x(s) + ' is not iterable'); - if (C(Z)) { - for (ee = 0, ie = j(s); ie > ee; ee++) - if ((ae = callFn(s[ee])) && L(z, ae)) return ae; - return new Result(!1); - } - Y = B(s, Z); - } - for (le = fe ? s.next : Y.next; !(ce = _(le, Y)).done; ) { - try { - ae = callFn(ce.value); - } catch (s) { - V(Y, 'throw', s); - } - if ('object' == typeof ae && ae && L(z, ae)) return ae; - } - return new Result(!1); - }; - }, - 40154: (s, o, i) => { - 'use strict'; - var u = i(13930), - _ = i(36624), - w = i(29367); - s.exports = function (s, o, i) { - var x, C; - _(s); - try { - if (!(x = w(s, 'return'))) { - if ('throw' === o) throw i; - return i; - } - x = u(x, s); - } catch (s) { - ((C = !0), (x = s)); - } - if ('throw' === o) throw i; - if (C) throw x; - return (_(x), i); - }; - }, - 47181: (s, o, i) => { - 'use strict'; - var u = i(95116).IteratorPrototype, - _ = i(58075), - w = i(75817), - x = i(14840), - C = i(93742), - returnThis = function () { - return this; - }; - s.exports = function (s, o, i, j) { - var L = o + ' Iterator'; - return ( - (s.prototype = _(u, { next: w(+!j, i) })), - x(s, L, !1, !0), - (C[L] = returnThis), - s - ); - }; - }, - 60183: (s, o, i) => { - 'use strict'; - var u = i(11091), - _ = i(13930), - w = i(7376), - x = i(36833), - C = i(62250), - j = i(47181), - L = i(15972), - B = i(79192), - $ = i(14840), - V = i(61626), - U = i(68055), - z = i(76264), - Y = i(93742), - Z = i(95116), - ee = x.PROPER, - ie = x.CONFIGURABLE, - ae = Z.IteratorPrototype, - le = Z.BUGGY_SAFARI_ITERATORS, - ce = z('iterator'), - pe = 'keys', - de = 'values', - fe = 'entries', - returnThis = function () { - return this; - }; - s.exports = function (s, o, i, x, z, Z, ye) { - j(i, o, x); - var be, - _e, - we, - getIterationMethod = function (s) { - if (s === z && Re) return Re; - if (!le && s && s in Pe) return Pe[s]; - switch (s) { - case pe: - return function keys() { - return new i(this, s); - }; - case de: - return function values() { - return new i(this, s); - }; - case fe: - return function entries() { - return new i(this, s); - }; - } - return function () { - return new i(this); - }; - }, - Se = o + ' Iterator', - xe = !1, - Pe = s.prototype, - Te = Pe[ce] || Pe['@@iterator'] || (z && Pe[z]), - Re = (!le && Te) || getIterationMethod(z), - qe = ('Array' === o && Pe.entries) || Te; - if ( - (qe && - (be = L(qe.call(new s()))) !== Object.prototype && - be.next && - (w || L(be) === ae || (B ? B(be, ae) : C(be[ce]) || U(be, ce, returnThis)), - $(be, Se, !0, !0), - w && (Y[Se] = returnThis)), - ee && - z === de && - Te && - Te.name !== de && - (!w && ie - ? V(Pe, 'name', de) - : ((xe = !0), - (Re = function values() { - return _(Te, this); - }))), - z) - ) - if ( - ((_e = { - values: getIterationMethod(de), - keys: Z ? Re : getIterationMethod(pe), - entries: getIterationMethod(fe) - }), - ye) - ) - for (we in _e) (le || xe || !(we in Pe)) && U(Pe, we, _e[we]); - else u({ target: o, proto: !0, forced: le || xe }, _e); - return ((w && !ye) || Pe[ce] === Re || U(Pe, ce, Re, { name: z }), (Y[o] = Re), _e); - }; - }, - 95116: (s, o, i) => { - 'use strict'; - var u, - _, - w, - x = i(98828), - C = i(62250), - j = i(46285), - L = i(58075), - B = i(15972), - $ = i(68055), - V = i(76264), - U = i(7376), - z = V('iterator'), - Y = !1; - ([].keys && - ('next' in (w = [].keys()) ? (_ = B(B(w))) !== Object.prototype && (u = _) : (Y = !0)), - !j(u) || - x(function () { - var s = {}; - return u[z].call(s) !== s; - }) - ? (u = {}) - : U && (u = L(u)), - C(u[z]) || - $(u, z, function () { - return this; - }), - (s.exports = { IteratorPrototype: u, BUGGY_SAFARI_ITERATORS: Y })); - }, - 93742: (s) => { - 'use strict'; - s.exports = {}; - }, - 20575: (s, o, i) => { - 'use strict'; - var u = i(3121); - s.exports = function (s) { - return u(s.length); - }; - }, - 41176: (s) => { - 'use strict'; - var o = Math.ceil, - i = Math.floor; - s.exports = - Math.trunc || - function trunc(s) { - var u = +s; - return (u > 0 ? i : o)(u); - }; - }, - 32096: (s, o, i) => { - 'use strict'; - var u = i(90160); - s.exports = function (s, o) { - return void 0 === s ? (arguments.length < 2 ? '' : o) : u(s); - }; - }, - 29538: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(1907), - w = i(13930), - x = i(98828), - C = i(2875), - j = i(87170), - L = i(22574), - B = i(39298), - $ = i(16946), - V = Object.assign, - U = Object.defineProperty, - z = _([].concat); - s.exports = - !V || - x(function () { - if ( - u && - 1 !== - V( - { b: 1 }, - V( - U({}, 'a', { - enumerable: !0, - get: function () { - U(this, 'b', { value: 3, enumerable: !1 }); - } - }), - { b: 2 } - ) - ).b - ) - return !0; - var s = {}, - o = {}, - i = Symbol('assign detection'), - _ = 'abcdefghijklmnopqrst'; - return ( - (s[i] = 7), - _.split('').forEach(function (s) { - o[s] = s; - }), - 7 !== V({}, s)[i] || C(V({}, o)).join('') !== _ - ); - }) - ? function assign(s, o) { - for (var i = B(s), _ = arguments.length, x = 1, V = j.f, U = L.f; _ > x; ) - for ( - var Y, - Z = $(arguments[x++]), - ee = V ? z(C(Z), V(Z)) : C(Z), - ie = ee.length, - ae = 0; - ie > ae; - ) - ((Y = ee[ae++]), (u && !w(U, Z, Y)) || (i[Y] = Z[Y])); - return i; - } - : V; - }, - 58075: (s, o, i) => { - 'use strict'; - var u, - _ = i(36624), - w = i(42220), - x = i(80376), - C = i(38530), - j = i(62416), - L = i(49552), - B = i(92522), - $ = 'prototype', - V = 'script', - U = B('IE_PROTO'), - EmptyConstructor = function () {}, - scriptTag = function (s) { - return '<' + V + '>' + s + ''; - }, - NullProtoObjectViaActiveX = function (s) { - (s.write(scriptTag('')), s.close()); - var o = s.parentWindow.Object; - return ((s = null), o); - }, - NullProtoObject = function () { - try { - u = new ActiveXObject('htmlfile'); - } catch (s) {} - var s, o, i; - NullProtoObject = - 'undefined' != typeof document - ? document.domain && u - ? NullProtoObjectViaActiveX(u) - : ((o = L('iframe')), - (i = 'java' + V + ':'), - (o.style.display = 'none'), - j.appendChild(o), - (o.src = String(i)), - (s = o.contentWindow.document).open(), - s.write(scriptTag('document.F=Object')), - s.close(), - s.F) - : NullProtoObjectViaActiveX(u); - for (var _ = x.length; _--; ) delete NullProtoObject[$][x[_]]; - return NullProtoObject(); - }; - ((C[U] = !0), - (s.exports = - Object.create || - function create(s, o) { - var i; - return ( - null !== s - ? ((EmptyConstructor[$] = _(s)), - (i = new EmptyConstructor()), - (EmptyConstructor[$] = null), - (i[U] = s)) - : (i = NullProtoObject()), - void 0 === o ? i : w.f(i, o) - ); - })); - }, - 42220: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(58661), - w = i(74284), - x = i(36624), - C = i(4993), - j = i(2875); - o.f = - u && !_ - ? Object.defineProperties - : function defineProperties(s, o) { - x(s); - for (var i, u = C(o), _ = j(o), L = _.length, B = 0; L > B; ) - w.f(s, (i = _[B++]), u[i]); - return s; - }; - }, - 74284: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(73648), - w = i(58661), - x = i(36624), - C = i(70470), - j = TypeError, - L = Object.defineProperty, - B = Object.getOwnPropertyDescriptor, - $ = 'enumerable', - V = 'configurable', - U = 'writable'; - o.f = u - ? w - ? function defineProperty(s, o, i) { - if ( - (x(s), - (o = C(o)), - x(i), - 'function' == typeof s && 'prototype' === o && 'value' in i && U in i && !i[U]) - ) { - var u = B(s, o); - u && - u[U] && - ((s[o] = i.value), - (i = { - configurable: V in i ? i[V] : u[V], - enumerable: $ in i ? i[$] : u[$], - writable: !1 - })); - } - return L(s, o, i); - } - : L - : function defineProperty(s, o, i) { - if ((x(s), (o = C(o)), x(i), _)) - try { - return L(s, o, i); - } catch (s) {} - if ('get' in i || 'set' in i) throw new j('Accessors not supported'); - return ('value' in i && (s[o] = i.value), s); - }; - }, - 13846: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(13930), - w = i(22574), - x = i(75817), - C = i(4993), - j = i(70470), - L = i(49724), - B = i(73648), - $ = Object.getOwnPropertyDescriptor; - o.f = u - ? $ - : function getOwnPropertyDescriptor(s, o) { - if (((s = C(s)), (o = j(o)), B)) - try { - return $(s, o); - } catch (s) {} - if (L(s, o)) return x(!_(w.f, s, o), s[o]); - }; - }, - 24443: (s, o, i) => { - 'use strict'; - var u = i(23045), - _ = i(80376).concat('length', 'prototype'); - o.f = - Object.getOwnPropertyNames || - function getOwnPropertyNames(s) { - return u(s, _); - }; - }, - 87170: (s, o) => { - 'use strict'; - o.f = Object.getOwnPropertySymbols; - }, - 15972: (s, o, i) => { - 'use strict'; - var u = i(49724), - _ = i(62250), - w = i(39298), - x = i(92522), - C = i(57382), - j = x('IE_PROTO'), - L = Object, - B = L.prototype; - s.exports = C - ? L.getPrototypeOf - : function (s) { - var o = w(s); - if (u(o, j)) return o[j]; - var i = o.constructor; - return _(i) && o instanceof i ? i.prototype : o instanceof L ? B : null; - }; - }, - 88280: (s, o, i) => { - 'use strict'; - var u = i(1907); - s.exports = u({}.isPrototypeOf); - }, - 23045: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = i(49724), - w = i(4993), - x = i(74436).indexOf, - C = i(38530), - j = u([].push); - s.exports = function (s, o) { - var i, - u = w(s), - L = 0, - B = []; - for (i in u) !_(C, i) && _(u, i) && j(B, i); - for (; o.length > L; ) _(u, (i = o[L++])) && (~x(B, i) || j(B, i)); - return B; - }; - }, - 2875: (s, o, i) => { - 'use strict'; - var u = i(23045), - _ = i(80376); - s.exports = - Object.keys || - function keys(s) { - return u(s, _); - }; - }, - 22574: (s, o) => { - 'use strict'; - var i = {}.propertyIsEnumerable, - u = Object.getOwnPropertyDescriptor, - _ = u && !i.call({ 1: 2 }, 1); - o.f = _ - ? function propertyIsEnumerable(s) { - var o = u(this, s); - return !!o && o.enumerable; - } - : i; - }, - 79192: (s, o, i) => { - 'use strict'; - var u = i(51871), - _ = i(46285), - w = i(74239), - x = i(10043); - s.exports = - Object.setPrototypeOf || - ('__proto__' in {} - ? (function () { - var s, - o = !1, - i = {}; - try { - ((s = u(Object.prototype, '__proto__', 'set'))(i, []), - (o = i instanceof Array)); - } catch (s) {} - return function setPrototypeOf(i, u) { - return (w(i), x(u), _(i) ? (o ? s(i, u) : (i.__proto__ = u), i) : i); - }; - })() - : void 0); - }, - 54878: (s, o, i) => { - 'use strict'; - var u = i(52623), - _ = i(73948); - s.exports = u - ? {}.toString - : function toString() { - return '[object ' + _(this) + ']'; - }; - }, - 60581: (s, o, i) => { - 'use strict'; - var u = i(13930), - _ = i(62250), - w = i(46285), - x = TypeError; - s.exports = function (s, o) { - var i, C; - if ('string' === o && _((i = s.toString)) && !w((C = u(i, s)))) return C; - if (_((i = s.valueOf)) && !w((C = u(i, s)))) return C; - if ('string' !== o && _((i = s.toString)) && !w((C = u(i, s)))) return C; - throw new x("Can't convert object to primitive value"); - }; - }, - 11042: (s, o, i) => { - 'use strict'; - var u = i(85582), - _ = i(1907), - w = i(24443), - x = i(87170), - C = i(36624), - j = _([].concat); - s.exports = - u('Reflect', 'ownKeys') || - function ownKeys(s) { - var o = w.f(C(s)), - i = x.f; - return i ? j(o, i(s)) : o; - }; - }, - 92046: (s) => { - 'use strict'; - s.exports = {}; - }, - 54829: (s, o, i) => { - 'use strict'; - var u = i(74284).f; - s.exports = function (s, o, i) { - i in s || - u(s, i, { - configurable: !0, - get: function () { - return o[i]; - }, - set: function (s) { - o[i] = s; - } - }); - }; - }, - 74239: (s, o, i) => { - 'use strict'; - var u = i(87136), - _ = TypeError; - s.exports = function (s) { - if (u(s)) throw new _("Can't call method on " + s); - return s; - }; - }, - 14840: (s, o, i) => { - 'use strict'; - var u = i(52623), - _ = i(74284).f, - w = i(61626), - x = i(49724), - C = i(54878), - j = i(76264)('toStringTag'); - s.exports = function (s, o, i, L) { - var B = i ? s : s && s.prototype; - B && - (x(B, j) || _(B, j, { configurable: !0, value: o }), L && !u && w(B, 'toString', C)); - }; - }, - 92522: (s, o, i) => { - 'use strict'; - var u = i(85816), - _ = i(6499), - w = u('keys'); - s.exports = function (s) { - return w[s] || (w[s] = _(s)); - }; - }, - 36128: (s, o, i) => { - 'use strict'; - var u = i(7376), - _ = i(45951), - w = i(2532), - x = '__core-js_shared__', - C = (s.exports = _[x] || w(x, {})); - (C.versions || (C.versions = [])).push({ - version: '3.39.0', - mode: u ? 'pure' : 'global', - copyright: '© 2014-2024 Denis Pushkarev (zloirock.ru)', - license: 'https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE', - source: 'https://github.com/zloirock/core-js' - }); - }, - 85816: (s, o, i) => { - 'use strict'; - var u = i(36128); - s.exports = function (s, o) { - return u[s] || (u[s] = o || {}); - }; - }, - 11470: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = i(65482), - w = i(90160), - x = i(74239), - C = u(''.charAt), - j = u(''.charCodeAt), - L = u(''.slice), - createMethod = function (s) { - return function (o, i) { - var u, - B, - $ = w(x(o)), - V = _(i), - U = $.length; - return V < 0 || V >= U - ? s - ? '' - : void 0 - : (u = j($, V)) < 55296 || - u > 56319 || - V + 1 === U || - (B = j($, V + 1)) < 56320 || - B > 57343 - ? s - ? C($, V) - : u - : s - ? L($, V, V + 2) - : B - 56320 + ((u - 55296) << 10) + 65536; - }; - }; - s.exports = { codeAt: createMethod(!1), charAt: createMethod(!0) }; - }, - 19846: (s, o, i) => { - 'use strict'; - var u = i(20798), - _ = i(98828), - w = i(45951).String; - s.exports = - !!Object.getOwnPropertySymbols && - !_(function () { - var s = Symbol('symbol detection'); - return !w(s) || !(Object(s) instanceof Symbol) || (!Symbol.sham && u && u < 41); - }); - }, - 34849: (s, o, i) => { - 'use strict'; - var u = i(65482), - _ = Math.max, - w = Math.min; - s.exports = function (s, o) { - var i = u(s); - return i < 0 ? _(i + o, 0) : w(i, o); - }; - }, - 4993: (s, o, i) => { - 'use strict'; - var u = i(16946), - _ = i(74239); - s.exports = function (s) { - return u(_(s)); - }; - }, - 65482: (s, o, i) => { - 'use strict'; - var u = i(41176); - s.exports = function (s) { - var o = +s; - return o != o || 0 === o ? 0 : u(o); - }; - }, - 3121: (s, o, i) => { - 'use strict'; - var u = i(65482), - _ = Math.min; - s.exports = function (s) { - var o = u(s); - return o > 0 ? _(o, 9007199254740991) : 0; - }; - }, - 39298: (s, o, i) => { - 'use strict'; - var u = i(74239), - _ = Object; - s.exports = function (s) { - return _(u(s)); - }; - }, - 46028: (s, o, i) => { - 'use strict'; - var u = i(13930), - _ = i(46285), - w = i(25594), - x = i(29367), - C = i(60581), - j = i(76264), - L = TypeError, - B = j('toPrimitive'); - s.exports = function (s, o) { - if (!_(s) || w(s)) return s; - var i, - j = x(s, B); - if (j) { - if ((void 0 === o && (o = 'default'), (i = u(j, s, o)), !_(i) || w(i))) return i; - throw new L("Can't convert object to primitive value"); - } - return (void 0 === o && (o = 'number'), C(s, o)); - }; - }, - 70470: (s, o, i) => { - 'use strict'; - var u = i(46028), - _ = i(25594); - s.exports = function (s) { - var o = u(s, 'string'); - return _(o) ? o : o + ''; - }; - }, - 52623: (s, o, i) => { - 'use strict'; - var u = {}; - ((u[i(76264)('toStringTag')] = 'z'), (s.exports = '[object z]' === String(u))); - }, - 90160: (s, o, i) => { - 'use strict'; - var u = i(73948), - _ = String; - s.exports = function (s) { - if ('Symbol' === u(s)) throw new TypeError('Cannot convert a Symbol value to a string'); - return _(s); - }; - }, - 4640: (s) => { - 'use strict'; - var o = String; - s.exports = function (s) { - try { - return o(s); - } catch (s) { - return 'Object'; - } - }; - }, - 6499: (s, o, i) => { - 'use strict'; - var u = i(1907), - _ = 0, - w = Math.random(), - x = u((1).toString); - s.exports = function (s) { - return 'Symbol(' + (void 0 === s ? '' : s) + ')_' + x(++_ + w, 36); - }; - }, - 51175: (s, o, i) => { - 'use strict'; - var u = i(19846); - s.exports = u && !Symbol.sham && 'symbol' == typeof Symbol.iterator; - }, - 58661: (s, o, i) => { - 'use strict'; - var u = i(39447), - _ = i(98828); - s.exports = - u && - _(function () { - return ( - 42 !== - Object.defineProperty(function () {}, 'prototype', { value: 42, writable: !1 }) - .prototype - ); - }); - }, - 40551: (s, o, i) => { - 'use strict'; - var u = i(45951), - _ = i(62250), - w = u.WeakMap; - s.exports = _(w) && /native code/.test(String(w)); - }, - 76264: (s, o, i) => { - 'use strict'; - var u = i(45951), - _ = i(85816), - w = i(49724), - x = i(6499), - C = i(19846), - j = i(51175), - L = u.Symbol, - B = _('wks'), - $ = j ? L.for || L : (L && L.withoutSetter) || x; - s.exports = function (s) { - return (w(B, s) || (B[s] = C && w(L, s) ? L[s] : $('Symbol.' + s)), B[s]); - }; - }, - 19358: (s, o, i) => { - 'use strict'; - var u = i(85582), - _ = i(49724), - w = i(61626), - x = i(88280), - C = i(79192), - j = i(19595), - L = i(54829), - B = i(34084), - $ = i(32096), - V = i(39259), - U = i(85884), - z = i(39447), - Y = i(7376); - s.exports = function (s, o, i, Z) { - var ee = 'stackTraceLimit', - ie = Z ? 2 : 1, - ae = s.split('.'), - le = ae[ae.length - 1], - ce = u.apply(null, ae); - if (ce) { - var pe = ce.prototype; - if ((!Y && _(pe, 'cause') && delete pe.cause, !i)) return ce; - var de = u('Error'), - fe = o(function (s, o) { - var i = $(Z ? o : s, void 0), - u = Z ? new ce(s) : new ce(); - return ( - void 0 !== i && w(u, 'message', i), - U(u, fe, u.stack, 2), - this && x(pe, this) && B(u, this, fe), - arguments.length > ie && V(u, arguments[ie]), - u - ); - }); - if ( - ((fe.prototype = pe), - 'Error' !== le - ? C - ? C(fe, de) - : j(fe, de, { name: !0 }) - : z && ee in ce && (L(fe, ce, ee), L(fe, ce, 'prepareStackTrace')), - j(fe, ce), - !Y) - ) - try { - (pe.name !== le && w(pe, 'name', le), (pe.constructor = fe)); - } catch (s) {} - return fe; - } - }; - }, - 36371: (s, o, i) => { - 'use strict'; - var u = i(11091), - _ = i(85582), - w = i(76024), - x = i(98828), - C = i(19358), - j = 'AggregateError', - L = _(j), - B = - !x(function () { - return 1 !== L([1]).errors[0]; - }) && - x(function () { - return 7 !== L([1], j, { cause: 7 }).cause; - }); - u( - { global: !0, constructor: !0, arity: 2, forced: B }, - { - AggregateError: C( - j, - function (s) { - return function AggregateError(o, i) { - return w(s, this, arguments); - }; - }, - B, - !0 - ) - } - ); - }, - 82048: (s, o, i) => { - 'use strict'; - var u = i(11091), - _ = i(88280), - w = i(15972), - x = i(79192), - C = i(19595), - j = i(58075), - L = i(61626), - B = i(75817), - $ = i(39259), - V = i(85884), - U = i(24823), - z = i(32096), - Y = i(76264)('toStringTag'), - Z = Error, - ee = [].push, - ie = function AggregateError(s, o) { - var i, - u = _(ae, this); - (x ? (i = x(new Z(), u ? w(this) : ae)) : ((i = u ? this : j(ae)), L(i, Y, 'Error')), - void 0 !== o && L(i, 'message', z(o)), - V(i, ie, i.stack, 1), - arguments.length > 2 && $(i, arguments[2])); - var C = []; - return (U(s, ee, { that: C }), L(i, 'errors', C), i); - }; - x ? x(ie, Z) : C(ie, Z, { name: !0 }); - var ae = (ie.prototype = j(Z.prototype, { - constructor: B(1, ie), - message: B(1, ''), - name: B(1, 'AggregateError') - })); - u({ global: !0, constructor: !0, arity: 2 }, { AggregateError: ie }); - }, - 64502: (s, o, i) => { - 'use strict'; - i(82048); - }, - 99363: (s, o, i) => { - 'use strict'; - var u = i(4993), - _ = i(42156), - w = i(93742), - x = i(64932), - C = i(74284).f, - j = i(60183), - L = i(59550), - B = i(7376), - $ = i(39447), - V = 'Array Iterator', - U = x.set, - z = x.getterFor(V); - s.exports = j( - Array, - 'Array', - function (s, o) { - U(this, { type: V, target: u(s), index: 0, kind: o }); - }, - function () { - var s = z(this), - o = s.target, - i = s.index++; - if (!o || i >= o.length) return ((s.target = null), L(void 0, !0)); - switch (s.kind) { - case 'keys': - return L(i, !1); - case 'values': - return L(o[i], !1); - } - return L([i, o[i]], !1); - }, - 'values' - ); - var Y = (w.Arguments = w.Array); - if ((_('keys'), _('values'), _('entries'), !B && $ && 'values' !== Y.name)) - try { - C(Y, 'name', { value: 'values' }); - } catch (s) {} - }, - 96605: (s, o, i) => { - 'use strict'; - var u = i(11091), - _ = i(45951), - w = i(76024), - x = i(19358), - C = 'WebAssembly', - j = _[C], - L = 7 !== new Error('e', { cause: 7 }).cause, - exportGlobalErrorCauseWrapper = function (s, o) { - var i = {}; - ((i[s] = x(s, o, L)), u({ global: !0, constructor: !0, arity: 1, forced: L }, i)); - }, - exportWebAssemblyErrorCauseWrapper = function (s, o) { - if (j && j[s]) { - var i = {}; - ((i[s] = x(C + '.' + s, o, L)), - u({ target: C, stat: !0, constructor: !0, arity: 1, forced: L }, i)); - } - }; - (exportGlobalErrorCauseWrapper('Error', function (s) { - return function Error(o) { - return w(s, this, arguments); - }; - }), - exportGlobalErrorCauseWrapper('EvalError', function (s) { - return function EvalError(o) { - return w(s, this, arguments); - }; - }), - exportGlobalErrorCauseWrapper('RangeError', function (s) { - return function RangeError(o) { - return w(s, this, arguments); - }; - }), - exportGlobalErrorCauseWrapper('ReferenceError', function (s) { - return function ReferenceError(o) { - return w(s, this, arguments); - }; - }), - exportGlobalErrorCauseWrapper('SyntaxError', function (s) { - return function SyntaxError(o) { - return w(s, this, arguments); - }; - }), - exportGlobalErrorCauseWrapper('TypeError', function (s) { - return function TypeError(o) { - return w(s, this, arguments); - }; - }), - exportGlobalErrorCauseWrapper('URIError', function (s) { - return function URIError(o) { - return w(s, this, arguments); - }; - }), - exportWebAssemblyErrorCauseWrapper('CompileError', function (s) { - return function CompileError(o) { - return w(s, this, arguments); - }; - }), - exportWebAssemblyErrorCauseWrapper('LinkError', function (s) { - return function LinkError(o) { - return w(s, this, arguments); - }; - }), - exportWebAssemblyErrorCauseWrapper('RuntimeError', function (s) { - return function RuntimeError(o) { - return w(s, this, arguments); - }; - })); - }, - 79307: (s, o, i) => { - 'use strict'; - var u = i(11091), - _ = i(44673); - u({ target: 'Function', proto: !0, forced: Function.bind !== _ }, { bind: _ }); - }, - 71340: (s, o, i) => { - 'use strict'; - var u = i(11091), - _ = i(29538); - u({ target: 'Object', stat: !0, arity: 2, forced: Object.assign !== _ }, { assign: _ }); - }, - 7057: (s, o, i) => { - 'use strict'; - var u = i(11470).charAt, - _ = i(90160), - w = i(64932), - x = i(60183), - C = i(59550), - j = 'String Iterator', - L = w.set, - B = w.getterFor(j); - x( - String, - 'String', - function (s) { - L(this, { type: j, string: _(s), index: 0 }); - }, - function next() { - var s, - o = B(this), - i = o.string, - _ = o.index; - return _ >= i.length - ? C(void 0, !0) - : ((s = u(i, _)), (o.index += s.length), C(s, !1)); - } - ); - }, - 91599: (s, o, i) => { - 'use strict'; - i(64502); - }, - 12560: (s, o, i) => { - 'use strict'; - i(99363); - var u = i(19287), - _ = i(45951), - w = i(14840), - x = i(93742); - for (var C in u) (w(_[C], C), (x[C] = x.Array)); - }, - 694: (s, o, i) => { - 'use strict'; - i(91599); - var u = i(37257); - (i(12560), (s.exports = u)); - }, - 19709: (s, o, i) => { - 'use strict'; - var u = i(23034); - s.exports = u; - }, - 40975: (s, o, i) => { - 'use strict'; - var u = i(9748); - s.exports = u; - } - }, - u = {}; - function __webpack_require__(s) { - var o = u[s]; - if (void 0 !== o) return o.exports; - var _ = (u[s] = { id: s, loaded: !1, exports: {} }); - return (i[s].call(_.exports, _, _.exports, __webpack_require__), (_.loaded = !0), _.exports); - } - ((__webpack_require__.n = (s) => { - var o = s && s.__esModule ? () => s.default : () => s; - return (__webpack_require__.d(o, { a: o }), o); - }), - (o = Object.getPrototypeOf ? (s) => Object.getPrototypeOf(s) : (s) => s.__proto__), - (__webpack_require__.t = function (i, u) { - if ((1 & u && (i = this(i)), 8 & u)) return i; - if ('object' == typeof i && i) { - if (4 & u && i.__esModule) return i; - if (16 & u && 'function' == typeof i.then) return i; - } - var _ = Object.create(null); - __webpack_require__.r(_); - var w = {}; - s = s || [null, o({}), o([]), o(o)]; - for (var x = 2 & u && i; 'object' == typeof x && !~s.indexOf(x); x = o(x)) - Object.getOwnPropertyNames(x).forEach((s) => (w[s] = () => i[s])); - return ((w.default = () => i), __webpack_require__.d(_, w), _); - }), - (__webpack_require__.d = (s, o) => { - for (var i in o) - __webpack_require__.o(o, i) && - !__webpack_require__.o(s, i) && - Object.defineProperty(s, i, { enumerable: !0, get: o[i] }); - }), - (__webpack_require__.g = (function () { - if ('object' == typeof globalThis) return globalThis; - try { - return this || new Function('return this')(); - } catch (s) { - if ('object' == typeof window) return window; - } - })()), - (__webpack_require__.o = (s, o) => Object.prototype.hasOwnProperty.call(s, o)), - (__webpack_require__.r = (s) => { - ('undefined' != typeof Symbol && - Symbol.toStringTag && - Object.defineProperty(s, Symbol.toStringTag, { value: 'Module' }), - Object.defineProperty(s, '__esModule', { value: !0 })); - }), - (__webpack_require__.nmd = (s) => ((s.paths = []), s.children || (s.children = []), s))); - var _ = {}; - return ( - (() => { - 'use strict'; - __webpack_require__.d(_, { default: () => WI }); - var s = {}; - (__webpack_require__.r(s), - __webpack_require__.d(s, { - CLEAR: () => ot, - CLEAR_BY: () => it, - NEW_AUTH_ERR: () => st, - NEW_SPEC_ERR: () => rt, - NEW_SPEC_ERR_BATCH: () => nt, - NEW_THROWN_ERR: () => et, - NEW_THROWN_ERR_BATCH: () => tt, - clear: () => clear, - clearBy: () => clearBy, - newAuthErr: () => newAuthErr, - newSpecErr: () => newSpecErr, - newSpecErrBatch: () => newSpecErrBatch, - newThrownErr: () => newThrownErr, - newThrownErrBatch: () => newThrownErrBatch - })); - var o = {}; - (__webpack_require__.r(o), - __webpack_require__.d(o, { - AUTHORIZE: () => Nt, - AUTHORIZE_OAUTH2: () => Lt, - CONFIGURE_AUTH: () => Ft, - LOGOUT: () => Rt, - PRE_AUTHORIZE_OAUTH2: () => Dt, - RESTORE_AUTHORIZATION: () => qt, - SHOW_AUTH_POPUP: () => Tt, - VALIDATE: () => Bt, - authPopup: () => authPopup, - authorize: () => authorize, - authorizeAccessCodeWithBasicAuthentication: () => - authorizeAccessCodeWithBasicAuthentication, - authorizeAccessCodeWithFormParams: () => authorizeAccessCodeWithFormParams, - authorizeApplication: () => authorizeApplication, - authorizeOauth2: () => authorizeOauth2, - authorizeOauth2WithPersistOption: () => authorizeOauth2WithPersistOption, - authorizePassword: () => authorizePassword, - authorizeRequest: () => authorizeRequest, - authorizeWithPersistOption: () => authorizeWithPersistOption, - configureAuth: () => configureAuth, - logout: () => logout, - logoutWithPersistOption: () => logoutWithPersistOption, - persistAuthorizationIfNeeded: () => persistAuthorizationIfNeeded, - preAuthorizeImplicit: () => preAuthorizeImplicit, - restoreAuthorization: () => restoreAuthorization, - showDefinitions: () => showDefinitions - })); - var i = {}; - (__webpack_require__.r(i), - __webpack_require__.d(i, { - authorized: () => Ht, - definitionsForRequirements: () => definitionsForRequirements, - definitionsToAuthorize: () => Kt, - getConfigs: () => Jt, - getDefinitionsByNames: () => getDefinitionsByNames, - isAuthorized: () => isAuthorized, - shownDefinitions: () => Wt - })); - var u = {}; - (__webpack_require__.r(u), - __webpack_require__.d(u, { - TOGGLE_CONFIGS: () => yn, - UPDATE_CONFIGS: () => gn, - downloadConfig: () => downloadConfig, - getConfigByUrl: () => getConfigByUrl, - loaded: () => actions_loaded, - toggle: () => toggle, - update: () => update - })); - var w = {}; - (__webpack_require__.r(w), __webpack_require__.d(w, { get: () => get })); - var x = {}; - (__webpack_require__.r(x), __webpack_require__.d(x, { transform: () => transform })); - var C = {}; - (__webpack_require__.r(C), - __webpack_require__.d(C, { transform: () => parameter_oneof_transform })); - var j = {}; - (__webpack_require__.r(j), - __webpack_require__.d(j, { allErrors: () => Mn, lastError: () => Tn })); - var L = {}; - (__webpack_require__.r(L), - __webpack_require__.d(L, { - SHOW: () => Fn, - UPDATE_FILTER: () => Ln, - UPDATE_LAYOUT: () => Dn, - UPDATE_MODE: () => Bn, - changeMode: () => changeMode, - show: () => actions_show, - updateFilter: () => updateFilter, - updateLayout: () => updateLayout - })); - var B = {}; - (__webpack_require__.r(B), - __webpack_require__.d(B, { - current: () => current, - currentFilter: () => currentFilter, - isShown: () => isShown, - showSummary: () => $n, - whatMode: () => whatMode - })); - var $ = {}; - (__webpack_require__.r($), - __webpack_require__.d($, { taggedOperations: () => taggedOperations })); - var V = {}; - (__webpack_require__.r(V), - __webpack_require__.d(V, { - requestSnippetGenerator_curl_bash: () => requestSnippetGenerator_curl_bash, - requestSnippetGenerator_curl_cmd: () => requestSnippetGenerator_curl_cmd, - requestSnippetGenerator_curl_powershell: () => requestSnippetGenerator_curl_powershell - })); - var U = {}; - (__webpack_require__.r(U), - __webpack_require__.d(U, { - getActiveLanguage: () => zn, - getDefaultExpanded: () => Wn, - getGenerators: () => Un, - getSnippetGenerators: () => getSnippetGenerators - })); - var z = {}; - (__webpack_require__.r(z), - __webpack_require__.d(z, { - JsonSchemaArrayItemFile: () => JsonSchemaArrayItemFile, - JsonSchemaArrayItemText: () => JsonSchemaArrayItemText, - JsonSchemaForm: () => JsonSchemaForm, - JsonSchema_array: () => JsonSchema_array, - JsonSchema_boolean: () => JsonSchema_boolean, - JsonSchema_object: () => JsonSchema_object, - JsonSchema_string: () => JsonSchema_string - })); - var Y = {}; - (__webpack_require__.r(Y), - __webpack_require__.d(Y, { - allowTryItOutFor: () => allowTryItOutFor, - basePath: () => Ks, - canExecuteScheme: () => canExecuteScheme, - consumes: () => $s, - consumesOptionsFor: () => consumesOptionsFor, - contentTypeValues: () => contentTypeValues, - currentProducesFor: () => currentProducesFor, - definitions: () => Ws, - externalDocs: () => Rs, - findDefinition: () => findDefinition, - getOAS3RequiredRequestBodyContentType: () => getOAS3RequiredRequestBodyContentType, - getParameter: () => getParameter, - hasHost: () => to, - host: () => Hs, - info: () => Ns, - isMediaTypeSchemaPropertiesEqual: () => isMediaTypeSchemaPropertiesEqual, - isOAS3: () => Ts, - lastError: () => ks, - mutatedRequestFor: () => mutatedRequestFor, - mutatedRequests: () => eo, - operationScheme: () => operationScheme, - operationWithMeta: () => operationWithMeta, - operations: () => qs, - operationsWithRootInherited: () => Gs, - operationsWithTags: () => Xs, - parameterInclusionSettingFor: () => parameterInclusionSettingFor, - parameterValues: () => parameterValues, - parameterWithMeta: () => parameterWithMeta, - parameterWithMetaByIdentity: () => parameterWithMetaByIdentity, - parametersIncludeIn: () => parametersIncludeIn, - parametersIncludeType: () => parametersIncludeType, - paths: () => Bs, - produces: () => Vs, - producesOptionsFor: () => producesOptionsFor, - requestFor: () => requestFor, - requests: () => Qs, - responseFor: () => responseFor, - responses: () => Zs, - schemes: () => Js, - security: () => Us, - securityDefinitions: () => zs, - semver: () => Ls, - spec: () => spec, - specJS: () => Is, - specJson: () => js, - specJsonWithResolvedSubtrees: () => Ms, - specResolved: () => Ps, - specResolvedSubtree: () => specResolvedSubtree, - specSource: () => As, - specStr: () => Os, - tagDetails: () => tagDetails, - taggedOperations: () => selectors_taggedOperations, - tags: () => Ys, - url: () => Cs, - validOperationMethods: () => Fs, - validateBeforeExecute: () => validateBeforeExecute, - validationErrors: () => validationErrors, - version: () => Ds - })); - var Z = {}; - (__webpack_require__.r(Z), - __webpack_require__.d(Z, { - CLEAR_REQUEST: () => wo, - CLEAR_RESPONSE: () => Eo, - CLEAR_VALIDATE_PARAMS: () => So, - LOG_REQUEST: () => _o, - SET_MUTATED_REQUEST: () => bo, - SET_REQUEST: () => vo, - SET_RESPONSE: () => yo, - SET_SCHEME: () => Oo, - UPDATE_EMPTY_PARAM_INCLUSION: () => mo, - UPDATE_JSON: () => ho, - UPDATE_OPERATION_META_VALUE: () => xo, - UPDATE_PARAM: () => fo, - UPDATE_RESOLVED: () => ko, - UPDATE_RESOLVED_SUBTREE: () => Co, - UPDATE_SPEC: () => uo, - UPDATE_URL: () => po, - VALIDATE_PARAMS: () => go, - changeConsumesValue: () => changeConsumesValue, - changeParam: () => changeParam, - changeParamByIdentity: () => changeParamByIdentity, - changeProducesValue: () => changeProducesValue, - clearRequest: () => clearRequest, - clearResponse: () => clearResponse, - clearValidateParams: () => clearValidateParams, - execute: () => actions_execute, - executeRequest: () => executeRequest, - invalidateResolvedSubtreeCache: () => invalidateResolvedSubtreeCache, - logRequest: () => logRequest, - parseToJson: () => parseToJson, - requestResolvedSubtree: () => requestResolvedSubtree, - resolveSpec: () => resolveSpec, - setMutatedRequest: () => setMutatedRequest, - setRequest: () => setRequest, - setResponse: () => setResponse, - setScheme: () => setScheme, - updateEmptyParamInclusion: () => updateEmptyParamInclusion, - updateJsonSpec: () => updateJsonSpec, - updateResolved: () => updateResolved, - updateResolvedSubtree: () => updateResolvedSubtree, - updateSpec: () => updateSpec, - updateUrl: () => updateUrl, - validateParams: () => validateParams - })); - var ee = {}; - (__webpack_require__.r(ee), - __webpack_require__.d(ee, { - executeRequest: () => wrap_actions_executeRequest, - updateJsonSpec: () => wrap_actions_updateJsonSpec, - updateSpec: () => wrap_actions_updateSpec, - validateParams: () => wrap_actions_validateParams - })); - var ie = {}; - (__webpack_require__.r(ie), - __webpack_require__.d(ie, { - JsonPatchError: () => Ro, - _areEquals: () => _areEquals, - applyOperation: () => applyOperation, - applyPatch: () => applyPatch, - applyReducer: () => applyReducer, - deepClone: () => Do, - getValueByPointer: () => getValueByPointer, - validate: () => validate, - validator: () => validator - })); - var ae = {}; - (__webpack_require__.r(ae), - __webpack_require__.d(ae, { - compare: () => compare, - generate: () => generate, - observe: () => observe, - unobserve: () => unobserve - })); - var le = {}; - (__webpack_require__.r(le), - __webpack_require__.d(le, { - hasElementSourceMap: () => hasElementSourceMap, - includesClasses: () => includesClasses, - includesSymbols: () => includesSymbols, - isAnnotationElement: () => zu, - isArrayElement: () => qu, - isBooleanElement: () => Bu, - isCommentElement: () => Wu, - isElement: () => Nu, - isLinkElement: () => Vu, - isMemberElement: () => $u, - isNullElement: () => Lu, - isNumberElement: () => Du, - isObjectElement: () => Fu, - isParseResultElement: () => Ku, - isPrimitiveElement: () => isPrimitiveElement, - isRefElement: () => Uu, - isSourceMapElement: () => Hu, - isStringElement: () => Ru - })); - var ce = {}; - (__webpack_require__.r(ce), - __webpack_require__.d(ce, { - isJSONReferenceElement: () => Nf, - isJSONSchemaElement: () => Tf, - isLinkDescriptionElement: () => Df, - isMediaElement: () => Rf - })); - var pe = {}; - (__webpack_require__.r(pe), - __webpack_require__.d(pe, { - isBooleanJsonSchemaElement: () => isBooleanJsonSchemaElement, - isCallbackElement: () => Im, - isComponentsElement: () => Pm, - isContactElement: () => Mm, - isExampleElement: () => Tm, - isExternalDocumentationElement: () => Nm, - isHeaderElement: () => Rm, - isInfoElement: () => Dm, - isLicenseElement: () => Lm, - isLinkElement: () => Bm, - isMediaTypeElement: () => eg, - isOpenApi3_0Element: () => qm, - isOpenapiElement: () => Fm, - isOperationElement: () => $m, - isParameterElement: () => Vm, - isPathItemElement: () => Um, - isPathsElement: () => zm, - isReferenceElement: () => Wm, - isRequestBodyElement: () => Km, - isResponseElement: () => Hm, - isResponsesElement: () => Jm, - isSchemaElement: () => Gm, - isSecurityRequirementElement: () => Ym, - isSecuritySchemeElement: () => Xm, - isServerElement: () => Zm, - isServerVariableElement: () => Qm, - isServersElement: () => rg - })); - var de = {}; - (__webpack_require__.r(de), - __webpack_require__.d(de, { - isBooleanJsonSchemaElement: () => predicates_isBooleanJsonSchemaElement, - isCallbackElement: () => T_, - isComponentsElement: () => N_, - isContactElement: () => R_, - isExampleElement: () => D_, - isExternalDocumentationElement: () => L_, - isHeaderElement: () => B_, - isInfoElement: () => F_, - isJsonSchemaDialectElement: () => q_, - isLicenseElement: () => $_, - isLinkElement: () => V_, - isMediaTypeElement: () => sE, - isOpenApi3_1Element: () => z_, - isOpenapiElement: () => U_, - isOperationElement: () => W_, - isParameterElement: () => K_, - isPathItemElement: () => H_, - isPathItemElementExternal: () => isPathItemElementExternal, - isPathsElement: () => J_, - isReferenceElement: () => G_, - isReferenceElementExternal: () => isReferenceElementExternal, - isRequestBodyElement: () => Y_, - isResponseElement: () => X_, - isResponsesElement: () => Z_, - isSchemaElement: () => Q_, - isSecurityRequirementElement: () => eE, - isSecuritySchemeElement: () => tE, - isServerElement: () => rE, - isServerVariableElement: () => nE - })); - var fe = {}; - (__webpack_require__.r(fe), - __webpack_require__.d(fe, { - cookie: () => parameter_builders_cookie, - header: () => parameter_builders_header, - path: () => parameter_builders_path, - query: () => parameter_builders_query - })); - var ye = {}; - (__webpack_require__.r(ye), - __webpack_require__.d(ye, { - Button: () => Button, - Col: () => Col, - Collapse: () => Collapse, - Container: () => Container, - Input: () => Input, - Link: () => layout_utils_Link, - Row: () => Row, - Select: () => Select, - TextArea: () => TextArea - })); - var be = {}; - (__webpack_require__.r(be), - __webpack_require__.d(be, { - basePath: () => KO, - consumes: () => HO, - definitions: () => VO, - findDefinition: () => $O, - hasHost: () => UO, - host: () => WO, - produces: () => JO, - schemes: () => GO, - securityDefinitions: () => zO, - validOperationMethods: () => wrap_selectors_validOperationMethods - })); - var _e = {}; - (__webpack_require__.r(_e), - __webpack_require__.d(_e, { definitionsToAuthorize: () => YO })); - var we = {}; - (__webpack_require__.r(we), - __webpack_require__.d(we, { - callbacksOperations: () => QO, - findSchema: () => findSchema, - isOAS3: () => selectors_isOAS3, - isOAS30: () => selectors_isOAS30, - isSwagger2: () => selectors_isSwagger2, - servers: () => ZO - })); - var Se = {}; - (__webpack_require__.r(Se), - __webpack_require__.d(Se, { - CLEAR_REQUEST_BODY_VALIDATE_ERROR: () => bA, - CLEAR_REQUEST_BODY_VALUE: () => _A, - SET_REQUEST_BODY_VALIDATE_ERROR: () => vA, - UPDATE_ACTIVE_EXAMPLES_MEMBER: () => fA, - UPDATE_REQUEST_BODY_INCLUSION: () => dA, - UPDATE_REQUEST_BODY_VALUE: () => pA, - UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG: () => hA, - UPDATE_REQUEST_CONTENT_TYPE: () => mA, - UPDATE_RESPONSE_CONTENT_TYPE: () => gA, - UPDATE_SELECTED_SERVER: () => uA, - UPDATE_SERVER_VARIABLE_VALUE: () => yA, - clearRequestBodyValidateError: () => clearRequestBodyValidateError, - clearRequestBodyValue: () => clearRequestBodyValue, - initRequestBodyValidateError: () => initRequestBodyValidateError, - setActiveExamplesMember: () => setActiveExamplesMember, - setRequestBodyInclusion: () => setRequestBodyInclusion, - setRequestBodyValidateError: () => setRequestBodyValidateError, - setRequestBodyValue: () => setRequestBodyValue, - setRequestContentType: () => setRequestContentType, - setResponseContentType: () => setResponseContentType, - setRetainRequestBodyValueFlag: () => setRetainRequestBodyValueFlag, - setSelectedServer: () => setSelectedServer, - setServerVariableValue: () => setServerVariableValue - })); - var xe = {}; - (__webpack_require__.r(xe), - __webpack_require__.d(xe, { - activeExamplesMember: () => jA, - hasUserEditedBody: () => CA, - requestBodyErrors: () => AA, - requestBodyInclusionSetting: () => OA, - requestBodyValue: () => xA, - requestContentType: () => IA, - responseContentType: () => PA, - selectDefaultRequestBodyValue: () => selectDefaultRequestBodyValue, - selectedServer: () => SA, - serverEffectiveValue: () => NA, - serverVariableValue: () => MA, - serverVariables: () => TA, - shouldRetainRequestBodyValue: () => kA, - validOperationMethods: () => DA, - validateBeforeExecute: () => RA, - validateShallowRequired: () => validateShallowRequired - })); - var Pe = __webpack_require__(96540); - function formatProdErrorMessage(s) { - return `Minified Redux error #${s}; visit https://redux.js.org/Errors?code=${s} for the full message or use the non-minified dev environment for full errors. `; - } - var Te = (() => ('function' == typeof Symbol && Symbol.observable) || '@@observable')(), - randomString = () => Math.random().toString(36).substring(7).split('').join('.'), - Re = { - INIT: `@@redux/INIT${randomString()}`, - REPLACE: `@@redux/REPLACE${randomString()}`, - PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}` - }; - function isPlainObject(s) { - if ('object' != typeof s || null === s) return !1; - let o = s; - for (; null !== Object.getPrototypeOf(o); ) o = Object.getPrototypeOf(o); - return Object.getPrototypeOf(s) === o || null === Object.getPrototypeOf(s); - } - function createStore(s, o, i) { - if ('function' != typeof s) throw new Error(formatProdErrorMessage(2)); - if ( - ('function' == typeof o && 'function' == typeof i) || - ('function' == typeof i && 'function' == typeof arguments[3]) - ) - throw new Error(formatProdErrorMessage(0)); - if (('function' == typeof o && void 0 === i && ((i = o), (o = void 0)), void 0 !== i)) { - if ('function' != typeof i) throw new Error(formatProdErrorMessage(1)); - return i(createStore)(s, o); - } - let u = s, - _ = o, - w = new Map(), - x = w, - C = 0, - j = !1; - function ensureCanMutateNextListeners() { - x === w && - ((x = new Map()), - w.forEach((s, o) => { - x.set(o, s); - })); - } - function getState() { - if (j) throw new Error(formatProdErrorMessage(3)); - return _; - } - function subscribe(s) { - if ('function' != typeof s) throw new Error(formatProdErrorMessage(4)); - if (j) throw new Error(formatProdErrorMessage(5)); - let o = !0; - ensureCanMutateNextListeners(); - const i = C++; - return ( - x.set(i, s), - function unsubscribe() { - if (o) { - if (j) throw new Error(formatProdErrorMessage(6)); - ((o = !1), ensureCanMutateNextListeners(), x.delete(i), (w = null)); - } - } - ); - } - function dispatch(s) { - if (!isPlainObject(s)) throw new Error(formatProdErrorMessage(7)); - if (void 0 === s.type) throw new Error(formatProdErrorMessage(8)); - if ('string' != typeof s.type) throw new Error(formatProdErrorMessage(17)); - if (j) throw new Error(formatProdErrorMessage(9)); - try { - ((j = !0), (_ = u(_, s))); - } finally { - j = !1; - } - return ( - (w = x).forEach((s) => { - s(); - }), - s - ); - } - dispatch({ type: Re.INIT }); - return { - dispatch, - subscribe, - getState, - replaceReducer: function replaceReducer(s) { - if ('function' != typeof s) throw new Error(formatProdErrorMessage(10)); - ((u = s), dispatch({ type: Re.REPLACE })); - }, - [Te]: function observable() { - const s = subscribe; - return { - subscribe(o) { - if ('object' != typeof o || null === o) - throw new Error(formatProdErrorMessage(11)); - function observeState() { - const s = o; - s.next && s.next(getState()); - } - observeState(); - return { unsubscribe: s(observeState) }; - }, - [Te]() { - return this; - } - }; - } - }; - } - function bindActionCreator(s, o) { - return function (...i) { - return o(s.apply(this, i)); - }; - } - function compose(...s) { - return 0 === s.length - ? (s) => s - : 1 === s.length - ? s[0] - : s.reduce( - (s, o) => - (...i) => - s(o(...i)) - ); - } - var qe = __webpack_require__(9404), - $e = __webpack_require__.n(qe), - ze = __webpack_require__(81919), - We = __webpack_require__.n(ze), - He = __webpack_require__(89593), - Ye = __webpack_require__(20334), - Xe = __webpack_require__(55364), - Qe = __webpack_require__.n(Xe); - const et = 'err_new_thrown_err', - tt = 'err_new_thrown_err_batch', - rt = 'err_new_spec_err', - nt = 'err_new_spec_err_batch', - st = 'err_new_auth_err', - ot = 'err_clear', - it = 'err_clear_by'; - function newThrownErr(s) { - return { type: et, payload: (0, Ye.serializeError)(s) }; - } - function newThrownErrBatch(s) { - return { type: tt, payload: s }; - } - function newSpecErr(s) { - return { type: rt, payload: s }; - } - function newSpecErrBatch(s) { - return { type: nt, payload: s }; - } - function newAuthErr(s) { - return { type: st, payload: s }; - } - function clear(s = {}) { - return { type: ot, payload: s }; - } - function clearBy(s = () => !0) { - return { type: it, payload: s }; - } - const at = (function makeWindow() { - var s = { - location: {}, - history: {}, - open: () => {}, - close: () => {}, - File: function () {}, - FormData: function () {} - }; - if ('undefined' == typeof window) return s; - try { - s = window; - for (var o of ['File', 'Blob', 'FormData']) o in window && (s[o] = window[o]); - } catch (s) { - console.error(s); - } - return s; - })(); - var lt = __webpack_require__(16750), - ct = (__webpack_require__(84058), __webpack_require__(55808), __webpack_require__(50104)), - ut = __webpack_require__.n(ct), - pt = __webpack_require__(7309), - ht = __webpack_require__.n(pt), - dt = __webpack_require__(42426), - mt = __webpack_require__.n(dt), - gt = __webpack_require__(75288), - yt = __webpack_require__.n(gt), - vt = __webpack_require__(1882), - bt = __webpack_require__.n(vt), - _t = __webpack_require__(2205), - Et = __webpack_require__.n(_t), - wt = __webpack_require__(53209), - St = __webpack_require__.n(wt), - xt = __webpack_require__(62802), - kt = __webpack_require__.n(xt); - const Ct = $e().Set.of( - 'type', - 'format', - 'items', - 'default', - 'maximum', - 'exclusiveMaximum', - 'minimum', - 'exclusiveMinimum', - 'maxLength', - 'minLength', - 'pattern', - 'maxItems', - 'minItems', - 'uniqueItems', - 'enum', - 'multipleOf' - ); - function getParameterSchema(s, { isOAS3: o } = {}) { - if (!$e().Map.isMap(s)) return { schema: $e().Map(), parameterContentMediaType: null }; - if (!o) - return 'body' === s.get('in') - ? { schema: s.get('schema', $e().Map()), parameterContentMediaType: null } - : { schema: s.filter((s, o) => Ct.includes(o)), parameterContentMediaType: null }; - if (s.get('content')) { - const o = s.get('content', $e().Map({})).keySeq().first(); - return { - schema: s.getIn(['content', o, 'schema'], $e().Map()), - parameterContentMediaType: o - }; - } - return { - schema: s.get('schema') ? s.get('schema', $e().Map()) : $e().Map(), - parameterContentMediaType: null - }; - } - var Ot = __webpack_require__(48287).Buffer; - const At = 'default', - isImmutable = (s) => $e().Iterable.isIterable(s); - function objectify(s) { - return isObject(s) ? (isImmutable(s) ? s.toJS() : s) : {}; - } - function fromJSOrdered(s) { - if (isImmutable(s)) return s; - if (s instanceof at.File) return s; - if (!isObject(s)) return s; - if (Array.isArray(s)) return $e().Seq(s).map(fromJSOrdered).toList(); - if (bt()(s.entries)) { - const o = (function createObjWithHashedKeys(s) { - if (!bt()(s.entries)) return s; - const o = {}, - i = '_**[]', - u = {}; - for (let _ of s.entries()) - if (o[_[0]] || (u[_[0]] && u[_[0]].containsMultiple)) { - if (!u[_[0]]) { - ((u[_[0]] = { containsMultiple: !0, length: 1 }), - (o[`${_[0]}${i}${u[_[0]].length}`] = o[_[0]]), - delete o[_[0]]); - } - ((u[_[0]].length += 1), (o[`${_[0]}${i}${u[_[0]].length}`] = _[1])); - } else o[_[0]] = _[1]; - return o; - })(s); - return $e().OrderedMap(o).map(fromJSOrdered); - } - return $e().OrderedMap(s).map(fromJSOrdered); - } - function normalizeArray(s) { - return Array.isArray(s) ? s : [s]; - } - function isFn(s) { - return 'function' == typeof s; - } - function isObject(s) { - return !!s && 'object' == typeof s; - } - function isFunc(s) { - return 'function' == typeof s; - } - function isArray(s) { - return Array.isArray(s); - } - const jt = ut(); - function objMap(s, o) { - return Object.keys(s).reduce((i, u) => ((i[u] = o(s[u], u)), i), {}); - } - function objReduce(s, o) { - return Object.keys(s).reduce((i, u) => { - let _ = o(s[u], u); - return (_ && 'object' == typeof _ && Object.assign(i, _), i); - }, {}); - } - function systemThunkMiddleware(s) { - return ({ dispatch: o, getState: i }) => - (o) => - (i) => - 'function' == typeof i ? i(s()) : o(i); - } - function validateValueBySchema(s, o, i, u, _) { - if (!o) return []; - let w = [], - x = o.get('nullable'), - C = o.get('required'), - j = o.get('maximum'), - L = o.get('minimum'), - B = o.get('type'), - $ = o.get('format'), - V = o.get('maxLength'), - U = o.get('minLength'), - z = o.get('uniqueItems'), - Y = o.get('maxItems'), - Z = o.get('minItems'), - ee = o.get('pattern'); - const ie = i || !0 === C, - ae = null != s, - le = ie || (ae && 'array' === B) || !(!ie && !ae), - ce = x && null === s; - if (ie && !ae && !ce && !u && !B) return (w.push('Required field is not provided'), w); - if (ce || !B || !le) return []; - let pe = 'string' === B && s, - de = 'array' === B && Array.isArray(s) && s.length, - fe = 'array' === B && $e().List.isList(s) && s.count(); - const ye = [ - pe, - de, - fe, - 'array' === B && 'string' == typeof s && s, - 'file' === B && s instanceof at.File, - 'boolean' === B && (s || !1 === s), - 'number' === B && (s || 0 === s), - 'integer' === B && (s || 0 === s), - 'object' === B && 'object' == typeof s && null !== s, - 'object' === B && 'string' == typeof s && s - ].some((s) => !!s); - if (ie && !ye && !u) return (w.push('Required field is not provided'), w); - if ('object' === B && (null === _ || 'application/json' === _)) { - let i = s; - if ('string' == typeof s) - try { - i = JSON.parse(s); - } catch (s) { - return (w.push('Parameter string value must be valid JSON'), w); - } - (o && - o.has('required') && - isFunc(C.isList) && - C.isList() && - C.forEach((s) => { - void 0 === i[s] && w.push({ propKey: s, error: 'Required property not found' }); - }), - o && - o.has('properties') && - o.get('properties').forEach((s, o) => { - const x = validateValueBySchema(i[o], s, !1, u, _); - w.push(...x.map((s) => ({ propKey: o, error: s }))); - })); - } - if (ee) { - let o = ((s, o) => { - if (!new RegExp(o).test(s)) return 'Value must follow pattern ' + o; - })(s, ee); - o && w.push(o); - } - if (Z && 'array' === B) { - let o = ((s, o) => { - if ((!s && o >= 1) || (s && s.length < o)) - return `Array must contain at least ${o} item${1 === o ? '' : 's'}`; - })(s, Z); - o && w.push(o); - } - if (Y && 'array' === B) { - let o = ((s, o) => { - if (s && s.length > o) - return `Array must not contain more then ${o} item${1 === o ? '' : 's'}`; - })(s, Y); - o && w.push({ needRemove: !0, error: o }); - } - if (z && 'array' === B) { - let o = ((s, o) => { - if (s && ('true' === o || !0 === o)) { - const o = (0, qe.fromJS)(s), - i = o.toSet(); - if (s.length > i.size) { - let s = (0, qe.Set)(); - if ( - (o.forEach((i, u) => { - o.filter((s) => (isFunc(s.equals) ? s.equals(i) : s === i)).size > 1 && - (s = s.add(u)); - }), - 0 !== s.size) - ) - return s.map((s) => ({ index: s, error: 'No duplicates allowed.' })).toArray(); - } - } - })(s, z); - o && w.push(...o); - } - if (V || 0 === V) { - let o = ((s, o) => { - if (s.length > o) - return `Value must be no longer than ${o} character${1 !== o ? 's' : ''}`; - })(s, V); - o && w.push(o); - } - if (U) { - let o = ((s, o) => { - if (s.length < o) return `Value must be at least ${o} character${1 !== o ? 's' : ''}`; - })(s, U); - o && w.push(o); - } - if (j || 0 === j) { - let o = ((s, o) => { - if (s > o) return `Value must be less than ${o}`; - })(s, j); - o && w.push(o); - } - if (L || 0 === L) { - let o = ((s, o) => { - if (s < o) return `Value must be greater than ${o}`; - })(s, L); - o && w.push(o); - } - if ('string' === B) { - let o; - if ( - ((o = - 'date-time' === $ - ? ((s) => { - if (isNaN(Date.parse(s))) return 'Value must be a DateTime'; - })(s) - : 'uuid' === $ - ? ((s) => { - if ( - ((s = s.toString().toLowerCase()), - !/^[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[)}]?$/.test( - s - )) - ) - return 'Value must be a Guid'; - })(s) - : ((s) => { - if (s && 'string' != typeof s) return 'Value must be a string'; - })(s)), - !o) - ) - return w; - w.push(o); - } else if ('boolean' === B) { - let o = ((s) => { - if ('true' !== s && 'false' !== s && !0 !== s && !1 !== s) - return 'Value must be a boolean'; - })(s); - if (!o) return w; - w.push(o); - } else if ('number' === B) { - let o = ((s) => { - if (!/^-?\d+(\.?\d+)?$/.test(s)) return 'Value must be a number'; - })(s); - if (!o) return w; - w.push(o); - } else if ('integer' === B) { - let o = ((s) => { - if (!/^-?\d+$/.test(s)) return 'Value must be an integer'; - })(s); - if (!o) return w; - w.push(o); - } else if ('array' === B) { - if (!de && !fe) return w; - s && - s.forEach((s, i) => { - const x = validateValueBySchema(s, o.get('items'), !1, u, _); - w.push(...x.map((s) => ({ index: i, error: s }))); - }); - } else if ('file' === B) { - let o = ((s) => { - if (s && !(s instanceof at.File)) return 'Value must be a file'; - })(s); - if (!o) return w; - w.push(o); - } - return w; - } - const utils_btoa = (s) => { - let o; - return ( - (o = s instanceof Ot ? s : Ot.from(s.toString(), 'utf-8')), - o.toString('base64') - ); - }, - It = { - operationsSorter: { - alpha: (s, o) => s.get('path').localeCompare(o.get('path')), - method: (s, o) => s.get('method').localeCompare(o.get('method')) - }, - tagsSorter: { alpha: (s, o) => s.localeCompare(o) } - }, - buildFormData = (s) => { - let o = []; - for (let i in s) { - let u = s[i]; - void 0 !== u && - '' !== u && - o.push([i, '=', encodeURIComponent(u).replace(/%20/g, '+')].join('')); - } - return o.join('&'); - }, - shallowEqualKeys = (s, o, i) => !!ht()(i, (i) => yt()(s[i], o[i])); - function sanitizeUrl(s) { - return 'string' != typeof s || '' === s ? '' : (0, lt.J)(s); - } - function requiresValidationURL(s) { - return !( - !s || - s.indexOf('localhost') >= 0 || - s.indexOf('127.0.0.1') >= 0 || - 'none' === s - ); - } - const createDeepLinkPath = (s) => - 'string' == typeof s || s instanceof String ? s.trim().replace(/\s/g, '%20') : '', - escapeDeepLinkPath = (s) => Et()(createDeepLinkPath(s).replace(/%20/g, '_')), - getExtensions = (s) => s.filter((s, o) => /^x-/.test(o)), - getCommonExtensions = (s) => - s.filter((s, o) => /^pattern|maxLength|minLength|maximum|minimum/.test(o)); - function deeplyStripKey(s, o, i = () => !0) { - if ('object' != typeof s || Array.isArray(s) || null === s || !o) return s; - const u = Object.assign({}, s); - return ( - Object.keys(u).forEach((s) => { - s === o && i(u[s], s) ? delete u[s] : (u[s] = deeplyStripKey(u[s], o, i)); - }), - u - ); - } - function stringify(s) { - if ('string' == typeof s) return s; - if ((s && s.toJS && (s = s.toJS()), 'object' == typeof s && null !== s)) - try { - return JSON.stringify(s, null, 2); - } catch (o) { - return String(s); - } - return null == s ? '' : s.toString(); - } - function paramToIdentifier(s, { returnAll: o = !1, allowHashes: i = !0 } = {}) { - if (!$e().Map.isMap(s)) - throw new Error('paramToIdentifier: received a non-Im.Map parameter as input'); - const u = s.get('name'), - _ = s.get('in'); - let w = []; - return ( - s && s.hashCode && _ && u && i && w.push(`${_}.${u}.hash-${s.hashCode()}`), - _ && u && w.push(`${_}.${u}`), - w.push(u), - o ? w : w[0] || '' - ); - } - function paramToValue(s, o) { - return paramToIdentifier(s, { returnAll: !0 }) - .map((s) => o[s]) - .filter((s) => void 0 !== s)[0]; - } - function b64toB64UrlEncoded(s) { - return s.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); - } - const isEmptyValue = (s) => !s || !(!isImmutable(s) || !s.isEmpty()), - idFn = (s) => s; - function createStoreWithMiddleware(s, o, i) { - let u = [systemThunkMiddleware(i)]; - return createStore( - s, - o, - (at.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose)( - (function applyMiddleware(...s) { - return (o) => (i, u) => { - const _ = o(i, u); - let dispatch = () => { - throw new Error(formatProdErrorMessage(15)); - }; - const w = { getState: _.getState, dispatch: (s, ...o) => dispatch(s, ...o) }, - x = s.map((s) => s(w)); - return ((dispatch = compose(...x)(_.dispatch)), { ..._, dispatch }); - }; - })(...u) - ) - ); - } - class Store { - constructor(s = {}) { - (We()( - this, - { - state: {}, - plugins: [], - system: { configs: {}, fn: {}, components: {}, rootInjects: {}, statePlugins: {} }, - boundSystem: {}, - toolbox: {} - }, - s - ), - (this.getSystem = this._getSystem.bind(this)), - (this.store = (function configureStore(s, o, i) { - return createStoreWithMiddleware(s, o, i); - })(idFn, (0, qe.fromJS)(this.state), this.getSystem)), - this.buildSystem(!1), - this.register(this.plugins)); - } - getStore() { - return this.store; - } - register(s, o = !0) { - var i = combinePlugins(s, this.getSystem()); - (systemExtend(this.system, i), o && this.buildSystem()); - callAfterLoad.call(this.system, s, this.getSystem()) && this.buildSystem(); - } - buildSystem(s = !0) { - let o = this.getStore().dispatch, - i = this.getStore().getState; - ((this.boundSystem = Object.assign( - {}, - this.getRootInjects(), - this.getWrappedAndBoundActions(o), - this.getWrappedAndBoundSelectors(i, this.getSystem), - this.getStateThunks(i), - this.getFn(), - this.getConfigs() - )), - s && this.rebuildReducer()); - } - _getSystem() { - return this.boundSystem; - } - getRootInjects() { - return Object.assign( - { - getSystem: this.getSystem, - getStore: this.getStore.bind(this), - getComponents: this.getComponents.bind(this), - getState: this.getStore().getState, - getConfigs: this._getConfigs.bind(this), - Im: $e(), - React: Pe - }, - this.system.rootInjects || {} - ); - } - _getConfigs() { - return this.system.configs; - } - getConfigs() { - return { configs: this.system.configs }; - } - setConfigs(s) { - this.system.configs = s; - } - rebuildReducer() { - this.store.replaceReducer( - (function buildReducer(s) { - return (function allReducers(s) { - let o = Object.keys(s).reduce( - (o, i) => ( - (o[i] = (function makeReducer(s) { - return (o = new qe.Map(), i) => { - if (!s) return o; - let u = s[i.type]; - if (u) { - const s = wrapWithTryCatch(u)(o, i); - return null === s ? o : s; - } - return o; - }; - })(s[i])), - o - ), - {} - ); - if (!Object.keys(o).length) return idFn; - return (0, He.H)(o); - })(objMap(s, (s) => s.reducers)); - })(this.system.statePlugins) - ); - } - getType(s) { - let o = s[0].toUpperCase() + s.slice(1); - return objReduce(this.system.statePlugins, (i, u) => { - let _ = i[s]; - if (_) return { [u + o]: _ }; - }); - } - getSelectors() { - return this.getType('selectors'); - } - getActions() { - return objMap(this.getType('actions'), (s) => - objReduce(s, (s, o) => { - if (isFn(s)) return { [o]: s }; - }) - ); - } - getWrappedAndBoundActions(s) { - return objMap(this.getBoundActions(s), (s, o) => { - let i = this.system.statePlugins[o.slice(0, -7)].wrapActions; - return i - ? objMap(s, (s, o) => { - let u = i[o]; - return u - ? (Array.isArray(u) || (u = [u]), - u.reduce((s, o) => { - let newAction = (...i) => o(s, this.getSystem())(...i); - if (!isFn(newAction)) - throw new TypeError( - 'wrapActions needs to return a function that returns a new function (ie the wrapped action)' - ); - return wrapWithTryCatch(newAction); - }, s || Function.prototype)) - : s; - }) - : s; - }); - } - getWrappedAndBoundSelectors(s, o) { - return objMap(this.getBoundSelectors(s, o), (o, i) => { - let u = [i.slice(0, -9)], - _ = this.system.statePlugins[u].wrapSelectors; - return _ - ? objMap(o, (o, i) => { - let w = _[i]; - return w - ? (Array.isArray(w) || (w = [w]), - w.reduce((o, i) => { - let wrappedSelector = (..._) => - i(o, this.getSystem())(s().getIn(u), ..._); - if (!isFn(wrappedSelector)) - throw new TypeError( - 'wrapSelector needs to return a function that returns a new function (ie the wrapped action)' - ); - return wrappedSelector; - }, o || Function.prototype)) - : o; - }) - : o; - }); - } - getStates(s) { - return Object.keys(this.system.statePlugins).reduce( - (o, i) => ((o[i] = s.get(i)), o), - {} - ); - } - getStateThunks(s) { - return Object.keys(this.system.statePlugins).reduce( - (o, i) => ((o[i] = () => s().get(i)), o), - {} - ); - } - getFn() { - return { fn: this.system.fn }; - } - getComponents(s) { - const o = this.system.components[s]; - return Array.isArray(o) - ? o.reduce((s, o) => o(s, this.getSystem())) - : void 0 !== s - ? this.system.components[s] - : this.system.components; - } - getBoundSelectors(s, o) { - return objMap(this.getSelectors(), (i, u) => { - let _ = [u.slice(0, -9)]; - return objMap(i, (i) => (...u) => { - let w = wrapWithTryCatch(i).apply(null, [s().getIn(_), ...u]); - return ('function' == typeof w && (w = wrapWithTryCatch(w)(o())), w); - }); - }); - } - getBoundActions(s) { - s = s || this.getStore().dispatch; - const o = this.getActions(), - process = (s) => - 'function' != typeof s - ? objMap(s, (s) => process(s)) - : (...o) => { - var i = null; - try { - i = s(...o); - } catch (s) { - i = { type: et, error: !0, payload: (0, Ye.serializeError)(s) }; - } finally { - return i; - } - }; - return objMap(o, (o) => - (function bindActionCreators(s, o) { - if ('function' == typeof s) return bindActionCreator(s, o); - if ('object' != typeof s || null === s) throw new Error(formatProdErrorMessage(16)); - const i = {}; - for (const u in s) { - const _ = s[u]; - 'function' == typeof _ && (i[u] = bindActionCreator(_, o)); - } - return i; - })(process(o), s) - ); - } - getMapStateToProps() { - return () => Object.assign({}, this.getSystem()); - } - getMapDispatchToProps(s) { - return (o) => We()({}, this.getWrappedAndBoundActions(o), this.getFn(), s); - } - } - function combinePlugins(s, o) { - return isObject(s) && !isArray(s) - ? Qe()({}, s) - : isFunc(s) - ? combinePlugins(s(o), o) - : isArray(s) - ? s - .map((s) => combinePlugins(s, o)) - .reduce(systemExtend, { components: o.getComponents() }) - : {}; - } - function callAfterLoad(s, o, { hasLoaded: i } = {}) { - let u = i; - return ( - isObject(s) && - !isArray(s) && - 'function' == typeof s.afterLoad && - ((u = !0), wrapWithTryCatch(s.afterLoad).call(this, o)), - isFunc(s) - ? callAfterLoad.call(this, s(o), o, { hasLoaded: u }) - : isArray(s) - ? s.map((s) => callAfterLoad.call(this, s, o, { hasLoaded: u })) - : u - ); - } - function systemExtend(s = {}, o = {}) { - if (!isObject(s)) return {}; - if (!isObject(o)) return s; - o.wrapComponents && - (objMap(o.wrapComponents, (i, u) => { - const _ = s.components && s.components[u]; - _ && Array.isArray(_) - ? ((s.components[u] = _.concat([i])), delete o.wrapComponents[u]) - : _ && ((s.components[u] = [_, i]), delete o.wrapComponents[u]); - }), - Object.keys(o.wrapComponents).length || delete o.wrapComponents); - const { statePlugins: i } = s; - if (isObject(i)) - for (let s in i) { - const u = i[s]; - if (!isObject(u)) continue; - const { wrapActions: _, wrapSelectors: w } = u; - if (isObject(_)) - for (let i in _) { - let u = _[i]; - (Array.isArray(u) || ((u = [u]), (_[i] = u)), - o && - o.statePlugins && - o.statePlugins[s] && - o.statePlugins[s].wrapActions && - o.statePlugins[s].wrapActions[i] && - (o.statePlugins[s].wrapActions[i] = _[i].concat( - o.statePlugins[s].wrapActions[i] - ))); - } - if (isObject(w)) - for (let i in w) { - let u = w[i]; - (Array.isArray(u) || ((u = [u]), (w[i] = u)), - o && - o.statePlugins && - o.statePlugins[s] && - o.statePlugins[s].wrapSelectors && - o.statePlugins[s].wrapSelectors[i] && - (o.statePlugins[s].wrapSelectors[i] = w[i].concat( - o.statePlugins[s].wrapSelectors[i] - ))); - } - } - return We()(s, o); - } - function wrapWithTryCatch(s, { logErrors: o = !0 } = {}) { - return 'function' != typeof s - ? s - : function (...i) { - try { - return s.call(this, ...i); - } catch (s) { - return (o && console.error(s), null); - } - }; - } - var Pt = __webpack_require__(61160), - Mt = __webpack_require__.n(Pt); - const Tt = 'show_popup', - Nt = 'authorize', - Rt = 'logout', - Dt = 'pre_authorize_oauth2', - Lt = 'authorize_oauth2', - Bt = 'validate', - Ft = 'configure_auth', - qt = 'restore_authorization'; - function showDefinitions(s) { - return { type: Tt, payload: s }; - } - function authorize(s) { - return { type: Nt, payload: s }; - } - const authorizeWithPersistOption = - (s) => - ({ authActions: o }) => { - (o.authorize(s), o.persistAuthorizationIfNeeded()); - }; - function logout(s) { - return { type: Rt, payload: s }; - } - const logoutWithPersistOption = - (s) => - ({ authActions: o }) => { - (o.logout(s), o.persistAuthorizationIfNeeded()); - }, - preAuthorizeImplicit = - (s) => - ({ authActions: o, errActions: i }) => { - let { auth: u, token: _, isValid: w } = s, - { schema: x, name: C } = u, - j = x.get('flow'); - (delete at.swaggerUIRedirectOauth2, - 'accessCode' === j || - w || - i.newAuthErr({ - authId: C, - source: 'auth', - level: 'warning', - message: - "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server" - }), - _.error - ? i.newAuthErr({ - authId: C, - source: 'auth', - level: 'error', - message: JSON.stringify(_) - }) - : o.authorizeOauth2WithPersistOption({ auth: u, token: _ })); - }; - function authorizeOauth2(s) { - return { type: Lt, payload: s }; - } - const authorizeOauth2WithPersistOption = - (s) => - ({ authActions: o }) => { - (o.authorizeOauth2(s), o.persistAuthorizationIfNeeded()); - }, - authorizePassword = - (s) => - ({ authActions: o }) => { - let { - schema: i, - name: u, - username: _, - password: w, - passwordType: x, - clientId: C, - clientSecret: j - } = s, - L = { grant_type: 'password', scope: s.scopes.join(' '), username: _, password: w }, - B = {}; - switch (x) { - case 'request-body': - !(function setClientIdAndSecret(s, o, i) { - o && Object.assign(s, { client_id: o }); - i && Object.assign(s, { client_secret: i }); - })(L, C, j); - break; - case 'basic': - B.Authorization = 'Basic ' + utils_btoa(C + ':' + j); - break; - default: - console.warn( - `Warning: invalid passwordType ${x} was passed, not including client id and secret` - ); - } - return o.authorizeRequest({ - body: buildFormData(L), - url: i.get('tokenUrl'), - name: u, - headers: B, - query: {}, - auth: s - }); - }; - const authorizeApplication = - (s) => - ({ authActions: o }) => { - let { schema: i, scopes: u, name: _, clientId: w, clientSecret: x } = s, - C = { Authorization: 'Basic ' + utils_btoa(w + ':' + x) }, - j = { grant_type: 'client_credentials', scope: u.join(' ') }; - return o.authorizeRequest({ - body: buildFormData(j), - name: _, - url: i.get('tokenUrl'), - auth: s, - headers: C - }); - }, - authorizeAccessCodeWithFormParams = - ({ auth: s, redirectUrl: o }) => - ({ authActions: i }) => { - let { schema: u, name: _, clientId: w, clientSecret: x, codeVerifier: C } = s, - j = { - grant_type: 'authorization_code', - code: s.code, - client_id: w, - client_secret: x, - redirect_uri: o, - code_verifier: C - }; - return i.authorizeRequest({ - body: buildFormData(j), - name: _, - url: u.get('tokenUrl'), - auth: s - }); - }, - authorizeAccessCodeWithBasicAuthentication = - ({ auth: s, redirectUrl: o }) => - ({ authActions: i }) => { - let { schema: u, name: _, clientId: w, clientSecret: x, codeVerifier: C } = s, - j = { Authorization: 'Basic ' + utils_btoa(w + ':' + x) }, - L = { - grant_type: 'authorization_code', - code: s.code, - client_id: w, - redirect_uri: o, - code_verifier: C - }; - return i.authorizeRequest({ - body: buildFormData(L), - name: _, - url: u.get('tokenUrl'), - auth: s, - headers: j - }); - }, - authorizeRequest = - (s) => - ({ - fn: o, - getConfigs: i, - authActions: u, - errActions: _, - oas3Selectors: w, - specSelectors: x, - authSelectors: C - }) => { - let j, - { body: L, query: B = {}, headers: $ = {}, name: V, url: U, auth: z } = s, - { additionalQueryStringParams: Y } = C.getConfigs() || {}; - if (x.isOAS3()) { - let s = w.serverEffectiveValue(w.selectedServer()); - j = Mt()(U, s, !0); - } else j = Mt()(U, x.url(), !0); - 'object' == typeof Y && (j.query = Object.assign({}, j.query, Y)); - const Z = j.toString(); - let ee = Object.assign( - { - Accept: 'application/json, text/plain, */*', - 'Content-Type': 'application/x-www-form-urlencoded', - 'X-Requested-With': 'XMLHttpRequest' - }, - $ - ); - o.fetch({ - url: Z, - method: 'post', - headers: ee, - query: B, - body: L, - requestInterceptor: i().requestInterceptor, - responseInterceptor: i().responseInterceptor - }) - .then(function (s) { - let o = JSON.parse(s.data), - i = o && (o.error || ''), - w = o && (o.parseError || ''); - s.ok - ? i || w - ? _.newAuthErr({ - authId: V, - level: 'error', - source: 'auth', - message: JSON.stringify(o) - }) - : u.authorizeOauth2WithPersistOption({ auth: z, token: o }) - : _.newAuthErr({ - authId: V, - level: 'error', - source: 'auth', - message: s.statusText - }); - }) - .catch((s) => { - let o = new Error(s).message; - if (s.response && s.response.data) { - const i = s.response.data; - try { - const s = 'string' == typeof i ? JSON.parse(i) : i; - (s.error && (o += `, error: ${s.error}`), - s.error_description && (o += `, description: ${s.error_description}`)); - } catch (s) {} - } - _.newAuthErr({ authId: V, level: 'error', source: 'auth', message: o }); - }); - }; - function configureAuth(s) { - return { type: Ft, payload: s }; - } - function restoreAuthorization(s) { - return { type: qt, payload: s }; - } - const persistAuthorizationIfNeeded = - () => - ({ authSelectors: s, getConfigs: o }) => { - if (!o().persistAuthorization) return; - const i = s.authorized().toJS(); - localStorage.setItem('authorized', JSON.stringify(i)); - }, - authPopup = (s, o) => () => { - ((at.swaggerUIRedirectOauth2 = o), at.open(s)); - }, - $t = { - [Tt]: (s, { payload: o }) => s.set('showDefinitions', o), - [Nt]: (s, { payload: o }) => { - let i = (0, qe.fromJS)(o), - u = s.get('authorized') || (0, qe.Map)(); - return ( - i.entrySeq().forEach(([o, i]) => { - if (!isFunc(i.getIn)) return s.set('authorized', u); - let _ = i.getIn(['schema', 'type']); - if ('apiKey' === _ || 'http' === _) u = u.set(o, i); - else if ('basic' === _) { - let s = i.getIn(['value', 'username']), - _ = i.getIn(['value', 'password']); - ((u = u.setIn([o, 'value'], { - username: s, - header: 'Basic ' + utils_btoa(s + ':' + _) - })), - (u = u.setIn([o, 'schema'], i.get('schema')))); - } - }), - s.set('authorized', u) - ); - }, - [Lt]: (s, { payload: o }) => { - let i, - { auth: u, token: _ } = o; - ((u.token = Object.assign({}, _)), (i = (0, qe.fromJS)(u))); - let w = s.get('authorized') || (0, qe.Map)(); - return ((w = w.set(i.get('name'), i)), s.set('authorized', w)); - }, - [Rt]: (s, { payload: o }) => { - let i = s.get('authorized').withMutations((s) => { - o.forEach((o) => { - s.delete(o); - }); - }); - return s.set('authorized', i); - }, - [Ft]: (s, { payload: o }) => s.set('configs', o), - [qt]: (s, { payload: o }) => s.set('authorized', (0, qe.fromJS)(o.authorized)) - }; - function assertIsFunction(s, o = 'expected a function, instead received ' + typeof s) { - if ('function' != typeof s) throw new TypeError(o); - } - var ensureIsArray = (s) => (Array.isArray(s) ? s : [s]); - function getDependencies(s) { - const o = Array.isArray(s[0]) ? s[0] : s; - return ( - (function assertIsArrayOfFunctions( - s, - o = 'expected all items to be functions, instead received the following types: ' - ) { - if (!s.every((s) => 'function' == typeof s)) { - const i = s - .map((s) => - 'function' == typeof s ? `function ${s.name || 'unnamed'}()` : typeof s - ) - .join(', '); - throw new TypeError(`${o}[${i}]`); - } - })( - o, - 'createSelector expects all input-selectors to be functions, but received the following types: ' - ), - o - ); - } - (Symbol(), Object.getPrototypeOf({})); - var Vt = - 'undefined' != typeof WeakRef - ? WeakRef - : class { - constructor(s) { - this.value = s; - } - deref() { - return this.value; - } - }; - function weakMapMemoize(s, o = {}) { - let i = { s: 0, v: void 0, o: null, p: null }; - const { resultEqualityCheck: u } = o; - let _, - w = 0; - function memoized() { - let o = i; - const { length: x } = arguments; - for (let s = 0, i = x; s < i; s++) { - const i = arguments[s]; - if ('function' == typeof i || ('object' == typeof i && null !== i)) { - let s = o.o; - null === s && (o.o = s = new WeakMap()); - const u = s.get(i); - void 0 === u ? ((o = { s: 0, v: void 0, o: null, p: null }), s.set(i, o)) : (o = u); - } else { - let s = o.p; - null === s && (o.p = s = new Map()); - const u = s.get(i); - void 0 === u ? ((o = { s: 0, v: void 0, o: null, p: null }), s.set(i, o)) : (o = u); - } - } - const C = o; - let j; - if (1 === o.s) j = o.v; - else if (((j = s.apply(null, arguments)), w++, u)) { - const s = _?.deref?.() ?? _; - null != s && u(s, j) && ((j = s), 0 !== w && w--); - _ = ('object' == typeof j && null !== j) || 'function' == typeof j ? new Vt(j) : j; - } - return ((C.s = 1), (C.v = j), j); - } - return ( - (memoized.clearCache = () => { - ((i = { s: 0, v: void 0, o: null, p: null }), memoized.resetResultsCount()); - }), - (memoized.resultsCount = () => w), - (memoized.resetResultsCount = () => { - w = 0; - }), - memoized - ); - } - function createSelectorCreator(s, ...o) { - const i = 'function' == typeof s ? { memoize: s, memoizeOptions: o } : s, - createSelector2 = (...s) => { - let o, - u = 0, - _ = 0, - w = {}, - x = s.pop(); - ('object' == typeof x && ((w = x), (x = s.pop())), - assertIsFunction( - x, - `createSelector expects an output function after the inputs, but received: [${typeof x}]` - )); - const C = { ...i, ...w }, - { - memoize: j, - memoizeOptions: L = [], - argsMemoize: B = weakMapMemoize, - argsMemoizeOptions: $ = [], - devModeChecks: V = {} - } = C, - U = ensureIsArray(L), - z = ensureIsArray($), - Y = getDependencies(s), - Z = j( - function recomputationWrapper() { - return (u++, x.apply(null, arguments)); - }, - ...U - ); - const ee = B( - function dependenciesChecker() { - _++; - const s = (function collectInputSelectorResults(s, o) { - const i = [], - { length: u } = s; - for (let _ = 0; _ < u; _++) i.push(s[_].apply(null, o)); - return i; - })(Y, arguments); - return ((o = Z.apply(null, s)), o); - }, - ...z - ); - return Object.assign(ee, { - resultFunc: x, - memoizedResultFunc: Z, - dependencies: Y, - dependencyRecomputations: () => _, - resetDependencyRecomputations: () => { - _ = 0; - }, - lastResult: () => o, - recomputations: () => u, - resetRecomputations: () => { - u = 0; - }, - memoize: j, - argsMemoize: B - }); - }; - return ( - Object.assign(createSelector2, { withTypes: () => createSelector2 }), - createSelector2 - ); - } - var Ut = createSelectorCreator(weakMapMemoize), - zt = Object.assign( - (s, o = Ut) => { - !(function assertIsObject(s, o = 'expected an object, instead received ' + typeof s) { - if ('object' != typeof s) throw new TypeError(o); - })( - s, - 'createStructuredSelector expects first argument to be an object where each property is a selector, instead received a ' + - typeof s - ); - const i = Object.keys(s); - return o( - i.map((o) => s[o]), - (...s) => s.reduce((s, o, u) => ((s[i[u]] = o), s), {}) - ); - }, - { withTypes: () => zt } - ); - const state = (s) => s, - Wt = Ut(state, (s) => s.get('showDefinitions')), - Kt = Ut(state, () => ({ specSelectors: s }) => { - let o = s.securityDefinitions() || (0, qe.Map)({}), - i = (0, qe.List)(); - return ( - o.entrySeq().forEach(([s, o]) => { - let u = (0, qe.Map)(); - ((u = u.set(s, o)), (i = i.push(u))); - }), - i - ); - }), - getDefinitionsByNames = - (s, o) => - ({ specSelectors: s }) => { - console.warn( - 'WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.' - ); - let i = s.securityDefinitions(), - u = (0, qe.List)(); - return ( - o.valueSeq().forEach((s) => { - let o = (0, qe.Map)(); - (s.entrySeq().forEach(([s, u]) => { - let _, - w = i.get(s); - ('oauth2' === w.get('type') && - u.size && - ((_ = w.get('scopes')), - _.keySeq().forEach((s) => { - u.contains(s) || (_ = _.delete(s)); - }), - (w = w.set('allowedScopes', _))), - (o = o.set(s, w))); - }), - (u = u.push(o))); - }), - u - ); - }, - definitionsForRequirements = - (s, o = (0, qe.List)()) => - ({ authSelectors: s }) => { - const i = s.definitionsToAuthorize() || (0, qe.List)(); - let u = (0, qe.List)(); - return ( - i.forEach((s) => { - let i = o.find((o) => o.get(s.keySeq().first())); - i && - (s.forEach((o, u) => { - if ('oauth2' === o.get('type')) { - const _ = i.get(u); - let w = o.get('scopes'); - qe.List.isList(_) && - qe.Map.isMap(w) && - (w.keySeq().forEach((s) => { - _.contains(s) || (w = w.delete(s)); - }), - (s = s.set(u, o.set('scopes', w)))); - } - }), - (u = u.push(s))); - }), - u - ); - }, - Ht = Ut(state, (s) => s.get('authorized') || (0, qe.Map)()), - isAuthorized = - (s, o) => - ({ authSelectors: s }) => { - let i = s.authorized(); - return qe.List.isList(o) - ? !!o.toJS().filter( - (s) => - -1 === - Object.keys(s) - .map((s) => !!i.get(s)) - .indexOf(!1) - ).length - : null; - }, - Jt = Ut(state, (s) => s.get('configs')), - execute = - (s, { authSelectors: o, specSelectors: i }) => - ({ path: u, method: _, operation: w, extras: x }) => { - let C = { - authorized: o.authorized() && o.authorized().toJS(), - definitions: i.securityDefinitions() && i.securityDefinitions().toJS(), - specSecurity: i.security() && i.security().toJS() - }; - return s({ path: u, method: _, operation: w, securities: C, ...x }); - }, - loaded = (s, o) => (i) => { - const { getConfigs: u, authActions: _ } = o, - w = u(); - if ((s(i), w.persistAuthorization)) { - const s = localStorage.getItem('authorized'); - s && _.restoreAuthorization({ authorized: JSON.parse(s) }); - } - }, - wrap_actions_authorize = (s, o) => (i) => { - s(i); - if (o.getConfigs().persistAuthorization) - try { - const [{ schema: s, value: o }] = Object.values(i), - u = 'apiKey' === s.get('type'), - _ = 'cookie' === s.get('in'); - u && _ && (document.cookie = `${s.get('name')}=${o}; SameSite=None; Secure`); - } catch (s) { - console.error('Error persisting cookie based apiKey in document.cookie.', s); - } - }, - wrap_actions_logout = (s, o) => (i) => { - const u = o.getConfigs(), - _ = o.authSelectors.authorized(); - try { - u.persistAuthorization && - Array.isArray(i) && - i.forEach((s) => { - const o = _.get(s, {}), - i = 'apiKey' === o.getIn(['schema', 'type']), - u = 'cookie' === o.getIn(['schema', 'in']); - if (i && u) { - const s = o.getIn(['schema', 'name']); - document.cookie = `${s}=; Max-Age=-99999999`; - } - }); - } catch (s) { - console.error('Error deleting cookie based apiKey from document.cookie.', s); - } - s(i); - }; - var Gt = __webpack_require__(90179), - Yt = __webpack_require__.n(Gt); - class LockAuthIcon extends Pe.Component { - mapStateToProps(s, o) { - return { state: s, ownProps: Yt()(o, Object.keys(o.getSystem())) }; - } - render() { - const { getComponent: s, ownProps: o } = this.props, - i = s('LockIcon'); - return Pe.createElement(i, o); - } - } - const Xt = LockAuthIcon; - class UnlockAuthIcon extends Pe.Component { - mapStateToProps(s, o) { - return { state: s, ownProps: Yt()(o, Object.keys(o.getSystem())) }; - } - render() { - const { getComponent: s, ownProps: o } = this.props, - i = s('UnlockIcon'); - return Pe.createElement(i, o); - } - } - const Zt = UnlockAuthIcon; - function auth() { - return { - afterLoad(s) { - ((this.rootInjects = this.rootInjects || {}), - (this.rootInjects.initOAuth = s.authActions.configureAuth), - (this.rootInjects.preauthorizeApiKey = preauthorizeApiKey.bind(null, s)), - (this.rootInjects.preauthorizeBasic = preauthorizeBasic.bind(null, s))); - }, - components: { - LockAuthIcon: Xt, - UnlockAuthIcon: Zt, - LockAuthOperationIcon: Xt, - UnlockAuthOperationIcon: Zt - }, - statePlugins: { - auth: { - reducers: $t, - actions: o, - selectors: i, - wrapActions: { authorize: wrap_actions_authorize, logout: wrap_actions_logout } - }, - configs: { wrapActions: { loaded } }, - spec: { wrapActions: { execute } } - } - }; - } - function preauthorizeBasic(s, o, i, u) { - const { - authActions: { authorize: _ }, - specSelectors: { specJson: w, isOAS3: x } - } = s, - C = x() ? ['components', 'securitySchemes'] : ['securityDefinitions'], - j = w().getIn([...C, o]); - return j ? _({ [o]: { value: { username: i, password: u }, schema: j.toJS() } }) : null; - } - function preauthorizeApiKey(s, o, i) { - const { - authActions: { authorize: u }, - specSelectors: { specJson: _, isOAS3: w } - } = s, - x = w() ? ['components', 'securitySchemes'] : ['securityDefinitions'], - C = _().getIn([...x, o]); - return C ? u({ [o]: { value: i, schema: C.toJS() } }) : null; - } - function isNothing(s) { - return null == s; - } - var Qt = function repeat(s, o) { - var i, - u = ''; - for (i = 0; i < o; i += 1) u += s; - return u; - }, - er = function isNegativeZero(s) { - return 0 === s && Number.NEGATIVE_INFINITY === 1 / s; - }, - tr = { - isNothing, - isObject: function js_yaml_isObject(s) { - return 'object' == typeof s && null !== s; - }, - toArray: function toArray(s) { - return Array.isArray(s) ? s : isNothing(s) ? [] : [s]; - }, - repeat: Qt, - isNegativeZero: er, - extend: function extend(s, o) { - var i, u, _, w; - if (o) - for (i = 0, u = (w = Object.keys(o)).length; i < u; i += 1) s[(_ = w[i])] = o[_]; - return s; - } - }; - function formatError(s, o) { - var i = '', - u = s.reason || '(unknown reason)'; - return s.mark - ? (s.mark.name && (i += 'in "' + s.mark.name + '" '), - (i += '(' + (s.mark.line + 1) + ':' + (s.mark.column + 1) + ')'), - !o && s.mark.snippet && (i += '\n\n' + s.mark.snippet), - u + ' ' + i) - : u; - } - function YAMLException$1(s, o) { - (Error.call(this), - (this.name = 'YAMLException'), - (this.reason = s), - (this.mark = o), - (this.message = formatError(this, !1)), - Error.captureStackTrace - ? Error.captureStackTrace(this, this.constructor) - : (this.stack = new Error().stack || '')); - } - ((YAMLException$1.prototype = Object.create(Error.prototype)), - (YAMLException$1.prototype.constructor = YAMLException$1), - (YAMLException$1.prototype.toString = function toString(s) { - return this.name + ': ' + formatError(this, s); - })); - var rr = YAMLException$1; - function getLine(s, o, i, u, _) { - var w = '', - x = '', - C = Math.floor(_ / 2) - 1; - return ( - u - o > C && (o = u - C + (w = ' ... ').length), - i - u > C && (i = u + C - (x = ' ...').length), - { str: w + s.slice(o, i).replace(/\t/g, '→') + x, pos: u - o + w.length } - ); - } - function padStart(s, o) { - return tr.repeat(' ', o - s.length) + s; - } - var nr = function makeSnippet(s, o) { - if (((o = Object.create(o || null)), !s.buffer)) return null; - (o.maxLength || (o.maxLength = 79), - 'number' != typeof o.indent && (o.indent = 1), - 'number' != typeof o.linesBefore && (o.linesBefore = 3), - 'number' != typeof o.linesAfter && (o.linesAfter = 2)); - for (var i, u = /\r?\n|\r|\0/g, _ = [0], w = [], x = -1; (i = u.exec(s.buffer)); ) - (w.push(i.index), - _.push(i.index + i[0].length), - s.position <= i.index && x < 0 && (x = _.length - 2)); - x < 0 && (x = _.length - 1); - var C, - j, - L = '', - B = Math.min(s.line + o.linesAfter, w.length).toString().length, - $ = o.maxLength - (o.indent + B + 3); - for (C = 1; C <= o.linesBefore && !(x - C < 0); C++) - ((j = getLine(s.buffer, _[x - C], w[x - C], s.position - (_[x] - _[x - C]), $)), - (L = - tr.repeat(' ', o.indent) + - padStart((s.line - C + 1).toString(), B) + - ' | ' + - j.str + - '\n' + - L)); - for ( - j = getLine(s.buffer, _[x], w[x], s.position, $), - L += - tr.repeat(' ', o.indent) + - padStart((s.line + 1).toString(), B) + - ' | ' + - j.str + - '\n', - L += tr.repeat('-', o.indent + B + 3 + j.pos) + '^\n', - C = 1; - C <= o.linesAfter && !(x + C >= w.length); - C++ - ) - ((j = getLine(s.buffer, _[x + C], w[x + C], s.position - (_[x] - _[x + C]), $)), - (L += - tr.repeat(' ', o.indent) + - padStart((s.line + C + 1).toString(), B) + - ' | ' + - j.str + - '\n')); - return L.replace(/\n$/, ''); - }, - sr = [ - 'kind', - 'multi', - 'resolve', - 'construct', - 'instanceOf', - 'predicate', - 'represent', - 'representName', - 'defaultStyle', - 'styleAliases' - ], - ir = ['scalar', 'sequence', 'mapping']; - var ar = function Type$1(s, o) { - if ( - ((o = o || {}), - Object.keys(o).forEach(function (o) { - if (-1 === sr.indexOf(o)) - throw new rr( - 'Unknown option "' + o + '" is met in definition of "' + s + '" YAML type.' - ); - }), - (this.options = o), - (this.tag = s), - (this.kind = o.kind || null), - (this.resolve = - o.resolve || - function () { - return !0; - }), - (this.construct = - o.construct || - function (s) { - return s; - }), - (this.instanceOf = o.instanceOf || null), - (this.predicate = o.predicate || null), - (this.represent = o.represent || null), - (this.representName = o.representName || null), - (this.defaultStyle = o.defaultStyle || null), - (this.multi = o.multi || !1), - (this.styleAliases = (function compileStyleAliases(s) { - var o = {}; - return ( - null !== s && - Object.keys(s).forEach(function (i) { - s[i].forEach(function (s) { - o[String(s)] = i; - }); - }), - o - ); - })(o.styleAliases || null)), - -1 === ir.indexOf(this.kind)) - ) - throw new rr( - 'Unknown kind "' + this.kind + '" is specified for "' + s + '" YAML type.' - ); - }; - function compileList(s, o) { - var i = []; - return ( - s[o].forEach(function (s) { - var o = i.length; - (i.forEach(function (i, u) { - i.tag === s.tag && i.kind === s.kind && i.multi === s.multi && (o = u); - }), - (i[o] = s)); - }), - i - ); - } - function Schema$1(s) { - return this.extend(s); - } - Schema$1.prototype.extend = function extend(s) { - var o = [], - i = []; - if (s instanceof ar) i.push(s); - else if (Array.isArray(s)) i = i.concat(s); - else { - if (!s || (!Array.isArray(s.implicit) && !Array.isArray(s.explicit))) - throw new rr( - 'Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })' - ); - (s.implicit && (o = o.concat(s.implicit)), s.explicit && (i = i.concat(s.explicit))); - } - (o.forEach(function (s) { - if (!(s instanceof ar)) - throw new rr( - 'Specified list of YAML types (or a single Type object) contains a non-Type object.' - ); - if (s.loadKind && 'scalar' !== s.loadKind) - throw new rr( - 'There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.' - ); - if (s.multi) - throw new rr( - 'There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.' - ); - }), - i.forEach(function (s) { - if (!(s instanceof ar)) - throw new rr( - 'Specified list of YAML types (or a single Type object) contains a non-Type object.' - ); - })); - var u = Object.create(Schema$1.prototype); - return ( - (u.implicit = (this.implicit || []).concat(o)), - (u.explicit = (this.explicit || []).concat(i)), - (u.compiledImplicit = compileList(u, 'implicit')), - (u.compiledExplicit = compileList(u, 'explicit')), - (u.compiledTypeMap = (function compileMap() { - var s, - o, - i = { - scalar: {}, - sequence: {}, - mapping: {}, - fallback: {}, - multi: { scalar: [], sequence: [], mapping: [], fallback: [] } - }; - function collectType(s) { - s.multi - ? (i.multi[s.kind].push(s), i.multi.fallback.push(s)) - : (i[s.kind][s.tag] = i.fallback[s.tag] = s); - } - for (s = 0, o = arguments.length; s < o; s += 1) arguments[s].forEach(collectType); - return i; - })(u.compiledImplicit, u.compiledExplicit)), - u - ); - }; - var lr = Schema$1, - cr = new ar('tag:yaml.org,2002:str', { - kind: 'scalar', - construct: function (s) { - return null !== s ? s : ''; - } - }), - ur = new ar('tag:yaml.org,2002:seq', { - kind: 'sequence', - construct: function (s) { - return null !== s ? s : []; - } - }), - pr = new ar('tag:yaml.org,2002:map', { - kind: 'mapping', - construct: function (s) { - return null !== s ? s : {}; - } - }), - dr = new lr({ explicit: [cr, ur, pr] }); - var fr = new ar('tag:yaml.org,2002:null', { - kind: 'scalar', - resolve: function resolveYamlNull(s) { - if (null === s) return !0; - var o = s.length; - return ( - (1 === o && '~' === s) || (4 === o && ('null' === s || 'Null' === s || 'NULL' === s)) - ); - }, - construct: function constructYamlNull() { - return null; - }, - predicate: function isNull(s) { - return null === s; - }, - represent: { - canonical: function () { - return '~'; - }, - lowercase: function () { - return 'null'; - }, - uppercase: function () { - return 'NULL'; - }, - camelcase: function () { - return 'Null'; - }, - empty: function () { - return ''; - } - }, - defaultStyle: 'lowercase' - }); - var mr = new ar('tag:yaml.org,2002:bool', { - kind: 'scalar', - resolve: function resolveYamlBoolean(s) { - if (null === s) return !1; - var o = s.length; - return ( - (4 === o && ('true' === s || 'True' === s || 'TRUE' === s)) || - (5 === o && ('false' === s || 'False' === s || 'FALSE' === s)) - ); - }, - construct: function constructYamlBoolean(s) { - return 'true' === s || 'True' === s || 'TRUE' === s; - }, - predicate: function isBoolean(s) { - return '[object Boolean]' === Object.prototype.toString.call(s); - }, - represent: { - lowercase: function (s) { - return s ? 'true' : 'false'; - }, - uppercase: function (s) { - return s ? 'TRUE' : 'FALSE'; - }, - camelcase: function (s) { - return s ? 'True' : 'False'; - } - }, - defaultStyle: 'lowercase' - }); - function isOctCode(s) { - return 48 <= s && s <= 55; - } - function isDecCode(s) { - return 48 <= s && s <= 57; - } - var gr = new ar('tag:yaml.org,2002:int', { - kind: 'scalar', - resolve: function resolveYamlInteger(s) { - if (null === s) return !1; - var o, - i, - u = s.length, - _ = 0, - w = !1; - if (!u) return !1; - if ((('-' !== (o = s[_]) && '+' !== o) || (o = s[++_]), '0' === o)) { - if (_ + 1 === u) return !0; - if ('b' === (o = s[++_])) { - for (_++; _ < u; _++) - if ('_' !== (o = s[_])) { - if ('0' !== o && '1' !== o) return !1; - w = !0; - } - return w && '_' !== o; - } - if ('x' === o) { - for (_++; _ < u; _++) - if ('_' !== (o = s[_])) { - if ( - !( - (48 <= (i = s.charCodeAt(_)) && i <= 57) || - (65 <= i && i <= 70) || - (97 <= i && i <= 102) - ) - ) - return !1; - w = !0; - } - return w && '_' !== o; - } - if ('o' === o) { - for (_++; _ < u; _++) - if ('_' !== (o = s[_])) { - if (!isOctCode(s.charCodeAt(_))) return !1; - w = !0; - } - return w && '_' !== o; - } - } - if ('_' === o) return !1; - for (; _ < u; _++) - if ('_' !== (o = s[_])) { - if (!isDecCode(s.charCodeAt(_))) return !1; - w = !0; - } - return !(!w || '_' === o); - }, - construct: function constructYamlInteger(s) { - var o, - i = s, - u = 1; - if ( - (-1 !== i.indexOf('_') && (i = i.replace(/_/g, '')), - ('-' !== (o = i[0]) && '+' !== o) || - ('-' === o && (u = -1), (o = (i = i.slice(1))[0])), - '0' === i) - ) - return 0; - if ('0' === o) { - if ('b' === i[1]) return u * parseInt(i.slice(2), 2); - if ('x' === i[1]) return u * parseInt(i.slice(2), 16); - if ('o' === i[1]) return u * parseInt(i.slice(2), 8); - } - return u * parseInt(i, 10); - }, - predicate: function isInteger(s) { - return ( - '[object Number]' === Object.prototype.toString.call(s) && - s % 1 == 0 && - !tr.isNegativeZero(s) - ); - }, - represent: { - binary: function (s) { - return s >= 0 ? '0b' + s.toString(2) : '-0b' + s.toString(2).slice(1); - }, - octal: function (s) { - return s >= 0 ? '0o' + s.toString(8) : '-0o' + s.toString(8).slice(1); - }, - decimal: function (s) { - return s.toString(10); - }, - hexadecimal: function (s) { - return s >= 0 - ? '0x' + s.toString(16).toUpperCase() - : '-0x' + s.toString(16).toUpperCase().slice(1); - } - }, - defaultStyle: 'decimal', - styleAliases: { - binary: [2, 'bin'], - octal: [8, 'oct'], - decimal: [10, 'dec'], - hexadecimal: [16, 'hex'] - } - }), - yr = new RegExp( - '^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$' - ); - var vr = /^[-+]?[0-9]+e/; - var br = new ar('tag:yaml.org,2002:float', { - kind: 'scalar', - resolve: function resolveYamlFloat(s) { - return null !== s && !(!yr.test(s) || '_' === s[s.length - 1]); - }, - construct: function constructYamlFloat(s) { - var o, i; - return ( - (i = '-' === (o = s.replace(/_/g, '').toLowerCase())[0] ? -1 : 1), - '+-'.indexOf(o[0]) >= 0 && (o = o.slice(1)), - '.inf' === o - ? 1 === i - ? Number.POSITIVE_INFINITY - : Number.NEGATIVE_INFINITY - : '.nan' === o - ? NaN - : i * parseFloat(o, 10) - ); - }, - predicate: function isFloat(s) { - return ( - '[object Number]' === Object.prototype.toString.call(s) && - (s % 1 != 0 || tr.isNegativeZero(s)) - ); - }, - represent: function representYamlFloat(s, o) { - var i; - if (isNaN(s)) - switch (o) { - case 'lowercase': - return '.nan'; - case 'uppercase': - return '.NAN'; - case 'camelcase': - return '.NaN'; - } - else if (Number.POSITIVE_INFINITY === s) - switch (o) { - case 'lowercase': - return '.inf'; - case 'uppercase': - return '.INF'; - case 'camelcase': - return '.Inf'; - } - else if (Number.NEGATIVE_INFINITY === s) - switch (o) { - case 'lowercase': - return '-.inf'; - case 'uppercase': - return '-.INF'; - case 'camelcase': - return '-.Inf'; - } - else if (tr.isNegativeZero(s)) return '-0.0'; - return ((i = s.toString(10)), vr.test(i) ? i.replace('e', '.e') : i); - }, - defaultStyle: 'lowercase' - }), - _r = dr.extend({ implicit: [fr, mr, gr, br] }), - Er = _r, - wr = new RegExp('^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$'), - Sr = new RegExp( - '^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$' - ); - var xr = new ar('tag:yaml.org,2002:timestamp', { - kind: 'scalar', - resolve: function resolveYamlTimestamp(s) { - return null !== s && (null !== wr.exec(s) || null !== Sr.exec(s)); - }, - construct: function constructYamlTimestamp(s) { - var o, - i, - u, - _, - w, - x, - C, - j, - L = 0, - B = null; - if ((null === (o = wr.exec(s)) && (o = Sr.exec(s)), null === o)) - throw new Error('Date resolve error'); - if (((i = +o[1]), (u = +o[2] - 1), (_ = +o[3]), !o[4])) - return new Date(Date.UTC(i, u, _)); - if (((w = +o[4]), (x = +o[5]), (C = +o[6]), o[7])) { - for (L = o[7].slice(0, 3); L.length < 3; ) L += '0'; - L = +L; - } - return ( - o[9] && ((B = 6e4 * (60 * +o[10] + +(o[11] || 0))), '-' === o[9] && (B = -B)), - (j = new Date(Date.UTC(i, u, _, w, x, C, L))), - B && j.setTime(j.getTime() - B), - j - ); - }, - instanceOf: Date, - represent: function representYamlTimestamp(s) { - return s.toISOString(); - } - }); - var kr = new ar('tag:yaml.org,2002:merge', { - kind: 'scalar', - resolve: function resolveYamlMerge(s) { - return '<<' === s || null === s; - } - }), - Cr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r'; - var Or = new ar('tag:yaml.org,2002:binary', { - kind: 'scalar', - resolve: function resolveYamlBinary(s) { - if (null === s) return !1; - var o, - i, - u = 0, - _ = s.length, - w = Cr; - for (i = 0; i < _; i++) - if (!((o = w.indexOf(s.charAt(i))) > 64)) { - if (o < 0) return !1; - u += 6; - } - return u % 8 == 0; - }, - construct: function constructYamlBinary(s) { - var o, - i, - u = s.replace(/[\r\n=]/g, ''), - _ = u.length, - w = Cr, - x = 0, - C = []; - for (o = 0; o < _; o++) - (o % 4 == 0 && - o && - (C.push((x >> 16) & 255), C.push((x >> 8) & 255), C.push(255 & x)), - (x = (x << 6) | w.indexOf(u.charAt(o)))); - return ( - 0 === (i = (_ % 4) * 6) - ? (C.push((x >> 16) & 255), C.push((x >> 8) & 255), C.push(255 & x)) - : 18 === i - ? (C.push((x >> 10) & 255), C.push((x >> 2) & 255)) - : 12 === i && C.push((x >> 4) & 255), - new Uint8Array(C) - ); - }, - predicate: function isBinary(s) { - return '[object Uint8Array]' === Object.prototype.toString.call(s); - }, - represent: function representYamlBinary(s) { - var o, - i, - u = '', - _ = 0, - w = s.length, - x = Cr; - for (o = 0; o < w; o++) - (o % 3 == 0 && - o && - ((u += x[(_ >> 18) & 63]), - (u += x[(_ >> 12) & 63]), - (u += x[(_ >> 6) & 63]), - (u += x[63 & _])), - (_ = (_ << 8) + s[o])); - return ( - 0 === (i = w % 3) - ? ((u += x[(_ >> 18) & 63]), - (u += x[(_ >> 12) & 63]), - (u += x[(_ >> 6) & 63]), - (u += x[63 & _])) - : 2 === i - ? ((u += x[(_ >> 10) & 63]), - (u += x[(_ >> 4) & 63]), - (u += x[(_ << 2) & 63]), - (u += x[64])) - : 1 === i && - ((u += x[(_ >> 2) & 63]), - (u += x[(_ << 4) & 63]), - (u += x[64]), - (u += x[64])), - u - ); - } - }), - Ar = Object.prototype.hasOwnProperty, - jr = Object.prototype.toString; - var Ir = new ar('tag:yaml.org,2002:omap', { - kind: 'sequence', - resolve: function resolveYamlOmap(s) { - if (null === s) return !0; - var o, - i, - u, - _, - w, - x = [], - C = s; - for (o = 0, i = C.length; o < i; o += 1) { - if (((u = C[o]), (w = !1), '[object Object]' !== jr.call(u))) return !1; - for (_ in u) - if (Ar.call(u, _)) { - if (w) return !1; - w = !0; - } - if (!w) return !1; - if (-1 !== x.indexOf(_)) return !1; - x.push(_); - } - return !0; - }, - construct: function constructYamlOmap(s) { - return null !== s ? s : []; - } - }), - Pr = Object.prototype.toString; - var Mr = new ar('tag:yaml.org,2002:pairs', { - kind: 'sequence', - resolve: function resolveYamlPairs(s) { - if (null === s) return !0; - var o, - i, - u, - _, - w, - x = s; - for (w = new Array(x.length), o = 0, i = x.length; o < i; o += 1) { - if (((u = x[o]), '[object Object]' !== Pr.call(u))) return !1; - if (1 !== (_ = Object.keys(u)).length) return !1; - w[o] = [_[0], u[_[0]]]; - } - return !0; - }, - construct: function constructYamlPairs(s) { - if (null === s) return []; - var o, - i, - u, - _, - w, - x = s; - for (w = new Array(x.length), o = 0, i = x.length; o < i; o += 1) - ((u = x[o]), (_ = Object.keys(u)), (w[o] = [_[0], u[_[0]]])); - return w; - } - }), - Tr = Object.prototype.hasOwnProperty; - var Nr = new ar('tag:yaml.org,2002:set', { - kind: 'mapping', - resolve: function resolveYamlSet(s) { - if (null === s) return !0; - var o, - i = s; - for (o in i) if (Tr.call(i, o) && null !== i[o]) return !1; - return !0; - }, - construct: function constructYamlSet(s) { - return null !== s ? s : {}; - } - }), - Rr = Er.extend({ implicit: [xr, kr], explicit: [Or, Ir, Mr, Nr] }), - Dr = Object.prototype.hasOwnProperty, - Lr = - /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/, - Br = /[\x85\u2028\u2029]/, - Fr = /[,\[\]\{\}]/, - qr = /^(?:!|!!|![a-z\-]+!)$/i, - $r = /^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i; - function _class(s) { - return Object.prototype.toString.call(s); - } - function is_EOL(s) { - return 10 === s || 13 === s; - } - function is_WHITE_SPACE(s) { - return 9 === s || 32 === s; - } - function is_WS_OR_EOL(s) { - return 9 === s || 32 === s || 10 === s || 13 === s; - } - function is_FLOW_INDICATOR(s) { - return 44 === s || 91 === s || 93 === s || 123 === s || 125 === s; - } - function fromHexCode(s) { - var o; - return 48 <= s && s <= 57 ? s - 48 : 97 <= (o = 32 | s) && o <= 102 ? o - 97 + 10 : -1; - } - function simpleEscapeSequence(s) { - return 48 === s - ? '\0' - : 97 === s - ? '' - : 98 === s - ? '\b' - : 116 === s || 9 === s - ? '\t' - : 110 === s - ? '\n' - : 118 === s - ? '\v' - : 102 === s - ? '\f' - : 114 === s - ? '\r' - : 101 === s - ? '' - : 32 === s - ? ' ' - : 34 === s - ? '"' - : 47 === s - ? '/' - : 92 === s - ? '\\' - : 78 === s - ? '…' - : 95 === s - ? ' ' - : 76 === s - ? '\u2028' - : 80 === s - ? '\u2029' - : ''; - } - function charFromCodepoint(s) { - return s <= 65535 - ? String.fromCharCode(s) - : String.fromCharCode(55296 + ((s - 65536) >> 10), 56320 + ((s - 65536) & 1023)); - } - for (var Vr = new Array(256), Ur = new Array(256), zr = 0; zr < 256; zr++) - ((Vr[zr] = simpleEscapeSequence(zr) ? 1 : 0), (Ur[zr] = simpleEscapeSequence(zr))); - function State$1(s, o) { - ((this.input = s), - (this.filename = o.filename || null), - (this.schema = o.schema || Rr), - (this.onWarning = o.onWarning || null), - (this.legacy = o.legacy || !1), - (this.json = o.json || !1), - (this.listener = o.listener || null), - (this.implicitTypes = this.schema.compiledImplicit), - (this.typeMap = this.schema.compiledTypeMap), - (this.length = s.length), - (this.position = 0), - (this.line = 0), - (this.lineStart = 0), - (this.lineIndent = 0), - (this.firstTabInLine = -1), - (this.documents = [])); - } - function generateError(s, o) { - var i = { - name: s.filename, - buffer: s.input.slice(0, -1), - position: s.position, - line: s.line, - column: s.position - s.lineStart - }; - return ((i.snippet = nr(i)), new rr(o, i)); - } - function throwError(s, o) { - throw generateError(s, o); - } - function throwWarning(s, o) { - s.onWarning && s.onWarning.call(null, generateError(s, o)); - } - var Wr = { - YAML: function handleYamlDirective(s, o, i) { - var u, _, w; - (null !== s.version && throwError(s, 'duplication of %YAML directive'), - 1 !== i.length && throwError(s, 'YAML directive accepts exactly one argument'), - null === (u = /^([0-9]+)\.([0-9]+)$/.exec(i[0])) && - throwError(s, 'ill-formed argument of the YAML directive'), - (_ = parseInt(u[1], 10)), - (w = parseInt(u[2], 10)), - 1 !== _ && throwError(s, 'unacceptable YAML version of the document'), - (s.version = i[0]), - (s.checkLineBreaks = w < 2), - 1 !== w && 2 !== w && throwWarning(s, 'unsupported YAML version of the document')); - }, - TAG: function handleTagDirective(s, o, i) { - var u, _; - (2 !== i.length && throwError(s, 'TAG directive accepts exactly two arguments'), - (u = i[0]), - (_ = i[1]), - qr.test(u) || - throwError(s, 'ill-formed tag handle (first argument) of the TAG directive'), - Dr.call(s.tagMap, u) && - throwError(s, 'there is a previously declared suffix for "' + u + '" tag handle'), - $r.test(_) || - throwError(s, 'ill-formed tag prefix (second argument) of the TAG directive')); - try { - _ = decodeURIComponent(_); - } catch (o) { - throwError(s, 'tag prefix is malformed: ' + _); - } - s.tagMap[u] = _; - } - }; - function captureSegment(s, o, i, u) { - var _, w, x, C; - if (o < i) { - if (((C = s.input.slice(o, i)), u)) - for (_ = 0, w = C.length; _ < w; _ += 1) - 9 === (x = C.charCodeAt(_)) || - (32 <= x && x <= 1114111) || - throwError(s, 'expected valid JSON character'); - else Lr.test(C) && throwError(s, 'the stream contains non-printable characters'); - s.result += C; - } - } - function mergeMappings(s, o, i, u) { - var _, w, x, C; - for ( - tr.isObject(i) || - throwError(s, 'cannot merge mappings; the provided source object is unacceptable'), - x = 0, - C = (_ = Object.keys(i)).length; - x < C; - x += 1 - ) - ((w = _[x]), Dr.call(o, w) || ((o[w] = i[w]), (u[w] = !0))); - } - function storeMappingPair(s, o, i, u, _, w, x, C, j) { - var L, B; - if (Array.isArray(_)) - for (L = 0, B = (_ = Array.prototype.slice.call(_)).length; L < B; L += 1) - (Array.isArray(_[L]) && throwError(s, 'nested arrays are not supported inside keys'), - 'object' == typeof _ && - '[object Object]' === _class(_[L]) && - (_[L] = '[object Object]')); - if ( - ('object' == typeof _ && '[object Object]' === _class(_) && (_ = '[object Object]'), - (_ = String(_)), - null === o && (o = {}), - 'tag:yaml.org,2002:merge' === u) - ) - if (Array.isArray(w)) - for (L = 0, B = w.length; L < B; L += 1) mergeMappings(s, o, w[L], i); - else mergeMappings(s, o, w, i); - else - (s.json || - Dr.call(i, _) || - !Dr.call(o, _) || - ((s.line = x || s.line), - (s.lineStart = C || s.lineStart), - (s.position = j || s.position), - throwError(s, 'duplicated mapping key')), - '__proto__' === _ - ? Object.defineProperty(o, _, { - configurable: !0, - enumerable: !0, - writable: !0, - value: w - }) - : (o[_] = w), - delete i[_]); - return o; - } - function readLineBreak(s) { - var o; - (10 === (o = s.input.charCodeAt(s.position)) - ? s.position++ - : 13 === o - ? (s.position++, 10 === s.input.charCodeAt(s.position) && s.position++) - : throwError(s, 'a line break is expected'), - (s.line += 1), - (s.lineStart = s.position), - (s.firstTabInLine = -1)); - } - function skipSeparationSpace(s, o, i) { - for (var u = 0, _ = s.input.charCodeAt(s.position); 0 !== _; ) { - for (; is_WHITE_SPACE(_); ) - (9 === _ && -1 === s.firstTabInLine && (s.firstTabInLine = s.position), - (_ = s.input.charCodeAt(++s.position))); - if (o && 35 === _) - do { - _ = s.input.charCodeAt(++s.position); - } while (10 !== _ && 13 !== _ && 0 !== _); - if (!is_EOL(_)) break; - for ( - readLineBreak(s), _ = s.input.charCodeAt(s.position), u++, s.lineIndent = 0; - 32 === _; - ) - (s.lineIndent++, (_ = s.input.charCodeAt(++s.position))); - } - return ( - -1 !== i && 0 !== u && s.lineIndent < i && throwWarning(s, 'deficient indentation'), - u - ); - } - function testDocumentSeparator(s) { - var o, - i = s.position; - return !( - (45 !== (o = s.input.charCodeAt(i)) && 46 !== o) || - o !== s.input.charCodeAt(i + 1) || - o !== s.input.charCodeAt(i + 2) || - ((i += 3), 0 !== (o = s.input.charCodeAt(i)) && !is_WS_OR_EOL(o)) - ); - } - function writeFoldedLines(s, o) { - 1 === o ? (s.result += ' ') : o > 1 && (s.result += tr.repeat('\n', o - 1)); - } - function readBlockSequence(s, o) { - var i, - u, - _ = s.tag, - w = s.anchor, - x = [], - C = !1; - if (-1 !== s.firstTabInLine) return !1; - for ( - null !== s.anchor && (s.anchorMap[s.anchor] = x), u = s.input.charCodeAt(s.position); - 0 !== u && - (-1 !== s.firstTabInLine && - ((s.position = s.firstTabInLine), - throwError(s, 'tab characters must not be used in indentation')), - 45 === u) && - is_WS_OR_EOL(s.input.charCodeAt(s.position + 1)); - ) - if (((C = !0), s.position++, skipSeparationSpace(s, !0, -1) && s.lineIndent <= o)) - (x.push(null), (u = s.input.charCodeAt(s.position))); - else if ( - ((i = s.line), - composeNode(s, o, 3, !1, !0), - x.push(s.result), - skipSeparationSpace(s, !0, -1), - (u = s.input.charCodeAt(s.position)), - (s.line === i || s.lineIndent > o) && 0 !== u) - ) - throwError(s, 'bad indentation of a sequence entry'); - else if (s.lineIndent < o) break; - return !!C && ((s.tag = _), (s.anchor = w), (s.kind = 'sequence'), (s.result = x), !0); - } - function readTagProperty(s) { - var o, - i, - u, - _, - w = !1, - x = !1; - if (33 !== (_ = s.input.charCodeAt(s.position))) return !1; - if ( - (null !== s.tag && throwError(s, 'duplication of a tag property'), - 60 === (_ = s.input.charCodeAt(++s.position)) - ? ((w = !0), (_ = s.input.charCodeAt(++s.position))) - : 33 === _ - ? ((x = !0), (i = '!!'), (_ = s.input.charCodeAt(++s.position))) - : (i = '!'), - (o = s.position), - w) - ) { - do { - _ = s.input.charCodeAt(++s.position); - } while (0 !== _ && 62 !== _); - s.position < s.length - ? ((u = s.input.slice(o, s.position)), (_ = s.input.charCodeAt(++s.position))) - : throwError(s, 'unexpected end of the stream within a verbatim tag'); - } else { - for (; 0 !== _ && !is_WS_OR_EOL(_); ) - (33 === _ && - (x - ? throwError(s, 'tag suffix cannot contain exclamation marks') - : ((i = s.input.slice(o - 1, s.position + 1)), - qr.test(i) || throwError(s, 'named tag handle cannot contain such characters'), - (x = !0), - (o = s.position + 1))), - (_ = s.input.charCodeAt(++s.position))); - ((u = s.input.slice(o, s.position)), - Fr.test(u) && throwError(s, 'tag suffix cannot contain flow indicator characters')); - } - u && !$r.test(u) && throwError(s, 'tag name cannot contain such characters: ' + u); - try { - u = decodeURIComponent(u); - } catch (o) { - throwError(s, 'tag name is malformed: ' + u); - } - return ( - w - ? (s.tag = u) - : Dr.call(s.tagMap, i) - ? (s.tag = s.tagMap[i] + u) - : '!' === i - ? (s.tag = '!' + u) - : '!!' === i - ? (s.tag = 'tag:yaml.org,2002:' + u) - : throwError(s, 'undeclared tag handle "' + i + '"'), - !0 - ); - } - function readAnchorProperty(s) { - var o, i; - if (38 !== (i = s.input.charCodeAt(s.position))) return !1; - for ( - null !== s.anchor && throwError(s, 'duplication of an anchor property'), - i = s.input.charCodeAt(++s.position), - o = s.position; - 0 !== i && !is_WS_OR_EOL(i) && !is_FLOW_INDICATOR(i); - ) - i = s.input.charCodeAt(++s.position); - return ( - s.position === o && - throwError(s, 'name of an anchor node must contain at least one character'), - (s.anchor = s.input.slice(o, s.position)), - !0 - ); - } - function composeNode(s, o, i, u, _) { - var w, - x, - C, - j, - L, - B, - $, - V, - U, - z = 1, - Y = !1, - Z = !1; - if ( - (null !== s.listener && s.listener('open', s), - (s.tag = null), - (s.anchor = null), - (s.kind = null), - (s.result = null), - (w = x = C = 4 === i || 3 === i), - u && - skipSeparationSpace(s, !0, -1) && - ((Y = !0), - s.lineIndent > o - ? (z = 1) - : s.lineIndent === o - ? (z = 0) - : s.lineIndent < o && (z = -1)), - 1 === z) - ) - for (; readTagProperty(s) || readAnchorProperty(s); ) - skipSeparationSpace(s, !0, -1) - ? ((Y = !0), - (C = w), - s.lineIndent > o - ? (z = 1) - : s.lineIndent === o - ? (z = 0) - : s.lineIndent < o && (z = -1)) - : (C = !1); - if ( - (C && (C = Y || _), - (1 !== z && 4 !== i) || - ((V = 1 === i || 2 === i ? o : o + 1), - (U = s.position - s.lineStart), - 1 === z - ? (C && - (readBlockSequence(s, U) || - (function readBlockMapping(s, o, i) { - var u, - _, - w, - x, - C, - j, - L, - B = s.tag, - $ = s.anchor, - V = {}, - U = Object.create(null), - z = null, - Y = null, - Z = null, - ee = !1, - ie = !1; - if (-1 !== s.firstTabInLine) return !1; - for ( - null !== s.anchor && (s.anchorMap[s.anchor] = V), - L = s.input.charCodeAt(s.position); - 0 !== L; - ) { - if ( - (ee || - -1 === s.firstTabInLine || - ((s.position = s.firstTabInLine), - throwError(s, 'tab characters must not be used in indentation')), - (u = s.input.charCodeAt(s.position + 1)), - (w = s.line), - (63 !== L && 58 !== L) || !is_WS_OR_EOL(u)) - ) { - if ( - ((x = s.line), - (C = s.lineStart), - (j = s.position), - !composeNode(s, i, 2, !1, !0)) - ) - break; - if (s.line === w) { - for (L = s.input.charCodeAt(s.position); is_WHITE_SPACE(L); ) - L = s.input.charCodeAt(++s.position); - if (58 === L) - (is_WS_OR_EOL((L = s.input.charCodeAt(++s.position))) || - throwError( - s, - 'a whitespace character is expected after the key-value separator within a block mapping' - ), - ee && - (storeMappingPair(s, V, U, z, Y, null, x, C, j), - (z = Y = Z = null)), - (ie = !0), - (ee = !1), - (_ = !1), - (z = s.tag), - (Y = s.result)); - else { - if (!ie) return ((s.tag = B), (s.anchor = $), !0); - throwError( - s, - 'can not read an implicit mapping pair; a colon is missed' - ); - } - } else { - if (!ie) return ((s.tag = B), (s.anchor = $), !0); - throwError( - s, - 'can not read a block mapping entry; a multiline key may not be an implicit key' - ); - } - } else - (63 === L - ? (ee && - (storeMappingPair(s, V, U, z, Y, null, x, C, j), - (z = Y = Z = null)), - (ie = !0), - (ee = !0), - (_ = !0)) - : ee - ? ((ee = !1), (_ = !0)) - : throwError( - s, - 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line' - ), - (s.position += 1), - (L = u)); - if ( - ((s.line === w || s.lineIndent > o) && - (ee && ((x = s.line), (C = s.lineStart), (j = s.position)), - composeNode(s, o, 4, !0, _) && (ee ? (Y = s.result) : (Z = s.result)), - ee || - (storeMappingPair(s, V, U, z, Y, Z, x, C, j), (z = Y = Z = null)), - skipSeparationSpace(s, !0, -1), - (L = s.input.charCodeAt(s.position))), - (s.line === w || s.lineIndent > o) && 0 !== L) - ) - throwError(s, 'bad indentation of a mapping entry'); - else if (s.lineIndent < o) break; - } - return ( - ee && storeMappingPair(s, V, U, z, Y, null, x, C, j), - ie && ((s.tag = B), (s.anchor = $), (s.kind = 'mapping'), (s.result = V)), - ie - ); - })(s, U, V))) || - (function readFlowCollection(s, o) { - var i, - u, - _, - w, - x, - C, - j, - L, - B, - $, - V, - U, - z = !0, - Y = s.tag, - Z = s.anchor, - ee = Object.create(null); - if (91 === (U = s.input.charCodeAt(s.position))) ((x = 93), (L = !1), (w = [])); - else { - if (123 !== U) return !1; - ((x = 125), (L = !0), (w = {})); - } - for ( - null !== s.anchor && (s.anchorMap[s.anchor] = w), - U = s.input.charCodeAt(++s.position); - 0 !== U; - ) { - if ( - (skipSeparationSpace(s, !0, o), (U = s.input.charCodeAt(s.position)) === x) - ) - return ( - s.position++, - (s.tag = Y), - (s.anchor = Z), - (s.kind = L ? 'mapping' : 'sequence'), - (s.result = w), - !0 - ); - (z - ? 44 === U && throwError(s, "expected the node content, but found ','") - : throwError(s, 'missed comma between flow collection entries'), - (V = null), - (C = j = !1), - 63 === U && - is_WS_OR_EOL(s.input.charCodeAt(s.position + 1)) && - ((C = j = !0), s.position++, skipSeparationSpace(s, !0, o)), - (i = s.line), - (u = s.lineStart), - (_ = s.position), - composeNode(s, o, 1, !1, !0), - ($ = s.tag), - (B = s.result), - skipSeparationSpace(s, !0, o), - (U = s.input.charCodeAt(s.position)), - (!j && s.line !== i) || - 58 !== U || - ((C = !0), - (U = s.input.charCodeAt(++s.position)), - skipSeparationSpace(s, !0, o), - composeNode(s, o, 1, !1, !0), - (V = s.result)), - L - ? storeMappingPair(s, w, ee, $, B, V, i, u, _) - : C - ? w.push(storeMappingPair(s, null, ee, $, B, V, i, u, _)) - : w.push(B), - skipSeparationSpace(s, !0, o), - 44 === (U = s.input.charCodeAt(s.position)) - ? ((z = !0), (U = s.input.charCodeAt(++s.position))) - : (z = !1)); - } - throwError(s, 'unexpected end of the stream within a flow collection'); - })(s, V) - ? (Z = !0) - : ((x && - (function readBlockScalar(s, o) { - var i, - u, - _, - w, - x, - C = 1, - j = !1, - L = !1, - B = o, - $ = 0, - V = !1; - if (124 === (w = s.input.charCodeAt(s.position))) u = !1; - else { - if (62 !== w) return !1; - u = !0; - } - for (s.kind = 'scalar', s.result = ''; 0 !== w; ) - if (43 === (w = s.input.charCodeAt(++s.position)) || 45 === w) - 1 === C - ? (C = 43 === w ? 3 : 2) - : throwError(s, 'repeat of a chomping mode identifier'); - else { - if (!((_ = 48 <= (x = w) && x <= 57 ? x - 48 : -1) >= 0)) break; - 0 === _ - ? throwError( - s, - 'bad explicit indentation width of a block scalar; it cannot be less than one' - ) - : L - ? throwError(s, 'repeat of an indentation width identifier') - : ((B = o + _ - 1), (L = !0)); - } - if (is_WHITE_SPACE(w)) { - do { - w = s.input.charCodeAt(++s.position); - } while (is_WHITE_SPACE(w)); - if (35 === w) - do { - w = s.input.charCodeAt(++s.position); - } while (!is_EOL(w) && 0 !== w); - } - for (; 0 !== w; ) { - for ( - readLineBreak(s), s.lineIndent = 0, w = s.input.charCodeAt(s.position); - (!L || s.lineIndent < B) && 32 === w; - ) - (s.lineIndent++, (w = s.input.charCodeAt(++s.position))); - if ((!L && s.lineIndent > B && (B = s.lineIndent), is_EOL(w))) $++; - else { - if (s.lineIndent < B) { - 3 === C - ? (s.result += tr.repeat('\n', j ? 1 + $ : $)) - : 1 === C && j && (s.result += '\n'); - break; - } - for ( - u - ? is_WHITE_SPACE(w) - ? ((V = !0), (s.result += tr.repeat('\n', j ? 1 + $ : $))) - : V - ? ((V = !1), (s.result += tr.repeat('\n', $ + 1))) - : 0 === $ - ? j && (s.result += ' ') - : (s.result += tr.repeat('\n', $)) - : (s.result += tr.repeat('\n', j ? 1 + $ : $)), - j = !0, - L = !0, - $ = 0, - i = s.position; - !is_EOL(w) && 0 !== w; - ) - w = s.input.charCodeAt(++s.position); - captureSegment(s, i, s.position, !1); - } - } - return !0; - })(s, V)) || - (function readSingleQuotedScalar(s, o) { - var i, u, _; - if (39 !== (i = s.input.charCodeAt(s.position))) return !1; - for ( - s.kind = 'scalar', s.result = '', s.position++, u = _ = s.position; - 0 !== (i = s.input.charCodeAt(s.position)); - ) - if (39 === i) { - if ( - (captureSegment(s, u, s.position, !0), - 39 !== (i = s.input.charCodeAt(++s.position))) - ) - return !0; - ((u = s.position), s.position++, (_ = s.position)); - } else - is_EOL(i) - ? (captureSegment(s, u, _, !0), - writeFoldedLines(s, skipSeparationSpace(s, !1, o)), - (u = _ = s.position)) - : s.position === s.lineStart && testDocumentSeparator(s) - ? throwError( - s, - 'unexpected end of the document within a single quoted scalar' - ) - : (s.position++, (_ = s.position)); - throwError(s, 'unexpected end of the stream within a single quoted scalar'); - })(s, V) || - (function readDoubleQuotedScalar(s, o) { - var i, u, _, w, x, C, j; - if (34 !== (C = s.input.charCodeAt(s.position))) return !1; - for ( - s.kind = 'scalar', s.result = '', s.position++, i = u = s.position; - 0 !== (C = s.input.charCodeAt(s.position)); - ) { - if (34 === C) - return (captureSegment(s, i, s.position, !0), s.position++, !0); - if (92 === C) { - if ( - (captureSegment(s, i, s.position, !0), - is_EOL((C = s.input.charCodeAt(++s.position)))) - ) - skipSeparationSpace(s, !1, o); - else if (C < 256 && Vr[C]) ((s.result += Ur[C]), s.position++); - else if ( - (x = 120 === (j = C) ? 2 : 117 === j ? 4 : 85 === j ? 8 : 0) > 0 - ) { - for (_ = x, w = 0; _ > 0; _--) - (x = fromHexCode((C = s.input.charCodeAt(++s.position)))) >= 0 - ? (w = (w << 4) + x) - : throwError(s, 'expected hexadecimal character'); - ((s.result += charFromCodepoint(w)), s.position++); - } else throwError(s, 'unknown escape sequence'); - i = u = s.position; - } else - is_EOL(C) - ? (captureSegment(s, i, u, !0), - writeFoldedLines(s, skipSeparationSpace(s, !1, o)), - (i = u = s.position)) - : s.position === s.lineStart && testDocumentSeparator(s) - ? throwError( - s, - 'unexpected end of the document within a double quoted scalar' - ) - : (s.position++, (u = s.position)); - } - throwError(s, 'unexpected end of the stream within a double quoted scalar'); - })(s, V) - ? (Z = !0) - : !(function readAlias(s) { - var o, i, u; - if (42 !== (u = s.input.charCodeAt(s.position))) return !1; - for ( - u = s.input.charCodeAt(++s.position), o = s.position; - 0 !== u && !is_WS_OR_EOL(u) && !is_FLOW_INDICATOR(u); - ) - u = s.input.charCodeAt(++s.position); - return ( - s.position === o && - throwError( - s, - 'name of an alias node must contain at least one character' - ), - (i = s.input.slice(o, s.position)), - Dr.call(s.anchorMap, i) || - throwError(s, 'unidentified alias "' + i + '"'), - (s.result = s.anchorMap[i]), - skipSeparationSpace(s, !0, -1), - !0 - ); - })(s) - ? (function readPlainScalar(s, o, i) { - var u, - _, - w, - x, - C, - j, - L, - B, - $ = s.kind, - V = s.result; - if ( - is_WS_OR_EOL((B = s.input.charCodeAt(s.position))) || - is_FLOW_INDICATOR(B) || - 35 === B || - 38 === B || - 42 === B || - 33 === B || - 124 === B || - 62 === B || - 39 === B || - 34 === B || - 37 === B || - 64 === B || - 96 === B - ) - return !1; - if ( - (63 === B || 45 === B) && - (is_WS_OR_EOL((u = s.input.charCodeAt(s.position + 1))) || - (i && is_FLOW_INDICATOR(u))) - ) - return !1; - for ( - s.kind = 'scalar', s.result = '', _ = w = s.position, x = !1; - 0 !== B; - ) { - if (58 === B) { - if ( - is_WS_OR_EOL((u = s.input.charCodeAt(s.position + 1))) || - (i && is_FLOW_INDICATOR(u)) - ) - break; - } else if (35 === B) { - if (is_WS_OR_EOL(s.input.charCodeAt(s.position - 1))) break; - } else { - if ( - (s.position === s.lineStart && testDocumentSeparator(s)) || - (i && is_FLOW_INDICATOR(B)) - ) - break; - if (is_EOL(B)) { - if ( - ((C = s.line), - (j = s.lineStart), - (L = s.lineIndent), - skipSeparationSpace(s, !1, -1), - s.lineIndent >= o) - ) { - ((x = !0), (B = s.input.charCodeAt(s.position))); - continue; - } - ((s.position = w), - (s.line = C), - (s.lineStart = j), - (s.lineIndent = L)); - break; - } - } - (x && - (captureSegment(s, _, w, !1), - writeFoldedLines(s, s.line - C), - (_ = w = s.position), - (x = !1)), - is_WHITE_SPACE(B) || (w = s.position + 1), - (B = s.input.charCodeAt(++s.position))); - } - return ( - captureSegment(s, _, w, !1), - !!s.result || ((s.kind = $), (s.result = V), !1) - ); - })(s, V, 1 === i) && ((Z = !0), null === s.tag && (s.tag = '?')) - : ((Z = !0), - (null === s.tag && null === s.anchor) || - throwError(s, 'alias node should not have any properties')), - null !== s.anchor && (s.anchorMap[s.anchor] = s.result)) - : 0 === z && (Z = C && readBlockSequence(s, U))), - null === s.tag) - ) - null !== s.anchor && (s.anchorMap[s.anchor] = s.result); - else if ('?' === s.tag) { - for ( - null !== s.result && - 'scalar' !== s.kind && - throwError( - s, - 'unacceptable node kind for ! tag; it should be "scalar", not "' + s.kind + '"' - ), - j = 0, - L = s.implicitTypes.length; - j < L; - j += 1 - ) - if (($ = s.implicitTypes[j]).resolve(s.result)) { - ((s.result = $.construct(s.result)), - (s.tag = $.tag), - null !== s.anchor && (s.anchorMap[s.anchor] = s.result)); - break; - } - } else if ('!' !== s.tag) { - if (Dr.call(s.typeMap[s.kind || 'fallback'], s.tag)) - $ = s.typeMap[s.kind || 'fallback'][s.tag]; - else - for ( - $ = null, j = 0, L = (B = s.typeMap.multi[s.kind || 'fallback']).length; - j < L; - j += 1 - ) - if (s.tag.slice(0, B[j].tag.length) === B[j].tag) { - $ = B[j]; - break; - } - ($ || throwError(s, 'unknown tag !<' + s.tag + '>'), - null !== s.result && - $.kind !== s.kind && - throwError( - s, - 'unacceptable node kind for !<' + - s.tag + - '> tag; it should be "' + - $.kind + - '", not "' + - s.kind + - '"' - ), - $.resolve(s.result, s.tag) - ? ((s.result = $.construct(s.result, s.tag)), - null !== s.anchor && (s.anchorMap[s.anchor] = s.result)) - : throwError(s, 'cannot resolve a node with !<' + s.tag + '> explicit tag')); - } - return ( - null !== s.listener && s.listener('close', s), - null !== s.tag || null !== s.anchor || Z - ); - } - function readDocument(s) { - var o, - i, - u, - _, - w = s.position, - x = !1; - for ( - s.version = null, - s.checkLineBreaks = s.legacy, - s.tagMap = Object.create(null), - s.anchorMap = Object.create(null); - 0 !== (_ = s.input.charCodeAt(s.position)) && - (skipSeparationSpace(s, !0, -1), - (_ = s.input.charCodeAt(s.position)), - !(s.lineIndent > 0 || 37 !== _)); - ) { - for ( - x = !0, _ = s.input.charCodeAt(++s.position), o = s.position; - 0 !== _ && !is_WS_OR_EOL(_); - ) - _ = s.input.charCodeAt(++s.position); - for ( - u = [], - (i = s.input.slice(o, s.position)).length < 1 && - throwError(s, 'directive name must not be less than one character in length'); - 0 !== _; - ) { - for (; is_WHITE_SPACE(_); ) _ = s.input.charCodeAt(++s.position); - if (35 === _) { - do { - _ = s.input.charCodeAt(++s.position); - } while (0 !== _ && !is_EOL(_)); - break; - } - if (is_EOL(_)) break; - for (o = s.position; 0 !== _ && !is_WS_OR_EOL(_); ) - _ = s.input.charCodeAt(++s.position); - u.push(s.input.slice(o, s.position)); - } - (0 !== _ && readLineBreak(s), - Dr.call(Wr, i) - ? Wr[i](s, i, u) - : throwWarning(s, 'unknown document directive "' + i + '"')); - } - (skipSeparationSpace(s, !0, -1), - 0 === s.lineIndent && - 45 === s.input.charCodeAt(s.position) && - 45 === s.input.charCodeAt(s.position + 1) && - 45 === s.input.charCodeAt(s.position + 2) - ? ((s.position += 3), skipSeparationSpace(s, !0, -1)) - : x && throwError(s, 'directives end mark is expected'), - composeNode(s, s.lineIndent - 1, 4, !1, !0), - skipSeparationSpace(s, !0, -1), - s.checkLineBreaks && - Br.test(s.input.slice(w, s.position)) && - throwWarning(s, 'non-ASCII line breaks are interpreted as content'), - s.documents.push(s.result), - s.position === s.lineStart && testDocumentSeparator(s) - ? 46 === s.input.charCodeAt(s.position) && - ((s.position += 3), skipSeparationSpace(s, !0, -1)) - : s.position < s.length - 1 && - throwError(s, 'end of the stream or a document separator is expected')); - } - function loadDocuments(s, o) { - ((o = o || {}), - 0 !== (s = String(s)).length && - (10 !== s.charCodeAt(s.length - 1) && - 13 !== s.charCodeAt(s.length - 1) && - (s += '\n'), - 65279 === s.charCodeAt(0) && (s = s.slice(1)))); - var i = new State$1(s, o), - u = s.indexOf('\0'); - for ( - -1 !== u && ((i.position = u), throwError(i, 'null byte is not allowed in input')), - i.input += '\0'; - 32 === i.input.charCodeAt(i.position); - ) - ((i.lineIndent += 1), (i.position += 1)); - for (; i.position < i.length - 1; ) readDocument(i); - return i.documents; - } - var Kr = { - loadAll: function loadAll$1(s, o, i) { - null !== o && 'object' == typeof o && void 0 === i && ((i = o), (o = null)); - var u = loadDocuments(s, i); - if ('function' != typeof o) return u; - for (var _ = 0, w = u.length; _ < w; _ += 1) o(u[_]); - }, - load: function load$1(s, o) { - var i = loadDocuments(s, o); - if (0 !== i.length) { - if (1 === i.length) return i[0]; - throw new rr('expected a single document in the stream, but found more'); - } - } - }, - Hr = Object.prototype.toString, - Jr = Object.prototype.hasOwnProperty, - Gr = 65279, - Yr = { - 0: '\\0', - 7: '\\a', - 8: '\\b', - 9: '\\t', - 10: '\\n', - 11: '\\v', - 12: '\\f', - 13: '\\r', - 27: '\\e', - 34: '\\"', - 92: '\\\\', - 133: '\\N', - 160: '\\_', - 8232: '\\L', - 8233: '\\P' - }, - Xr = [ - 'y', - 'Y', - 'yes', - 'Yes', - 'YES', - 'on', - 'On', - 'ON', - 'n', - 'N', - 'no', - 'No', - 'NO', - 'off', - 'Off', - 'OFF' - ], - Zr = /^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/; - function encodeHex(s) { - var o, i, u; - if (((o = s.toString(16).toUpperCase()), s <= 255)) ((i = 'x'), (u = 2)); - else if (s <= 65535) ((i = 'u'), (u = 4)); - else { - if (!(s <= 4294967295)) - throw new rr('code point within a string may not be greater than 0xFFFFFFFF'); - ((i = 'U'), (u = 8)); - } - return '\\' + i + tr.repeat('0', u - o.length) + o; - } - function State(s) { - ((this.schema = s.schema || Rr), - (this.indent = Math.max(1, s.indent || 2)), - (this.noArrayIndent = s.noArrayIndent || !1), - (this.skipInvalid = s.skipInvalid || !1), - (this.flowLevel = tr.isNothing(s.flowLevel) ? -1 : s.flowLevel), - (this.styleMap = (function compileStyleMap(s, o) { - var i, u, _, w, x, C, j; - if (null === o) return {}; - for (i = {}, _ = 0, w = (u = Object.keys(o)).length; _ < w; _ += 1) - ((x = u[_]), - (C = String(o[x])), - '!!' === x.slice(0, 2) && (x = 'tag:yaml.org,2002:' + x.slice(2)), - (j = s.compiledTypeMap.fallback[x]) && - Jr.call(j.styleAliases, C) && - (C = j.styleAliases[C]), - (i[x] = C)); - return i; - })(this.schema, s.styles || null)), - (this.sortKeys = s.sortKeys || !1), - (this.lineWidth = s.lineWidth || 80), - (this.noRefs = s.noRefs || !1), - (this.noCompatMode = s.noCompatMode || !1), - (this.condenseFlow = s.condenseFlow || !1), - (this.quotingType = '"' === s.quotingType ? 2 : 1), - (this.forceQuotes = s.forceQuotes || !1), - (this.replacer = 'function' == typeof s.replacer ? s.replacer : null), - (this.implicitTypes = this.schema.compiledImplicit), - (this.explicitTypes = this.schema.compiledExplicit), - (this.tag = null), - (this.result = ''), - (this.duplicates = []), - (this.usedDuplicates = null)); - } - function indentString(s, o) { - for (var i, u = tr.repeat(' ', o), _ = 0, w = -1, x = '', C = s.length; _ < C; ) - (-1 === (w = s.indexOf('\n', _)) - ? ((i = s.slice(_)), (_ = C)) - : ((i = s.slice(_, w + 1)), (_ = w + 1)), - i.length && '\n' !== i && (x += u), - (x += i)); - return x; - } - function generateNextLine(s, o) { - return '\n' + tr.repeat(' ', s.indent * o); - } - function isWhitespace(s) { - return 32 === s || 9 === s; - } - function isPrintable(s) { - return ( - (32 <= s && s <= 126) || - (161 <= s && s <= 55295 && 8232 !== s && 8233 !== s) || - (57344 <= s && s <= 65533 && s !== Gr) || - (65536 <= s && s <= 1114111) - ); - } - function isNsCharOrWhitespace(s) { - return isPrintable(s) && s !== Gr && 13 !== s && 10 !== s; - } - function isPlainSafe(s, o, i) { - var u = isNsCharOrWhitespace(s), - _ = u && !isWhitespace(s); - return ( - ((i ? u : u && 44 !== s && 91 !== s && 93 !== s && 123 !== s && 125 !== s) && - 35 !== s && - !(58 === o && !_)) || - (isNsCharOrWhitespace(o) && !isWhitespace(o) && 35 === s) || - (58 === o && _) - ); - } - function codePointAt(s, o) { - var i, - u = s.charCodeAt(o); - return u >= 55296 && - u <= 56319 && - o + 1 < s.length && - (i = s.charCodeAt(o + 1)) >= 56320 && - i <= 57343 - ? 1024 * (u - 55296) + i - 56320 + 65536 - : u; - } - function needIndentIndicator(s) { - return /^\n* /.test(s); - } - function chooseScalarStyle(s, o, i, u, _, w, x, C) { - var j, - L = 0, - B = null, - $ = !1, - V = !1, - U = -1 !== u, - z = -1, - Y = - (function isPlainSafeFirst(s) { - return ( - isPrintable(s) && - s !== Gr && - !isWhitespace(s) && - 45 !== s && - 63 !== s && - 58 !== s && - 44 !== s && - 91 !== s && - 93 !== s && - 123 !== s && - 125 !== s && - 35 !== s && - 38 !== s && - 42 !== s && - 33 !== s && - 124 !== s && - 61 !== s && - 62 !== s && - 39 !== s && - 34 !== s && - 37 !== s && - 64 !== s && - 96 !== s - ); - })(codePointAt(s, 0)) && - (function isPlainSafeLast(s) { - return !isWhitespace(s) && 58 !== s; - })(codePointAt(s, s.length - 1)); - if (o || x) - for (j = 0; j < s.length; L >= 65536 ? (j += 2) : j++) { - if (!isPrintable((L = codePointAt(s, j)))) return 5; - ((Y = Y && isPlainSafe(L, B, C)), (B = L)); - } - else { - for (j = 0; j < s.length; L >= 65536 ? (j += 2) : j++) { - if (10 === (L = codePointAt(s, j))) - (($ = !0), U && ((V = V || (j - z - 1 > u && ' ' !== s[z + 1])), (z = j))); - else if (!isPrintable(L)) return 5; - ((Y = Y && isPlainSafe(L, B, C)), (B = L)); - } - V = V || (U && j - z - 1 > u && ' ' !== s[z + 1]); - } - return $ || V - ? i > 9 && needIndentIndicator(s) - ? 5 - : x - ? 2 === w - ? 5 - : 2 - : V - ? 4 - : 3 - : !Y || x || _(s) - ? 2 === w - ? 5 - : 2 - : 1; - } - function writeScalar(s, o, i, u, _) { - s.dump = (function () { - if (0 === o.length) return 2 === s.quotingType ? '""' : "''"; - if (!s.noCompatMode && (-1 !== Xr.indexOf(o) || Zr.test(o))) - return 2 === s.quotingType ? '"' + o + '"' : "'" + o + "'"; - var w = s.indent * Math.max(1, i), - x = -1 === s.lineWidth ? -1 : Math.max(Math.min(s.lineWidth, 40), s.lineWidth - w), - C = u || (s.flowLevel > -1 && i >= s.flowLevel); - switch ( - chooseScalarStyle( - o, - C, - s.indent, - x, - function testAmbiguity(o) { - return (function testImplicitResolving(s, o) { - var i, u; - for (i = 0, u = s.implicitTypes.length; i < u; i += 1) - if (s.implicitTypes[i].resolve(o)) return !0; - return !1; - })(s, o); - }, - s.quotingType, - s.forceQuotes && !u, - _ - ) - ) { - case 1: - return o; - case 2: - return "'" + o.replace(/'/g, "''") + "'"; - case 3: - return '|' + blockHeader(o, s.indent) + dropEndingNewline(indentString(o, w)); - case 4: - return ( - '>' + - blockHeader(o, s.indent) + - dropEndingNewline( - indentString( - (function foldString(s, o) { - var i, - u, - _ = /(\n+)([^\n]*)/g, - w = - ((C = s.indexOf('\n')), - (C = -1 !== C ? C : s.length), - (_.lastIndex = C), - foldLine(s.slice(0, C), o)), - x = '\n' === s[0] || ' ' === s[0]; - var C; - for (; (u = _.exec(s)); ) { - var j = u[1], - L = u[2]; - ((i = ' ' === L[0]), - (w += j + (x || i || '' === L ? '' : '\n') + foldLine(L, o)), - (x = i)); - } - return w; - })(o, x), - w - ) - ) - ); - case 5: - return ( - '"' + - (function escapeString(s) { - for (var o, i = '', u = 0, _ = 0; _ < s.length; u >= 65536 ? (_ += 2) : _++) - ((u = codePointAt(s, _)), - !(o = Yr[u]) && isPrintable(u) - ? ((i += s[_]), u >= 65536 && (i += s[_ + 1])) - : (i += o || encodeHex(u))); - return i; - })(o) + - '"' - ); - default: - throw new rr('impossible error: invalid scalar style'); - } - })(); - } - function blockHeader(s, o) { - var i = needIndentIndicator(s) ? String(o) : '', - u = '\n' === s[s.length - 1]; - return i + (u && ('\n' === s[s.length - 2] || '\n' === s) ? '+' : u ? '' : '-') + '\n'; - } - function dropEndingNewline(s) { - return '\n' === s[s.length - 1] ? s.slice(0, -1) : s; - } - function foldLine(s, o) { - if ('' === s || ' ' === s[0]) return s; - for (var i, u, _ = / [^ ]/g, w = 0, x = 0, C = 0, j = ''; (i = _.exec(s)); ) - ((C = i.index) - w > o && - ((u = x > w ? x : C), (j += '\n' + s.slice(w, u)), (w = u + 1)), - (x = C)); - return ( - (j += '\n'), - s.length - w > o && x > w - ? (j += s.slice(w, x) + '\n' + s.slice(x + 1)) - : (j += s.slice(w)), - j.slice(1) - ); - } - function writeBlockSequence(s, o, i, u) { - var _, - w, - x, - C = '', - j = s.tag; - for (_ = 0, w = i.length; _ < w; _ += 1) - ((x = i[_]), - s.replacer && (x = s.replacer.call(i, String(_), x)), - (writeNode(s, o + 1, x, !0, !0, !1, !0) || - (void 0 === x && writeNode(s, o + 1, null, !0, !0, !1, !0))) && - ((u && '' === C) || (C += generateNextLine(s, o)), - s.dump && 10 === s.dump.charCodeAt(0) ? (C += '-') : (C += '- '), - (C += s.dump))); - ((s.tag = j), (s.dump = C || '[]')); - } - function detectType(s, o, i) { - var u, _, w, x, C, j; - for (w = 0, x = (_ = i ? s.explicitTypes : s.implicitTypes).length; w < x; w += 1) - if ( - ((C = _[w]).instanceOf || C.predicate) && - (!C.instanceOf || ('object' == typeof o && o instanceof C.instanceOf)) && - (!C.predicate || C.predicate(o)) - ) { - if ( - (i - ? C.multi && C.representName - ? (s.tag = C.representName(o)) - : (s.tag = C.tag) - : (s.tag = '?'), - C.represent) - ) { - if ( - ((j = s.styleMap[C.tag] || C.defaultStyle), - '[object Function]' === Hr.call(C.represent)) - ) - u = C.represent(o, j); - else { - if (!Jr.call(C.represent, j)) - throw new rr('!<' + C.tag + '> tag resolver accepts not "' + j + '" style'); - u = C.represent[j](o, j); - } - s.dump = u; - } - return !0; - } - return !1; - } - function writeNode(s, o, i, u, _, w, x) { - ((s.tag = null), (s.dump = i), detectType(s, i, !1) || detectType(s, i, !0)); - var C, - j = Hr.call(s.dump), - L = u; - u && (u = s.flowLevel < 0 || s.flowLevel > o); - var B, - $, - V = '[object Object]' === j || '[object Array]' === j; - if ( - (V && ($ = -1 !== (B = s.duplicates.indexOf(i))), - ((null !== s.tag && '?' !== s.tag) || $ || (2 !== s.indent && o > 0)) && (_ = !1), - $ && s.usedDuplicates[B]) - ) - s.dump = '*ref_' + B; - else { - if ( - (V && $ && !s.usedDuplicates[B] && (s.usedDuplicates[B] = !0), - '[object Object]' === j) - ) - u && 0 !== Object.keys(s.dump).length - ? (!(function writeBlockMapping(s, o, i, u) { - var _, - w, - x, - C, - j, - L, - B = '', - $ = s.tag, - V = Object.keys(i); - if (!0 === s.sortKeys) V.sort(); - else if ('function' == typeof s.sortKeys) V.sort(s.sortKeys); - else if (s.sortKeys) throw new rr('sortKeys must be a boolean or a function'); - for (_ = 0, w = V.length; _ < w; _ += 1) - ((L = ''), - (u && '' === B) || (L += generateNextLine(s, o)), - (C = i[(x = V[_])]), - s.replacer && (C = s.replacer.call(i, x, C)), - writeNode(s, o + 1, x, !0, !0, !0) && - ((j = - (null !== s.tag && '?' !== s.tag) || - (s.dump && s.dump.length > 1024)) && - (s.dump && 10 === s.dump.charCodeAt(0) ? (L += '?') : (L += '? ')), - (L += s.dump), - j && (L += generateNextLine(s, o)), - writeNode(s, o + 1, C, !0, j) && - (s.dump && 10 === s.dump.charCodeAt(0) ? (L += ':') : (L += ': '), - (B += L += s.dump)))); - ((s.tag = $), (s.dump = B || '{}')); - })(s, o, s.dump, _), - $ && (s.dump = '&ref_' + B + s.dump)) - : (!(function writeFlowMapping(s, o, i) { - var u, - _, - w, - x, - C, - j = '', - L = s.tag, - B = Object.keys(i); - for (u = 0, _ = B.length; u < _; u += 1) - ((C = ''), - '' !== j && (C += ', '), - s.condenseFlow && (C += '"'), - (x = i[(w = B[u])]), - s.replacer && (x = s.replacer.call(i, w, x)), - writeNode(s, o, w, !1, !1) && - (s.dump.length > 1024 && (C += '? '), - (C += - s.dump + - (s.condenseFlow ? '"' : '') + - ':' + - (s.condenseFlow ? '' : ' ')), - writeNode(s, o, x, !1, !1) && (j += C += s.dump))); - ((s.tag = L), (s.dump = '{' + j + '}')); - })(s, o, s.dump), - $ && (s.dump = '&ref_' + B + ' ' + s.dump)); - else if ('[object Array]' === j) - u && 0 !== s.dump.length - ? (s.noArrayIndent && !x && o > 0 - ? writeBlockSequence(s, o - 1, s.dump, _) - : writeBlockSequence(s, o, s.dump, _), - $ && (s.dump = '&ref_' + B + s.dump)) - : (!(function writeFlowSequence(s, o, i) { - var u, - _, - w, - x = '', - C = s.tag; - for (u = 0, _ = i.length; u < _; u += 1) - ((w = i[u]), - s.replacer && (w = s.replacer.call(i, String(u), w)), - (writeNode(s, o, w, !1, !1) || - (void 0 === w && writeNode(s, o, null, !1, !1))) && - ('' !== x && (x += ',' + (s.condenseFlow ? '' : ' ')), (x += s.dump))); - ((s.tag = C), (s.dump = '[' + x + ']')); - })(s, o, s.dump), - $ && (s.dump = '&ref_' + B + ' ' + s.dump)); - else { - if ('[object String]' !== j) { - if ('[object Undefined]' === j) return !1; - if (s.skipInvalid) return !1; - throw new rr('unacceptable kind of an object to dump ' + j); - } - '?' !== s.tag && writeScalar(s, s.dump, o, w, L); - } - null !== s.tag && - '?' !== s.tag && - ((C = encodeURI('!' === s.tag[0] ? s.tag.slice(1) : s.tag).replace(/!/g, '%21')), - (C = - '!' === s.tag[0] - ? '!' + C - : 'tag:yaml.org,2002:' === C.slice(0, 18) - ? '!!' + C.slice(18) - : '!<' + C + '>'), - (s.dump = C + ' ' + s.dump)); - } - return !0; - } - function getDuplicateReferences(s, o) { - var i, - u, - _ = [], - w = []; - for (inspectNode(s, _, w), i = 0, u = w.length; i < u; i += 1) o.duplicates.push(_[w[i]]); - o.usedDuplicates = new Array(u); - } - function inspectNode(s, o, i) { - var u, _, w; - if (null !== s && 'object' == typeof s) - if (-1 !== (_ = o.indexOf(s))) -1 === i.indexOf(_) && i.push(_); - else if ((o.push(s), Array.isArray(s))) - for (_ = 0, w = s.length; _ < w; _ += 1) inspectNode(s[_], o, i); - else - for (_ = 0, w = (u = Object.keys(s)).length; _ < w; _ += 1) - inspectNode(s[u[_]], o, i); - } - var Qr = function dump$1(s, o) { - var i = new State((o = o || {})); - i.noRefs || getDuplicateReferences(s, i); - var u = s; - return ( - i.replacer && (u = i.replacer.call({ '': u }, '', u)), - writeNode(i, 0, u, !0, !0) ? i.dump + '\n' : '' - ); - }; - function renamed(s, o) { - return function () { - throw new Error( - 'Function yaml.' + - s + - ' is removed in js-yaml 4. Use yaml.' + - o + - ' instead, which is now safe by default.' - ); - }; - } - var en = ar, - tn = lr, - rn = dr, - nn = _r, - sn = Er, - on = Rr, - an = Kr.load, - ln = Kr.loadAll, - cn = { dump: Qr }.dump, - un = rr, - pn = { - binary: Or, - float: br, - map: pr, - null: fr, - pairs: Mr, - set: Nr, - timestamp: xr, - bool: mr, - int: gr, - merge: kr, - omap: Ir, - seq: ur, - str: cr - }, - hn = renamed('safeLoad', 'load'), - dn = renamed('safeLoadAll', 'loadAll'), - fn = renamed('safeDump', 'dump'); - const mn = { - Type: en, - Schema: tn, - FAILSAFE_SCHEMA: rn, - JSON_SCHEMA: nn, - CORE_SCHEMA: sn, - DEFAULT_SCHEMA: on, - load: an, - loadAll: ln, - dump: cn, - YAMLException: un, - types: pn, - safeLoad: hn, - safeLoadAll: dn, - safeDump: fn - }, - gn = 'configs_update', - yn = 'configs_toggle'; - function update(s, o) { - return { type: gn, payload: { [s]: o } }; - } - function toggle(s) { - return { type: yn, payload: s }; - } - const actions_loaded = () => () => {}, - downloadConfig = (s) => (o) => { - const { - fn: { fetch: i } - } = o; - return i(s); - }, - getConfigByUrl = (s, o) => (i) => { - const { specActions: u, configsActions: _ } = i; - if (s) return _.downloadConfig(s).then(next, next); - function next(_) { - _ instanceof Error || _.status >= 400 - ? (u.updateLoadingStatus('failedConfig'), - u.updateLoadingStatus('failedConfig'), - u.updateUrl(''), - console.error(_.statusText + ' ' + s.url), - o(null)) - : o( - ((s, o) => { - try { - return mn.load(s); - } catch (s) { - return (o && o.errActions.newThrownErr(new Error(s)), {}); - } - })(_.text, i) - ); - } - }, - get = (s, o) => s.getIn(Array.isArray(o) ? o : [o]), - vn = { - [gn]: (s, o) => s.merge((0, qe.fromJS)(o.payload)), - [yn]: (s, o) => { - const i = o.payload, - u = s.get(i); - return s.set(i, !u); - } - }; - function configsPlugin() { - return { statePlugins: { configs: { reducers: vn, actions: u, selectors: w } } }; - } - const setHash = (s) => - s ? history.pushState(null, null, `#${s}`) : (window.location.hash = ''); - var bn = __webpack_require__(86215), - _n = __webpack_require__.n(bn); - const En = 'layout_scroll_to', - wn = 'layout_clear_scroll'; - const Sn = { - fn: { - getScrollParent: function getScrollParent(s, o) { - const i = document.documentElement; - let u = getComputedStyle(s); - const _ = 'absolute' === u.position, - w = o ? /(auto|scroll|hidden)/ : /(auto|scroll)/; - if ('fixed' === u.position) return i; - for (let o = s; (o = o.parentElement); ) - if ( - ((u = getComputedStyle(o)), - (!_ || 'static' !== u.position) && w.test(u.overflow + u.overflowY + u.overflowX)) - ) - return o; - return i; - } - }, - statePlugins: { - layout: { - actions: { - scrollToElement: (s, o) => (i) => { - try { - ((o = o || i.fn.getScrollParent(s)), _n().createScroller(o).to(s)); - } catch (s) { - console.error(s); - } - }, - scrollTo: (s) => ({ type: En, payload: Array.isArray(s) ? s : [s] }), - clearScrollTo: () => ({ type: wn }), - readyToScroll: (s, o) => (i) => { - const u = i.layoutSelectors.getScrollToKey(); - $e().is(u, (0, qe.fromJS)(s)) && - (i.layoutActions.scrollToElement(o), i.layoutActions.clearScrollTo()); - }, - parseDeepLinkHash: - (s) => - ({ layoutActions: o, layoutSelectors: i, getConfigs: u }) => { - if (u().deepLinking && s) { - let u = s.slice(1); - ('!' === u[0] && (u = u.slice(1)), '/' === u[0] && (u = u.slice(1))); - const _ = u.split('/').map((s) => s || ''), - w = i.isShownKeyFromUrlHashArray(_), - [x, C = '', j = ''] = w; - if ('operations' === x) { - const s = i.isShownKeyFromUrlHashArray([C]); - (C.indexOf('_') > -1 && - (console.warn( - 'Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.' - ), - o.show( - s.map((s) => s.replace(/_/g, ' ')), - !0 - )), - o.show(s, !0)); - } - ((C.indexOf('_') > -1 || j.indexOf('_') > -1) && - (console.warn( - 'Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead.' - ), - o.show( - w.map((s) => s.replace(/_/g, ' ')), - !0 - )), - o.show(w, !0), - o.scrollTo(w)); - } - } - }, - selectors: { - getScrollToKey: (s) => s.get('scrollToKey'), - isShownKeyFromUrlHashArray(s, o) { - const [i, u] = o; - return u ? ['operations', i, u] : i ? ['operations-tag', i] : []; - }, - urlHashArrayFromIsShownKey(s, o) { - let [i, u, _] = o; - return 'operations' == i ? [u, _] : 'operations-tag' == i ? [u] : []; - } - }, - reducers: { - [En]: (s, o) => s.set('scrollToKey', $e().fromJS(o.payload)), - [wn]: (s) => s.delete('scrollToKey') - }, - wrapActions: { - show: - (s, { getConfigs: o, layoutSelectors: i }) => - (...u) => { - if ((s(...u), o().deepLinking)) - try { - let [s, o] = u; - s = Array.isArray(s) ? s : [s]; - const _ = i.urlHashArrayFromIsShownKey(s); - if (!_.length) return; - const [w, x] = _; - if (!o) return setHash('/'); - 2 === _.length - ? setHash( - createDeepLinkPath( - `/${encodeURIComponent(w)}/${encodeURIComponent(x)}` - ) - ) - : 1 === _.length && - setHash(createDeepLinkPath(`/${encodeURIComponent(w)}`)); - } catch (s) { - console.error(s); - } - } - } - } - } - }; - var xn = __webpack_require__(2209), - kn = __webpack_require__.n(xn); - const operation_wrapper = (s, o) => - class OperationWrapper extends Pe.Component { - onLoad = (s) => { - const { operation: i } = this.props, - { tag: u, operationId: _ } = i.toObject(); - let { isShownKey: w } = i.toObject(); - ((w = w || ['operations', u, _]), o.layoutActions.readyToScroll(w, s)); - }; - render() { - return Pe.createElement( - 'span', - { ref: this.onLoad }, - Pe.createElement(s, this.props) - ); - } - }, - operation_tag_wrapper = (s, o) => - class OperationTagWrapper extends Pe.Component { - onLoad = (s) => { - const { tag: i } = this.props, - u = ['operations-tag', i]; - o.layoutActions.readyToScroll(u, s); - }; - render() { - return Pe.createElement( - 'span', - { ref: this.onLoad }, - Pe.createElement(s, this.props) - ); - } - }; - function deep_linking() { - return [ - Sn, - { - statePlugins: { - configs: { - wrapActions: { - loaded: - (s, o) => - (...i) => { - s(...i); - const u = decodeURIComponent(window.location.hash); - o.layoutActions.parseDeepLinkHash(u); - } - } - } - }, - wrapComponents: { operation: operation_wrapper, OperationTag: operation_tag_wrapper } - } - ]; - } - var Cn = __webpack_require__(40860), - On = __webpack_require__.n(Cn); - function transform(s) { - return s.map((s) => { - let o = 'is not of a type(s)', - i = s.get('message').indexOf(o); - if (i > -1) { - let o = s - .get('message') - .slice(i + 19) - .split(','); - return s.set( - 'message', - s.get('message').slice(0, i) + - (function makeNewMessage(s) { - return s.reduce( - (s, o, i, u) => - i === u.length - 1 && u.length > 1 - ? s + 'or ' + o - : u[i + 1] && u.length > 2 - ? s + o + ', ' - : u[i + 1] - ? s + o + ' ' - : s + o, - 'should be a' - ); - })(o) - ); - } - return s; - }); - } - var An = __webpack_require__(58156), - jn = __webpack_require__.n(An); - function parameter_oneof_transform(s, { jsSpec: o }) { - return s; - } - const In = [x, C]; - function transformErrors(s) { - let o = { jsSpec: {} }, - i = On()( - In, - (s, i) => { - try { - return i.transform(s, o).filter((s) => !!s); - } catch (o) { - return (console.error('Transformer error:', o), s); - } - }, - s - ); - return i.filter((s) => !!s).map((s) => (!s.get('line') && s.get('path'), s)); - } - let Pn = { line: 0, level: 'error', message: 'Unknown error' }; - const Mn = Ut( - (s) => s, - (s) => s.get('errors', (0, qe.List)()) - ), - Tn = Ut(Mn, (s) => s.last()); - function err(o) { - return { - statePlugins: { - err: { - reducers: { - [et]: (s, { payload: o }) => { - let i = Object.assign(Pn, o, { type: 'thrown' }); - return s - .update('errors', (s) => (s || (0, qe.List)()).push((0, qe.fromJS)(i))) - .update('errors', (s) => transformErrors(s)); - }, - [tt]: (s, { payload: o }) => ( - (o = o.map((s) => (0, qe.fromJS)(Object.assign(Pn, s, { type: 'thrown' })))), - s - .update('errors', (s) => (s || (0, qe.List)()).concat((0, qe.fromJS)(o))) - .update('errors', (s) => transformErrors(s)) - ), - [rt]: (s, { payload: o }) => { - let i = (0, qe.fromJS)(o); - return ( - (i = i.set('type', 'spec')), - s - .update('errors', (s) => - (s || (0, qe.List)()).push((0, qe.fromJS)(i)).sortBy((s) => s.get('line')) - ) - .update('errors', (s) => transformErrors(s)) - ); - }, - [nt]: (s, { payload: o }) => ( - (o = o.map((s) => (0, qe.fromJS)(Object.assign(Pn, s, { type: 'spec' })))), - s - .update('errors', (s) => (s || (0, qe.List)()).concat((0, qe.fromJS)(o))) - .update('errors', (s) => transformErrors(s)) - ), - [st]: (s, { payload: o }) => { - let i = (0, qe.fromJS)(Object.assign({}, o)); - return ( - (i = i.set('type', 'auth')), - s - .update('errors', (s) => (s || (0, qe.List)()).push((0, qe.fromJS)(i))) - .update('errors', (s) => transformErrors(s)) - ); - }, - [ot]: (s, { payload: o }) => { - if (!o || !s.get('errors')) return s; - let i = s.get('errors').filter((s) => - s.keySeq().every((i) => { - const u = s.get(i), - _ = o[i]; - return !_ || u !== _; - }) - ); - return s.merge({ errors: i }); - }, - [it]: (s, { payload: o }) => { - if (!o || 'function' != typeof o) return s; - let i = s.get('errors').filter((s) => o(s)); - return s.merge({ errors: i }); - } - }, - actions: s, - selectors: j - } - } - }; - } - function opsFilter(s, o) { - return s.filter((s, i) => -1 !== i.indexOf(o)); - } - function filter() { - return { fn: { opsFilter } }; - } - var Nn = __webpack_require__(7666), - Rn = __webpack_require__.n(Nn); - const arrow_up = ({ className: s = null, width: o = 20, height: i = 20, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement('path', { - d: 'M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z' - }) - ), - arrow_down = ({ className: s = null, width: o = 20, height: i = 20, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement('path', { - d: 'M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z' - }) - ), - arrow = ({ className: s = null, width: o = 20, height: i = 20, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement('path', { - d: 'M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z' - }) - ), - components_close = ({ className: s = null, width: o = 20, height: i = 20, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement('path', { - d: 'M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z' - }) - ), - copy = ({ className: s = null, width: o = 15, height: i = 16, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 15 16', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement( - 'g', - { transform: 'translate(2, -1)' }, - Pe.createElement('path', { - fill: '#ffffff', - fillRule: 'evenodd', - d: 'M2 13h4v1H2v-1zm5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-.45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z' - }) - ) - ), - lock = ({ className: s = null, width: o = 20, height: i = 20, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement('path', { - d: 'M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z' - }) - ), - unlock = ({ className: s = null, width: o = 20, height: i = 20, ...u }) => - Pe.createElement( - 'svg', - Rn()( - { - xmlns: 'http://www.w3.org/2000/svg', - viewBox: '0 0 20 20', - className: s, - width: o, - height: i, - 'aria-hidden': 'true', - focusable: 'false' - }, - u - ), - Pe.createElement('path', { - d: 'M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z' - }) - ), - icons = () => ({ - components: { - ArrowUpIcon: arrow_up, - ArrowDownIcon: arrow_down, - ArrowIcon: arrow, - CloseIcon: components_close, - CopyIcon: copy, - LockIcon: lock, - UnlockIcon: unlock - } - }), - Dn = 'layout_update_layout', - Ln = 'layout_update_filter', - Bn = 'layout_update_mode', - Fn = 'layout_show'; - function updateLayout(s) { - return { type: Dn, payload: s }; - } - function updateFilter(s) { - return { type: Ln, payload: s }; - } - function actions_show(s, o = !0) { - return ((s = normalizeArray(s)), { type: Fn, payload: { thing: s, shown: o } }); - } - function changeMode(s, o = '') { - return ((s = normalizeArray(s)), { type: Bn, payload: { thing: s, mode: o } }); - } - const qn = { - [Dn]: (s, o) => s.set('layout', o.payload), - [Ln]: (s, o) => s.set('filter', o.payload), - [Fn]: (s, o) => { - const i = o.payload.shown, - u = (0, qe.fromJS)(o.payload.thing); - return s.update('shown', (0, qe.fromJS)({}), (s) => s.set(u, i)); - }, - [Bn]: (s, o) => { - let i = o.payload.thing, - u = o.payload.mode; - return s.setIn(['modes'].concat(i), (u || '') + ''); - } - }, - current = (s) => s.get('layout'), - currentFilter = (s) => s.get('filter'), - isShown = (s, o, i) => ( - (o = normalizeArray(o)), - s.get('shown', (0, qe.fromJS)({})).get((0, qe.fromJS)(o), i) - ), - whatMode = (s, o, i = '') => ((o = normalizeArray(o)), s.getIn(['modes', ...o], i)), - $n = Ut( - (s) => s, - (s) => !isShown(s, 'editor') - ), - taggedOperations = - (s, o) => - (i, ...u) => { - let _ = s(i, ...u); - const { fn: w, layoutSelectors: x, getConfigs: C } = o.getSystem(), - j = C(), - { maxDisplayedTags: L } = j; - let B = x.currentFilter(); - return (B && !0 !== B && (_ = w.opsFilter(_, B)), L >= 0 && (_ = _.slice(0, L)), _); - }; - function plugins_layout() { - return { - statePlugins: { - layout: { reducers: qn, actions: L, selectors: B }, - spec: { wrapSelectors: $ } - } - }; - } - function logs({ configs: s }) { - const o = { debug: 0, info: 1, log: 2, warn: 3, error: 4 }, - getLevel = (s) => o[s] || -1; - let { logLevel: i } = s, - u = getLevel(i); - function log(s, ...o) { - getLevel(s) >= u && console[s](...o); - } - return ( - (log.warn = log.bind(null, 'warn')), - (log.error = log.bind(null, 'error')), - (log.info = log.bind(null, 'info')), - (log.debug = log.bind(null, 'debug')), - { rootInjects: { log } } - ); - } - let Vn = !1; - function on_complete() { - return { - statePlugins: { - spec: { - wrapActions: { - updateSpec: - (s) => - (...o) => ((Vn = !0), s(...o)), - updateJsonSpec: - (s, o) => - (...i) => { - const u = o.getConfigs().onComplete; - return ( - Vn && 'function' == typeof u && (setTimeout(u, 0), (Vn = !1)), - s(...i) - ); - } - } - } - } - }; - } - const extractKey = (s) => { - const o = '_**[]'; - return s.indexOf(o) < 0 ? s : s.split(o)[0].trim(); - }, - escapeShell = (s) => - '-d ' === s || /^[_\/-]/g.test(s) ? s : "'" + s.replace(/'/g, "'\\''") + "'", - escapeCMD = (s) => - '-d ' === - (s = s - .replace(/\^/g, '^^') - .replace(/\\"/g, '\\\\"') - .replace(/"/g, '""') - .replace(/\n/g, '^\n')) - ? s.replace(/-d /g, '-d ^\n') - : /^[_\/-]/g.test(s) - ? s - : '"' + s + '"', - escapePowershell = (s) => { - if ('-d ' === s) return s; - if (/\n/.test(s)) { - return `@"\n${s.replace(/`/g, '``').replace(/\$/g, '`$')}\n"@`; - } - if (!/^[_\/-]/.test(s)) { - return `'${s.replace(/'/g, "''")}'`; - } - return s; - }; - const curlify = (s, o, i, u = '') => { - let _ = !1, - w = ''; - const addWords = (...s) => (w += ' ' + s.map(o).join(' ')), - addWordsWithoutLeadingSpace = (...s) => (w += s.map(o).join(' ')), - addNewLine = () => (w += ` ${i}`), - addIndent = (s = 1) => (w += ' '.repeat(s)); - let x = s.get('headers'); - w += 'curl' + u; - const C = s.get('curlOptions'); - if ( - (qe.List.isList(C) && !C.isEmpty() && addWords(...s.get('curlOptions')), - addWords('-X', s.get('method')), - addNewLine(), - addIndent(), - addWordsWithoutLeadingSpace(`${s.get('url')}`), - x && x.size) - ) - for (let o of s.get('headers').entries()) { - (addNewLine(), addIndent()); - let [s, i] = o; - (addWordsWithoutLeadingSpace('-H', `${s}: ${i}`), - (_ = _ || (/^content-type$/i.test(s) && /^multipart\/form-data$/i.test(i)))); - } - const j = s.get('body'); - if (j) - if (_ && ['POST', 'PUT', 'PATCH'].includes(s.get('method'))) - for (let [s, o] of j.entrySeq()) { - let i = extractKey(s); - (addNewLine(), - addIndent(), - addWordsWithoutLeadingSpace('-F'), - o instanceof at.File && 'string' == typeof o.valueOf() - ? addWords(`${i}=${o.data}${o.type ? `;type=${o.type}` : ''}`) - : o instanceof at.File - ? addWords(`${i}=@${o.name}${o.type ? `;type=${o.type}` : ''}`) - : addWords(`${i}=${o}`)); - } - else if (j instanceof at.File) - (addNewLine(), - addIndent(), - addWordsWithoutLeadingSpace(`--data-binary '@${j.name}'`)); - else { - (addNewLine(), addIndent(), addWordsWithoutLeadingSpace('-d ')); - let o = j; - qe.Map.isMap(o) - ? addWordsWithoutLeadingSpace( - (function getStringBodyOfMap(s) { - let o = []; - for (let [i, u] of s.get('body').entrySeq()) { - let s = extractKey(i); - u instanceof at.File - ? o.push( - ` "${s}": {\n "name": "${u.name}"${u.type ? `,\n "type": "${u.type}"` : ''}\n }` - ) - : o.push( - ` "${s}": ${JSON.stringify(u, null, 2).replace(/(\r\n|\r|\n)/g, '\n ')}` - ); - } - return `{\n${o.join(',\n')}\n}`; - })(s) - ) - : ('string' != typeof o && (o = JSON.stringify(o)), - addWordsWithoutLeadingSpace(o)); - } - else - j || - 'POST' !== s.get('method') || - (addNewLine(), addIndent(), addWordsWithoutLeadingSpace("-d ''")); - return w; - }, - requestSnippetGenerator_curl_powershell = (s) => - curlify(s, escapePowershell, '`\n', '.exe'), - requestSnippetGenerator_curl_bash = (s) => curlify(s, escapeShell, '\\\n'), - requestSnippetGenerator_curl_cmd = (s) => curlify(s, escapeCMD, '^\n'), - request_snippets_selectors_state = (s) => s || (0, qe.Map)(), - Un = Ut(request_snippets_selectors_state, (s) => { - const o = s.get('languages'), - i = s.get('generators', (0, qe.Map)()); - return !o || o.isEmpty() ? i : i.filter((s, i) => o.includes(i)); - }), - getSnippetGenerators = - (s) => - ({ fn: o }) => - Un(s) - .map((s, i) => { - const u = ((s) => o[`requestSnippetGenerator_${s}`])(i); - return 'function' != typeof u ? null : s.set('fn', u); - }) - .filter((s) => s), - zn = Ut(request_snippets_selectors_state, (s) => s.get('activeLanguage')), - Wn = Ut(request_snippets_selectors_state, (s) => s.get('defaultExpanded')); - var Kn = __webpack_require__(46942), - Hn = __webpack_require__.n(Kn), - Jn = __webpack_require__(59399); - const Gn = { - cursor: 'pointer', - lineHeight: 1, - display: 'inline-flex', - backgroundColor: 'rgb(250, 250, 250)', - paddingBottom: '0', - paddingTop: '0', - border: '1px solid rgb(51, 51, 51)', - borderRadius: '4px 4px 0 0', - boxShadow: 'none', - borderBottom: 'none' - }, - Yn = { - cursor: 'pointer', - lineHeight: 1, - display: 'inline-flex', - backgroundColor: 'rgb(51, 51, 51)', - boxShadow: 'none', - border: '1px solid rgb(51, 51, 51)', - paddingBottom: '0', - paddingTop: '0', - borderRadius: '4px 4px 0 0', - marginTop: '-5px', - marginRight: '-5px', - marginLeft: '-5px', - zIndex: '9999', - borderBottom: 'none' - }, - request_snippets = ({ request: s, requestSnippetsSelectors: o, getComponent: i }) => { - const u = (0, Pe.useRef)(null), - _ = i('ArrowUpIcon'), - w = i('ArrowDownIcon'), - x = i('SyntaxHighlighter', !0), - [C, j] = (0, Pe.useState)(o.getSnippetGenerators()?.keySeq().first()), - [L, B] = (0, Pe.useState)(o?.getDefaultExpanded()), - $ = o.getSnippetGenerators(), - V = $.get(C), - U = V.get('fn')(s), - handleSetIsExpanded = () => { - B(!L); - }, - handleGetBtnStyle = (s) => (s === C ? Yn : Gn), - handlePreventYScrollingBeyondElement = (s) => { - const { target: o, deltaY: i } = s, - { scrollHeight: u, offsetHeight: _, scrollTop: w } = o; - u > _ && ((0 === w && i < 0) || (_ + w >= u && i > 0)) && s.preventDefault(); - }; - return ( - (0, Pe.useEffect)(() => {}, []), - (0, Pe.useEffect)(() => { - const s = Array.from(u.current.childNodes).filter( - (s) => !!s.nodeType && s.classList?.contains('curl-command') - ); - return ( - s.forEach((s) => - s.addEventListener('mousewheel', handlePreventYScrollingBeyondElement, { - passive: !1 - }) - ), - () => { - s.forEach((s) => - s.removeEventListener('mousewheel', handlePreventYScrollingBeyondElement) - ); - } - ); - }, [s]), - Pe.createElement( - 'div', - { className: 'request-snippets', ref: u }, - Pe.createElement( - 'div', - { - style: { - width: '100%', - display: 'flex', - justifyContent: 'flex-start', - alignItems: 'center', - marginBottom: '15px' - } - }, - Pe.createElement( - 'h4', - { onClick: () => handleSetIsExpanded(), style: { cursor: 'pointer' } }, - 'Snippets' - ), - Pe.createElement( - 'button', - { - onClick: () => handleSetIsExpanded(), - style: { border: 'none', background: 'none' }, - title: L ? 'Collapse operation' : 'Expand operation' - }, - L - ? Pe.createElement(w, { className: 'arrow', width: '10', height: '10' }) - : Pe.createElement(_, { className: 'arrow', width: '10', height: '10' }) - ) - ), - L && - Pe.createElement( - 'div', - { className: 'curl-command' }, - Pe.createElement( - 'div', - { - style: { - paddingLeft: '15px', - paddingRight: '10px', - width: '100%', - display: 'flex' - } - }, - $.entrySeq().map(([s, o]) => - Pe.createElement( - 'div', - { - className: Hn()('btn', { active: s === C }), - style: handleGetBtnStyle(s), - key: s, - onClick: () => - ((s) => { - C !== s && j(s); - })(s) - }, - Pe.createElement( - 'h4', - { style: s === C ? { color: 'white' } : {} }, - o.get('title') - ) - ) - ) - ), - Pe.createElement( - 'div', - { className: 'copy-to-clipboard' }, - Pe.createElement( - Jn.CopyToClipboard, - { text: U }, - Pe.createElement('button', null) - ) - ), - Pe.createElement( - 'div', - null, - Pe.createElement( - x, - { - language: V.get('syntax'), - className: 'curl microlight', - renderPlainText: ({ children: s, PlainTextViewer: o }) => - Pe.createElement(o, { className: 'curl' }, s) - }, - U - ) - ) - ) - ) - ); - }, - plugins_request_snippets = () => ({ - components: { RequestSnippets: request_snippets }, - fn: V, - statePlugins: { requestSnippets: { selectors: U } } - }); - class ModelCollapse extends Pe.Component { - static defaultProps = { - collapsedContent: '{...}', - expanded: !1, - title: null, - onToggle: () => {}, - hideSelfOnExpand: !1, - specPath: $e().List([]) - }; - constructor(s, o) { - super(s, o); - let { expanded: i, collapsedContent: u } = this.props; - this.state = { - expanded: i, - collapsedContent: u || ModelCollapse.defaultProps.collapsedContent - }; - } - componentDidMount() { - const { hideSelfOnExpand: s, expanded: o, modelName: i } = this.props; - s && o && this.props.onToggle(i, o); - } - UNSAFE_componentWillReceiveProps(s) { - this.props.expanded !== s.expanded && this.setState({ expanded: s.expanded }); - } - toggleCollapsed = () => { - (this.props.onToggle && this.props.onToggle(this.props.modelName, !this.state.expanded), - this.setState({ expanded: !this.state.expanded })); - }; - onLoad = (s) => { - if (s && this.props.layoutSelectors) { - const o = this.props.layoutSelectors.getScrollToKey(); - ($e().is(o, this.props.specPath) && this.toggleCollapsed(), - this.props.layoutActions.readyToScroll(this.props.specPath, s.parentElement)); - } - }; - render() { - const { title: s, classes: o } = this.props; - return this.state.expanded && this.props.hideSelfOnExpand - ? Pe.createElement('span', { className: o || '' }, this.props.children) - : Pe.createElement( - 'span', - { className: o || '', ref: this.onLoad }, - Pe.createElement( - 'button', - { - 'aria-expanded': this.state.expanded, - className: 'model-box-control', - onClick: this.toggleCollapsed - }, - s && Pe.createElement('span', { className: 'pointer' }, s), - Pe.createElement('span', { - className: 'model-toggle' + (this.state.expanded ? '' : ' collapsed') - }), - !this.state.expanded && - Pe.createElement('span', null, this.state.collapsedContent) - ), - this.state.expanded && this.props.children - ); - } - } - const useTabs = ({ initialTab: s, isExecute: o, schema: i, example: u }) => { - const _ = (0, Pe.useMemo)(() => ({ example: 'example', model: 'model' }), []), - w = (0, Pe.useMemo)(() => Object.keys(_), [_]).includes(s) && i && !o ? s : _.example, - x = ((s) => { - const o = (0, Pe.useRef)(); - return ( - (0, Pe.useEffect)(() => { - o.current = s; - }), - o.current - ); - })(o), - [C, j] = (0, Pe.useState)(w), - L = (0, Pe.useCallback)((s) => { - j(s.target.dataset.name); - }, []); - return ( - (0, Pe.useEffect)(() => { - x && !o && u && j(_.example); - }, [x, o, u]), - { activeTab: C, onTabChange: L, tabs: _ } - ); - }, - model_example = ({ - schema: s, - example: o, - isExecute: i = !1, - specPath: u, - includeWriteOnly: _ = !1, - includeReadOnly: w = !1, - getComponent: x, - getConfigs: C, - specSelectors: j - }) => { - const { defaultModelRendering: L, defaultModelExpandDepth: B } = C(), - $ = x('ModelWrapper'), - V = x('HighlightCode', !0), - U = St()(5).toString('base64'), - z = St()(5).toString('base64'), - Y = St()(5).toString('base64'), - Z = St()(5).toString('base64'), - ee = j.isOAS3(), - { - activeTab: ie, - tabs: ae, - onTabChange: le - } = useTabs({ initialTab: L, isExecute: i, schema: s, example: o }); - return Pe.createElement( - 'div', - { className: 'model-example' }, - Pe.createElement( - 'ul', - { className: 'tab', role: 'tablist' }, - Pe.createElement( - 'li', - { - className: Hn()('tabitem', { active: ie === ae.example }), - role: 'presentation' - }, - Pe.createElement( - 'button', - { - 'aria-controls': z, - 'aria-selected': ie === ae.example, - className: 'tablinks', - 'data-name': 'example', - id: U, - onClick: le, - role: 'tab' - }, - i ? 'Edit Value' : 'Example Value' - ) - ), - s && - Pe.createElement( - 'li', - { - className: Hn()('tabitem', { active: ie === ae.model }), - role: 'presentation' - }, - Pe.createElement( - 'button', - { - 'aria-controls': Z, - 'aria-selected': ie === ae.model, - className: Hn()('tablinks', { inactive: i }), - 'data-name': 'model', - id: Y, - onClick: le, - role: 'tab' - }, - ee ? 'Schema' : 'Model' - ) - ) - ), - ie === ae.example && - Pe.createElement( - 'div', - { - 'aria-hidden': ie !== ae.example, - 'aria-labelledby': U, - 'data-name': 'examplePanel', - id: z, - role: 'tabpanel', - tabIndex: '0' - }, - o || Pe.createElement(V, null, '(no example available') - ), - ie === ae.model && - Pe.createElement( - 'div', - { - 'aria-hidden': ie === ae.example, - 'aria-labelledby': Y, - 'data-name': 'modelPanel', - id: Z, - role: 'tabpanel', - tabIndex: '0' - }, - Pe.createElement($, { - schema: s, - getComponent: x, - getConfigs: C, - specSelectors: j, - expandDepth: B, - specPath: u, - includeReadOnly: w, - includeWriteOnly: _ - }) - ) - ); - }; - class ModelWrapper extends Pe.Component { - onToggle = (s, o) => { - this.props.layoutActions && this.props.layoutActions.show(this.props.fullPath, o); - }; - render() { - let { getComponent: s, getConfigs: o } = this.props; - const i = s('Model'); - let u; - return ( - this.props.layoutSelectors && - (u = this.props.layoutSelectors.isShown(this.props.fullPath)), - Pe.createElement( - 'div', - { className: 'model-box' }, - Pe.createElement( - i, - Rn()({}, this.props, { - getConfigs: o, - expanded: u, - depth: 1, - onToggle: this.onToggle, - expandDepth: this.props.expandDepth || 0 - }) - ) - ) - ); - } - } - function _typeof(s) { - return ( - (_typeof = - 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator - ? function (s) { - return typeof s; - } - : function (s) { - return s && - 'function' == typeof Symbol && - s.constructor === Symbol && - s !== Symbol.prototype - ? 'symbol' - : typeof s; - }), - _typeof(s) - ); - } - function _defineProperties(s, o) { - for (var i = 0; i < o.length; i++) { - var u = o[i]; - ((u.enumerable = u.enumerable || !1), - (u.configurable = !0), - 'value' in u && (u.writable = !0), - Object.defineProperty(s, u.key, u)); - } - } - function _defineProperty(s, o, i) { - return ( - o in s - ? Object.defineProperty(s, o, { - value: i, - enumerable: !0, - configurable: !0, - writable: !0 - }) - : (s[o] = i), - s - ); - } - function ownKeys(s, o) { - var i = Object.keys(s); - if (Object.getOwnPropertySymbols) { - var u = Object.getOwnPropertySymbols(s); - (o && - (u = u.filter(function (o) { - return Object.getOwnPropertyDescriptor(s, o).enumerable; - })), - i.push.apply(i, u)); - } - return i; - } - function _getPrototypeOf(s) { - return ( - (_getPrototypeOf = Object.setPrototypeOf - ? Object.getPrototypeOf - : function _getPrototypeOf(s) { - return s.__proto__ || Object.getPrototypeOf(s); - }), - _getPrototypeOf(s) - ); - } - function _setPrototypeOf(s, o) { - return ( - (_setPrototypeOf = - Object.setPrototypeOf || - function _setPrototypeOf(s, o) { - return ((s.__proto__ = o), s); - }), - _setPrototypeOf(s, o) - ); - } - function _possibleConstructorReturn(s, o) { - return !o || ('object' != typeof o && 'function' != typeof o) - ? (function _assertThisInitialized(s) { - if (void 0 === s) - throw new ReferenceError( - "this hasn't been initialised - super() hasn't been called" - ); - return s; - })(s) - : o; - } - var Xn = {}; - function react_immutable_pure_component_es_get(s, o, i) { - return (function isInvalid(s) { - return null == s; - })(s) - ? i - : (function isMapLike(s) { - return ( - null !== s && - 'object' === _typeof(s) && - 'function' == typeof s.get && - 'function' == typeof s.has - ); - })(s) - ? s.has(o) - ? s.get(o) - : i - : hasOwnProperty.call(s, o) - ? s[o] - : i; - } - function getIn(s, o, i) { - for (var u = 0; u !== o.length; ) - if ((s = react_immutable_pure_component_es_get(s, o[u++], Xn)) === Xn) return i; - return s; - } - function check(s) { - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, - i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, - u = (function createChecker(s, o) { - return function (i) { - if ('string' == typeof i) return (0, qe.is)(o[i], s[i]); - if (Array.isArray(i)) return (0, qe.is)(getIn(o, i), getIn(s, i)); - throw new TypeError('Invalid key: expected Array or string: ' + i); - }; - })(o, i), - _ = - s || - Object.keys( - (function _objectSpread2(s) { - for (var o = 1; o < arguments.length; o++) { - var i = null != arguments[o] ? arguments[o] : {}; - o % 2 - ? ownKeys(i, !0).forEach(function (o) { - _defineProperty(s, o, i[o]); - }) - : Object.getOwnPropertyDescriptors - ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(i)) - : ownKeys(i).forEach(function (o) { - Object.defineProperty(s, o, Object.getOwnPropertyDescriptor(i, o)); - }); - } - return s; - })({}, i, {}, o) - ); - return _.every(u); - } - const Zn = (function (s) { - function ImmutablePureComponent() { - return ( - (function _classCallCheck(s, o) { - if (!(s instanceof o)) throw new TypeError('Cannot call a class as a function'); - })(this, ImmutablePureComponent), - _possibleConstructorReturn( - this, - _getPrototypeOf(ImmutablePureComponent).apply(this, arguments) - ) - ); - } - return ( - (function _inherits(s, o) { - if ('function' != typeof o && null !== o) - throw new TypeError('Super expression must either be null or a function'); - ((s.prototype = Object.create(o && o.prototype, { - constructor: { value: s, writable: !0, configurable: !0 } - })), - o && _setPrototypeOf(s, o)); - })(ImmutablePureComponent, s), - (function _createClass(s, o, i) { - return (o && _defineProperties(s.prototype, o), i && _defineProperties(s, i), s); - })(ImmutablePureComponent, [ - { - key: 'shouldComponentUpdate', - value: function shouldComponentUpdate(s) { - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; - return ( - !check(this.updateOnProps, this.props, s, 'updateOnProps') || - !check(this.updateOnStates, this.state, o, 'updateOnStates') - ); - } - } - ]), - ImmutablePureComponent - ); - })(Pe.Component); - var Qn, - es = __webpack_require__(5556), - ts = __webpack_require__.n(es); - function _extends() { - return ( - (_extends = Object.assign - ? Object.assign.bind() - : function (s) { - for (var o = 1; o < arguments.length; o++) { - var i = arguments[o]; - for (var u in i) ({}).hasOwnProperty.call(i, u) && (s[u] = i[u]); - } - return s; - }), - _extends.apply(null, arguments) - ); - } - const rolling_load = (s) => - Pe.createElement( - 'svg', - _extends( - { - xmlns: 'http://www.w3.org/2000/svg', - width: 200, - height: 200, - className: 'rolling-load_svg__lds-rolling', - preserveAspectRatio: 'xMidYMid', - style: { - backgroundImage: 'none', - backgroundPosition: 'initial initial', - backgroundRepeat: 'initial initial' - }, - viewBox: '0 0 100 100' - }, - s - ), - Qn || - (Qn = Pe.createElement( - 'circle', - { - cx: 50, - cy: 50, - r: 35, - fill: 'none', - stroke: '#555', - strokeDasharray: '164.93361431346415 56.97787143782138', - strokeWidth: 10 - }, - Pe.createElement('animateTransform', { - attributeName: 'transform', - begin: '0s', - calcMode: 'linear', - dur: '1s', - keyTimes: '0;1', - repeatCount: 'indefinite', - type: 'rotate', - values: '0 50 50;360 50 50' - }) - )) - ), - decodeRefName = (s) => { - const o = s.replace(/~1/g, '/').replace(/~0/g, '~'); - try { - return decodeURIComponent(o); - } catch { - return o; - } - }; - class Model extends Zn { - static propTypes = { - schema: kn().map.isRequired, - getComponent: ts().func.isRequired, - getConfigs: ts().func.isRequired, - specSelectors: ts().object.isRequired, - name: ts().string, - displayName: ts().string, - isRef: ts().bool, - required: ts().bool, - expandDepth: ts().number, - depth: ts().number, - specPath: kn().list.isRequired, - includeReadOnly: ts().bool, - includeWriteOnly: ts().bool - }; - getModelName = (s) => - -1 !== s.indexOf('#/definitions/') - ? decodeRefName(s.replace(/^.*#\/definitions\//, '')) - : -1 !== s.indexOf('#/components/schemas/') - ? decodeRefName(s.replace(/^.*#\/components\/schemas\//, '')) - : void 0; - getRefSchema = (s) => { - let { specSelectors: o } = this.props; - return o.findDefinition(s); - }; - render() { - let { - getComponent: s, - getConfigs: o, - specSelectors: i, - schema: u, - required: _, - name: w, - isRef: x, - specPath: C, - displayName: j, - includeReadOnly: L, - includeWriteOnly: B - } = this.props; - const $ = s('ObjectModel'), - V = s('ArrayModel'), - U = s('PrimitiveModel'); - let z = 'object', - Y = u && u.get('$$ref'), - Z = u && u.get('$ref'); - if ((!w && Y && (w = this.getModelName(Y)), Z)) { - const s = this.getModelName(Z), - o = this.getRefSchema(s); - qe.Map.isMap(o) - ? ((u = o.mergeDeep(u)), Y || ((u = u.set('$$ref', Z)), (Y = Z))) - : qe.Map.isMap(u) && 1 === u.size && ((u = null), (w = Z)); - } - if (!u) - return Pe.createElement( - 'span', - { className: 'model model-title' }, - Pe.createElement('span', { className: 'model-title__text' }, j || w), - !Z && Pe.createElement(rolling_load, { height: '20px', width: '20px' }) - ); - const ee = i.isOAS3() && u.get('deprecated'); - switch (((x = void 0 !== x ? x : !!Y), (z = (u && u.get('type')) || z), z)) { - case 'object': - return Pe.createElement( - $, - Rn()({ className: 'object' }, this.props, { - specPath: C, - getConfigs: o, - schema: u, - name: w, - deprecated: ee, - isRef: x, - includeReadOnly: L, - includeWriteOnly: B - }) - ); - case 'array': - return Pe.createElement( - V, - Rn()({ className: 'array' }, this.props, { - getConfigs: o, - schema: u, - name: w, - deprecated: ee, - required: _, - includeReadOnly: L, - includeWriteOnly: B - }) - ); - default: - return Pe.createElement( - U, - Rn()({}, this.props, { - getComponent: s, - getConfigs: o, - schema: u, - name: w, - deprecated: ee, - required: _ - }) - ); - } - } - } - class Models extends Pe.Component { - getSchemaBasePath = () => - this.props.specSelectors.isOAS3() ? ['components', 'schemas'] : ['definitions']; - getCollapsedContent = () => ' '; - handleToggle = (s, o) => { - const { layoutActions: i } = this.props; - (i.show([...this.getSchemaBasePath(), s], o), - o && this.props.specActions.requestResolvedSubtree([...this.getSchemaBasePath(), s])); - }; - onLoadModels = (s) => { - s && this.props.layoutActions.readyToScroll(this.getSchemaBasePath(), s); - }; - onLoadModel = (s) => { - if (s) { - const o = s.getAttribute('data-name'); - this.props.layoutActions.readyToScroll([...this.getSchemaBasePath(), o], s); - } - }; - render() { - let { - specSelectors: s, - getComponent: o, - layoutSelectors: i, - layoutActions: u, - getConfigs: _ - } = this.props, - w = s.definitions(), - { docExpansion: x, defaultModelsExpandDepth: C } = _(); - if (!w.size || C < 0) return null; - const j = this.getSchemaBasePath(); - let L = i.isShown(j, C > 0 && 'none' !== x); - const B = s.isOAS3(), - $ = o('ModelWrapper'), - V = o('Collapse'), - U = o('ModelCollapse'), - z = o('JumpToPath', !0), - Y = o('ArrowUpIcon'), - Z = o('ArrowDownIcon'); - return Pe.createElement( - 'section', - { className: L ? 'models is-open' : 'models', ref: this.onLoadModels }, - Pe.createElement( - 'h4', - null, - Pe.createElement( - 'button', - { 'aria-expanded': L, className: 'models-control', onClick: () => u.show(j, !L) }, - Pe.createElement('span', null, B ? 'Schemas' : 'Models'), - L ? Pe.createElement(Y, null) : Pe.createElement(Z, null) - ) - ), - Pe.createElement( - V, - { isOpened: L }, - w - .entrySeq() - .map(([w]) => { - const x = [...j, w], - L = $e().List(x), - B = s.specResolvedSubtree(x), - V = s.specJson().getIn(x), - Y = qe.Map.isMap(B) ? B : $e().Map(), - Z = qe.Map.isMap(V) ? V : $e().Map(), - ee = Y.get('title') || Z.get('title') || w, - ie = i.isShown(x, !1); - ie && - 0 === Y.size && - Z.size > 0 && - this.props.specActions.requestResolvedSubtree(x); - const ae = Pe.createElement($, { - name: w, - expandDepth: C, - schema: Y || $e().Map(), - displayName: ee, - fullPath: x, - specPath: L, - getComponent: o, - specSelectors: s, - getConfigs: _, - layoutSelectors: i, - layoutActions: u, - includeReadOnly: !0, - includeWriteOnly: !0 - }), - le = Pe.createElement( - 'span', - { className: 'model-box' }, - Pe.createElement('span', { className: 'model model-title' }, ee) - ); - return Pe.createElement( - 'div', - { - id: `model-${w}`, - className: 'model-container', - key: `models-section-${w}`, - 'data-name': w, - ref: this.onLoadModel - }, - Pe.createElement( - 'span', - { className: 'models-jump-to-path' }, - Pe.createElement(z, { specPath: L }) - ), - Pe.createElement( - U, - { - classes: 'model-box', - collapsedContent: this.getCollapsedContent(w), - onToggle: this.handleToggle, - title: le, - displayName: ee, - modelName: w, - specPath: L, - layoutSelectors: i, - layoutActions: u, - hideSelfOnExpand: !0, - expanded: C > 0 && ie - }, - ae - ) - ); - }) - .toArray() - ) - ); - } - } - const enum_model = ({ value: s, getComponent: o }) => { - let i = o('ModelCollapse'), - u = Pe.createElement('span', null, 'Array [ ', s.count(), ' ]'); - return Pe.createElement( - 'span', - { className: 'prop-enum' }, - 'Enum:', - Pe.createElement('br', null), - Pe.createElement(i, { collapsedContent: u }, '[ ', s.map(String).join(', '), ' ]') - ); - }; - class ObjectModel extends Pe.Component { - render() { - let { - schema: s, - name: o, - displayName: i, - isRef: u, - getComponent: _, - getConfigs: w, - depth: x, - onToggle: C, - expanded: j, - specPath: L, - ...B - } = this.props, - { specSelectors: $, expandDepth: V, includeReadOnly: U, includeWriteOnly: z } = B; - const { isOAS3: Y } = $; - if (!s) return null; - const { showExtensions: Z } = w(); - let ee = s.get('description'), - ie = s.get('properties'), - ae = s.get('additionalProperties'), - le = s.get('title') || i || o, - ce = s.get('required'), - pe = s.filter( - (s, o) => - -1 !== ['maxProperties', 'minProperties', 'nullable', 'example'].indexOf(o) - ), - de = s.get('deprecated'), - fe = s.getIn(['externalDocs', 'url']), - ye = s.getIn(['externalDocs', 'description']); - const be = _('JumpToPath', !0), - _e = _('Markdown', !0), - we = _('Model'), - Se = _('ModelCollapse'), - xe = _('Property'), - Te = _('Link'), - JumpToPathSection = () => - Pe.createElement( - 'span', - { className: 'model-jump-to-path' }, - Pe.createElement(be, { specPath: L }) - ), - Re = Pe.createElement( - 'span', - null, - Pe.createElement('span', null, '{'), - '...', - Pe.createElement('span', null, '}'), - u ? Pe.createElement(JumpToPathSection, null) : '' - ), - $e = $.isOAS3() ? s.get('allOf') : null, - ze = $.isOAS3() ? s.get('anyOf') : null, - We = $.isOAS3() ? s.get('oneOf') : null, - He = $.isOAS3() ? s.get('not') : null, - Ye = - le && - Pe.createElement( - 'span', - { className: 'model-title' }, - u && - s.get('$$ref') && - Pe.createElement('span', { className: 'model-hint' }, s.get('$$ref')), - Pe.createElement('span', { className: 'model-title__text' }, le) - ); - return Pe.createElement( - 'span', - { className: 'model' }, - Pe.createElement( - Se, - { - modelName: o, - title: Ye, - onToggle: C, - expanded: !!j || x <= V, - collapsedContent: Re - }, - Pe.createElement('span', { className: 'brace-open object' }, '{'), - u ? Pe.createElement(JumpToPathSection, null) : null, - Pe.createElement( - 'span', - { className: 'inner-object' }, - Pe.createElement( - 'table', - { className: 'model' }, - Pe.createElement( - 'tbody', - null, - ee - ? Pe.createElement( - 'tr', - { className: 'description' }, - Pe.createElement('td', null, 'description:'), - Pe.createElement('td', null, Pe.createElement(_e, { source: ee })) - ) - : null, - fe && - Pe.createElement( - 'tr', - { className: 'external-docs' }, - Pe.createElement('td', null, 'externalDocs:'), - Pe.createElement( - 'td', - null, - Pe.createElement( - Te, - { target: '_blank', href: sanitizeUrl(fe) }, - ye || fe - ) - ) - ), - de - ? Pe.createElement( - 'tr', - { className: 'property' }, - Pe.createElement('td', null, 'deprecated:'), - Pe.createElement('td', null, 'true') - ) - : null, - ie && ie.size - ? ie - .entrySeq() - .filter( - ([, s]) => (!s.get('readOnly') || U) && (!s.get('writeOnly') || z) - ) - .map(([s, i]) => { - let u = Y() && i.get('deprecated'), - C = qe.List.isList(ce) && ce.contains(s), - j = ['property-row']; - return ( - u && j.push('deprecated'), - C && j.push('required'), - Pe.createElement( - 'tr', - { key: s, className: j.join(' ') }, - Pe.createElement( - 'td', - null, - s, - C && Pe.createElement('span', { className: 'star' }, '*') - ), - Pe.createElement( - 'td', - null, - Pe.createElement( - we, - Rn()({ key: `object-${o}-${s}_${i}` }, B, { - required: C, - getComponent: _, - specPath: L.push('properties', s), - getConfigs: w, - schema: i, - depth: x + 1 - }) - ) - ) - ) - ); - }) - .toArray() - : null, - Z ? Pe.createElement('tr', null, Pe.createElement('td', null, ' ')) : null, - Z - ? s - .entrySeq() - .map(([s, o]) => { - if ('x-' !== s.slice(0, 2)) return; - const i = o ? (o.toJS ? o.toJS() : o) : null; - return Pe.createElement( - 'tr', - { key: s, className: 'extension' }, - Pe.createElement('td', null, s), - Pe.createElement('td', null, JSON.stringify(i)) - ); - }) - .toArray() - : null, - ae && ae.size - ? Pe.createElement( - 'tr', - null, - Pe.createElement('td', null, '< * >:'), - Pe.createElement( - 'td', - null, - Pe.createElement( - we, - Rn()({}, B, { - required: !1, - getComponent: _, - specPath: L.push('additionalProperties'), - getConfigs: w, - schema: ae, - depth: x + 1 - }) - ) - ) - ) - : null, - $e - ? Pe.createElement( - 'tr', - null, - Pe.createElement('td', null, 'allOf ->'), - Pe.createElement( - 'td', - null, - $e.map((s, o) => - Pe.createElement( - 'div', - { key: o }, - Pe.createElement( - we, - Rn()({}, B, { - required: !1, - getComponent: _, - specPath: L.push('allOf', o), - getConfigs: w, - schema: s, - depth: x + 1 - }) - ) - ) - ) - ) - ) - : null, - ze - ? Pe.createElement( - 'tr', - null, - Pe.createElement('td', null, 'anyOf ->'), - Pe.createElement( - 'td', - null, - ze.map((s, o) => - Pe.createElement( - 'div', - { key: o }, - Pe.createElement( - we, - Rn()({}, B, { - required: !1, - getComponent: _, - specPath: L.push('anyOf', o), - getConfigs: w, - schema: s, - depth: x + 1 - }) - ) - ) - ) - ) - ) - : null, - We - ? Pe.createElement( - 'tr', - null, - Pe.createElement('td', null, 'oneOf ->'), - Pe.createElement( - 'td', - null, - We.map((s, o) => - Pe.createElement( - 'div', - { key: o }, - Pe.createElement( - we, - Rn()({}, B, { - required: !1, - getComponent: _, - specPath: L.push('oneOf', o), - getConfigs: w, - schema: s, - depth: x + 1 - }) - ) - ) - ) - ) - ) - : null, - He - ? Pe.createElement( - 'tr', - null, - Pe.createElement('td', null, 'not ->'), - Pe.createElement( - 'td', - null, - Pe.createElement( - 'div', - null, - Pe.createElement( - we, - Rn()({}, B, { - required: !1, - getComponent: _, - specPath: L.push('not'), - getConfigs: w, - schema: He, - depth: x + 1 - }) - ) - ) - ) - ) - : null - ) - ) - ), - Pe.createElement('span', { className: 'brace-close' }, '}') - ), - pe.size - ? pe.entrySeq().map(([s, o]) => - Pe.createElement(xe, { - key: `${s}-${o}`, - propKey: s, - propVal: o, - propClass: 'property' - }) - ) - : null - ); - } - } - class ArrayModel extends Pe.Component { - render() { - let { - getComponent: s, - getConfigs: o, - schema: i, - depth: u, - expandDepth: _, - name: w, - displayName: x, - specPath: C - } = this.props, - j = i.get('description'), - L = i.get('items'), - B = i.get('title') || x || w, - $ = i.filter( - (s, o) => - -1 === ['type', 'items', 'description', '$$ref', 'externalDocs'].indexOf(o) - ), - V = i.getIn(['externalDocs', 'url']), - U = i.getIn(['externalDocs', 'description']); - const z = s('Markdown', !0), - Y = s('ModelCollapse'), - Z = s('Model'), - ee = s('Property'), - ie = s('Link'), - ae = - B && - Pe.createElement( - 'span', - { className: 'model-title' }, - Pe.createElement('span', { className: 'model-title__text' }, B) - ); - return Pe.createElement( - 'span', - { className: 'model' }, - Pe.createElement( - Y, - { title: ae, expanded: u <= _, collapsedContent: '[...]' }, - '[', - $.size - ? $.entrySeq().map(([s, o]) => - Pe.createElement(ee, { - key: `${s}-${o}`, - propKey: s, - propVal: o, - propClass: 'property' - }) - ) - : null, - j - ? Pe.createElement(z, { source: j }) - : $.size - ? Pe.createElement('div', { className: 'markdown' }) - : null, - V && - Pe.createElement( - 'div', - { className: 'external-docs' }, - Pe.createElement(ie, { target: '_blank', href: sanitizeUrl(V) }, U || V) - ), - Pe.createElement( - 'span', - null, - Pe.createElement( - Z, - Rn()({}, this.props, { - getConfigs: o, - specPath: C.push('items'), - name: null, - schema: L, - required: !1, - depth: u + 1 - }) - ) - ), - ']' - ) - ); - } - } - const rs = 'property primitive'; - class Primitive extends Pe.Component { - render() { - let { - schema: s, - getComponent: o, - getConfigs: i, - name: u, - displayName: _, - depth: w, - expandDepth: x - } = this.props; - const { showExtensions: C } = i(); - if (!s || !s.get) return Pe.createElement('div', null); - let j = s.get('type'), - L = s.get('format'), - B = s.get('xml'), - $ = s.get('enum'), - V = s.get('title') || _ || u, - U = s.get('description'), - z = getExtensions(s), - Y = s - .filter( - (s, o) => - -1 === - ['enum', 'type', 'format', 'description', '$$ref', 'externalDocs'].indexOf(o) - ) - .filterNot((s, o) => z.has(o)), - Z = s.getIn(['externalDocs', 'url']), - ee = s.getIn(['externalDocs', 'description']); - const ie = o('Markdown', !0), - ae = o('EnumModel'), - le = o('Property'), - ce = o('ModelCollapse'), - pe = o('Link'), - de = - V && - Pe.createElement( - 'span', - { className: 'model-title' }, - Pe.createElement('span', { className: 'model-title__text' }, V) - ); - return Pe.createElement( - 'span', - { className: 'model' }, - Pe.createElement( - ce, - { title: de, expanded: w <= x, collapsedContent: '[...]' }, - Pe.createElement( - 'span', - { className: 'prop' }, - u && w > 1 && Pe.createElement('span', { className: 'prop-name' }, V), - Pe.createElement('span', { className: 'prop-type' }, j), - L && Pe.createElement('span', { className: 'prop-format' }, '($', L, ')'), - Y.size - ? Y.entrySeq().map(([s, o]) => - Pe.createElement(le, { - key: `${s}-${o}`, - propKey: s, - propVal: o, - propClass: rs - }) - ) - : null, - C && z.size - ? z.entrySeq().map(([s, o]) => - Pe.createElement(le, { - key: `${s}-${o}`, - propKey: s, - propVal: o, - propClass: rs - }) - ) - : null, - U ? Pe.createElement(ie, { source: U }) : null, - Z && - Pe.createElement( - 'div', - { className: 'external-docs' }, - Pe.createElement(pe, { target: '_blank', href: sanitizeUrl(Z) }, ee || Z) - ), - B && B.size - ? Pe.createElement( - 'span', - null, - Pe.createElement('br', null), - Pe.createElement('span', { className: rs }, 'xml:'), - B.entrySeq() - .map(([s, o]) => - Pe.createElement( - 'span', - { key: `${s}-${o}`, className: rs }, - Pe.createElement('br', null), - '   ', - s, - ': ', - String(o) - ) - ) - .toArray() - ) - : null, - $ && Pe.createElement(ae, { value: $, getComponent: o }) - ) - ) - ); - } - } - class Schemes extends Pe.Component { - UNSAFE_componentWillMount() { - let { schemes: s } = this.props; - this.setScheme(s.first()); - } - UNSAFE_componentWillReceiveProps(s) { - (this.props.currentScheme && s.schemes.includes(this.props.currentScheme)) || - this.setScheme(s.schemes.first()); - } - onChange = (s) => { - this.setScheme(s.target.value); - }; - setScheme = (s) => { - let { path: o, method: i, specActions: u } = this.props; - u.setScheme(s, o, i); - }; - render() { - let { schemes: s, currentScheme: o } = this.props; - return Pe.createElement( - 'label', - { htmlFor: 'schemes' }, - Pe.createElement('span', { className: 'schemes-title' }, 'Schemes'), - Pe.createElement( - 'select', - { onChange: this.onChange, value: o, id: 'schemes' }, - s - .valueSeq() - .map((s) => Pe.createElement('option', { value: s, key: s }, s)) - .toArray() - ) - ); - } - } - class SchemesContainer extends Pe.Component { - render() { - const { specActions: s, specSelectors: o, getComponent: i } = this.props, - u = o.operationScheme(), - _ = o.schemes(), - w = i('schemes'); - return _ && _.size - ? Pe.createElement(w, { currentScheme: u, schemes: _, specActions: s }) - : null; - } - } - var ns = __webpack_require__(24677), - ss = __webpack_require__.n(ns); - const os = { - value: '', - onChange: () => {}, - schema: {}, - keyName: '', - required: !1, - errors: (0, qe.List)() - }; - class JsonSchemaForm extends Pe.Component { - static defaultProps = os; - componentDidMount() { - const { dispatchInitialValue: s, value: o, onChange: i } = this.props; - s ? i(o) : !1 === s && i(''); - } - render() { - let { - schema: s, - errors: o, - value: i, - onChange: u, - getComponent: _, - fn: w, - disabled: x - } = this.props; - const C = s && s.get ? s.get('format') : null, - j = s && s.get ? s.get('type') : null; - let getComponentSilently = (s) => _(s, !1, { failSilently: !0 }), - L = j - ? getComponentSilently(C ? `JsonSchema_${j}_${C}` : `JsonSchema_${j}`) - : _('JsonSchema_string'); - return ( - L || (L = _('JsonSchema_string')), - Pe.createElement( - L, - Rn()({}, this.props, { - errors: o, - fn: w, - getComponent: _, - value: i, - onChange: u, - schema: s, - disabled: x - }) - ) - ); - } - } - class JsonSchema_string extends Pe.Component { - static defaultProps = os; - onChange = (s) => { - const o = - this.props.schema && 'file' === this.props.schema.get('type') - ? s.target.files[0] - : s.target.value; - this.props.onChange(o, this.props.keyName); - }; - onEnumChange = (s) => this.props.onChange(s); - render() { - let { - getComponent: s, - value: o, - schema: i, - errors: u, - required: _, - description: w, - disabled: x - } = this.props; - const C = i && i.get ? i.get('enum') : null, - j = i && i.get ? i.get('format') : null, - L = i && i.get ? i.get('type') : null, - B = i && i.get ? i.get('in') : null; - if ((o || (o = ''), (u = u.toJS ? u.toJS() : []), C)) { - const i = s('Select'); - return Pe.createElement(i, { - className: u.length ? 'invalid' : '', - title: u.length ? u : '', - allowedValues: [...C], - value: o, - allowEmptyValue: !_, - disabled: x, - onChange: this.onEnumChange - }); - } - const $ = x || (B && 'formData' === B && !('FormData' in window)), - V = s('Input'); - return L && 'file' === L - ? Pe.createElement(V, { - type: 'file', - className: u.length ? 'invalid' : '', - title: u.length ? u : '', - onChange: this.onChange, - disabled: $ - }) - : Pe.createElement(ss(), { - type: j && 'password' === j ? 'password' : 'text', - className: u.length ? 'invalid' : '', - title: u.length ? u : '', - value: o, - minLength: 0, - debounceTimeout: 350, - placeholder: w, - onChange: this.onChange, - disabled: $ - }); - } - } - class JsonSchema_array extends Pe.PureComponent { - static defaultProps = os; - constructor(s, o) { - (super(s, o), (this.state = { value: valueOrEmptyList(s.value), schema: s.schema })); - } - UNSAFE_componentWillReceiveProps(s) { - const o = valueOrEmptyList(s.value); - (o !== this.state.value && this.setState({ value: o }), - s.schema !== this.state.schema && this.setState({ schema: s.schema })); - } - onChange = () => { - this.props.onChange(this.state.value); - }; - onItemChange = (s, o) => { - this.setState(({ value: i }) => ({ value: i.set(o, s) }), this.onChange); - }; - removeItem = (s) => { - this.setState(({ value: o }) => ({ value: o.delete(s) }), this.onChange); - }; - addItem = () => { - const { fn: s } = this.props; - let o = valueOrEmptyList(this.state.value); - this.setState( - () => ({ - value: o.push( - s.getSampleSchema(this.state.schema.get('items'), !1, { includeWriteOnly: !0 }) - ) - }), - this.onChange - ); - }; - onEnumChange = (s) => { - this.setState(() => ({ value: s }), this.onChange); - }; - render() { - let { - getComponent: s, - required: o, - schema: i, - errors: u, - fn: _, - disabled: w - } = this.props; - u = u.toJS ? u.toJS() : Array.isArray(u) ? u : []; - const x = u.filter((s) => 'string' == typeof s), - C = u.filter((s) => void 0 !== s.needRemove).map((s) => s.error), - j = this.state.value, - L = !!(j && j.count && j.count() > 0), - B = i.getIn(['items', 'enum']), - $ = i.getIn(['items', 'type']), - V = i.getIn(['items', 'format']), - U = i.get('items'); - let z, - Y = !1, - Z = 'file' === $ || ('string' === $ && 'binary' === V); - if ( - ($ && V - ? (z = s(`JsonSchema_${$}_${V}`)) - : ('boolean' !== $ && 'array' !== $ && 'object' !== $) || - (z = s(`JsonSchema_${$}`)), - z || Z || (Y = !0), - B) - ) { - const i = s('Select'); - return Pe.createElement(i, { - className: u.length ? 'invalid' : '', - title: u.length ? u : '', - multiple: !0, - value: j, - disabled: w, - allowedValues: B, - allowEmptyValue: !o, - onChange: this.onEnumChange - }); - } - const ee = s('Button'); - return Pe.createElement( - 'div', - { className: 'json-schema-array' }, - L - ? j.map((o, i) => { - const x = (0, qe.fromJS)([ - ...u.filter((s) => s.index === i).map((s) => s.error) - ]); - return Pe.createElement( - 'div', - { key: i, className: 'json-schema-form-item' }, - Z - ? Pe.createElement(JsonSchemaArrayItemFile, { - value: o, - onChange: (s) => this.onItemChange(s, i), - disabled: w, - errors: x, - getComponent: s - }) - : Y - ? Pe.createElement(JsonSchemaArrayItemText, { - value: o, - onChange: (s) => this.onItemChange(s, i), - disabled: w, - errors: x - }) - : Pe.createElement( - z, - Rn()({}, this.props, { - value: o, - onChange: (s) => this.onItemChange(s, i), - disabled: w, - errors: x, - schema: U, - getComponent: s, - fn: _ - }) - ), - w - ? null - : Pe.createElement( - ee, - { - className: `btn btn-sm json-schema-form-item-remove ${C.length ? 'invalid' : null}`, - title: C.length ? C : '', - onClick: () => this.removeItem(i) - }, - ' - ' - ) - ); - }) - : null, - w - ? null - : Pe.createElement( - ee, - { - className: `btn btn-sm json-schema-form-item-add ${x.length ? 'invalid' : null}`, - title: x.length ? x : '', - onClick: this.addItem - }, - 'Add ', - $ ? `${$} ` : '', - 'item' - ) - ); - } - } - class JsonSchemaArrayItemText extends Pe.Component { - static defaultProps = os; - onChange = (s) => { - const o = s.target.value; - this.props.onChange(o, this.props.keyName); - }; - render() { - let { value: s, errors: o, description: i, disabled: u } = this.props; - return ( - s || (s = ''), - (o = o.toJS ? o.toJS() : []), - Pe.createElement(ss(), { - type: 'text', - className: o.length ? 'invalid' : '', - title: o.length ? o : '', - value: s, - minLength: 0, - debounceTimeout: 350, - placeholder: i, - onChange: this.onChange, - disabled: u - }) - ); - } - } - class JsonSchemaArrayItemFile extends Pe.Component { - static defaultProps = os; - onFileChange = (s) => { - const o = s.target.files[0]; - this.props.onChange(o, this.props.keyName); - }; - render() { - let { getComponent: s, errors: o, disabled: i } = this.props; - const u = s('Input'), - _ = i || !('FormData' in window); - return Pe.createElement(u, { - type: 'file', - className: o.length ? 'invalid' : '', - title: o.length ? o : '', - onChange: this.onFileChange, - disabled: _ - }); - } - } - class JsonSchema_boolean extends Pe.Component { - static defaultProps = os; - onEnumChange = (s) => this.props.onChange(s); - render() { - let { - getComponent: s, - value: o, - errors: i, - schema: u, - required: _, - disabled: w - } = this.props; - i = i.toJS ? i.toJS() : []; - let x = u && u.get ? u.get('enum') : null, - C = !x || !_, - j = !x && ['true', 'false']; - const L = s('Select'); - return Pe.createElement(L, { - className: i.length ? 'invalid' : '', - title: i.length ? i : '', - value: String(o), - disabled: w, - allowedValues: x ? [...x] : j, - allowEmptyValue: C, - onChange: this.onEnumChange - }); - } - } - const stringifyObjectErrors = (s) => - s.map((s) => { - const o = void 0 !== s.propKey ? s.propKey : s.index; - let i = 'string' == typeof s ? s : 'string' == typeof s.error ? s.error : null; - if (!o && i) return i; - let u = s.error, - _ = `/${s.propKey}`; - for (; 'object' == typeof u; ) { - const s = void 0 !== u.propKey ? u.propKey : u.index; - if (void 0 === s) break; - if (((_ += `/${s}`), !u.error)) break; - u = u.error; - } - return `${_}: ${u}`; - }); - class JsonSchema_object extends Pe.PureComponent { - constructor() { - super(); - } - static defaultProps = os; - onChange = (s) => { - this.props.onChange(s); - }; - handleOnChange = (s) => { - const o = s.target.value; - this.onChange(o); - }; - render() { - let { getComponent: s, value: o, errors: i, disabled: u } = this.props; - const _ = s('TextArea'); - return ( - (i = i.toJS ? i.toJS() : Array.isArray(i) ? i : []), - Pe.createElement( - 'div', - null, - Pe.createElement(_, { - className: Hn()({ invalid: i.length }), - title: i.length ? stringifyObjectErrors(i).join(', ') : '', - value: stringify(o), - disabled: u, - onChange: this.handleOnChange - }) - ) - ); - } - } - function valueOrEmptyList(s) { - return qe.List.isList(s) ? s : Array.isArray(s) ? (0, qe.fromJS)(s) : (0, qe.List)(); - } - const json_schema_5 = () => ({ - components: { - modelExample: model_example, - ModelWrapper, - ModelCollapse, - Model, - Models, - EnumModel: enum_model, - ObjectModel, - ArrayModel, - PrimitiveModel: Primitive, - schemes: Schemes, - SchemesContainer, - ...z - } - }); - var as = __webpack_require__(19123), - ls = __webpack_require__.n(as), - cs = __webpack_require__(41859), - us = __webpack_require__.n(cs), - ps = __webpack_require__(62193), - hs = __webpack_require__.n(ps); - const shallowArrayEquals = (s) => (o) => - Array.isArray(s) && - Array.isArray(o) && - s.length === o.length && - s.every((s, i) => s === o[i]), - list = (...s) => s; - class Cache extends Map { - delete(s) { - const o = Array.from(this.keys()).find(shallowArrayEquals(s)); - return super.delete(o); - } - get(s) { - const o = Array.from(this.keys()).find(shallowArrayEquals(s)); - return super.get(o); - } - has(s) { - return -1 !== Array.from(this.keys()).findIndex(shallowArrayEquals(s)); - } - } - const utils_memoizeN = (s, o = list) => { - const { Cache: i } = ut(); - ut().Cache = Cache; - const u = ut()(s, o); - return ((ut().Cache = i), u); - }, - ds = { - string: (s) => - s.pattern - ? ((s) => { - try { - return new (us())(s).gen(); - } catch (s) { - return 'string'; - } - })(s.pattern) - : 'string', - string_email: () => 'user@example.com', - 'string_date-time': () => new Date().toISOString(), - string_date: () => new Date().toISOString().substring(0, 10), - string_uuid: () => '3fa85f64-5717-4562-b3fc-2c963f66afa6', - string_hostname: () => 'example.com', - string_ipv4: () => '198.51.100.42', - string_ipv6: () => '2001:0db8:5b96:0000:0000:426f:8e17:642a', - number: () => 0, - number_float: () => 0, - integer: () => 0, - boolean: (s) => 'boolean' != typeof s.default || s.default - }, - primitive = (s) => { - s = objectify(s); - let { type: o, format: i } = s, - u = ds[`${o}_${i}`] || ds[o]; - return isFunc(u) ? u(s) : 'Unknown Type: ' + s.type; - }, - sanitizeRef = (s) => - deeplyStripKey(s, '$$ref', (s) => 'string' == typeof s && s.indexOf('#') > -1), - fs = ['maxProperties', 'minProperties'], - ms = ['minItems', 'maxItems'], - gs = ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum'], - ys = ['minLength', 'maxLength'], - mergeJsonSchema = (s, o, i = {}) => { - const u = { ...s }; - if ( - (['example', 'default', 'enum', 'xml', 'type', ...fs, ...ms, ...gs, ...ys].forEach( - (s) => - ((s) => { - void 0 === u[s] && void 0 !== o[s] && (u[s] = o[s]); - })(s) - ), - void 0 !== o.required && - Array.isArray(o.required) && - ((void 0 !== u.required && u.required.length) || (u.required = []), - o.required.forEach((s) => { - u.required.includes(s) || u.required.push(s); - })), - o.properties) - ) { - u.properties || (u.properties = {}); - let s = objectify(o.properties); - for (let _ in s) - Object.prototype.hasOwnProperty.call(s, _) && - ((s[_] && s[_].deprecated) || - (s[_] && s[_].readOnly && !i.includeReadOnly) || - (s[_] && s[_].writeOnly && !i.includeWriteOnly) || - u.properties[_] || - ((u.properties[_] = s[_]), - !o.required && - Array.isArray(o.required) && - -1 !== o.required.indexOf(_) && - (u.required ? u.required.push(_) : (u.required = [_])))); - } - return ( - o.items && - (u.items || (u.items = {}), (u.items = mergeJsonSchema(u.items, o.items, i))), - u - ); - }, - sampleFromSchemaGeneric = (s, o = {}, i = void 0, u = !1) => { - s && isFunc(s.toJS) && (s = s.toJS()); - let _ = void 0 !== i || (s && void 0 !== s.example) || (s && void 0 !== s.default); - const w = !_ && s && s.oneOf && s.oneOf.length > 0, - x = !_ && s && s.anyOf && s.anyOf.length > 0; - if (!_ && (w || x)) { - const i = objectify(w ? s.oneOf[0] : s.anyOf[0]); - if ( - (!(s = mergeJsonSchema(s, i, o)).xml && i.xml && (s.xml = i.xml), - void 0 !== s.example && void 0 !== i.example) - ) - _ = !0; - else if (i.properties) { - s.properties || (s.properties = {}); - let u = objectify(i.properties); - for (let _ in u) - Object.prototype.hasOwnProperty.call(u, _) && - ((u[_] && u[_].deprecated) || - (u[_] && u[_].readOnly && !o.includeReadOnly) || - (u[_] && u[_].writeOnly && !o.includeWriteOnly) || - s.properties[_] || - ((s.properties[_] = u[_]), - !i.required && - Array.isArray(i.required) && - -1 !== i.required.indexOf(_) && - (s.required ? s.required.push(_) : (s.required = [_])))); - } - } - const C = {}; - let { - xml: j, - type: L, - example: B, - properties: $, - additionalProperties: V, - items: U - } = s || {}, - { includeReadOnly: z, includeWriteOnly: Y } = o; - j = j || {}; - let Z, - { name: ee, prefix: ie, namespace: ae } = j, - le = {}; - if (u && ((ee = ee || 'notagname'), (Z = (ie ? ie + ':' : '') + ee), ae)) { - C[ie ? 'xmlns:' + ie : 'xmlns'] = ae; - } - u && (le[Z] = []); - const schemaHasAny = (o) => o.some((o) => Object.prototype.hasOwnProperty.call(s, o)); - s && - !L && - ($ || V || schemaHasAny(fs) - ? (L = 'object') - : U || schemaHasAny(ms) - ? (L = 'array') - : schemaHasAny(gs) - ? ((L = 'number'), (s.type = 'number')) - : _ || s.enum || ((L = 'string'), (s.type = 'string'))); - const handleMinMaxItems = (o) => { - if ((null != s?.maxItems && (o = o.slice(0, s?.maxItems)), null != s?.minItems)) { - let i = 0; - for (; o.length < s?.minItems; ) o.push(o[i++ % o.length]); - } - return o; - }, - ce = objectify($); - let pe, - de = 0; - const hasExceededMaxProperties = () => - s && - null !== s.maxProperties && - void 0 !== s.maxProperties && - de >= s.maxProperties, - canAddProperty = (o) => - !s || - null === s.maxProperties || - void 0 === s.maxProperties || - (!hasExceededMaxProperties() && - (!((o) => !(s && s.required && s.required.length && s.required.includes(o)))(o) || - s.maxProperties - - de - - (() => { - if (!s || !s.required) return 0; - let o = 0; - return ( - u - ? s.required.forEach((s) => (o += void 0 === le[s] ? 0 : 1)) - : s.required.forEach( - (s) => (o += void 0 === le[Z]?.find((o) => void 0 !== o[s]) ? 0 : 1) - ), - s.required.length - o - ); - })() > - 0)); - if ( - ((pe = u - ? (i, _ = void 0) => { - if (s && ce[i]) { - if (((ce[i].xml = ce[i].xml || {}), ce[i].xml.attribute)) { - const s = Array.isArray(ce[i].enum) ? ce[i].enum[0] : void 0, - o = ce[i].example, - u = ce[i].default; - return void (C[ce[i].xml.name || i] = - void 0 !== o - ? o - : void 0 !== u - ? u - : void 0 !== s - ? s - : primitive(ce[i])); - } - ce[i].xml.name = ce[i].xml.name || i; - } else ce[i] || !1 === V || (ce[i] = { xml: { name: i } }); - let w = sampleFromSchemaGeneric((s && ce[i]) || void 0, o, _, u); - canAddProperty(i) && - (de++, Array.isArray(w) ? (le[Z] = le[Z].concat(w)) : le[Z].push(w)); - } - : (i, _) => { - if (canAddProperty(i)) { - if ( - Object.prototype.hasOwnProperty.call(s, 'discriminator') && - s.discriminator && - Object.prototype.hasOwnProperty.call(s.discriminator, 'mapping') && - s.discriminator.mapping && - Object.prototype.hasOwnProperty.call(s, '$$ref') && - s.$$ref && - s.discriminator.propertyName === i - ) { - for (let o in s.discriminator.mapping) - if (-1 !== s.$$ref.search(s.discriminator.mapping[o])) { - le[i] = o; - break; - } - } else le[i] = sampleFromSchemaGeneric(ce[i], o, _, u); - de++; - } - }), - _) - ) { - let _; - if (((_ = sanitizeRef(void 0 !== i ? i : void 0 !== B ? B : s.default)), !u)) { - if ('number' == typeof _ && 'string' === L) return `${_}`; - if ('string' != typeof _ || 'string' === L) return _; - try { - return JSON.parse(_); - } catch (s) { - return _; - } - } - if ((s || (L = Array.isArray(_) ? 'array' : typeof _), 'array' === L)) { - if (!Array.isArray(_)) { - if ('string' == typeof _) return _; - _ = [_]; - } - const i = s ? s.items : void 0; - i && ((i.xml = i.xml || j || {}), (i.xml.name = i.xml.name || j.name)); - let w = _.map((s) => sampleFromSchemaGeneric(i, o, s, u)); - return ( - (w = handleMinMaxItems(w)), - j.wrapped ? ((le[Z] = w), hs()(C) || le[Z].push({ _attr: C })) : (le = w), - le - ); - } - if ('object' === L) { - if ('string' == typeof _) return _; - for (let o in _) - Object.prototype.hasOwnProperty.call(_, o) && - ((s && ce[o] && ce[o].readOnly && !z) || - (s && ce[o] && ce[o].writeOnly && !Y) || - (s && ce[o] && ce[o].xml && ce[o].xml.attribute - ? (C[ce[o].xml.name || o] = _[o]) - : pe(o, _[o]))); - return (hs()(C) || le[Z].push({ _attr: C }), le); - } - return ((le[Z] = hs()(C) ? _ : [{ _attr: C }, _]), le); - } - if ('object' === L) { - for (let s in ce) - Object.prototype.hasOwnProperty.call(ce, s) && - ((ce[s] && ce[s].deprecated) || - (ce[s] && ce[s].readOnly && !z) || - (ce[s] && ce[s].writeOnly && !Y) || - pe(s)); - if ((u && C && le[Z].push({ _attr: C }), hasExceededMaxProperties())) return le; - if (!0 === V) - (u - ? le[Z].push({ additionalProp: 'Anything can be here' }) - : (le.additionalProp1 = {}), - de++); - else if (V) { - const i = objectify(V), - _ = sampleFromSchemaGeneric(i, o, void 0, u); - if (u && i.xml && i.xml.name && 'notagname' !== i.xml.name) le[Z].push(_); - else { - const o = - null !== s.minProperties && void 0 !== s.minProperties && de < s.minProperties - ? s.minProperties - de - : 3; - for (let s = 1; s <= o; s++) { - if (hasExceededMaxProperties()) return le; - if (u) { - const o = {}; - ((o['additionalProp' + s] = _.notagname), le[Z].push(o)); - } else le['additionalProp' + s] = _; - de++; - } - } - } - return le; - } - if ('array' === L) { - if (!U) return; - let i; - if ( - (u && ((U.xml = U.xml || s?.xml || {}), (U.xml.name = U.xml.name || j.name)), - Array.isArray(U.anyOf)) - ) - i = U.anyOf.map((s) => - sampleFromSchemaGeneric(mergeJsonSchema(s, U, o), o, void 0, u) - ); - else if (Array.isArray(U.oneOf)) - i = U.oneOf.map((s) => - sampleFromSchemaGeneric(mergeJsonSchema(s, U, o), o, void 0, u) - ); - else { - if (!(!u || (u && j.wrapped))) return sampleFromSchemaGeneric(U, o, void 0, u); - i = [sampleFromSchemaGeneric(U, o, void 0, u)]; - } - return ( - (i = handleMinMaxItems(i)), - u && j.wrapped ? ((le[Z] = i), hs()(C) || le[Z].push({ _attr: C }), le) : i - ); - } - let fe; - if (s && Array.isArray(s.enum)) fe = normalizeArray(s.enum)[0]; - else { - if (!s) return; - if (((fe = primitive(s)), 'number' == typeof fe)) { - let o = s.minimum; - null != o && (s.exclusiveMinimum && o++, (fe = o)); - let i = s.maximum; - null != i && (s.exclusiveMaximum && i--, (fe = i)); - } - if ( - 'string' == typeof fe && - (null !== s.maxLength && void 0 !== s.maxLength && (fe = fe.slice(0, s.maxLength)), - null !== s.minLength && void 0 !== s.minLength) - ) { - let o = 0; - for (; fe.length < s.minLength; ) fe += fe[o++ % fe.length]; - } - } - if ('file' !== L) return u ? ((le[Z] = hs()(C) ? fe : [{ _attr: C }, fe]), le) : fe; - }, - inferSchema = (s) => (s.schema && (s = s.schema), s.properties && (s.type = 'object'), s), - createXMLExample = (s, o, i) => { - const u = sampleFromSchemaGeneric(s, o, i, !0); - if (u) return 'string' == typeof u ? u : ls()(u, { declaration: !0, indent: '\t' }); - }, - sampleFromSchema = (s, o, i) => sampleFromSchemaGeneric(s, o, i, !1), - resolver = (s, o, i) => [s, JSON.stringify(o), JSON.stringify(i)], - vs = utils_memoizeN(createXMLExample, resolver), - bs = utils_memoizeN(sampleFromSchema, resolver), - _s = [{ when: /json/, shouldStringifyTypes: ['string'] }], - Es = ['object'], - get_json_sample_schema = (s) => (o, i, u, _) => { - const { fn: w } = s(), - x = w.memoizedSampleFromSchema(o, i, _), - C = typeof x, - j = _s.reduce((s, o) => (o.when.test(u) ? [...s, ...o.shouldStringifyTypes] : s), Es); - return mt()(j, (s) => s === C) ? JSON.stringify(x, null, 2) : x; - }, - get_yaml_sample_schema = (s) => (o, i, u, _) => { - const { fn: w } = s(), - x = w.getJsonSampleSchema(o, i, u, _); - let C; - try { - ((C = mn.dump(mn.load(x), { lineWidth: -1 }, { schema: nn })), - '\n' === C[C.length - 1] && (C = C.slice(0, C.length - 1))); - } catch (s) { - return (console.error(s), 'error: could not generate yaml example'); - } - return C.replace(/\t/g, ' '); - }, - get_xml_sample_schema = (s) => (o, i, u) => { - const { fn: _ } = s(); - if ((o && !o.xml && (o.xml = {}), o && !o.xml.name)) { - if (!o.$$ref && (o.type || o.items || o.properties || o.additionalProperties)) - return '\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e'; - if (o.$$ref) { - let s = o.$$ref.match(/\S*\/(\S+)$/); - o.xml.name = s[1]; - } - } - return _.memoizedCreateXMLExample(o, i, u); - }, - get_sample_schema = - (s) => - (o, i = '', u = {}, _ = void 0) => { - const { fn: w } = s(); - return ( - 'function' == typeof o?.toJS && (o = o.toJS()), - 'function' == typeof _?.toJS && (_ = _.toJS()), - /xml/.test(i) - ? w.getXmlSampleSchema(o, u, _) - : /(yaml|yml)/.test(i) - ? w.getYamlSampleSchema(o, u, i, _) - : w.getJsonSampleSchema(o, u, i, _) - ); - }, - json_schema_5_samples = ({ getSystem: s }) => { - const o = get_json_sample_schema(s), - i = get_yaml_sample_schema(s), - u = get_xml_sample_schema(s), - _ = get_sample_schema(s); - return { - fn: { - jsonSchema5: { - inferSchema, - sampleFromSchema, - sampleFromSchemaGeneric, - createXMLExample, - memoizedSampleFromSchema: bs, - memoizedCreateXMLExample: vs, - getJsonSampleSchema: o, - getYamlSampleSchema: i, - getXmlSampleSchema: u, - getSampleSchema: _, - mergeJsonSchema - }, - inferSchema, - sampleFromSchema, - sampleFromSchemaGeneric, - createXMLExample, - memoizedSampleFromSchema: bs, - memoizedCreateXMLExample: vs, - getJsonSampleSchema: o, - getYamlSampleSchema: i, - getXmlSampleSchema: u, - getSampleSchema: _, - mergeJsonSchema - } - }; - }; - var ws = __webpack_require__(37334), - Ss = __webpack_require__.n(ws); - const xs = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'], - spec_selectors_state = (s) => s || (0, qe.Map)(), - ks = Ut(spec_selectors_state, (s) => s.get('lastError')), - Cs = Ut(spec_selectors_state, (s) => s.get('url')), - Os = Ut(spec_selectors_state, (s) => s.get('spec') || ''), - As = Ut(spec_selectors_state, (s) => s.get('specSource') || 'not-editor'), - js = Ut(spec_selectors_state, (s) => s.get('json', (0, qe.Map)())), - Is = Ut(js, (s) => s.toJS()), - Ps = Ut(spec_selectors_state, (s) => s.get('resolved', (0, qe.Map)())), - specResolvedSubtree = (s, o) => s.getIn(['resolvedSubtrees', ...o], void 0), - mergerFn = (s, o) => - qe.Map.isMap(s) && qe.Map.isMap(o) - ? o.get('$$ref') - ? o - : (0, qe.OrderedMap)().mergeWith(mergerFn, s, o) - : o, - Ms = Ut(spec_selectors_state, (s) => - (0, qe.OrderedMap)().mergeWith(mergerFn, s.get('json'), s.get('resolvedSubtrees')) - ), - spec = (s) => js(s), - Ts = Ut(spec, () => !1), - Ns = Ut(spec, (s) => returnSelfOrNewMap(s && s.get('info'))), - Rs = Ut(spec, (s) => returnSelfOrNewMap(s && s.get('externalDocs'))), - Ds = Ut(Ns, (s) => s && s.get('version')), - Ls = Ut(Ds, (s) => /v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(s).slice(1)), - Bs = Ut(Ms, (s) => s.get('paths')), - Fs = Ss()(['get', 'put', 'post', 'delete', 'options', 'head', 'patch']), - qs = Ut(Bs, (s) => { - if (!s || s.size < 1) return (0, qe.List)(); - let o = (0, qe.List)(); - return s && s.forEach - ? (s.forEach((s, i) => { - if (!s || !s.forEach) return {}; - s.forEach((s, u) => { - xs.indexOf(u) < 0 || - (o = o.push( - (0, qe.fromJS)({ path: i, method: u, operation: s, id: `${u}-${i}` }) - )); - }); - }), - o) - : (0, qe.List)(); - }), - $s = Ut(spec, (s) => (0, qe.Set)(s.get('consumes'))), - Vs = Ut(spec, (s) => (0, qe.Set)(s.get('produces'))), - Us = Ut(spec, (s) => s.get('security', (0, qe.List)())), - zs = Ut(spec, (s) => s.get('securityDefinitions')), - findDefinition = (s, o) => { - const i = s.getIn(['resolvedSubtrees', 'definitions', o], null), - u = s.getIn(['json', 'definitions', o], null); - return i || u || null; - }, - Ws = Ut(spec, (s) => { - const o = s.get('definitions'); - return qe.Map.isMap(o) ? o : (0, qe.Map)(); - }), - Ks = Ut(spec, (s) => s.get('basePath')), - Hs = Ut(spec, (s) => s.get('host')), - Js = Ut(spec, (s) => s.get('schemes', (0, qe.Map)())), - Gs = Ut([qs, $s, Vs], (s, o, i) => - s.map((s) => - s.update('operation', (s) => { - if (s) { - if (!qe.Map.isMap(s)) return; - return s.withMutations( - (s) => ( - s.get('consumes') || s.update('consumes', (s) => (0, qe.Set)(s).merge(o)), - s.get('produces') || s.update('produces', (s) => (0, qe.Set)(s).merge(i)), - s - ) - ); - } - return (0, qe.Map)(); - }) - ) - ), - Ys = Ut(spec, (s) => { - const o = s.get('tags', (0, qe.List)()); - return qe.List.isList(o) ? o.filter((s) => qe.Map.isMap(s)) : (0, qe.List)(); - }), - tagDetails = (s, o) => - (Ys(s) || (0, qe.List)()) - .filter(qe.Map.isMap) - .find((s) => s.get('name') === o, (0, qe.Map)()), - Xs = Ut(Gs, Ys, (s, o) => - s.reduce( - (s, o) => { - let i = (0, qe.Set)(o.getIn(['operation', 'tags'])); - return i.count() < 1 - ? s.update('default', (0, qe.List)(), (s) => s.push(o)) - : i.reduce((s, i) => s.update(i, (0, qe.List)(), (s) => s.push(o)), s); - }, - o.reduce((s, o) => s.set(o.get('name'), (0, qe.List)()), (0, qe.OrderedMap)()) - ) - ), - selectors_taggedOperations = - (s) => - ({ getConfigs: o }) => { - let { tagsSorter: i, operationsSorter: u } = o(); - return Xs(s) - .sortBy( - (s, o) => o, - (s, o) => { - let u = 'function' == typeof i ? i : It.tagsSorter[i]; - return u ? u(s, o) : null; - } - ) - .map((o, i) => { - let _ = 'function' == typeof u ? u : It.operationsSorter[u], - w = _ ? o.sort(_) : o; - return (0, qe.Map)({ tagDetails: tagDetails(s, i), operations: w }); - }); - }, - Zs = Ut(spec_selectors_state, (s) => s.get('responses', (0, qe.Map)())), - Qs = Ut(spec_selectors_state, (s) => s.get('requests', (0, qe.Map)())), - eo = Ut(spec_selectors_state, (s) => s.get('mutatedRequests', (0, qe.Map)())), - responseFor = (s, o, i) => Zs(s).getIn([o, i], null), - requestFor = (s, o, i) => Qs(s).getIn([o, i], null), - mutatedRequestFor = (s, o, i) => eo(s).getIn([o, i], null), - allowTryItOutFor = () => !0, - parameterWithMetaByIdentity = (s, o, i) => { - const u = Ms(s).getIn(['paths', ...o, 'parameters'], (0, qe.OrderedMap)()), - _ = s.getIn(['meta', 'paths', ...o, 'parameters'], (0, qe.OrderedMap)()); - return u - .map((s) => { - const o = _.get(`${i.get('in')}.${i.get('name')}`), - u = _.get(`${i.get('in')}.${i.get('name')}.hash-${i.hashCode()}`); - return (0, qe.OrderedMap)().merge(s, o, u); - }) - .find( - (s) => s.get('in') === i.get('in') && s.get('name') === i.get('name'), - (0, qe.OrderedMap)() - ); - }, - parameterInclusionSettingFor = (s, o, i, u) => { - const _ = `${u}.${i}`; - return s.getIn(['meta', 'paths', ...o, 'parameter_inclusions', _], !1); - }, - parameterWithMeta = (s, o, i, u) => { - const _ = Ms(s) - .getIn(['paths', ...o, 'parameters'], (0, qe.OrderedMap)()) - .find((s) => s.get('in') === u && s.get('name') === i, (0, qe.OrderedMap)()); - return parameterWithMetaByIdentity(s, o, _); - }, - operationWithMeta = (s, o, i) => { - const u = Ms(s).getIn(['paths', o, i], (0, qe.OrderedMap)()), - _ = s.getIn(['meta', 'paths', o, i], (0, qe.OrderedMap)()), - w = u - .get('parameters', (0, qe.List)()) - .map((u) => parameterWithMetaByIdentity(s, [o, i], u)); - return (0, qe.OrderedMap)().merge(u, _).set('parameters', w); - }; - function getParameter(s, o, i, u) { - return ( - (o = o || []), - s - .getIn(['meta', 'paths', ...o, 'parameters'], (0, qe.fromJS)([])) - .find((s) => qe.Map.isMap(s) && s.get('name') === i && s.get('in') === u) || - (0, qe.Map)() - ); - } - const to = Ut(spec, (s) => { - const o = s.get('host'); - return 'string' == typeof o && o.length > 0 && '/' !== o[0]; - }); - function parameterValues(s, o, i) { - return ( - (o = o || []), - operationWithMeta(s, ...o) - .get('parameters', (0, qe.List)()) - .reduce( - (s, o) => { - let u = i && 'body' === o.get('in') ? o.get('value_xml') : o.get('value'); - return ( - qe.List.isList(u) && (u = u.filter((s) => '' !== s)), - s.set(paramToIdentifier(o, { allowHashes: !1 }), u) - ); - }, - (0, qe.fromJS)({}) - ) - ); - } - function parametersIncludeIn(s, o = '') { - if (qe.List.isList(s)) return s.some((s) => qe.Map.isMap(s) && s.get('in') === o); - } - function parametersIncludeType(s, o = '') { - if (qe.List.isList(s)) return s.some((s) => qe.Map.isMap(s) && s.get('type') === o); - } - function contentTypeValues(s, o) { - o = o || []; - let i = Ms(s).getIn(['paths', ...o], (0, qe.fromJS)({})), - u = s.getIn(['meta', 'paths', ...o], (0, qe.fromJS)({})), - _ = currentProducesFor(s, o); - const w = i.get('parameters') || new qe.List(), - x = u.get('consumes_value') - ? u.get('consumes_value') - : parametersIncludeType(w, 'file') - ? 'multipart/form-data' - : parametersIncludeType(w, 'formData') - ? 'application/x-www-form-urlencoded' - : void 0; - return (0, qe.fromJS)({ requestContentType: x, responseContentType: _ }); - } - function currentProducesFor(s, o) { - o = o || []; - const i = Ms(s).getIn(['paths', ...o], null); - if (null === i) return; - const u = s.getIn(['meta', 'paths', ...o, 'produces_value'], null), - _ = i.getIn(['produces', 0], null); - return u || _ || 'application/json'; - } - function producesOptionsFor(s, o) { - o = o || []; - const i = Ms(s), - u = i.getIn(['paths', ...o], null); - if (null === u) return; - const [_] = o, - w = u.get('produces', null), - x = i.getIn(['paths', _, 'produces'], null), - C = i.getIn(['produces'], null); - return w || x || C; - } - function consumesOptionsFor(s, o) { - o = o || []; - const i = Ms(s), - u = i.getIn(['paths', ...o], null); - if (null === u) return; - const [_] = o, - w = u.get('consumes', null), - x = i.getIn(['paths', _, 'consumes'], null), - C = i.getIn(['consumes'], null); - return w || x || C; - } - const operationScheme = (s, o, i) => { - let u = s.get('url').match(/^([a-z][a-z0-9+\-.]*):/), - _ = Array.isArray(u) ? u[1] : null; - return s.getIn(['scheme', o, i]) || s.getIn(['scheme', '_defaultScheme']) || _ || ''; - }, - canExecuteScheme = (s, o, i) => ['http', 'https'].indexOf(operationScheme(s, o, i)) > -1, - validationErrors = (s, o) => { - o = o || []; - const i = s.getIn(['meta', 'paths', ...o, 'parameters'], (0, qe.fromJS)([])), - u = []; - if (0 === i.length) return u; - const getErrorsWithPaths = (s, o = []) => { - const getNestedErrorsWithPaths = (s, o) => { - const i = [...o, s.get('propKey') || s.get('index')]; - return qe.Map.isMap(s.get('error')) - ? getErrorsWithPaths(s.get('error'), i) - : { error: s.get('error'), path: i }; - }; - return qe.List.isList(s) - ? s.map((s) => - qe.Map.isMap(s) ? getNestedErrorsWithPaths(s, o) : { error: s, path: o } - ) - : getNestedErrorsWithPaths(s, o); - }; - return ( - i.forEach((s, o) => { - const i = o.split('.').slice(1, -1).join('.'), - _ = s.get('errors'); - if (_ && _.count()) { - getErrorsWithPaths(_).forEach(({ error: s, path: o }) => { - u.push( - ((s, o, i) => - `For '${i}'${(o = o.reduce((s, o) => ('number' == typeof o ? `${s}[${o}]` : s ? `${s}.${o}` : o), '')) ? ` at path '${o}'` : ''}: ${s}.`)( - s, - o, - i - ) - ); - }); - } - }), - u - ); - }, - validateBeforeExecute = (s, o) => 0 === validationErrors(s, o).length, - getOAS3RequiredRequestBodyContentType = (s, o) => { - let i = { requestBody: !1, requestContentType: {} }, - u = s.getIn(['resolvedSubtrees', 'paths', ...o, 'requestBody'], (0, qe.fromJS)([])); - return ( - u.size < 1 || - (u.getIn(['required']) && (i.requestBody = u.getIn(['required'])), - u - .getIn(['content']) - .entrySeq() - .forEach((s) => { - const o = s[0]; - if (s[1].getIn(['schema', 'required'])) { - const u = s[1].getIn(['schema', 'required']).toJS(); - i.requestContentType[o] = u; - } - })), - i - ); - }, - isMediaTypeSchemaPropertiesEqual = (s, o, i, u) => { - if ((i || u) && i === u) return !0; - let _ = s.getIn( - ['resolvedSubtrees', 'paths', ...o, 'requestBody', 'content'], - (0, qe.fromJS)([]) - ); - if (_.size < 2 || !i || !u) return !1; - let w = _.getIn([i, 'schema', 'properties'], (0, qe.fromJS)([])), - x = _.getIn([u, 'schema', 'properties'], (0, qe.fromJS)([])); - return !!w.equals(x); - }; - function returnSelfOrNewMap(s) { - return qe.Map.isMap(s) ? s : new qe.Map(); - } - var ro = __webpack_require__(85015), - no = __webpack_require__.n(ro), - so = __webpack_require__(38221), - oo = __webpack_require__.n(so), - io = __webpack_require__(63560), - ao = __webpack_require__.n(io), - lo = __webpack_require__(56367), - co = __webpack_require__.n(lo); - const uo = 'spec_update_spec', - po = 'spec_update_url', - ho = 'spec_update_json', - fo = 'spec_update_param', - mo = 'spec_update_empty_param_inclusion', - go = 'spec_validate_param', - yo = 'spec_set_response', - vo = 'spec_set_request', - bo = 'spec_set_mutated_request', - _o = 'spec_log_request', - Eo = 'spec_clear_response', - wo = 'spec_clear_request', - So = 'spec_clear_validate_param', - xo = 'spec_update_operation_meta_value', - ko = 'spec_update_resolved', - Co = 'spec_update_resolved_subtree', - Oo = 'set_scheme', - toStr = (s) => (no()(s) ? s : ''); - function updateSpec(s) { - const o = toStr(s).replace(/\t/g, ' '); - if ('string' == typeof s) return { type: uo, payload: o }; - } - function updateResolved(s) { - return { type: ko, payload: s }; - } - function updateUrl(s) { - return { type: po, payload: s }; - } - function updateJsonSpec(s) { - return { type: ho, payload: s }; - } - const parseToJson = - (s) => - ({ specActions: o, specSelectors: i, errActions: u }) => { - let { specStr: _ } = i, - w = null; - try { - ((s = s || _()), u.clear({ source: 'parser' }), (w = mn.load(s, { schema: nn }))); - } catch (s) { - return ( - console.error(s), - u.newSpecErr({ - source: 'parser', - level: 'error', - message: s.reason, - line: s.mark && s.mark.line ? s.mark.line + 1 : void 0 - }) - ); - } - return w && 'object' == typeof w ? o.updateJsonSpec(w) : {}; - }; - let Ao = !1; - const resolveSpec = - (s, o) => - ({ - specActions: i, - specSelectors: u, - errActions: _, - fn: { fetch: w, resolve: x, AST: C = {} }, - getConfigs: j - }) => { - Ao || - (console.warn( - 'specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!' - ), - (Ao = !0)); - const { - modelPropertyMacro: L, - parameterMacro: B, - requestInterceptor: $, - responseInterceptor: V - } = j(); - (void 0 === s && (s = u.specJson()), void 0 === o && (o = u.url())); - let U = C.getLineNumberForPath ? C.getLineNumberForPath : () => {}, - z = u.specStr(); - return x({ - fetch: w, - spec: s, - baseDoc: String(new URL(o, document.baseURI)), - modelPropertyMacro: L, - parameterMacro: B, - requestInterceptor: $, - responseInterceptor: V - }).then(({ spec: s, errors: o }) => { - if ((_.clear({ type: 'thrown' }), Array.isArray(o) && o.length > 0)) { - let s = o.map( - (s) => ( - console.error(s), - (s.line = s.fullPath ? U(z, s.fullPath) : null), - (s.path = s.fullPath ? s.fullPath.join('.') : null), - (s.level = 'error'), - (s.type = 'thrown'), - (s.source = 'resolver'), - Object.defineProperty(s, 'message', { enumerable: !0, value: s.message }), - s - ) - ); - _.newThrownErrBatch(s); - } - return i.updateResolved(s); - }); - }; - let jo = []; - const Io = oo()(() => { - const s = jo.reduce( - (s, { path: o, system: i }) => (s.has(i) || s.set(i, []), s.get(i).push(o), s), - new Map() - ); - ((jo = []), - s.forEach(async (s, o) => { - if (!o) - return void console.error( - "debResolveSubtrees: don't have a system to operate on, aborting." - ); - if (!o.fn.resolveSubtree) - return void console.error( - 'Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing.' - ); - const { - errActions: i, - errSelectors: u, - fn: { resolveSubtree: _, fetch: w, AST: x = {} }, - specSelectors: C, - specActions: j - } = o, - L = x.getLineNumberForPath ?? Ss()(void 0), - B = C.specStr(), - { - modelPropertyMacro: $, - parameterMacro: V, - requestInterceptor: U, - responseInterceptor: z - } = o.getConfigs(); - try { - const o = await s.reduce( - async (s, o) => { - let { resultMap: x, specWithCurrentSubtrees: j } = await s; - const { errors: Y, spec: Z } = await _(j, o, { - baseDoc: String(new URL(C.url(), document.baseURI)), - modelPropertyMacro: $, - parameterMacro: V, - requestInterceptor: U, - responseInterceptor: z - }); - if ( - (u.allErrors().size && - i.clearBy( - (s) => - 'thrown' !== s.get('type') || - 'resolver' !== s.get('source') || - !s.get('fullPath').every((s, i) => s === o[i] || void 0 === o[i]) - ), - Array.isArray(Y) && Y.length > 0) - ) { - let s = Y.map( - (s) => ( - (s.line = s.fullPath ? L(B, s.fullPath) : null), - (s.path = s.fullPath ? s.fullPath.join('.') : null), - (s.level = 'error'), - (s.type = 'thrown'), - (s.source = 'resolver'), - Object.defineProperty(s, 'message', { - enumerable: !0, - value: s.message - }), - s - ) - ); - i.newThrownErrBatch(s); - } - return ( - Z && - C.isOAS3() && - 'components' === o[0] && - 'securitySchemes' === o[1] && - (await Promise.all( - Object.values(Z) - .filter((s) => 'openIdConnect' === s.type) - .map(async (s) => { - const o = { - url: s.openIdConnectUrl, - requestInterceptor: U, - responseInterceptor: z - }; - try { - const i = await w(o); - i instanceof Error || i.status >= 400 - ? console.error(i.statusText + ' ' + o.url) - : (s.openIdConnectData = JSON.parse(i.text)); - } catch (s) { - console.error(s); - } - }) - )), - ao()(x, o, Z), - (j = co()(o, Z, j)), - { resultMap: x, specWithCurrentSubtrees: j } - ); - }, - Promise.resolve({ - resultMap: (C.specResolvedSubtree([]) || (0, qe.Map)()).toJS(), - specWithCurrentSubtrees: C.specJS() - }) - ); - j.updateResolvedSubtree([], o.resultMap); - } catch (s) { - console.error(s); - } - })); - }, 35), - requestResolvedSubtree = (s) => (o) => { - jo.find(({ path: i, system: u }) => u === o && i.toString() === s.toString()) || - (jo.push({ path: s, system: o }), Io()); - }; - function changeParam(s, o, i, u, _) { - return { type: fo, payload: { path: s, value: u, paramName: o, paramIn: i, isXml: _ } }; - } - function changeParamByIdentity(s, o, i, u) { - return { type: fo, payload: { path: s, param: o, value: i, isXml: u } }; - } - const updateResolvedSubtree = (s, o) => ({ type: Co, payload: { path: s, value: o } }), - invalidateResolvedSubtreeCache = () => ({ - type: Co, - payload: { path: [], value: (0, qe.Map)() } - }), - validateParams = (s, o) => ({ type: go, payload: { pathMethod: s, isOAS3: o } }), - updateEmptyParamInclusion = (s, o, i, u) => ({ - type: mo, - payload: { pathMethod: s, paramName: o, paramIn: i, includeEmptyValue: u } - }); - function clearValidateParams(s) { - return { type: So, payload: { pathMethod: s } }; - } - function changeConsumesValue(s, o) { - return { type: xo, payload: { path: s, value: o, key: 'consumes_value' } }; - } - function changeProducesValue(s, o) { - return { type: xo, payload: { path: s, value: o, key: 'produces_value' } }; - } - const setResponse = (s, o, i) => ({ payload: { path: s, method: o, res: i }, type: yo }), - setRequest = (s, o, i) => ({ payload: { path: s, method: o, req: i }, type: vo }), - setMutatedRequest = (s, o, i) => ({ payload: { path: s, method: o, req: i }, type: bo }), - logRequest = (s) => ({ payload: s, type: _o }), - executeRequest = - (s) => - ({ fn: o, specActions: i, specSelectors: u, getConfigs: _, oas3Selectors: w }) => { - let { pathName: x, method: C, operation: j } = s, - { requestInterceptor: L, responseInterceptor: B } = _(), - $ = j.toJS(); - if ( - (j && - j.get('parameters') && - j - .get('parameters') - .filter((s) => s && !0 === s.get('allowEmptyValue')) - .forEach((o) => { - if (u.parameterInclusionSettingFor([x, C], o.get('name'), o.get('in'))) { - s.parameters = s.parameters || {}; - const i = paramToValue(o, s.parameters); - (!i || (i && 0 === i.size)) && (s.parameters[o.get('name')] = ''); - } - }), - (s.contextUrl = Mt()(u.url()).toString()), - $ && $.operationId - ? (s.operationId = $.operationId) - : $ && x && C && (s.operationId = o.opId($, x, C)), - u.isOAS3()) - ) { - const o = `${x}:${C}`; - s.server = w.selectedServer(o) || w.selectedServer(); - const i = w.serverVariables({ server: s.server, namespace: o }).toJS(), - u = w.serverVariables({ server: s.server }).toJS(); - ((s.serverVariables = Object.keys(i).length ? i : u), - (s.requestContentType = w.requestContentType(x, C)), - (s.responseContentType = w.responseContentType(x, C) || '*/*')); - const _ = w.requestBodyValue(x, C), - j = w.requestBodyInclusionSetting(x, C); - _ && _.toJS - ? (s.requestBody = _.map((s) => (qe.Map.isMap(s) ? s.get('value') : s)) - .filter( - (s, o) => (Array.isArray(s) ? 0 !== s.length : !isEmptyValue(s)) || j.get(o) - ) - .toJS()) - : (s.requestBody = _); - } - let V = Object.assign({}, s); - ((V = o.buildRequest(V)), i.setRequest(s.pathName, s.method, V)); - ((s.requestInterceptor = async (o) => { - let u = await L.apply(void 0, [o]), - _ = Object.assign({}, u); - return (i.setMutatedRequest(s.pathName, s.method, _), u); - }), - (s.responseInterceptor = B)); - const U = Date.now(); - return o - .execute(s) - .then((o) => { - ((o.duration = Date.now() - U), i.setResponse(s.pathName, s.method, o)); - }) - .catch((o) => { - ('Failed to fetch' === o.message && - ((o.name = ''), - (o.message = - '**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.')), - i.setResponse(s.pathName, s.method, { error: !0, err: o })); - }); - }, - actions_execute = - ({ path: s, method: o, ...i } = {}) => - (u) => { - let { - fn: { fetch: _ }, - specSelectors: w, - specActions: x - } = u, - C = w.specJsonWithResolvedSubtrees().toJS(), - j = w.operationScheme(s, o), - { requestContentType: L, responseContentType: B } = w - .contentTypeValues([s, o]) - .toJS(), - $ = /xml/i.test(L), - V = w.parameterValues([s, o], $).toJS(); - return x.executeRequest({ - ...i, - fetch: _, - spec: C, - pathName: s, - method: o, - parameters: V, - requestContentType: L, - scheme: j, - responseContentType: B - }); - }; - function clearResponse(s, o) { - return { type: Eo, payload: { path: s, method: o } }; - } - function clearRequest(s, o) { - return { type: wo, payload: { path: s, method: o } }; - } - function setScheme(s, o, i) { - return { type: Oo, payload: { scheme: s, path: o, method: i } }; - } - const Po = { - [uo]: (s, o) => ('string' == typeof o.payload ? s.set('spec', o.payload) : s), - [po]: (s, o) => s.set('url', o.payload + ''), - [ho]: (s, o) => s.set('json', fromJSOrdered(o.payload)), - [ko]: (s, o) => s.setIn(['resolved'], fromJSOrdered(o.payload)), - [Co]: (s, o) => { - const { value: i, path: u } = o.payload; - return s.setIn(['resolvedSubtrees', ...u], fromJSOrdered(i)); - }, - [fo]: (s, { payload: o }) => { - let { path: i, paramName: u, paramIn: _, param: w, value: x, isXml: C } = o, - j = w ? paramToIdentifier(w) : `${_}.${u}`; - const L = C ? 'value_xml' : 'value'; - return s.setIn(['meta', 'paths', ...i, 'parameters', j, L], (0, qe.fromJS)(x)); - }, - [mo]: (s, { payload: o }) => { - let { pathMethod: i, paramName: u, paramIn: _, includeEmptyValue: w } = o; - if (!u || !_) - return ( - console.warn( - 'Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey.' - ), - s - ); - const x = `${_}.${u}`; - return s.setIn(['meta', 'paths', ...i, 'parameter_inclusions', x], w); - }, - [go]: (s, { payload: { pathMethod: o, isOAS3: i } }) => { - const u = Ms(s).getIn(['paths', ...o]), - _ = parameterValues(s, o).toJS(); - return s.updateIn(['meta', 'paths', ...o, 'parameters'], (0, qe.fromJS)({}), (w) => - u.get('parameters', (0, qe.List)()).reduce((u, w) => { - const x = paramToValue(w, _), - C = parameterInclusionSettingFor(s, o, w.get('name'), w.get('in')), - j = ((s, o, { isOAS3: i = !1, bypassRequiredCheck: u = !1 } = {}) => { - let _ = s.get('required'), - { schema: w, parameterContentMediaType: x } = getParameterSchema(s, { - isOAS3: i - }); - return validateValueBySchema(o, w, _, u, x); - })(w, x, { bypassRequiredCheck: C, isOAS3: i }); - return u.setIn([paramToIdentifier(w), 'errors'], (0, qe.fromJS)(j)); - }, w) - ); - }, - [So]: (s, { payload: { pathMethod: o } }) => - s.updateIn(['meta', 'paths', ...o, 'parameters'], (0, qe.fromJS)([]), (s) => - s.map((s) => s.set('errors', (0, qe.fromJS)([]))) - ), - [yo]: (s, { payload: { res: o, path: i, method: u } }) => { - let _; - ((_ = o.error - ? Object.assign( - { - error: !0, - name: o.err.name, - message: o.err.message, - statusCode: o.err.statusCode - }, - o.err.response - ) - : o), - (_.headers = _.headers || {})); - let w = s.setIn(['responses', i, u], fromJSOrdered(_)); - return ( - at.Blob && - _.data instanceof at.Blob && - (w = w.setIn(['responses', i, u, 'text'], _.data)), - w - ); - }, - [vo]: (s, { payload: { req: o, path: i, method: u } }) => - s.setIn(['requests', i, u], fromJSOrdered(o)), - [bo]: (s, { payload: { req: o, path: i, method: u } }) => - s.setIn(['mutatedRequests', i, u], fromJSOrdered(o)), - [xo]: (s, { payload: { path: o, value: i, key: u } }) => { - let _ = ['paths', ...o], - w = ['meta', 'paths', ...o]; - return s.getIn(['json', ..._]) || - s.getIn(['resolved', ..._]) || - s.getIn(['resolvedSubtrees', ..._]) - ? s.setIn([...w, u], (0, qe.fromJS)(i)) - : s; - }, - [Eo]: (s, { payload: { path: o, method: i } }) => s.deleteIn(['responses', o, i]), - [wo]: (s, { payload: { path: o, method: i } }) => s.deleteIn(['requests', o, i]), - [Oo]: (s, { payload: { scheme: o, path: i, method: u } }) => - i && u - ? s.setIn(['scheme', i, u], o) - : i || u - ? void 0 - : s.setIn(['scheme', '_defaultScheme'], o) - }, - wrap_actions_updateSpec = - (s, { specActions: o }) => - (...i) => { - (s(...i), o.parseToJson(...i)); - }, - wrap_actions_updateJsonSpec = - (s, { specActions: o }) => - (...i) => { - (s(...i), o.invalidateResolvedSubtreeCache()); - const [u] = i, - _ = jn()(u, ['paths']) || {}; - (Object.keys(_).forEach((s) => { - jn()(_, [s]).$ref && o.requestResolvedSubtree(['paths', s]); - }), - o.requestResolvedSubtree(['components', 'securitySchemes'])); - }, - wrap_actions_executeRequest = - (s, { specActions: o }) => - (i) => (o.logRequest(i), s(i)), - wrap_actions_validateParams = - (s, { specSelectors: o }) => - (i) => - s(i, o.isOAS3()), - plugins_spec = () => ({ - statePlugins: { - spec: { - wrapActions: { ...ee }, - reducers: { ...Po }, - actions: { ...Z }, - selectors: { ...Y } - } - } - }); - var Mo = (function () { - var extendStatics = function (s, o) { - return ( - (extendStatics = - Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && - function (s, o) { - s.__proto__ = o; - }) || - function (s, o) { - for (var i in o) o.hasOwnProperty(i) && (s[i] = o[i]); - }), - extendStatics(s, o) - ); - }; - return function (s, o) { - function __() { - this.constructor = s; - } - (extendStatics(s, o), - (s.prototype = - null === o ? Object.create(o) : ((__.prototype = o.prototype), new __()))); - }; - })(), - To = Object.prototype.hasOwnProperty; - function module_helpers_hasOwnProperty(s, o) { - return To.call(s, o); - } - function _objectKeys(s) { - if (Array.isArray(s)) { - for (var o = new Array(s.length), i = 0; i < o.length; i++) o[i] = '' + i; - return o; - } - if (Object.keys) return Object.keys(s); - var u = []; - for (var _ in s) module_helpers_hasOwnProperty(s, _) && u.push(_); - return u; - } - function _deepClone(s) { - switch (typeof s) { - case 'object': - return JSON.parse(JSON.stringify(s)); - case 'undefined': - return null; - default: - return s; - } - } - function helpers_isInteger(s) { - for (var o, i = 0, u = s.length; i < u; ) { - if (!((o = s.charCodeAt(i)) >= 48 && o <= 57)) return !1; - i++; - } - return !0; - } - function escapePathComponent(s) { - return -1 === s.indexOf('/') && -1 === s.indexOf('~') - ? s - : s.replace(/~/g, '~0').replace(/\//g, '~1'); - } - function unescapePathComponent(s) { - return s.replace(/~1/g, '/').replace(/~0/g, '~'); - } - function hasUndefined(s) { - if (void 0 === s) return !0; - if (s) - if (Array.isArray(s)) { - for (var o = 0, i = s.length; o < i; o++) if (hasUndefined(s[o])) return !0; - } else if ('object' == typeof s) - for (var u = _objectKeys(s), _ = u.length, w = 0; w < _; w++) - if (hasUndefined(s[u[w]])) return !0; - return !1; - } - function patchErrorMessageFormatter(s, o) { - var i = [s]; - for (var u in o) { - var _ = 'object' == typeof o[u] ? JSON.stringify(o[u], null, 2) : o[u]; - void 0 !== _ && i.push(u + ': ' + _); - } - return i.join('\n'); - } - var No = (function (s) { - function PatchError(o, i, u, _, w) { - var x = this.constructor, - C = - s.call( - this, - patchErrorMessageFormatter(o, { name: i, index: u, operation: _, tree: w }) - ) || this; - return ( - (C.name = i), - (C.index = u), - (C.operation = _), - (C.tree = w), - Object.setPrototypeOf(C, x.prototype), - (C.message = patchErrorMessageFormatter(o, { - name: i, - index: u, - operation: _, - tree: w - })), - C - ); - } - return (Mo(PatchError, s), PatchError); - })(Error), - Ro = No, - Do = _deepClone, - Lo = { - add: function (s, o, i) { - return ((s[o] = this.value), { newDocument: i }); - }, - remove: function (s, o, i) { - var u = s[o]; - return (delete s[o], { newDocument: i, removed: u }); - }, - replace: function (s, o, i) { - var u = s[o]; - return ((s[o] = this.value), { newDocument: i, removed: u }); - }, - move: function (s, o, i) { - var u = getValueByPointer(i, this.path); - u && (u = _deepClone(u)); - var _ = applyOperation(i, { op: 'remove', path: this.from }).removed; - return ( - applyOperation(i, { op: 'add', path: this.path, value: _ }), - { newDocument: i, removed: u } - ); - }, - copy: function (s, o, i) { - var u = getValueByPointer(i, this.from); - return ( - applyOperation(i, { op: 'add', path: this.path, value: _deepClone(u) }), - { newDocument: i } - ); - }, - test: function (s, o, i) { - return { newDocument: i, test: _areEquals(s[o], this.value) }; - }, - _get: function (s, o, i) { - return ((this.value = s[o]), { newDocument: i }); - } - }, - Bo = { - add: function (s, o, i) { - return ( - helpers_isInteger(o) ? s.splice(o, 0, this.value) : (s[o] = this.value), - { newDocument: i, index: o } - ); - }, - remove: function (s, o, i) { - return { newDocument: i, removed: s.splice(o, 1)[0] }; - }, - replace: function (s, o, i) { - var u = s[o]; - return ((s[o] = this.value), { newDocument: i, removed: u }); - }, - move: Lo.move, - copy: Lo.copy, - test: Lo.test, - _get: Lo._get - }; - function getValueByPointer(s, o) { - if ('' == o) return s; - var i = { op: '_get', path: o }; - return (applyOperation(s, i), i.value); - } - function applyOperation(s, o, i, u, _, w) { - if ( - (void 0 === i && (i = !1), - void 0 === u && (u = !0), - void 0 === _ && (_ = !0), - void 0 === w && (w = 0), - i && ('function' == typeof i ? i(o, 0, s, o.path) : validator(o, 0)), - '' === o.path) - ) { - var x = { newDocument: s }; - if ('add' === o.op) return ((x.newDocument = o.value), x); - if ('replace' === o.op) return ((x.newDocument = o.value), (x.removed = s), x); - if ('move' === o.op || 'copy' === o.op) - return ( - (x.newDocument = getValueByPointer(s, o.from)), - 'move' === o.op && (x.removed = s), - x - ); - if ('test' === o.op) { - if (((x.test = _areEquals(s, o.value)), !1 === x.test)) - throw new Ro('Test operation failed', 'TEST_OPERATION_FAILED', w, o, s); - return ((x.newDocument = s), x); - } - if ('remove' === o.op) return ((x.removed = s), (x.newDocument = null), x); - if ('_get' === o.op) return ((o.value = s), x); - if (i) - throw new Ro( - 'Operation `op` property is not one of operations defined in RFC-6902', - 'OPERATION_OP_INVALID', - w, - o, - s - ); - return x; - } - u || (s = _deepClone(s)); - var C = (o.path || '').split('/'), - j = s, - L = 1, - B = C.length, - $ = void 0, - V = void 0, - U = void 0; - for (U = 'function' == typeof i ? i : validator; ; ) { - if ( - ((V = C[L]) && -1 != V.indexOf('~') && (V = unescapePathComponent(V)), - _ && ('__proto__' == V || ('prototype' == V && L > 0 && 'constructor' == C[L - 1]))) - ) - throw new TypeError( - 'JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README' - ); - if ( - (i && - void 0 === $ && - (void 0 === j[V] ? ($ = C.slice(0, L).join('/')) : L == B - 1 && ($ = o.path), - void 0 !== $ && U(o, 0, s, $)), - L++, - Array.isArray(j)) - ) { - if ('-' === V) V = j.length; - else { - if (i && !helpers_isInteger(V)) - throw new Ro( - 'Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index', - 'OPERATION_PATH_ILLEGAL_ARRAY_INDEX', - w, - o, - s - ); - helpers_isInteger(V) && (V = ~~V); - } - if (L >= B) { - if (i && 'add' === o.op && V > j.length) - throw new Ro( - 'The specified index MUST NOT be greater than the number of elements in the array', - 'OPERATION_VALUE_OUT_OF_BOUNDS', - w, - o, - s - ); - if (!1 === (x = Bo[o.op].call(o, j, V, s)).test) - throw new Ro('Test operation failed', 'TEST_OPERATION_FAILED', w, o, s); - return x; - } - } else if (L >= B) { - if (!1 === (x = Lo[o.op].call(o, j, V, s)).test) - throw new Ro('Test operation failed', 'TEST_OPERATION_FAILED', w, o, s); - return x; - } - if (((j = j[V]), i && L < B && (!j || 'object' != typeof j))) - throw new Ro( - 'Cannot perform operation at the desired path', - 'OPERATION_PATH_UNRESOLVABLE', - w, - o, - s - ); - } - } - function applyPatch(s, o, i, u, _) { - if ((void 0 === u && (u = !0), void 0 === _ && (_ = !0), i && !Array.isArray(o))) - throw new Ro('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY'); - u || (s = _deepClone(s)); - for (var w = new Array(o.length), x = 0, C = o.length; x < C; x++) - ((w[x] = applyOperation(s, o[x], i, !0, _, x)), (s = w[x].newDocument)); - return ((w.newDocument = s), w); - } - function applyReducer(s, o, i) { - var u = applyOperation(s, o); - if (!1 === u.test) - throw new Ro('Test operation failed', 'TEST_OPERATION_FAILED', i, o, s); - return u.newDocument; - } - function validator(s, o, i, u) { - if ('object' != typeof s || null === s || Array.isArray(s)) - throw new Ro('Operation is not an object', 'OPERATION_NOT_AN_OBJECT', o, s, i); - if (!Lo[s.op]) - throw new Ro( - 'Operation `op` property is not one of operations defined in RFC-6902', - 'OPERATION_OP_INVALID', - o, - s, - i - ); - if ('string' != typeof s.path) - throw new Ro( - 'Operation `path` property is not a string', - 'OPERATION_PATH_INVALID', - o, - s, - i - ); - if (0 !== s.path.indexOf('/') && s.path.length > 0) - throw new Ro( - 'Operation `path` property must start with "/"', - 'OPERATION_PATH_INVALID', - o, - s, - i - ); - if (('move' === s.op || 'copy' === s.op) && 'string' != typeof s.from) - throw new Ro( - 'Operation `from` property is not present (applicable in `move` and `copy` operations)', - 'OPERATION_FROM_REQUIRED', - o, - s, - i - ); - if (('add' === s.op || 'replace' === s.op || 'test' === s.op) && void 0 === s.value) - throw new Ro( - 'Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', - 'OPERATION_VALUE_REQUIRED', - o, - s, - i - ); - if (('add' === s.op || 'replace' === s.op || 'test' === s.op) && hasUndefined(s.value)) - throw new Ro( - 'Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)', - 'OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED', - o, - s, - i - ); - if (i) - if ('add' == s.op) { - var _ = s.path.split('/').length, - w = u.split('/').length; - if (_ !== w + 1 && _ !== w) - throw new Ro( - 'Cannot perform an `add` operation at the desired path', - 'OPERATION_PATH_CANNOT_ADD', - o, - s, - i - ); - } else if ('replace' === s.op || 'remove' === s.op || '_get' === s.op) { - if (s.path !== u) - throw new Ro( - 'Cannot perform the operation at a path that does not exist', - 'OPERATION_PATH_UNRESOLVABLE', - o, - s, - i - ); - } else if ('move' === s.op || 'copy' === s.op) { - var x = validate([{ op: '_get', path: s.from, value: void 0 }], i); - if (x && 'OPERATION_PATH_UNRESOLVABLE' === x.name) - throw new Ro( - 'Cannot perform the operation from a path that does not exist', - 'OPERATION_FROM_UNRESOLVABLE', - o, - s, - i - ); - } - } - function validate(s, o, i) { - try { - if (!Array.isArray(s)) - throw new Ro('Patch sequence must be an array', 'SEQUENCE_NOT_AN_ARRAY'); - if (o) applyPatch(_deepClone(o), _deepClone(s), i || !0); - else { - i = i || validator; - for (var u = 0; u < s.length; u++) i(s[u], u, o, void 0); - } - } catch (s) { - if (s instanceof Ro) return s; - throw s; - } - } - function _areEquals(s, o) { - if (s === o) return !0; - if (s && o && 'object' == typeof s && 'object' == typeof o) { - var i, - u, - _, - w = Array.isArray(s), - x = Array.isArray(o); - if (w && x) { - if ((u = s.length) != o.length) return !1; - for (i = u; 0 != i--; ) if (!_areEquals(s[i], o[i])) return !1; - return !0; - } - if (w != x) return !1; - var C = Object.keys(s); - if ((u = C.length) !== Object.keys(o).length) return !1; - for (i = u; 0 != i--; ) if (!o.hasOwnProperty(C[i])) return !1; - for (i = u; 0 != i--; ) if (!_areEquals(s[(_ = C[i])], o[_])) return !1; - return !0; - } - return s != s && o != o; - } - var Fo = new WeakMap(), - qo = function qo(s) { - ((this.observers = new Map()), (this.obj = s)); - }, - $o = function $o(s, o) { - ((this.callback = s), (this.observer = o)); - }; - function unobserve(s, o) { - o.unobserve(); - } - function observe(s, o) { - var i, - u = (function getMirror(s) { - return Fo.get(s); - })(s); - if (u) { - var _ = (function getObserverFromMirror(s, o) { - return s.observers.get(o); - })(u, o); - i = _ && _.observer; - } else ((u = new qo(s)), Fo.set(s, u)); - if (i) return i; - if (((i = {}), (u.value = _deepClone(s)), o)) { - ((i.callback = o), (i.next = null)); - var dirtyCheck = function () { - generate(i); - }, - fastCheck = function () { - (clearTimeout(i.next), (i.next = setTimeout(dirtyCheck))); - }; - 'undefined' != typeof window && - (window.addEventListener('mouseup', fastCheck), - window.addEventListener('keyup', fastCheck), - window.addEventListener('mousedown', fastCheck), - window.addEventListener('keydown', fastCheck), - window.addEventListener('change', fastCheck)); - } - return ( - (i.patches = []), - (i.object = s), - (i.unobserve = function () { - (generate(i), - clearTimeout(i.next), - (function removeObserverFromMirror(s, o) { - s.observers.delete(o.callback); - })(u, i), - 'undefined' != typeof window && - (window.removeEventListener('mouseup', fastCheck), - window.removeEventListener('keyup', fastCheck), - window.removeEventListener('mousedown', fastCheck), - window.removeEventListener('keydown', fastCheck), - window.removeEventListener('change', fastCheck))); - }), - u.observers.set(o, new $o(o, i)), - i - ); - } - function generate(s, o) { - void 0 === o && (o = !1); - var i = Fo.get(s.object); - (_generate(i.value, s.object, s.patches, '', o), - s.patches.length && applyPatch(i.value, s.patches)); - var u = s.patches; - return (u.length > 0 && ((s.patches = []), s.callback && s.callback(u)), u); - } - function _generate(s, o, i, u, _) { - if (o !== s) { - 'function' == typeof o.toJSON && (o = o.toJSON()); - for ( - var w = _objectKeys(o), x = _objectKeys(s), C = !1, j = x.length - 1; - j >= 0; - j-- - ) { - var L = s[($ = x[j])]; - if ( - !module_helpers_hasOwnProperty(o, $) || - (void 0 === o[$] && void 0 !== L && !1 === Array.isArray(o)) - ) - Array.isArray(s) === Array.isArray(o) - ? (_ && - i.push({ - op: 'test', - path: u + '/' + escapePathComponent($), - value: _deepClone(L) - }), - i.push({ op: 'remove', path: u + '/' + escapePathComponent($) }), - (C = !0)) - : (_ && i.push({ op: 'test', path: u, value: s }), - i.push({ op: 'replace', path: u, value: o }), - !0); - else { - var B = o[$]; - 'object' == typeof L && - null != L && - 'object' == typeof B && - null != B && - Array.isArray(L) === Array.isArray(B) - ? _generate(L, B, i, u + '/' + escapePathComponent($), _) - : L !== B && - (_ && - i.push({ - op: 'test', - path: u + '/' + escapePathComponent($), - value: _deepClone(L) - }), - i.push({ - op: 'replace', - path: u + '/' + escapePathComponent($), - value: _deepClone(B) - })); - } - } - if (C || w.length != x.length) - for (j = 0; j < w.length; j++) { - var $; - module_helpers_hasOwnProperty(s, ($ = w[j])) || - void 0 === o[$] || - i.push({ - op: 'add', - path: u + '/' + escapePathComponent($), - value: _deepClone(o[$]) - }); - } - } - } - function compare(s, o, i) { - void 0 === i && (i = !1); - var u = []; - return (_generate(s, o, u, '', i), u); - } - Object.assign({}, ie, ae, { - JsonPatchError: No, - deepClone: _deepClone, - escapePathComponent, - unescapePathComponent - }); - var Vo = __webpack_require__(14744), - Uo = __webpack_require__.n(Vo); - const zo = { - add: function add(s, o) { - return { op: 'add', path: s, value: o }; - }, - replace, - remove: function remove(s) { - return { op: 'remove', path: s }; - }, - merge: function lib_merge(s, o) { - return { type: 'mutation', op: 'merge', path: s, value: o }; - }, - mergeDeep: function mergeDeep(s, o) { - return { type: 'mutation', op: 'mergeDeep', path: s, value: o }; - }, - context: function context(s, o) { - return { type: 'context', path: s, value: o }; - }, - getIn: function lib_getIn(s, o) { - return o.reduce((s, o) => (void 0 !== o && s ? s[o] : s), s); - }, - applyPatch: function lib_applyPatch(s, o, i) { - if ( - ((i = i || {}), - 'merge' === (o = { ...o, path: o.path && normalizeJSONPath(o.path) }).op) - ) { - const i = getInByJsonPath(s, o.path); - (Object.assign(i, o.value), applyPatch(s, [replace(o.path, i)])); - } else if ('mergeDeep' === o.op) { - const i = getInByJsonPath(s, o.path), - u = Uo()(i, o.value); - s = applyPatch(s, [replace(o.path, u)]).newDocument; - } else if ('add' === o.op && '' === o.path && lib_isObject(o.value)) { - applyPatch( - s, - Object.keys(o.value).reduce( - (s, i) => ( - s.push({ op: 'add', path: `/${normalizeJSONPath(i)}`, value: o.value[i] }), - s - ), - [] - ) - ); - } else if ('replace' === o.op && '' === o.path) { - let { value: u } = o; - (i.allowMetaPatches && - o.meta && - isAdditiveMutation(o) && - (Array.isArray(o.value) || lib_isObject(o.value)) && - (u = { ...u, ...o.meta }), - (s = u)); - } else if ( - (applyPatch(s, [o]), - i.allowMetaPatches && - o.meta && - isAdditiveMutation(o) && - (Array.isArray(o.value) || lib_isObject(o.value))) - ) { - const i = { ...getInByJsonPath(s, o.path), ...o.meta }; - applyPatch(s, [replace(o.path, i)]); - } - return s; - }, - parentPathMatch: function parentPathMatch(s, o) { - if (!Array.isArray(o)) return !1; - for (let i = 0, u = o.length; i < u; i += 1) if (o[i] !== s[i]) return !1; - return !0; - }, - flatten, - fullyNormalizeArray: function fullyNormalizeArray(s) { - return cleanArray(flatten(lib_normalizeArray(s))); - }, - normalizeArray: lib_normalizeArray, - isPromise: function isPromise(s) { - return lib_isObject(s) && lib_isFunction(s.then); - }, - forEachNew: function forEachNew(s, o) { - try { - return forEachNewPatch(s, forEach, o); - } catch (s) { - return s; - } - }, - forEachNewPrimitive: function forEachNewPrimitive(s, o) { - try { - return forEachNewPatch(s, forEachPrimitive, o); - } catch (s) { - return s; - } - }, - isJsonPatch, - isContextPatch: function isContextPatch(s) { - return isPatch(s) && 'context' === s.type; - }, - isPatch, - isMutation, - isAdditiveMutation, - isGenerator: function isGenerator(s) { - return '[object GeneratorFunction]' === Object.prototype.toString.call(s); - }, - isFunction: lib_isFunction, - isObject: lib_isObject, - isError: function lib_isError(s) { - return s instanceof Error; - } - }; - function normalizeJSONPath(s) { - return Array.isArray(s) - ? s.length < 1 - ? '' - : `/${s.map((s) => (s + '').replace(/~/g, '~0').replace(/\//g, '~1')).join('/')}` - : s; - } - function replace(s, o, i) { - return { op: 'replace', path: s, value: o, meta: i }; - } - function forEachNewPatch(s, o, i) { - return cleanArray( - flatten(s.filter(isAdditiveMutation).map((s) => o(s.value, i, s.path)) || []) - ); - } - function forEachPrimitive(s, o, i) { - return ( - (i = i || []), - Array.isArray(s) - ? s.map((s, u) => forEachPrimitive(s, o, i.concat(u))) - : lib_isObject(s) - ? Object.keys(s).map((u) => forEachPrimitive(s[u], o, i.concat(u))) - : o(s, i[i.length - 1], i) - ); - } - function forEach(s, o, i) { - let u = []; - if ((i = i || []).length > 0) { - const _ = o(s, i[i.length - 1], i); - _ && (u = u.concat(_)); - } - if (Array.isArray(s)) { - const _ = s.map((s, u) => forEach(s, o, i.concat(u))); - _ && (u = u.concat(_)); - } else if (lib_isObject(s)) { - const _ = Object.keys(s).map((u) => forEach(s[u], o, i.concat(u))); - _ && (u = u.concat(_)); - } - return ((u = flatten(u)), u); - } - function lib_normalizeArray(s) { - return Array.isArray(s) ? s : [s]; - } - function flatten(s) { - return [].concat(...s.map((s) => (Array.isArray(s) ? flatten(s) : s))); - } - function cleanArray(s) { - return s.filter((s) => void 0 !== s); - } - function lib_isObject(s) { - return s && 'object' == typeof s; - } - function lib_isFunction(s) { - return s && 'function' == typeof s; - } - function isJsonPatch(s) { - if (isPatch(s)) { - const { op: o } = s; - return 'add' === o || 'remove' === o || 'replace' === o; - } - return !1; - } - function isMutation(s) { - return isJsonPatch(s) || (isPatch(s) && 'mutation' === s.type); - } - function isAdditiveMutation(s) { - return ( - isMutation(s) && - ('add' === s.op || 'replace' === s.op || 'merge' === s.op || 'mergeDeep' === s.op) - ); - } - function isPatch(s) { - return s && 'object' == typeof s; - } - function getInByJsonPath(s, o) { - try { - return getValueByPointer(s, o); - } catch (s) { - return (console.error(s), {}); - } - } - var Wo = __webpack_require__(48675); - const Ko = class ApiDOMAggregateError extends Wo { - constructor(s, o, i) { - if ( - (super(s, o, i), - (this.name = this.constructor.name), - 'string' == typeof o && (this.message = o), - 'function' == typeof Error.captureStackTrace - ? Error.captureStackTrace(this, this.constructor) - : (this.stack = new Error(o).stack), - null != i && 'object' == typeof i && Object.hasOwn(i, 'cause') && !('cause' in this)) - ) { - const { cause: s } = i; - ((this.cause = s), - s instanceof Error && - 'stack' in s && - (this.stack = `${this.stack}\nCAUSE: ${s.stack}`)); - } - } - }; - class ApiDOMError extends Error { - static [Symbol.hasInstance](s) { - return ( - super[Symbol.hasInstance](s) || Function.prototype[Symbol.hasInstance].call(Ko, s) - ); - } - constructor(s, o) { - if ( - (super(s, o), - (this.name = this.constructor.name), - 'string' == typeof s && (this.message = s), - 'function' == typeof Error.captureStackTrace - ? Error.captureStackTrace(this, this.constructor) - : (this.stack = new Error(s).stack), - null != o && 'object' == typeof o && Object.hasOwn(o, 'cause') && !('cause' in this)) - ) { - const { cause: s } = o; - ((this.cause = s), - s instanceof Error && - 'stack' in s && - (this.stack = `${this.stack}\nCAUSE: ${s.stack}`)); - } - } - } - const Ho = ApiDOMError; - const Jo = class ApiDOMStructuredError extends Ho { - constructor(s, o) { - if ((super(s, o), null != o && 'object' == typeof o)) { - const { cause: s, ...i } = o; - Object.assign(this, i); - } - } - }; - var Go = __webpack_require__(65606); - function _isPlaceholder(s) { - return null != s && 'object' == typeof s && !0 === s['@@functional/placeholder']; - } - function _curry1(s) { - return function f1(o) { - return 0 === arguments.length || _isPlaceholder(o) ? f1 : s.apply(this, arguments); - }; - } - function _curry2(s) { - return function f2(o, i) { - switch (arguments.length) { - case 0: - return f2; - case 1: - return _isPlaceholder(o) - ? f2 - : _curry1(function (i) { - return s(o, i); - }); - default: - return _isPlaceholder(o) && _isPlaceholder(i) - ? f2 - : _isPlaceholder(o) - ? _curry1(function (o) { - return s(o, i); - }) - : _isPlaceholder(i) - ? _curry1(function (i) { - return s(o, i); - }) - : s(o, i); - } - }; - } - function _curry3(s) { - return function f3(o, i, u) { - switch (arguments.length) { - case 0: - return f3; - case 1: - return _isPlaceholder(o) - ? f3 - : _curry2(function (i, u) { - return s(o, i, u); - }); - case 2: - return _isPlaceholder(o) && _isPlaceholder(i) - ? f3 - : _isPlaceholder(o) - ? _curry2(function (o, u) { - return s(o, i, u); - }) - : _isPlaceholder(i) - ? _curry2(function (i, u) { - return s(o, i, u); - }) - : _curry1(function (u) { - return s(o, i, u); - }); - default: - return _isPlaceholder(o) && _isPlaceholder(i) && _isPlaceholder(u) - ? f3 - : _isPlaceholder(o) && _isPlaceholder(i) - ? _curry2(function (o, i) { - return s(o, i, u); - }) - : _isPlaceholder(o) && _isPlaceholder(u) - ? _curry2(function (o, u) { - return s(o, i, u); - }) - : _isPlaceholder(i) && _isPlaceholder(u) - ? _curry2(function (i, u) { - return s(o, i, u); - }) - : _isPlaceholder(o) - ? _curry1(function (o) { - return s(o, i, u); - }) - : _isPlaceholder(i) - ? _curry1(function (i) { - return s(o, i, u); - }) - : _isPlaceholder(u) - ? _curry1(function (u) { - return s(o, i, u); - }) - : s(o, i, u); - } - }; - } - const Yo = - Number.isInteger || - function _isInteger(s) { - return (s | 0) === s; - }; - function _isString(s) { - return '[object String]' === Object.prototype.toString.call(s); - } - function _nth(s, o) { - var i = s < 0 ? o.length + s : s; - return _isString(o) ? o.charAt(i) : o[i]; - } - function _path(s, o) { - for (var i = o, u = 0; u < s.length; u += 1) { - if (null == i) return; - var _ = s[u]; - i = Yo(_) ? _nth(_, i) : i[_]; - } - return i; - } - const Xo = _curry3(function pathSatisfies(s, o, i) { - return s(_path(o, i)); - }); - function _cloneRegExp(s) { - return new RegExp( - s.source, - s.flags - ? s.flags - : (s.global ? 'g' : '') + - (s.ignoreCase ? 'i' : '') + - (s.multiline ? 'm' : '') + - (s.sticky ? 'y' : '') + - (s.unicode ? 'u' : '') + - (s.dotAll ? 's' : '') - ); - } - function _arrayFromIterator(s) { - for (var o, i = []; !(o = s.next()).done; ) i.push(o.value); - return i; - } - function _includesWith(s, o, i) { - for (var u = 0, _ = i.length; u < _; ) { - if (s(o, i[u])) return !0; - u += 1; - } - return !1; - } - function _has(s, o) { - return Object.prototype.hasOwnProperty.call(o, s); - } - const Zo = - 'function' == typeof Object.is - ? Object.is - : function _objectIs(s, o) { - return s === o ? 0 !== s || 1 / s == 1 / o : s != s && o != o; - }; - var Qo = Object.prototype.toString; - const _i = (function () { - return '[object Arguments]' === Qo.call(arguments) - ? function _isArguments(s) { - return '[object Arguments]' === Qo.call(s); - } - : function _isArguments(s) { - return _has('callee', s); - }; - })(); - var Ei = !{ toString: null }.propertyIsEnumerable('toString'), - Oi = [ - 'constructor', - 'valueOf', - 'isPrototypeOf', - 'toString', - 'propertyIsEnumerable', - 'hasOwnProperty', - 'toLocaleString' - ], - Pi = (function () { - return arguments.propertyIsEnumerable('length'); - })(), - Mi = function contains(s, o) { - for (var i = 0; i < s.length; ) { - if (s[i] === o) return !0; - i += 1; - } - return !1; - }, - Ri = - 'function' != typeof Object.keys || Pi - ? _curry1(function keys(s) { - if (Object(s) !== s) return []; - var o, - i, - u = [], - _ = Pi && _i(s); - for (o in s) !_has(o, s) || (_ && 'length' === o) || (u[u.length] = o); - if (Ei) - for (i = Oi.length - 1; i >= 0; ) - (_has((o = Oi[i]), s) && !Mi(u, o) && (u[u.length] = o), (i -= 1)); - return u; - }) - : _curry1(function keys(s) { - return Object(s) !== s ? [] : Object.keys(s); - }); - const Wi = Ri; - const ea = _curry1(function type(s) { - return null === s - ? 'Null' - : void 0 === s - ? 'Undefined' - : Object.prototype.toString.call(s).slice(8, -1); - }); - function _uniqContentEquals(s, o, i, u) { - var _ = _arrayFromIterator(s); - function eq(s, o) { - return _equals(s, o, i.slice(), u.slice()); - } - return !_includesWith( - function (s, o) { - return !_includesWith(eq, o, s); - }, - _arrayFromIterator(o), - _ - ); - } - function _equals(s, o, i, u) { - if (Zo(s, o)) return !0; - var _ = ea(s); - if (_ !== ea(o)) return !1; - if ( - 'function' == typeof s['fantasy-land/equals'] || - 'function' == typeof o['fantasy-land/equals'] - ) - return ( - 'function' == typeof s['fantasy-land/equals'] && - s['fantasy-land/equals'](o) && - 'function' == typeof o['fantasy-land/equals'] && - o['fantasy-land/equals'](s) - ); - if ('function' == typeof s.equals || 'function' == typeof o.equals) - return ( - 'function' == typeof s.equals && - s.equals(o) && - 'function' == typeof o.equals && - o.equals(s) - ); - switch (_) { - case 'Arguments': - case 'Array': - case 'Object': - if ( - 'function' == typeof s.constructor && - 'Promise' === - (function _functionName(s) { - var o = String(s).match(/^function (\w*)/); - return null == o ? '' : o[1]; - })(s.constructor) - ) - return s === o; - break; - case 'Boolean': - case 'Number': - case 'String': - if (typeof s != typeof o || !Zo(s.valueOf(), o.valueOf())) return !1; - break; - case 'Date': - if (!Zo(s.valueOf(), o.valueOf())) return !1; - break; - case 'Error': - return s.name === o.name && s.message === o.message; - case 'RegExp': - if ( - s.source !== o.source || - s.global !== o.global || - s.ignoreCase !== o.ignoreCase || - s.multiline !== o.multiline || - s.sticky !== o.sticky || - s.unicode !== o.unicode - ) - return !1; - } - for (var w = i.length - 1; w >= 0; ) { - if (i[w] === s) return u[w] === o; - w -= 1; - } - switch (_) { - case 'Map': - return ( - s.size === o.size && - _uniqContentEquals(s.entries(), o.entries(), i.concat([s]), u.concat([o])) - ); - case 'Set': - return ( - s.size === o.size && - _uniqContentEquals(s.values(), o.values(), i.concat([s]), u.concat([o])) - ); - case 'Arguments': - case 'Array': - case 'Object': - case 'Boolean': - case 'Number': - case 'String': - case 'Date': - case 'Error': - case 'RegExp': - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float32Array': - case 'Float64Array': - case 'ArrayBuffer': - break; - default: - return !1; - } - var x = Wi(s); - if (x.length !== Wi(o).length) return !1; - var C = i.concat([s]), - j = u.concat([o]); - for (w = x.length - 1; w >= 0; ) { - var L = x[w]; - if (!_has(L, o) || !_equals(o[L], s[L], C, j)) return !1; - w -= 1; - } - return !0; - } - const ra = _curry2(function equals(s, o) { - return _equals(s, o, [], []); - }); - function _includes(s, o) { - return ( - (function _indexOf(s, o, i) { - var u, _; - if ('function' == typeof s.indexOf) - switch (typeof o) { - case 'number': - if (0 === o) { - for (u = 1 / o; i < s.length; ) { - if (0 === (_ = s[i]) && 1 / _ === u) return i; - i += 1; - } - return -1; - } - if (o != o) { - for (; i < s.length; ) { - if ('number' == typeof (_ = s[i]) && _ != _) return i; - i += 1; - } - return -1; - } - return s.indexOf(o, i); - case 'string': - case 'boolean': - case 'function': - case 'undefined': - return s.indexOf(o, i); - case 'object': - if (null === o) return s.indexOf(o, i); - } - for (; i < s.length; ) { - if (ra(s[i], o)) return i; - i += 1; - } - return -1; - })(o, s, 0) >= 0 - ); - } - function _map(s, o) { - for (var i = 0, u = o.length, _ = Array(u); i < u; ) ((_[i] = s(o[i])), (i += 1)); - return _; - } - function _quote(s) { - return ( - '"' + - s - .replace(/\\/g, '\\\\') - .replace(/[\b]/g, '\\b') - .replace(/\f/g, '\\f') - .replace(/\n/g, '\\n') - .replace(/\r/g, '\\r') - .replace(/\t/g, '\\t') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0') - .replace(/"/g, '\\"') + - '"' - ); - } - var na = function pad(s) { - return (s < 10 ? '0' : '') + s; - }; - const ia = - 'function' == typeof Date.prototype.toISOString - ? function _toISOString(s) { - return s.toISOString(); - } - : function _toISOString(s) { - return ( - s.getUTCFullYear() + - '-' + - na(s.getUTCMonth() + 1) + - '-' + - na(s.getUTCDate()) + - 'T' + - na(s.getUTCHours()) + - ':' + - na(s.getUTCMinutes()) + - ':' + - na(s.getUTCSeconds()) + - '.' + - (s.getUTCMilliseconds() / 1e3).toFixed(3).slice(2, 5) + - 'Z' - ); - }; - function _complement(s) { - return function () { - return !s.apply(this, arguments); - }; - } - function _arrayReduce(s, o, i) { - for (var u = 0, _ = i.length; u < _; ) ((o = s(o, i[u])), (u += 1)); - return o; - } - const aa = - Array.isArray || - function _isArray(s) { - return ( - null != s && s.length >= 0 && '[object Array]' === Object.prototype.toString.call(s) - ); - }; - function _dispatchable(s, o, i) { - return function () { - if (0 === arguments.length) return i(); - var u = arguments[arguments.length - 1]; - if (!aa(u)) { - for (var _ = 0; _ < s.length; ) { - if ('function' == typeof u[s[_]]) - return u[s[_]].apply(u, Array.prototype.slice.call(arguments, 0, -1)); - _ += 1; - } - if ( - (function _isTransformer(s) { - return null != s && 'function' == typeof s['@@transducer/step']; - })(u) - ) - return o.apply(null, Array.prototype.slice.call(arguments, 0, -1))(u); - } - return i.apply(this, arguments); - }; - } - function _isObject(s) { - return '[object Object]' === Object.prototype.toString.call(s); - } - const _xfBase_init = function () { - return this.xf['@@transducer/init'](); - }, - _xfBase_result = function (s) { - return this.xf['@@transducer/result'](s); - }; - var la = (function () { - function XFilter(s, o) { - ((this.xf = o), (this.f = s)); - } - return ( - (XFilter.prototype['@@transducer/init'] = _xfBase_init), - (XFilter.prototype['@@transducer/result'] = _xfBase_result), - (XFilter.prototype['@@transducer/step'] = function (s, o) { - return this.f(o) ? this.xf['@@transducer/step'](s, o) : s; - }), - XFilter - ); - })(); - function _xfilter(s) { - return function (o) { - return new la(s, o); - }; - } - var ca = _curry2( - _dispatchable(['fantasy-land/filter', 'filter'], _xfilter, function (s, o) { - return _isObject(o) - ? _arrayReduce( - function (i, u) { - return (s(o[u]) && (i[u] = o[u]), i); - }, - {}, - Wi(o) - ) - : (function _filter(s, o) { - for (var i = 0, u = o.length, _ = []; i < u; ) - (s(o[i]) && (_[_.length] = o[i]), (i += 1)); - return _; - })(s, o); - }) - ); - const ua = ca; - const da = _curry2(function reject(s, o) { - return ua(_complement(s), o); - }); - function _toString_toString(s, o) { - var i = function recur(i) { - var u = o.concat([s]); - return _includes(i, u) ? '' : _toString_toString(i, u); - }, - mapPairs = function (s, o) { - return _map(function (o) { - return _quote(o) + ': ' + i(s[o]); - }, o.slice().sort()); - }; - switch (Object.prototype.toString.call(s)) { - case '[object Arguments]': - return '(function() { return arguments; }(' + _map(i, s).join(', ') + '))'; - case '[object Array]': - return ( - '[' + - _map(i, s) - .concat( - mapPairs( - s, - da(function (s) { - return /^\d+$/.test(s); - }, Wi(s)) - ) - ) - .join(', ') + - ']' - ); - case '[object Boolean]': - return 'object' == typeof s ? 'new Boolean(' + i(s.valueOf()) + ')' : s.toString(); - case '[object Date]': - return 'new Date(' + (isNaN(s.valueOf()) ? i(NaN) : _quote(ia(s))) + ')'; - case '[object Map]': - return 'new Map(' + i(Array.from(s)) + ')'; - case '[object Null]': - return 'null'; - case '[object Number]': - return 'object' == typeof s - ? 'new Number(' + i(s.valueOf()) + ')' - : 1 / s == -1 / 0 - ? '-0' - : s.toString(10); - case '[object Set]': - return 'new Set(' + i(Array.from(s).sort()) + ')'; - case '[object String]': - return 'object' == typeof s ? 'new String(' + i(s.valueOf()) + ')' : _quote(s); - case '[object Undefined]': - return 'undefined'; - default: - if ('function' == typeof s.toString) { - var u = s.toString(); - if ('[object Object]' !== u) return u; - } - return '{' + mapPairs(s, Wi(s)).join(', ') + '}'; - } - } - const ma = _curry1(function toString(s) { - return _toString_toString(s, []); - }); - var ga = _curry2(function test(s, o) { - if ( - !(function _isRegExp(s) { - return '[object RegExp]' === Object.prototype.toString.call(s); - })(s) - ) - throw new TypeError( - '‘test’ requires a value of type RegExp as its first argument; received ' + ma(s) - ); - return _cloneRegExp(s).test(o); - }); - const ya = ga; - function _arity(s, o) { - switch (s) { - case 0: - return function () { - return o.apply(this, arguments); - }; - case 1: - return function (s) { - return o.apply(this, arguments); - }; - case 2: - return function (s, i) { - return o.apply(this, arguments); - }; - case 3: - return function (s, i, u) { - return o.apply(this, arguments); - }; - case 4: - return function (s, i, u, _) { - return o.apply(this, arguments); - }; - case 5: - return function (s, i, u, _, w) { - return o.apply(this, arguments); - }; - case 6: - return function (s, i, u, _, w, x) { - return o.apply(this, arguments); - }; - case 7: - return function (s, i, u, _, w, x, C) { - return o.apply(this, arguments); - }; - case 8: - return function (s, i, u, _, w, x, C, j) { - return o.apply(this, arguments); - }; - case 9: - return function (s, i, u, _, w, x, C, j, L) { - return o.apply(this, arguments); - }; - case 10: - return function (s, i, u, _, w, x, C, j, L, B) { - return o.apply(this, arguments); - }; - default: - throw new Error( - 'First argument to _arity must be a non-negative integer no greater than ten' - ); - } - } - function _pipe(s, o) { - return function () { - return o.call(this, s.apply(this, arguments)); - }; - } - const va = _curry1(function isArrayLike(s) { - return ( - !!aa(s) || - (!!s && - 'object' == typeof s && - !_isString(s) && - (0 === s.length || - (s.length > 0 && s.hasOwnProperty(0) && s.hasOwnProperty(s.length - 1)))) - ); - }); - var ba = 'undefined' != typeof Symbol ? Symbol.iterator : '@@iterator'; - function _createReduce(s, o, i) { - return function _reduce(u, _, w) { - if (va(w)) return s(u, _, w); - if (null == w) return _; - if ('function' == typeof w['fantasy-land/reduce']) - return o(u, _, w, 'fantasy-land/reduce'); - if (null != w[ba]) return i(u, _, w[ba]()); - if ('function' == typeof w.next) return i(u, _, w); - if ('function' == typeof w.reduce) return o(u, _, w, 'reduce'); - throw new TypeError('reduce: list must be array or iterable'); - }; - } - function _xArrayReduce(s, o, i) { - for (var u = 0, _ = i.length; u < _; ) { - if ((o = s['@@transducer/step'](o, i[u])) && o['@@transducer/reduced']) { - o = o['@@transducer/value']; - break; - } - u += 1; - } - return s['@@transducer/result'](o); - } - var _a = _curry2(function bind(s, o) { - return _arity(s.length, function () { - return s.apply(o, arguments); - }); - }); - const Ea = _a; - function _xIterableReduce(s, o, i) { - for (var u = i.next(); !u.done; ) { - if ((o = s['@@transducer/step'](o, u.value)) && o['@@transducer/reduced']) { - o = o['@@transducer/value']; - break; - } - u = i.next(); - } - return s['@@transducer/result'](o); - } - function _xMethodReduce(s, o, i, u) { - return s['@@transducer/result'](i[u](Ea(s['@@transducer/step'], s), o)); - } - const wa = _createReduce(_xArrayReduce, _xMethodReduce, _xIterableReduce); - var xa = (function () { - function XWrap(s) { - this.f = s; - } - return ( - (XWrap.prototype['@@transducer/init'] = function () { - throw new Error('init not implemented on XWrap'); - }), - (XWrap.prototype['@@transducer/result'] = function (s) { - return s; - }), - (XWrap.prototype['@@transducer/step'] = function (s, o) { - return this.f(s, o); - }), - XWrap - ); - })(); - function _xwrap(s) { - return new xa(s); - } - var ka = _curry3(function (s, o, i) { - return wa('function' == typeof s ? _xwrap(s) : s, o, i); - }); - const Ca = ka; - function _checkForMethod(s, o) { - return function () { - var i = arguments.length; - if (0 === i) return o(); - var u = arguments[i - 1]; - return aa(u) || 'function' != typeof u[s] - ? o.apply(this, arguments) - : u[s].apply(u, Array.prototype.slice.call(arguments, 0, i - 1)); - }; - } - var Aa = _curry3( - _checkForMethod('slice', function slice(s, o, i) { - return Array.prototype.slice.call(i, s, o); - }) - ); - const ja = Aa; - const Ia = _curry1(_checkForMethod('tail', ja(1, 1 / 0))); - function pipe() { - if (0 === arguments.length) throw new Error('pipe requires at least one argument'); - return _arity(arguments[0].length, Ca(_pipe, arguments[0], Ia(arguments))); - } - const Na = _curry2(function defaultTo(s, o) { - return null == o || o != o ? s : o; - }); - const Da = _curry2(function prop(s, o) { - if (null != o) return Yo(s) ? _nth(s, o) : o[s]; - }); - const La = _curry3(function propOr(s, o, i) { - return Na(s, Da(o, i)); - }); - var Ba = _curry1(function (s) { - return _nth(-1, s); - }); - const Fa = Ba; - function _curryN(s, o, i) { - return function () { - for (var u = [], _ = 0, w = s, x = 0, C = !1; x < o.length || _ < arguments.length; ) { - var j; - (x < o.length && (!_isPlaceholder(o[x]) || _ >= arguments.length) - ? (j = o[x]) - : ((j = arguments[_]), (_ += 1)), - (u[x] = j), - _isPlaceholder(j) ? (C = !0) : (w -= 1), - (x += 1)); - } - return !C && w <= 0 ? i.apply(this, u) : _arity(Math.max(0, w), _curryN(s, u, i)); - }; - } - var $a = _curry2(function curryN(s, o) { - return 1 === s ? _curry1(o) : _arity(s, _curryN(s, [], o)); - }); - const za = $a; - var Ha = _curry1(function curry(s) { - return za(s.length, s); - }); - const Ja = Ha; - function _isFunction(s) { - var o = Object.prototype.toString.call(s); - return ( - '[object Function]' === o || - '[object AsyncFunction]' === o || - '[object GeneratorFunction]' === o || - '[object AsyncGeneratorFunction]' === o - ); - } - const Ga = _curry2(function invoker(s, o) { - return za(s + 1, function () { - var i = arguments[s]; - if (null != i && _isFunction(i[o])) - return i[o].apply(i, Array.prototype.slice.call(arguments, 0, s)); - throw new TypeError(ma(i) + ' does not have a method named "' + o + '"'); - }); - }); - const tl = Ga(1, 'split'); - function dropLastWhile(s, o) { - for (var i = o.length - 1; i >= 0 && s(o[i]); ) i -= 1; - return ja(0, i + 1, o); - } - var sl = (function () { - function XDropLastWhile(s, o) { - ((this.f = s), (this.retained = []), (this.xf = o)); - } - return ( - (XDropLastWhile.prototype['@@transducer/init'] = _xfBase_init), - (XDropLastWhile.prototype['@@transducer/result'] = function (s) { - return ((this.retained = null), this.xf['@@transducer/result'](s)); - }), - (XDropLastWhile.prototype['@@transducer/step'] = function (s, o) { - return this.f(o) ? this.retain(s, o) : this.flush(s, o); - }), - (XDropLastWhile.prototype.flush = function (s, o) { - return ( - (s = wa(this.xf, s, this.retained)), - (this.retained = []), - this.xf['@@transducer/step'](s, o) - ); - }), - (XDropLastWhile.prototype.retain = function (s, o) { - return (this.retained.push(o), s); - }), - XDropLastWhile - ); - })(); - function _xdropLastWhile(s) { - return function (o) { - return new sl(s, o); - }; - } - const ul = _curry2(_dispatchable([], _xdropLastWhile, dropLastWhile)); - const yl = Ga(1, 'join'); - var vl = _curry1(function flip(s) { - return za(s.length, function (o, i) { - var u = Array.prototype.slice.call(arguments, 0); - return ((u[0] = i), (u[1] = o), s.apply(this, u)); - }); - }); - const _l = vl(_curry2(_includes)); - const El = Ja(function (s, o) { - return pipe(tl(''), ul(_l(s)), yl(''))(o); - }); - function _iterableReduce(s, o, i) { - for (var u = i.next(); !u.done; ) ((o = s(o, u.value)), (u = i.next())); - return o; - } - function _methodReduce(s, o, i, u) { - return i[u](s, o); - } - const wl = _createReduce(_arrayReduce, _methodReduce, _iterableReduce); - var Sl = (function () { - function XMap(s, o) { - ((this.xf = o), (this.f = s)); - } - return ( - (XMap.prototype['@@transducer/init'] = _xfBase_init), - (XMap.prototype['@@transducer/result'] = _xfBase_result), - (XMap.prototype['@@transducer/step'] = function (s, o) { - return this.xf['@@transducer/step'](s, this.f(o)); - }), - XMap - ); - })(); - var xl = _curry2( - _dispatchable( - ['fantasy-land/map', 'map'], - function _xmap(s) { - return function (o) { - return new Sl(s, o); - }; - }, - function map(s, o) { - switch (Object.prototype.toString.call(o)) { - case '[object Function]': - return za(o.length, function () { - return s.call(this, o.apply(this, arguments)); - }); - case '[object Object]': - return _arrayReduce( - function (i, u) { - return ((i[u] = s(o[u])), i); - }, - {}, - Wi(o) - ); - default: - return _map(s, o); - } - } - ) - ); - const kl = xl; - const Cl = _curry2(function ap(s, o) { - return 'function' == typeof o['fantasy-land/ap'] - ? o['fantasy-land/ap'](s) - : 'function' == typeof s.ap - ? s.ap(o) - : 'function' == typeof s - ? function (i) { - return s(i)(o(i)); - } - : wl( - function (s, i) { - return (function _concat(s, o) { - var i; - o = o || []; - var u = (s = s || []).length, - _ = o.length, - w = []; - for (i = 0; i < u; ) ((w[w.length] = s[i]), (i += 1)); - for (i = 0; i < _; ) ((w[w.length] = o[i]), (i += 1)); - return w; - })(s, kl(i, o)); - }, - [], - s - ); - }); - var Ol = _curry2(function liftN(s, o) { - var i = za(s, o); - return za(s, function () { - return _arrayReduce(Cl, kl(i, arguments[0]), Array.prototype.slice.call(arguments, 1)); - }); - }); - const Al = Ol; - var Il = _curry1(function lift(s) { - return Al(s.length, s); - }); - const Pl = Il; - const Ml = Pl( - _curry1(function not(s) { - return !s; - }) - ); - const Tl = _curry1(function always(s) { - return function () { - return s; - }; - }); - const Nl = Tl(void 0); - const Rl = ra(Nl()); - const Dl = Ml(Rl); - const Ll = _curry2(function max(s, o) { - if (s === o) return o; - function safeMax(s, o) { - if (s > o != o > s) return o > s ? o : s; - } - var i = safeMax(s, o); - if (void 0 !== i) return i; - var u = safeMax(typeof s, typeof o); - if (void 0 !== u) return u === typeof s ? s : o; - var _ = ma(s), - w = safeMax(_, ma(o)); - return void 0 !== w && w === _ ? s : o; - }); - var Bl = _curry2(function pluck(s, o) { - return kl(Da(s), o); - }); - const Fl = Bl; - const $l = _curry1(function anyPass(s) { - return za(Ca(Ll, 0, Fl('length', s)), function () { - for (var o = 0, i = s.length; o < i; ) { - if (s[o].apply(this, arguments)) return !0; - o += 1; - } - return !1; - }); - }); - var identical = function (s, o) { - switch (arguments.length) { - case 0: - return identical; - case 1: - return function unaryIdentical(o) { - return 0 === arguments.length ? unaryIdentical : Zo(s, o); - }; - default: - return Zo(s, o); - } - }; - const Vl = identical; - const Ul = za(1, pipe(ea, Vl('GeneratorFunction'))); - const zl = za(1, pipe(ea, Vl('AsyncFunction'))); - const Wl = $l([pipe(ea, Vl('Function')), Ul, zl]); - var Kl = _curry3(function replace(s, o, i) { - return i.replace(s, o); - }); - const Hl = Kl; - const Jl = za(1, pipe(ea, Vl('RegExp'))); - const Gl = _curry3(function when(s, o, i) { - return s(i) ? o(i) : i; - }); - const Yl = za(1, pipe(ea, Vl('String'))); - const Xl = Gl(Yl, Hl(/[.*+?^${}()|[\]\\-]/g, '\\$&')); - var Zl = function checkValue(s, o) { - if ('string' != typeof s && !(s instanceof String)) - throw TypeError('`'.concat(o, '` must be a string')); - }; - const Ql = function replaceAll(s, o, i) { - (!(function checkArguments(s, o, i) { - if (null == i || null == s || null == o) - throw TypeError('Input values must not be `null` or `undefined`'); - })(s, o, i), - Zl(i, 'str'), - Zl(o, 'replaceValue'), - (function checkSearchValue(s) { - if (!('string' == typeof s || s instanceof String || s instanceof RegExp)) - throw TypeError('`searchValue` must be a string or an regexp'); - })(s)); - var u = new RegExp(Jl(s) ? s : Xl(s), 'g'); - return Hl(u, o, i); - }; - var ec = za(3, Ql), - rc = Ga(2, 'replaceAll'); - const sc = Wl(String.prototype.replaceAll) ? rc : ec, - isWindows = () => Xo(ya(/^win/), ['platform'], Go), - getProtocol = (s) => { - try { - const o = new URL(s); - return El(':', o.protocol); - } catch { - return; - } - }, - oc = - (pipe(getProtocol, Dl), - (s) => { - if (Go.browser) return !1; - const o = getProtocol(s); - return Rl(o) || 'file' === o || /^[a-zA-Z]$/.test(o); - }), - isHttpUrl = (s) => { - const o = getProtocol(s); - return 'http' === o || 'https' === o; - }, - toFileSystemPath = (s, o) => { - const i = [/%23/g, '#', /%24/g, '$', /%26/g, '&', /%2C/g, ',', /%40/g, '@'], - u = La(!1, 'keepFileProtocol', o), - _ = La(isWindows, 'isWindows', o); - let w = decodeURI(s); - for (let s = 0; s < i.length; s += 2) w = w.replace(i[s], i[s + 1]); - let x = 'file://' === w.substring(0, 7).toLowerCase(); - return ( - x && - ((w = '/' === w[7] ? w.substring(8) : w.substring(7)), - _() && '/' === w[1] && (w = `${w[0]}:${w.substring(1)}`), - u ? (w = `file:///${w}`) : ((x = !1), (w = _() ? w : `/${w}`))), - _() && - !x && - ((w = sc('/', '\\', w)), - ':\\' === w.substring(1, 3) && (w = w[0].toUpperCase() + w.substring(1))), - w - ); - }, - getHash = (s) => { - const o = s.indexOf('#'); - return -1 !== o ? s.substring(o) : '#'; - }, - stripHash = (s) => { - const o = s.indexOf('#'); - let i = s; - return (o >= 0 && (i = s.substring(0, o)), i); - }, - url_cwd = () => { - if (Go.browser) return stripHash(globalThis.location.href); - const s = Go.cwd(), - o = Fa(s); - return ['/', '\\'].includes(o) ? s : s + (isWindows() ? '\\' : '/'); - }, - resolve = (s, o) => { - const i = new URL(o, new URL(s, 'resolve://')); - if ('resolve:' === i.protocol) { - const { pathname: s, search: o, hash: u } = i; - return s + o + u; - } - return i.toString(); - }, - sanitize = (s) => { - if (oc(s)) - return ((s) => { - const o = [/\?/g, '%3F', /#/g, '%23']; - let i = s; - (isWindows() && (i = i.replace(/\\/g, '/')), (i = encodeURI(i))); - for (let s = 0; s < o.length; s += 2) i = i.replace(o[s], o[s + 1]); - return i; - })(toFileSystemPath(s)); - try { - return new URL(s).toString(); - } catch { - return encodeURI(decodeURI(s)).replace(/%5B/g, '[').replace(/%5D/g, ']'); - } - }, - unsanitize = (s) => (oc(s) ? toFileSystemPath(s) : decodeURI(s)), - { - fetch: ic, - Response: ac, - Headers: lc, - Request: cc, - FormData: pc, - File: hc, - Blob: dc - } = globalThis; - function _array_like_to_array(s, o) { - (null == o || o > s.length) && (o = s.length); - for (var i = 0, u = new Array(o); i < o; i++) u[i] = s[i]; - return u; - } - function legacy_defineProperties(s, o) { - for (var i = 0; i < o.length; i++) { - var u = o[i]; - ((u.enumerable = u.enumerable || !1), - (u.configurable = !0), - 'value' in u && (u.writable = !0), - Object.defineProperty(s, u.key, u)); - } - } - function _instanceof(s, o) { - return null != o && 'undefined' != typeof Symbol && o[Symbol.hasInstance] - ? !!o[Symbol.hasInstance](s) - : s instanceof o; - } - function _sliced_to_array(s, o) { - return ( - (function _array_with_holes(s) { - if (Array.isArray(s)) return s; - })(s) || - (function _iterable_to_array_limit(s, o) { - var i = - null == s - ? null - : ('undefined' != typeof Symbol && s[Symbol.iterator]) || s['@@iterator']; - if (null != i) { - var u, - _, - w = [], - x = !0, - C = !1; - try { - for ( - i = i.call(s); - !(x = (u = i.next()).done) && (w.push(u.value), !o || w.length !== o); - x = !0 - ); - } catch (s) { - ((C = !0), (_ = s)); - } finally { - try { - x || null == i.return || i.return(); - } finally { - if (C) throw _; - } - } - return w; - } - })(s, o) || - (function _unsupported_iterable_to_array(s, o) { - if (!s) return; - if ('string' == typeof s) return _array_like_to_array(s, o); - var i = Object.prototype.toString.call(s).slice(8, -1); - 'Object' === i && s.constructor && (i = s.constructor.name); - if ('Map' === i || 'Set' === i) return Array.from(i); - if ('Arguments' === i || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)) - return _array_like_to_array(s, o); - })(s, o) || - (function _non_iterable_rest() { - throw new TypeError( - 'Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.' - ); - })() - ); - } - function _type_of(s) { - return s && 'undefined' != typeof Symbol && s.constructor === Symbol - ? 'symbol' - : typeof s; - } - (void 0 === globalThis.fetch && (globalThis.fetch = ic), - void 0 === globalThis.Headers && (globalThis.Headers = lc), - void 0 === globalThis.Request && (globalThis.Request = cc), - void 0 === globalThis.Response && (globalThis.Response = ac), - void 0 === globalThis.FormData && (globalThis.FormData = pc), - void 0 === globalThis.File && (globalThis.File = hc), - void 0 === globalThis.Blob && (globalThis.Blob = dc)); - var __typeError = function (s) { - throw TypeError(s); - }, - __accessCheck = function (s, o, i) { - return o.has(s) || __typeError('Cannot ' + i); - }, - __privateGet = function (s, o, i) { - return (__accessCheck(s, o, 'read from private field'), i ? i.call(s) : o.get(s)); - }, - __privateAdd = function (s, o, i) { - return o.has(s) - ? __typeError('Cannot add the same private member more than once') - : _instanceof(o, WeakSet) - ? o.add(s) - : o.set(s, i); - }, - __privateSet = function (s, o, i, u) { - return ( - __accessCheck(s, o, 'write to private field'), - u ? u.call(s, i) : o.set(s, i), - i - ); - }, - to_string = function (s) { - return Object.prototype.toString.call(s); - }, - is_typed_array = function (s) { - return ArrayBuffer.isView(s) && !_instanceof(s, DataView); - }, - fc = Array.isArray, - gc = Object.getOwnPropertyDescriptor, - bc = Object.prototype.propertyIsEnumerable, - _c = Object.getOwnPropertySymbols, - Ec = Object.prototype.hasOwnProperty; - function own_enumerable_keys(s) { - for (var o = Object.keys(s), i = _c(s), u = 0; u < i.length; u++) - bc.call(s, i[u]) && o.push(i[u]); - return o; - } - function is_writable(s, o) { - var i; - return !(null === (i = gc(s, o)) || void 0 === i ? void 0 : i.writable); - } - function legacy_copy(s, o) { - if ('object' === (void 0 === s ? 'undefined' : _type_of(s)) && null !== s) { - var i; - if (fc(s)) i = []; - else if ('[object Date]' === to_string(s)) i = new Date(s.getTime ? s.getTime() : s); - else if ( - (function (s) { - return '[object RegExp]' === to_string(s); - })(s) - ) - i = new RegExp(s); - else if ( - (function (s) { - return '[object Error]' === to_string(s); - })(s) - ) - i = { message: s.message }; - else if ( - (function (s) { - return '[object Boolean]' === to_string(s); - })(s) || - (function (s) { - return '[object Number]' === to_string(s); - })(s) || - (function (s) { - return '[object String]' === to_string(s); - })(s) - ) - i = Object(s); - else { - if (is_typed_array(s)) return s.slice(); - i = Object.create(Object.getPrototypeOf(s)); - } - var u = o.includeSymbols ? own_enumerable_keys : Object.keys, - _ = !0, - w = !1, - x = void 0; - try { - for (var C, j = u(s)[Symbol.iterator](); !(_ = (C = j.next()).done); _ = !0) { - var L = C.value; - i[L] = s[L]; - } - } catch (s) { - ((w = !0), (x = s)); - } finally { - try { - _ || null == j.return || j.return(); - } finally { - if (w) throw x; - } - } - return i; - } - return s; - } - var kc, - Oc, - jc = { includeSymbols: !1, immutable: !1 }; - function walk(s, o) { - var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : jc, - u = [], - _ = [], - w = !0, - x = i.includeSymbols ? own_enumerable_keys : Object.keys, - C = !!i.immutable; - return (function walker(s) { - var j = C ? legacy_copy(s, i) : s, - L = {}, - B = !0, - $ = { - node: j, - node_: s, - path: [].concat(u), - parent: _[_.length - 1], - parents: _, - key: u[u.length - 1], - isRoot: 0 === u.length, - level: u.length, - circular: void 0, - isLeaf: !1, - notLeaf: !0, - notRoot: !0, - isFirst: !1, - isLast: !1, - update: function update(s) { - var o = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; - ($.isRoot || ($.parent.node[$.key] = s), ($.node = s), o && (B = !1)); - }, - delete: function _delete(s) { - (delete $.parent.node[$.key], s && (B = !1)); - }, - remove: function remove(s) { - (fc($.parent.node) ? $.parent.node.splice($.key, 1) : delete $.parent.node[$.key], - s && (B = !1)); - }, - keys: null, - before: function before(s) { - L.before = s; - }, - after: function after(s) { - L.after = s; - }, - pre: function pre(s) { - L.pre = s; - }, - post: function post(s) { - L.post = s; - }, - stop: function stop() { - w = !1; - }, - block: function block() { - B = !1; - } - }; - if (!w) return $; - function update_state() { - if ('object' === _type_of($.node) && null !== $.node) { - (($.keys && $.node_ === $.node) || ($.keys = x($.node)), - ($.isLeaf = 0 === $.keys.length)); - for (var o = 0; o < _.length; o++) - if (_[o].node_ === s) { - $.circular = _[o]; - break; - } - } else (($.isLeaf = !0), ($.keys = null)); - (($.notLeaf = !$.isLeaf), ($.notRoot = !$.isRoot)); - } - update_state(); - var V = o.call($, $.node); - if ((void 0 !== V && $.update && $.update(V), L.before && L.before.call($, $.node), !B)) - return $; - if ('object' === _type_of($.node) && null !== $.node && !$.circular) { - var U; - (_.push($), update_state()); - var z = !0, - Y = !1, - Z = void 0; - try { - for ( - var ee, - ie = Object.entries(null !== (U = $.keys) && void 0 !== U ? U : [])[ - Symbol.iterator - ](); - !(z = (ee = ie.next()).done); - z = !0 - ) { - var ae, - le = _sliced_to_array(ee.value, 2), - ce = le[0], - pe = le[1]; - (u.push(pe), L.pre && L.pre.call($, $.node[pe], pe)); - var de = walker($.node[pe]); - (C && Ec.call($.node, pe) && !is_writable($.node, pe) && ($.node[pe] = de.node), - (de.isLast = - !!(null === (ae = $.keys) || void 0 === ae ? void 0 : ae.length) && - +ce == $.keys.length - 1), - (de.isFirst = 0 == +ce), - L.post && L.post.call($, de), - u.pop()); - } - } catch (s) { - ((Y = !0), (Z = s)); - } finally { - try { - z || null == ie.return || ie.return(); - } finally { - if (Y) throw Z; - } - } - _.pop(); - } - return (L.after && L.after.call($, $.node), $); - })(s).node; - } - var Ic = (function () { - function Traverse(s) { - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : jc; - (!(function _class_call_check(s, o) { - if (!(s instanceof o)) throw new TypeError('Cannot call a class as a function'); - })(this, Traverse), - __privateAdd(this, kc), - __privateAdd(this, Oc), - __privateSet(this, kc, s), - __privateSet(this, Oc, o)); - } - return ( - (function _create_class(s, o, i) { - return ( - o && legacy_defineProperties(s.prototype, o), - i && legacy_defineProperties(s, i), - s - ); - })(Traverse, [ - { - key: 'get', - value: function get(s) { - for (var o = __privateGet(this, kc), i = 0; o && i < s.length; i++) { - var u = s[i]; - if ( - !Ec.call(o, u) || - (!__privateGet(this, Oc).includeSymbols && - 'symbol' === (void 0 === u ? 'undefined' : _type_of(u))) - ) - return; - o = o[u]; - } - return o; - } - }, - { - key: 'has', - value: function has(s) { - for (var o = __privateGet(this, kc), i = 0; o && i < s.length; i++) { - var u = s[i]; - if ( - !Ec.call(o, u) || - (!__privateGet(this, Oc).includeSymbols && - 'symbol' === (void 0 === u ? 'undefined' : _type_of(u))) - ) - return !1; - o = o[u]; - } - return !0; - } - }, - { - key: 'set', - value: function set(s, o) { - var i = __privateGet(this, kc), - u = 0; - for (u = 0; u < s.length - 1; u++) { - var _ = s[u]; - (Ec.call(i, _) || (i[_] = {}), (i = i[_])); - } - return ((i[s[u]] = o), o); - } - }, - { - key: 'map', - value: function map(s) { - return walk(__privateGet(this, kc), s, { - immutable: !0, - includeSymbols: !!__privateGet(this, Oc).includeSymbols - }); - } - }, - { - key: 'forEach', - value: function forEach(s) { - return ( - __privateSet(this, kc, walk(__privateGet(this, kc), s, __privateGet(this, Oc))), - __privateGet(this, kc) - ); - } - }, - { - key: 'reduce', - value: function reduce(s, o) { - var i = 1 === arguments.length, - u = i ? __privateGet(this, kc) : o; - return ( - this.forEach(function (o) { - (this.isRoot && i) || (u = s.call(this, u, o)); - }), - u - ); - } - }, - { - key: 'paths', - value: function paths() { - var s = []; - return ( - this.forEach(function () { - s.push(this.path); - }), - s - ); - } - }, - { - key: 'nodes', - value: function nodes() { - var s = []; - return ( - this.forEach(function () { - s.push(this.node); - }), - s - ); - } - }, - { - key: 'clone', - value: function clone() { - var s = [], - o = [], - i = __privateGet(this, Oc); - return is_typed_array(__privateGet(this, kc)) - ? __privateGet(this, kc).slice() - : (function clone(u) { - for (var _ = 0; _ < s.length; _++) if (s[_] === u) return o[_]; - if ('object' === (void 0 === u ? 'undefined' : _type_of(u)) && null !== u) { - var w = legacy_copy(u, i); - (s.push(u), o.push(w)); - var x = i.includeSymbols ? own_enumerable_keys : Object.keys, - C = !0, - j = !1, - L = void 0; - try { - for ( - var B, $ = x(u)[Symbol.iterator](); - !(C = (B = $.next()).done); - C = !0 - ) { - var V = B.value; - w[V] = clone(u[V]); - } - } catch (s) { - ((j = !0), (L = s)); - } finally { - try { - C || null == $.return || $.return(); - } finally { - if (j) throw L; - } - } - return (s.pop(), o.pop(), w); - } - return u; - })(__privateGet(this, kc)); - } - } - ]), - Traverse - ); - })(); - ((kc = new WeakMap()), (Oc = new WeakMap())); - var traverse = function (s, o) { - return new Ic(s, o); - }; - ((traverse.get = function (s, o, i) { - return new Ic(s, i).get(o); - }), - (traverse.set = function (s, o, i, u) { - return new Ic(s, u).set(o, i); - }), - (traverse.has = function (s, o, i) { - return new Ic(s, i).has(o); - }), - (traverse.map = function (s, o, i) { - return new Ic(s, i).map(o); - }), - (traverse.forEach = function (s, o, i) { - return new Ic(s, i).forEach(o); - }), - (traverse.reduce = function (s, o, i, u) { - return new Ic(s, u).reduce(o, i); - }), - (traverse.paths = function (s, o) { - return new Ic(s, o).paths(); - }), - (traverse.nodes = function (s, o) { - return new Ic(s, o).nodes(); - }), - (traverse.clone = function (s, o) { - return new Ic(s, o).clone(); - })); - var Pc = traverse; - const Mc = 'application/json, application/yaml', - Nc = 'https://swagger.io', - Rc = Object.freeze({ url: '/' }), - Lc = ['properties'], - Fc = ['properties'], - qc = [ - 'definitions', - 'parameters', - 'responses', - 'securityDefinitions', - 'components/schemas', - 'components/responses', - 'components/parameters', - 'components/securitySchemes' - ], - Kc = ['schema/example', 'items/example']; - function isFreelyNamed(s) { - const o = s[s.length - 1], - i = s[s.length - 2], - u = s.join('/'); - return ( - (Lc.indexOf(o) > -1 && -1 === Fc.indexOf(i)) || - qc.indexOf(u) > -1 || - Kc.some((s) => u.indexOf(s) > -1) - ); - } - function absolutifyPointer(s, o) { - const [i, u] = s.split('#'), - _ = null != o ? o : '', - w = null != i ? i : ''; - let x; - if (isHttpUrl(_)) x = resolve(_, w); - else { - const s = resolve(Nc, _), - o = resolve(s, w).replace(Nc, ''); - x = w.startsWith('/') ? o : o.substring(1); - } - return u ? `${x}#${u}` : x; - } - const Hc = /^([a-z]+:\/\/|\/\/)/i; - class JSONRefError extends Jo {} - const Jc = {}, - Gc = new WeakMap(), - Qc = [ - (s) => 'paths' === s[0] && 'responses' === s[3] && 'examples' === s[5], - (s) => - 'paths' === s[0] && 'responses' === s[3] && 'content' === s[5] && 'example' === s[7], - (s) => - 'paths' === s[0] && - 'responses' === s[3] && - 'content' === s[5] && - 'examples' === s[7] && - 'value' === s[9], - (s) => - 'paths' === s[0] && - 'requestBody' === s[3] && - 'content' === s[4] && - 'example' === s[6], - (s) => - 'paths' === s[0] && - 'requestBody' === s[3] && - 'content' === s[4] && - 'examples' === s[6] && - 'value' === s[8], - (s) => 'paths' === s[0] && 'parameters' === s[2] && 'example' === s[4], - (s) => 'paths' === s[0] && 'parameters' === s[3] && 'example' === s[5], - (s) => - 'paths' === s[0] && 'parameters' === s[2] && 'examples' === s[4] && 'value' === s[6], - (s) => - 'paths' === s[0] && 'parameters' === s[3] && 'examples' === s[5] && 'value' === s[7], - (s) => - 'paths' === s[0] && 'parameters' === s[2] && 'content' === s[4] && 'example' === s[6], - (s) => - 'paths' === s[0] && - 'parameters' === s[2] && - 'content' === s[4] && - 'examples' === s[6] && - 'value' === s[8], - (s) => - 'paths' === s[0] && 'parameters' === s[3] && 'content' === s[4] && 'example' === s[7], - (s) => - 'paths' === s[0] && - 'parameters' === s[3] && - 'content' === s[5] && - 'examples' === s[7] && - 'value' === s[9] - ], - eu = { - key: '$ref', - plugin: (s, o, i, u) => { - const _ = u.getInstance(), - w = i.slice(0, -1); - if (isFreelyNamed(w) || ((s) => Qc.some((o) => o(s)))(w)) return; - const { baseDoc: x } = u.getContext(i); - if ('string' != typeof s) - return new JSONRefError('$ref: must be a string (JSON-Ref)', { - $ref: s, - baseDoc: x, - fullPath: i - }); - const C = refs_split(s), - j = C[0], - L = C[1] || ''; - let B, $, V; - try { - B = x || j ? absoluteify(j, x) : null; - } catch (o) { - return wrapError(o, { pointer: L, $ref: s, basePath: B, fullPath: i }); - } - if ( - (function pointerAlreadyInPath(s, o, i, u) { - let _ = Gc.get(u); - _ || ((_ = {}), Gc.set(u, _)); - const w = (function arrayToJsonPointer(s) { - if (0 === s.length) return ''; - return `/${s.map(escapeJsonPointerToken).join('/')}`; - })(i), - x = `${o || ''}#${s}`, - C = w.replace(/allOf\/\d+\/?/g, ''), - j = u.contextTree.get([]).baseDoc; - if (o === j && pointerIsAParent(C, s)) return !0; - let L = ''; - const B = i.some( - (s) => ( - (L = `${L}/${escapeJsonPointerToken(s)}`), - _[L] && _[L].some((s) => pointerIsAParent(s, x) || pointerIsAParent(x, s)) - ) - ); - if (B) return !0; - return void (_[C] = (_[C] || []).concat(x)); - })(L, B, w, u) && - !_.useCircularStructures - ) { - const o = absolutifyPointer(s, B); - return s === o ? null : zo.replace(i, o); - } - if ( - (null == B - ? ((V = jsonPointerToArray(L)), - ($ = u.get(V)), - void 0 === $ && - ($ = new JSONRefError(`Could not resolve reference: ${s}`, { - pointer: L, - $ref: s, - baseDoc: x, - fullPath: i - }))) - : (($ = extractFromDoc(B, L)), - ($ = - null != $.__value - ? $.__value - : $.catch((o) => { - throw wrapError(o, { pointer: L, $ref: s, baseDoc: x, fullPath: i }); - }))), - $ instanceof Error) - ) - return [zo.remove(i), $]; - const U = absolutifyPointer(s, B), - z = zo.replace(w, $, { $$ref: U }); - if (B && B !== x) return [z, zo.context(w, { baseDoc: B })]; - try { - if ( - !(function patchValueAlreadyInPath(s, o) { - const i = [s]; - return ( - o.path.reduce((s, o) => (i.push(s[o]), s[o]), s), - pointToAncestor(o.value) - ); - function pointToAncestor(s) { - return ( - zo.isObject(s) && - (i.indexOf(s) >= 0 || Object.keys(s).some((o) => pointToAncestor(s[o]))) - ); - } - })(u.state, z) || - _.useCircularStructures - ) - return z; - } catch (s) { - return null; - } - } - }, - tu = Object.assign(eu, { - docCache: Jc, - absoluteify, - clearCache: function clearCache(s) { - void 0 !== s - ? delete Jc[s] - : Object.keys(Jc).forEach((s) => { - delete Jc[s]; - }); - }, - JSONRefError, - wrapError, - getDoc, - split: refs_split, - extractFromDoc, - fetchJSON: function fetchJSON(s) { - return fetch(s, { headers: { Accept: Mc }, loadSpec: !0 }) - .then((s) => s.text()) - .then((s) => mn.load(s)); - }, - extract, - jsonPointerToArray, - unescapeJsonPointerToken - }), - ru = tu; - function absoluteify(s, o) { - if (!Hc.test(s)) { - if (!o) - throw new JSONRefError( - `Tried to resolve a relative URL, without having a basePath. path: '${s}' basePath: '${o}'` - ); - return resolve(o, s); - } - return s; - } - function wrapError(s, o) { - let i; - return ( - (i = - s && s.response && s.response.body - ? `${s.response.body.code} ${s.response.body.message}` - : s.message), - new JSONRefError(`Could not resolve reference: ${i}`, { ...o, cause: s }) - ); - } - function refs_split(s) { - return (s + '').split('#'); - } - function extractFromDoc(s, o) { - const i = Jc[s]; - if (i && !zo.isPromise(i)) - try { - const s = extract(o, i); - return Object.assign(Promise.resolve(s), { __value: s }); - } catch (s) { - return Promise.reject(s); - } - return getDoc(s).then((s) => extract(o, s)); - } - function getDoc(s) { - const o = Jc[s]; - return o - ? zo.isPromise(o) - ? o - : Promise.resolve(o) - : ((Jc[s] = tu.fetchJSON(s).then((o) => ((Jc[s] = o), o))), Jc[s]); - } - function extract(s, o) { - const i = jsonPointerToArray(s); - if (i.length < 1) return o; - const u = zo.getIn(o, i); - if (void 0 === u) - throw new JSONRefError(`Could not resolve pointer: ${s} does not exist in document`, { - pointer: s - }); - return u; - } - function jsonPointerToArray(s) { - if ('string' != typeof s) throw new TypeError('Expected a string, got a ' + typeof s); - return ( - '/' === s[0] && (s = s.substr(1)), - '' === s ? [] : s.split('/').map(unescapeJsonPointerToken) - ); - } - function unescapeJsonPointerToken(s) { - if ('string' != typeof s) return s; - return new URLSearchParams(`=${s.replace(/~1/g, '/').replace(/~0/g, '~')}`).get(''); - } - function escapeJsonPointerToken(s) { - return new URLSearchParams([['', s.replace(/~/g, '~0').replace(/\//g, '~1')]]) - .toString() - .slice(1); - } - const pointerBoundaryChar = (s) => !s || '/' === s || '#' === s; - function pointerIsAParent(s, o) { - if (pointerBoundaryChar(o)) return !0; - const i = s.charAt(o.length), - u = o.slice(-1); - return 0 === s.indexOf(o) && (!i || '/' === i || '#' === i) && '#' !== u; - } - const nu = { - key: 'allOf', - plugin: (s, o, i, u, _) => { - if (_.meta && _.meta.$$ref) return; - const w = i.slice(0, -1); - if (isFreelyNamed(w)) return; - if (!Array.isArray(s)) { - const s = new TypeError('allOf must be an array'); - return ((s.fullPath = i), s); - } - let x = !1, - C = _.value; - if ( - (w.forEach((s) => { - C && (C = C[s]); - }), - (C = { ...C }), - 0 === Object.keys(C).length) - ) - return; - delete C.allOf; - const j = []; - return ( - j.push(u.replace(w, {})), - s.forEach((s, o) => { - if (!u.isObject(s)) { - if (x) return null; - x = !0; - const s = new TypeError('Elements in allOf must be objects'); - return ((s.fullPath = i), j.push(s)); - } - j.push(u.mergeDeep(w, s)); - const _ = (function generateAbsoluteRefPatches( - s, - o, - { - specmap: i, - getBaseUrlForNodePath: u = (s) => i.getContext([...o, ...s]).baseDoc, - targetKeys: _ = ['$ref', '$$ref'] - } = {} - ) { - const w = []; - return ( - Pc(s).forEach(function callback() { - if (_.includes(this.key) && 'string' == typeof this.node) { - const s = this.path, - _ = o.concat(this.path), - x = absolutifyPointer(this.node, u(s)); - w.push(i.replace(_, x)); - } - }), - w - ); - })(s, i.slice(0, -1), { - getBaseUrlForNodePath: (s) => u.getContext([...i, o, ...s]).baseDoc, - specmap: u - }); - j.push(..._); - }), - C.example && j.push(u.remove([].concat(w, 'example'))), - j.push(u.mergeDeep(w, C)), - C.$$ref || j.push(u.remove([].concat(w, '$$ref'))), - j - ); - } - }, - su = { - key: 'parameters', - plugin: (s, o, i, u) => { - if (Array.isArray(s) && s.length) { - const o = Object.assign([], s), - _ = i.slice(0, -1), - w = { ...zo.getIn(u.spec, _) }; - for (let _ = 0; _ < s.length; _ += 1) { - const x = s[_]; - try { - o[_].default = u.parameterMacro(w, x); - } catch (s) { - const o = new Error(s); - return ((o.fullPath = i), o); - } - } - return zo.replace(i, o); - } - return zo.replace(i, s); - } - }, - ou = { - key: 'properties', - plugin: (s, o, i, u) => { - const _ = { ...s }; - for (const o in s) - try { - _[o].default = u.modelPropertyMacro(_[o]); - } catch (s) { - const o = new Error(s); - return ((o.fullPath = i), o); - } - return zo.replace(i, _); - } - }; - class ContextTree { - constructor(s) { - this.root = context_tree_createNode(s || {}); - } - set(s, o) { - const i = this.getParent(s, !0); - if (!i) return void context_tree_updateNode(this.root, o, null); - const u = s[s.length - 1], - { children: _ } = i; - _[u] ? context_tree_updateNode(_[u], o, i) : (_[u] = context_tree_createNode(o, i)); - } - get(s) { - if ((s = s || []).length < 1) return this.root.value; - let o, - i, - u = this.root; - for (let _ = 0; _ < s.length && ((i = s[_]), (o = u.children), o[i]); _ += 1) u = o[i]; - return u && u.protoValue; - } - getParent(s, o) { - return !s || s.length < 1 - ? null - : s.length < 2 - ? this.root - : s.slice(0, -1).reduce((s, i) => { - if (!s) return s; - const { children: u } = s; - return (!u[i] && o && (u[i] = context_tree_createNode(null, s)), u[i]); - }, this.root); - } - } - function context_tree_createNode(s, o) { - return context_tree_updateNode({ children: {} }, s, o); - } - function context_tree_updateNode(s, o, i) { - return ( - (s.value = o || {}), - (s.protoValue = i ? { ...i.protoValue, ...s.value } : s.value), - Object.keys(s.children).forEach((o) => { - const i = s.children[o]; - s.children[o] = context_tree_updateNode(i, i.value, s); - }), - s - ); - } - const specmap_noop = () => {}; - class SpecMap { - static getPluginName(s) { - return s.pluginName; - } - static getPatchesOfType(s, o) { - return s.filter(o); - } - constructor(s) { - (Object.assign( - this, - { - spec: '', - debugLevel: 'info', - plugins: [], - pluginHistory: {}, - errors: [], - mutations: [], - promisedPatches: [], - state: {}, - patches: [], - context: {}, - contextTree: new ContextTree(), - showDebug: !1, - allPatches: [], - pluginProp: 'specMap', - libMethods: Object.assign(Object.create(this), zo, { getInstance: () => this }), - allowMetaPatches: !1 - }, - s - ), - (this.get = this._get.bind(this)), - (this.getContext = this._getContext.bind(this)), - (this.hasRun = this._hasRun.bind(this)), - (this.wrappedPlugins = this.plugins - .map(this.wrapPlugin.bind(this)) - .filter(zo.isFunction)), - this.patches.push(zo.add([], this.spec)), - this.patches.push(zo.context([], this.context)), - this.updatePatches(this.patches)); - } - debug(s, ...o) { - this.debugLevel === s && console.log(...o); - } - verbose(s, ...o) { - 'verbose' === this.debugLevel && console.log(`[${s}] `, ...o); - } - wrapPlugin(s, o) { - const { pathDiscriminator: i } = this; - let u, - _ = null; - return ( - s[this.pluginProp] - ? ((_ = s), (u = s[this.pluginProp])) - : zo.isFunction(s) - ? (u = s) - : zo.isObject(s) && - (u = (function createKeyBasedPlugin(s) { - const isSubPath = (s, o) => - !Array.isArray(s) || s.every((s, i) => s === o[i]); - return function* generator(o, u) { - const _ = {}; - for (const [s, i] of o.filter(zo.isAdditiveMutation).entries()) { - if (!(s < 3e3)) return; - yield* traverse(i.value, i.path, i); - } - function* traverse(o, w, x) { - if (zo.isObject(o)) { - const C = w.length - 1, - j = w[C], - L = w.indexOf('properties'), - B = 'properties' === j && C === L, - $ = u.allowMetaPatches && _[o.$$ref]; - for (const C of Object.keys(o)) { - const j = o[C], - L = w.concat(C), - V = zo.isObject(j), - U = o.$$ref; - if ( - ($ || - (V && - (u.allowMetaPatches && U && (_[U] = !0), - yield* traverse(j, L, x))), - !B && C === s.key) - ) { - const o = isSubPath(i, w); - (i && !o) || (yield s.plugin(j, C, L, u, x)); - } - } - } else s.key === w[w.length - 1] && (yield s.plugin(o, s.key, w, u)); - } - }; - })(s)), - Object.assign(u.bind(_), { pluginName: s.name || o, isGenerator: zo.isGenerator(u) }) - ); - } - nextPlugin() { - return this.wrappedPlugins.find((s) => this.getMutationsForPlugin(s).length > 0); - } - nextPromisedPatch() { - if (this.promisedPatches.length > 0) - return Promise.race(this.promisedPatches.map((s) => s.value)); - } - getPluginHistory(s) { - const o = this.constructor.getPluginName(s); - return this.pluginHistory[o] || []; - } - getPluginRunCount(s) { - return this.getPluginHistory(s).length; - } - getPluginHistoryTip(s) { - const o = this.getPluginHistory(s); - return (o && o[o.length - 1]) || {}; - } - getPluginMutationIndex(s) { - const o = this.getPluginHistoryTip(s).mutationIndex; - return 'number' != typeof o ? -1 : o; - } - updatePluginHistory(s, o) { - const i = this.constructor.getPluginName(s); - ((this.pluginHistory[i] = this.pluginHistory[i] || []), this.pluginHistory[i].push(o)); - } - updatePatches(s) { - zo.normalizeArray(s).forEach((s) => { - if (s instanceof Error) this.errors.push(s); - else - try { - if (!zo.isObject(s)) - return void this.debug('updatePatches', 'Got a non-object patch', s); - if ((this.showDebug && this.allPatches.push(s), zo.isPromise(s.value))) - return (this.promisedPatches.push(s), void this.promisedPatchThen(s)); - if (zo.isContextPatch(s)) return void this.setContext(s.path, s.value); - zo.isMutation(s) && this.updateMutations(s); - } catch (s) { - (console.error(s), this.errors.push(s)); - } - }); - } - updateMutations(s) { - 'object' == typeof s.value && - !Array.isArray(s.value) && - this.allowMetaPatches && - (s.value = { ...s.value }); - const o = zo.applyPatch(this.state, s, { allowMetaPatches: this.allowMetaPatches }); - o && (this.mutations.push(s), (this.state = o)); - } - removePromisedPatch(s) { - const o = this.promisedPatches.indexOf(s); - o < 0 - ? this.debug("Tried to remove a promisedPatch that isn't there!") - : this.promisedPatches.splice(o, 1); - } - promisedPatchThen(s) { - return ( - (s.value = s.value - .then((o) => { - const i = { ...s, value: o }; - (this.removePromisedPatch(s), this.updatePatches(i)); - }) - .catch((o) => { - (this.removePromisedPatch(s), this.updatePatches(o)); - })), - s.value - ); - } - getMutations(s, o) { - return ( - (s = s || 0), - 'number' != typeof o && (o = this.mutations.length), - this.mutations.slice(s, o) - ); - } - getCurrentMutations() { - return this.getMutationsForPlugin(this.getCurrentPlugin()); - } - getMutationsForPlugin(s) { - const o = this.getPluginMutationIndex(s); - return this.getMutations(o + 1); - } - getCurrentPlugin() { - return this.currentPlugin; - } - getLib() { - return this.libMethods; - } - _get(s) { - return zo.getIn(this.state, s); - } - _getContext(s) { - return this.contextTree.get(s); - } - setContext(s, o) { - return this.contextTree.set(s, o); - } - _hasRun(s) { - return this.getPluginRunCount(this.getCurrentPlugin()) > (s || 0); - } - dispatch() { - const s = this, - o = this.nextPlugin(); - if (!o) { - const s = this.nextPromisedPatch(); - if (s) return s.then(() => this.dispatch()).catch(() => this.dispatch()); - const o = { spec: this.state, errors: this.errors }; - return (this.showDebug && (o.patches = this.allPatches), Promise.resolve(o)); - } - if ( - ((s.pluginCount = s.pluginCount || new WeakMap()), - s.pluginCount.set(o, (s.pluginCount.get(o) || 0) + 1), - s.pluginCount[o] > 100) - ) - return Promise.resolve({ - spec: s.state, - errors: s.errors.concat(new Error("We've reached a hard limit of 100 plugin runs")) - }); - if (o !== this.currentPlugin && this.promisedPatches.length) { - const s = this.promisedPatches.map((s) => s.value); - return Promise.all(s.map((s) => s.then(specmap_noop, specmap_noop))).then(() => - this.dispatch() - ); - } - return (function executePlugin() { - s.currentPlugin = o; - const i = s.getCurrentMutations(), - u = s.mutations.length - 1; - try { - if (o.isGenerator) for (const u of o(i, s.getLib())) updatePatches(u); - else { - updatePatches(o(i, s.getLib())); - } - } catch (s) { - (console.error(s), updatePatches([Object.assign(Object.create(s), { plugin: o })])); - } finally { - s.updatePluginHistory(o, { mutationIndex: u }); - } - return s.dispatch(); - })(); - function updatePatches(i) { - i && ((i = zo.fullyNormalizeArray(i)), s.updatePatches(i, o)); - } - } - } - const iu = { refs: ru, allOf: nu, parameters: su, properties: ou }; - function makeFetchJSON(s, o = {}) { - const { requestInterceptor: i, responseInterceptor: u } = o, - _ = s.withCredentials ? 'include' : 'same-origin'; - return (o) => - s({ - url: o, - loadSpec: !0, - requestInterceptor: i, - responseInterceptor: u, - headers: { Accept: Mc }, - credentials: _ - }).then((s) => s.body); - } - function isFile(s, o) { - return ( - o || 'undefined' == typeof navigator || (o = navigator), - o && 'ReactNative' === o.product - ? !(!s || 'object' != typeof s || 'string' != typeof s.uri) - : ('undefined' != typeof File && s instanceof File) || - ('undefined' != typeof Blob && s instanceof Blob) || - !!ArrayBuffer.isView(s) || - (null !== s && 'object' == typeof s && 'function' == typeof s.pipe) - ); - } - function isArrayOfFile(s, o) { - return Array.isArray(s) && s.some((s) => isFile(s, o)); - } - class FileWithData extends File { - constructor(s, o = '', i = {}) { - (super([s], o, i), (this.data = s)); - } - valueOf() { - return this.data; - } - toString() { - return this.valueOf(); - } - } - const isRfc3986Reserved = (s) => ":/?#[]@!$&'()*+,;=".indexOf(s) > -1, - isRfc3986Unreserved = (s) => /^[a-z0-9\-._~]+$/i.test(s); - function encodeCharacters(s, o = 'reserved') { - return [...s] - .map((s) => { - if (isRfc3986Unreserved(s)) return s; - if (isRfc3986Reserved(s) && 'unsafe' === o) return s; - const i = new TextEncoder(); - return Array.from(i.encode(s)) - .map((s) => `0${s.toString(16).toUpperCase()}`.slice(-2)) - .map((s) => `%${s}`) - .join(''); - }) - .join(''); - } - function stylize(s) { - const { value: o } = s; - return Array.isArray(o) - ? (function encodeArray({ key: s, value: o, style: i, explode: u, escape: _ }) { - if ('simple' === i) return o.map((s) => valueEncoder(s, _)).join(','); - if ('label' === i) return `.${o.map((s) => valueEncoder(s, _)).join('.')}`; - if ('matrix' === i) - return o - .map((s) => valueEncoder(s, _)) - .reduce((o, i) => (!o || u ? `${o || ''};${s}=${i}` : `${o},${i}`), ''); - if ('form' === i) { - const i = u ? `&${s}=` : ','; - return o.map((s) => valueEncoder(s, _)).join(i); - } - if ('spaceDelimited' === i) { - const i = u ? `${s}=` : ''; - return o.map((s) => valueEncoder(s, _)).join(` ${i}`); - } - if ('pipeDelimited' === i) { - const i = u ? `${s}=` : ''; - return o.map((s) => valueEncoder(s, _)).join(`|${i}`); - } - return; - })(s) - : 'object' == typeof o - ? (function encodeObject({ key: s, value: o, style: i, explode: u, escape: _ }) { - const w = Object.keys(o); - if ('simple' === i) - return w.reduce((s, i) => { - const w = valueEncoder(o[i], _); - return `${s ? `${s},` : ''}${i}${u ? '=' : ','}${w}`; - }, ''); - if ('label' === i) - return w.reduce((s, i) => { - const w = valueEncoder(o[i], _); - return `${s ? `${s}.` : '.'}${i}${u ? '=' : '.'}${w}`; - }, ''); - if ('matrix' === i && u) - return w.reduce( - (s, i) => `${s ? `${s};` : ';'}${i}=${valueEncoder(o[i], _)}`, - '' - ); - if ('matrix' === i) - return w.reduce((i, u) => { - const w = valueEncoder(o[u], _); - return `${i ? `${i},` : `;${s}=`}${u},${w}`; - }, ''); - if ('form' === i) - return w.reduce((s, i) => { - const w = valueEncoder(o[i], _); - return `${s ? `${s}${u ? '&' : ','}` : ''}${i}${u ? '=' : ','}${w}`; - }, ''); - return; - })(s) - : (function encodePrimitive({ key: s, value: o, style: i, escape: u }) { - if ('simple' === i) return valueEncoder(o, u); - if ('label' === i) return `.${valueEncoder(o, u)}`; - if ('matrix' === i) return `;${s}=${valueEncoder(o, u)}`; - if ('form' === i) return valueEncoder(o, u); - if ('deepObject' === i) return valueEncoder(o, u); - return; - })(s); - } - function valueEncoder(s, o = !1) { - return ( - Array.isArray(s) || (null !== s && 'object' == typeof s) - ? (s = JSON.stringify(s)) - : ('number' != typeof s && 'boolean' != typeof s) || (s = String(s)), - o && s.length > 0 ? encodeCharacters(s, o) : s - ); - } - const au = { form: ',', spaceDelimited: '%20', pipeDelimited: '|' }, - lu = { csv: ',', ssv: '%20', tsv: '%09', pipes: '|' }; - function formatKeyValue(s, o, i = !1) { - const { - collectionFormat: u, - allowEmptyValue: _, - serializationOption: w, - encoding: x - } = o, - C = 'object' != typeof o || Array.isArray(o) ? o : o.value, - j = i ? (s) => s.toString() : (s) => encodeURIComponent(s), - L = j(s); - if (void 0 === C && _) return [[L, '']]; - if (isFile(C) || isArrayOfFile(C)) return [[L, C]]; - if (w) return formatKeyValueBySerializationOption(s, C, i, w); - if (x) { - if ( - [typeof x.style, typeof x.explode, typeof x.allowReserved].some( - (s) => 'undefined' !== s - ) - ) { - const { style: o, explode: u, allowReserved: _ } = x; - return formatKeyValueBySerializationOption(s, C, i, { - style: o, - explode: u, - allowReserved: _ - }); - } - if ('string' == typeof x.contentType) { - if (x.contentType.startsWith('application/json')) { - const s = j('string' == typeof C ? C : JSON.stringify(C)); - return [[L, new FileWithData(s, 'blob', { type: x.contentType })]]; - } - const s = j(String(C)); - return [[L, new FileWithData(s, 'blob', { type: x.contentType })]]; - } - return 'object' != typeof C - ? [[L, j(C)]] - : Array.isArray(C) && C.every((s) => 'object' != typeof s) - ? [[L, C.map(j).join(',')]] - : [[L, j(JSON.stringify(C))]]; - } - return 'object' != typeof C - ? [[L, j(C)]] - : Array.isArray(C) - ? 'multi' === u - ? [[L, C.map(j)]] - : [[L, C.map(j).join(lu[u || 'csv'])]] - : [[L, '']]; - } - function formatKeyValueBySerializationOption(s, o, i, u) { - const _ = u.style || 'form', - w = void 0 === u.explode ? 'form' === _ : u.explode, - x = !i && (u && u.allowReserved ? 'unsafe' : 'reserved'), - encodeFn = (s) => valueEncoder(s, x), - C = i ? (s) => s : (s) => encodeFn(s); - return 'object' != typeof o - ? [[C(s), encodeFn(o)]] - : Array.isArray(o) - ? w - ? [[C(s), o.map(encodeFn)]] - : [[C(s), o.map(encodeFn).join(au[_])]] - : 'deepObject' === _ - ? Object.keys(o).map((i) => [C(`${s}[${i}]`), encodeFn(o[i])]) - : w - ? Object.keys(o).map((s) => [C(s), encodeFn(o[s])]) - : [ - [ - C(s), - Object.keys(o) - .map((s) => [`${C(s)},${encodeFn(o[s])}`]) - .join(',') - ] - ]; - } - function encodeFormOrQuery(s) { - return ((s, { encode: o = !0 } = {}) => { - const buildNestedParams = (s, o, i) => ( - null == i - ? s.append(o, '') - : Array.isArray(i) - ? i.reduce((i, u) => buildNestedParams(s, o, u), s) - : i instanceof Date - ? s.append(o, i.toISOString()) - : 'object' == typeof i - ? Object.entries(i).reduce( - (i, [u, _]) => buildNestedParams(s, `${o}[${u}]`, _), - s - ) - : s.append(o, i), - s - ), - i = Object.entries(s).reduce( - (s, [o, i]) => buildNestedParams(s, o, i), - new URLSearchParams() - ), - u = String(i); - return o ? u : decodeURIComponent(u); - })( - Object.keys(s).reduce((o, i) => { - for (const [u, _] of formatKeyValue(i, s[i])) - o[u] = _ instanceof FileWithData ? _.valueOf() : _; - return o; - }, {}), - { encode: !1 } - ); - } - function serializeRequest(s = {}) { - const { url: o = '', query: i, form: u } = s; - if (u) { - const o = Object.keys(u).some((s) => { - const { value: o } = u[s]; - return isFile(o) || isArrayOfFile(o); - }), - i = s.headers['content-type'] || s.headers['Content-Type']; - if (o || /multipart\/form-data/i.test(i)) { - const o = (function request_buildFormData(s) { - return Object.entries(s).reduce((s, [o, i]) => { - for (const [u, _] of formatKeyValue(o, i, !0)) - if (Array.isArray(_)) - for (const o of _) - if (ArrayBuffer.isView(o)) { - const i = new Blob([o]); - s.append(u, i); - } else s.append(u, o); - else if (ArrayBuffer.isView(_)) { - const o = new Blob([_]); - s.append(u, o); - } else s.append(u, _); - return s; - }, new FormData()); - })(s.form); - ((s.formdata = o), (s.body = o)); - } else s.body = encodeFormOrQuery(u); - delete s.form; - } - if (i) { - const [u, _] = o.split('?'); - let w = ''; - if (_) { - const s = new URLSearchParams(_); - (Object.keys(i).forEach((o) => s.delete(o)), (w = String(s))); - } - const x = ((...s) => { - const o = s.filter((s) => s).join('&'); - return o ? `?${o}` : ''; - })(w, encodeFormOrQuery(i)); - ((s.url = u + x), delete s.query); - } - return s; - } - function serializeHeaders(s = {}) { - return 'function' != typeof s.entries - ? {} - : Array.from(s.entries()).reduce( - (s, [o, i]) => ( - (s[o] = (function serializeHeaderValue(s) { - return s.includes(', ') ? s.split(', ') : s; - })(i)), - s - ), - {} - ); - } - function serializeResponse(s, o, { loadSpec: i = !1 } = {}) { - const u = { - ok: s.ok, - url: s.url || o, - status: s.status, - statusText: s.statusText, - headers: serializeHeaders(s.headers) - }, - _ = u.headers['content-type'], - w = i || ((s = '') => /(json|xml|yaml|text)\b/.test(s))(_); - return (w ? s.text : s.blob || s.buffer).call(s).then((s) => { - if (((u.text = s), (u.data = s), w)) - try { - const o = (function parseBody(s, o) { - return o && (0 === o.indexOf('application/json') || o.indexOf('+json') > 0) - ? JSON.parse(s) - : mn.load(s); - })(s, _); - ((u.body = o), (u.obj = o)); - } catch (s) { - u.parseError = s; - } - return u; - }); - } - async function http_http(s, o = {}) { - ('object' == typeof s && (s = (o = s).url), - (o.headers = o.headers || {}), - (o = serializeRequest(o)).headers && - Object.keys(o.headers).forEach((s) => { - const i = o.headers[s]; - 'string' == typeof i && (o.headers[s] = i.replace(/\n+/g, ' ')); - }), - o.requestInterceptor && (o = (await o.requestInterceptor(o)) || o)); - const i = o.headers['content-type'] || o.headers['Content-Type']; - let u; - /multipart\/form-data/i.test(i) && - (delete o.headers['content-type'], delete o.headers['Content-Type']); - try { - ((u = await (o.userFetch || fetch)(o.url, o)), - (u = await serializeResponse(u, s, o)), - o.responseInterceptor && (u = (await o.responseInterceptor(u)) || u)); - } catch (s) { - if (!u) throw s; - const o = new Error(u.statusText || `response status is ${u.status}`); - throw ((o.status = u.status), (o.statusCode = u.status), (o.responseError = s), o); - } - if (!u.ok) { - const s = new Error(u.statusText || `response status is ${u.status}`); - throw ((s.status = u.status), (s.statusCode = u.status), (s.response = u), s); - } - return u; - } - const options_retrievalURI = (s) => { - var o, i; - const { baseDoc: u, url: _ } = s, - w = null !== (o = null != u ? u : _) && void 0 !== o ? o : ''; - return 'string' == - typeof (null === (i = globalThis.document) || void 0 === i ? void 0 : i.baseURI) - ? String(new URL(w, globalThis.document.baseURI)) - : w; - }, - options_httpClient = (s) => { - const { fetch: o, http: i } = s; - return o || i || http_http; - }; - async function resolveGenericStrategy(s) { - const { - spec: o, - mode: i, - allowMetaPatches: u = !0, - pathDiscriminator: _, - modelPropertyMacro: w, - parameterMacro: x, - requestInterceptor: C, - responseInterceptor: j, - skipNormalization: L = !1, - useCircularStructures: B, - strategies: $ - } = s, - V = options_retrievalURI(s), - U = options_httpClient(s), - z = $.find((s) => s.match(o)); - return (async function doResolve(s) { - V && (iu.refs.docCache[V] = s); - iu.refs.fetchJSON = makeFetchJSON(U, { requestInterceptor: C, responseInterceptor: j }); - const o = [iu.refs]; - 'function' == typeof x && o.push(iu.parameters); - 'function' == typeof w && o.push(iu.properties); - 'strict' !== i && o.push(iu.allOf); - const $ = await (function mapSpec(s) { - return new SpecMap(s).dispatch(); - })({ - spec: s, - context: { baseDoc: V }, - plugins: o, - allowMetaPatches: u, - pathDiscriminator: _, - parameterMacro: x, - modelPropertyMacro: w, - useCircularStructures: B - }); - L || ($.spec = z.normalize($.spec)); - return $; - })(o); - } - const replace_special_chars_with_underscore = (s) => s.replace(/\W/gi, '_'); - function opId(s, o, i = '', { v2OperationIdCompatibilityMode: u } = {}) { - if (!s || 'object' != typeof s) return null; - return (s.operationId || '').replace(/\s/g, '').length - ? replace_special_chars_with_underscore(s.operationId) - : (function idFromPathMethod(s, o, { v2OperationIdCompatibilityMode: i } = {}) { - if (i) { - let i = `${o.toLowerCase()}_${s}`.replace( - /[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g, - '_' - ); - return ( - (i = i || `${s.substring(1)}_${o}`), - i - .replace(/((_){2,})/g, '_') - .replace(/^(_)*/g, '') - .replace(/([_])*$/g, '') - ); - } - return `${o.toLowerCase()}${replace_special_chars_with_underscore(s)}`; - })(o, i, { v2OperationIdCompatibilityMode: u }); - } - function normalize(s) { - const { spec: o } = s, - { paths: i } = o, - u = {}; - if (!i || o.$$normalized) return s; - for (const s in i) { - const _ = i[s]; - if (null == _ || !['object', 'function'].includes(typeof _)) continue; - const w = _.parameters; - for (const i in _) { - const x = _[i]; - if (null == x || !['object', 'function'].includes(typeof x)) continue; - const C = opId(x, s, i); - if (C) { - u[C] ? u[C].push(x) : (u[C] = [x]); - const s = u[C]; - if (s.length > 1) - s.forEach((s, o) => { - ((s.__originalOperationId = s.__originalOperationId || s.operationId), - (s.operationId = `${C}${o + 1}`)); - }); - else if (void 0 !== x.operationId) { - const o = s[0]; - ((o.__originalOperationId = o.__originalOperationId || x.operationId), - (o.operationId = C)); - } - } - if ('parameters' !== i) { - const s = [], - i = {}; - for (const u in o) - ('produces' !== u && 'consumes' !== u && 'security' !== u) || - ((i[u] = o[u]), s.push(i)); - if ((w && ((i.parameters = w), s.push(i)), s.length)) - for (const o of s) - for (const s in o) - if (x[s]) { - if ('parameters' === s) - for (const i of o[s]) { - x[s].some( - (s) => - (s.name && s.name === i.name) || - (s.$ref && s.$ref === i.$ref) || - (s.$$ref && s.$$ref === i.$$ref) || - s === i - ) || x[s].push(i); - } - } else x[s] = o[s]; - } - } - } - return ((o.$$normalized = !0), s); - } - const cu = { - name: 'generic', - match: () => !0, - normalize(s) { - const { spec: o } = normalize({ spec: s }); - return o; - }, - resolve: async (s) => resolveGenericStrategy(s) - }, - uu = cu; - const isOpenAPI30 = (s) => { - try { - const { openapi: o } = s; - return 'string' == typeof o && /^3\.0\.([0123])(?:-rc[012])?$/.test(o); - } catch { - return !1; - } - }, - isOpenAPI31 = (s) => { - try { - const { openapi: o } = s; - return 'string' == typeof o && /^3\.1\.(?:[1-9]\d*|0)$/.test(o); - } catch { - return !1; - } - }, - isOpenAPI3 = (s) => isOpenAPI30(s) || isOpenAPI31(s), - pu = { - name: 'openapi-2', - match: (s) => - ((s) => { - try { - const { swagger: o } = s; - return '2.0' === o; - } catch { - return !1; - } - })(s), - normalize(s) { - const { spec: o } = normalize({ spec: s }); - return o; - }, - resolve: async (s) => - (async function resolveOpenAPI2Strategy(s) { - return resolveGenericStrategy(s); - })(s) - }, - hu = pu; - const du = { - name: 'openapi-3-0', - match: (s) => isOpenAPI30(s), - normalize(s) { - const { spec: o } = normalize({ spec: s }); - return o; - }, - resolve: async (s) => - (async function resolveOpenAPI30Strategy(s) { - return resolveGenericStrategy(s); - })(s) - }, - fu = du; - const mu = _curry2(function and(s, o) { - return s && o; - }); - const gu = _curry2(function both(s, o) { - return _isFunction(s) - ? function _both() { - return s.apply(this, arguments) && o.apply(this, arguments); - } - : Pl(mu)(s, o); - }); - const yu = ra(null); - const vu = Ml(yu); - function isOfTypeObject_typeof(s) { - return ( - (isOfTypeObject_typeof = - 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator - ? function (s) { - return typeof s; - } - : function (s) { - return s && - 'function' == typeof Symbol && - s.constructor === Symbol && - s !== Symbol.prototype - ? 'symbol' - : typeof s; - }), - isOfTypeObject_typeof(s) - ); - } - const bu = function isOfTypeObject(s) { - return 'object' === isOfTypeObject_typeof(s); - }; - const _u = za(1, gu(vu, bu)); - var Eu = pipe(ea, Vl('Object')), - wu = pipe(ma, ra(ma(Object))), - Su = Xo(gu(Wl, wu), ['constructor']), - xu = za(1, function (s) { - if (!_u(s) || !Eu(s)) return !1; - var o = Object.getPrototypeOf(s); - return !!yu(o) || Su(o); - }); - const ku = xu; - var Cu = __webpack_require__(34035); - function _reduced(s) { - return s && s['@@transducer/reduced'] - ? s - : { '@@transducer/value': s, '@@transducer/reduced': !0 }; - } - var Ou = (function () { - function XAll(s, o) { - ((this.xf = o), (this.f = s), (this.all = !0)); - } - return ( - (XAll.prototype['@@transducer/init'] = _xfBase_init), - (XAll.prototype['@@transducer/result'] = function (s) { - return ( - this.all && (s = this.xf['@@transducer/step'](s, !0)), - this.xf['@@transducer/result'](s) - ); - }), - (XAll.prototype['@@transducer/step'] = function (s, o) { - return ( - this.f(o) || ((this.all = !1), (s = _reduced(this.xf['@@transducer/step'](s, !1)))), - s - ); - }), - XAll - ); - })(); - function _xall(s) { - return function (o) { - return new Ou(s, o); - }; - } - var Au = _curry2( - _dispatchable(['all'], _xall, function all(s, o) { - for (var i = 0; i < o.length; ) { - if (!s(o[i])) return !1; - i += 1; - } - return !0; - }) - ); - const ju = Au; - class Annotation extends Cu.Om { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'annotation')); - } - get code() { - return this.attributes.get('code'); - } - set code(s) { - this.attributes.set('code', s); - } - } - const Iu = Annotation; - class Comment extends Cu.Om { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'comment')); - } - } - const Pu = Comment; - class ParseResult extends Cu.wE { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'parseResult')); - } - get api() { - return this.children.filter((s) => s.classes.contains('api')).first; - } - get results() { - return this.children.filter((s) => s.classes.contains('result')); - } - get result() { - return this.results.first; - } - get annotations() { - return this.children.filter((s) => 'annotation' === s.element); - } - get warnings() { - return this.children.filter( - (s) => 'annotation' === s.element && s.classes.contains('warning') - ); - } - get errors() { - return this.children.filter( - (s) => 'annotation' === s.element && s.classes.contains('error') - ); - } - get isEmpty() { - return this.children.reject((s) => 'annotation' === s.element).isEmpty; - } - replaceResult(s) { - const { result: o } = this; - if (Rl(o)) return !1; - const i = this.content.findIndex((s) => s === o); - return -1 !== i && ((this.content[i] = s), !0); - } - } - const Mu = ParseResult; - class SourceMap extends Cu.wE { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'sourceMap')); - } - get positionStart() { - return this.children.filter((s) => s.classes.contains('position')).get(0); - } - get positionEnd() { - return this.children.filter((s) => s.classes.contains('position')).get(1); - } - set position(s) { - if (void 0 === s) return; - const o = new Cu.wE([s.start.row, s.start.column, s.start.char]), - i = new Cu.wE([s.end.row, s.end.column, s.end.char]); - (o.classes.push('position'), i.classes.push('position'), this.push(o).push(i)); - } - } - const Tu = SourceMap, - hasMethod = (s, o) => - 'object' == typeof o && null !== o && s in o && 'function' == typeof o[s], - hasBasicElementProps = (s) => - 'object' == typeof s && - null != s && - '_storedElement' in s && - 'string' == typeof s._storedElement && - '_content' in s, - primitiveEq = (s, o) => - 'object' == typeof o && - null !== o && - 'primitive' in o && - 'function' == typeof o.primitive && - o.primitive() === s, - hasClass = (s, o) => - 'object' == typeof o && - null !== o && - 'classes' in o && - (Array.isArray(o.classes) || o.classes instanceof Cu.wE) && - o.classes.includes(s), - isElementType = (s, o) => - 'object' == typeof o && null !== o && 'element' in o && o.element === s, - helpers = (s) => - s({ hasMethod, hasBasicElementProps, primitiveEq, isElementType, hasClass }), - Nu = helpers( - ({ hasBasicElementProps: s, primitiveEq: o }) => - (i) => - i instanceof Cu.Hg || (s(i) && o(void 0, i)) - ), - Ru = helpers( - ({ hasBasicElementProps: s, primitiveEq: o }) => - (i) => - i instanceof Cu.Om || (s(i) && o('string', i)) - ), - Du = helpers( - ({ hasBasicElementProps: s, primitiveEq: o }) => - (i) => - i instanceof Cu.kT || (s(i) && o('number', i)) - ), - Lu = helpers( - ({ hasBasicElementProps: s, primitiveEq: o }) => - (i) => - i instanceof Cu.Os || (s(i) && o('null', i)) - ), - Bu = helpers( - ({ hasBasicElementProps: s, primitiveEq: o }) => - (i) => - i instanceof Cu.bd || (s(i) && o('boolean', i)) - ), - Fu = helpers( - ({ hasBasicElementProps: s, primitiveEq: o, hasMethod: i }) => - (u) => - u instanceof Cu.Sh || - (s(u) && o('object', u) && i('keys', u) && i('values', u) && i('items', u)) - ), - qu = helpers( - ({ hasBasicElementProps: s, primitiveEq: o, hasMethod: i }) => - (u) => - (u instanceof Cu.wE && !(u instanceof Cu.Sh)) || - (s(u) && - o('array', u) && - i('push', u) && - i('unshift', u) && - i('map', u) && - i('reduce', u)) - ), - $u = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Cu.Pr || (s(u) && o('member', u) && i(void 0, u)) - ), - Vu = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Cu.Ft || (s(u) && o('link', u) && i(void 0, u)) - ), - Uu = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Cu.sI || (s(u) && o('ref', u) && i(void 0, u)) - ), - zu = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Iu || (s(u) && o('annotation', u) && i('array', u)) - ), - Wu = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Pu || (s(u) && o('comment', u) && i('string', u)) - ), - Ku = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Mu || (s(u) && o('parseResult', u) && i('array', u)) - ), - Hu = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Tu || (s(u) && o('sourceMap', u) && i('array', u)) - ), - isPrimitiveElement = (s) => - isElementType('object', s) || - isElementType('array', s) || - isElementType('boolean', s) || - isElementType('number', s) || - isElementType('string', s) || - isElementType('null', s) || - isElementType('member', s), - hasElementSourceMap = (s) => Hu(s.meta.get('sourceMap')), - includesSymbols = (s, o) => { - if (0 === s.length) return !0; - const i = o.attributes.get('symbols'); - return !!qu(i) && ju(_l(i.toValue()), s); - }, - includesClasses = (s, o) => 0 === s.length || ju(_l(o.classes.toValue()), s); - const es_T = function () { - return !0; - }; - const es_F = function () { - return !1; - }, - getVisitFn = (s, o, i) => { - const u = s[o]; - if (null != u) { - if (!i && 'function' == typeof u) return u; - const s = i ? u.leave : u.enter; - if ('function' == typeof s) return s; - } else { - const u = i ? s.leave : s.enter; - if (null != u) { - if ('function' == typeof u) return u; - const s = u[o]; - if ('function' == typeof s) return s; - } - } - return null; - }, - Ju = {}, - getNodeType = (s) => (null == s ? void 0 : s.type), - isNode = (s) => 'string' == typeof getNodeType(s), - cloneNode = (s) => - Object.create(Object.getPrototypeOf(s), Object.getOwnPropertyDescriptors(s)), - mergeAll = ( - s, - { - visitFnGetter: o = getVisitFn, - nodeTypeGetter: i = getNodeType, - breakSymbol: u = Ju, - deleteNodeSymbol: _ = null, - skipVisitingNodeSymbol: w = !1, - exposeEdits: x = !1 - } = {} - ) => { - const C = Symbol('skip'), - j = new Array(s.length).fill(C); - return { - enter(L, B, $, V, U, z) { - let Y = L, - Z = !1; - const ee = { - ...z, - replaceWith(s, o) { - (z.replaceWith(s, o), (Y = s)); - } - }; - for (let L = 0; L < s.length; L += 1) - if (j[L] === C) { - const C = o(s[L], i(Y), !1); - if ('function' == typeof C) { - const o = C.call(s[L], Y, B, $, V, U, ee); - if ('function' == typeof (null == o ? void 0 : o.then)) - throw new Jo('Async visitor not supported in sync mode', { - visitor: s[L], - visitFn: C - }); - if (o === w) j[L] = Y; - else if (o === u) j[L] = u; - else { - if (o === _) return o; - if (void 0 !== o) { - if (!x) return o; - ((Y = o), (Z = !0)); - } - } - } - } - return Z ? Y : void 0; - }, - leave(_, x, L, B, $, V) { - let U = _; - const z = { - ...V, - replaceWith(s, o) { - (V.replaceWith(s, o), (U = s)); - } - }; - for (let _ = 0; _ < s.length; _ += 1) - if (j[_] === C) { - const C = o(s[_], i(U), !0); - if ('function' == typeof C) { - const o = C.call(s[_], U, x, L, B, $, z); - if ('function' == typeof (null == o ? void 0 : o.then)) - throw new Jo('Async visitor not supported in sync mode', { - visitor: s[_], - visitFn: C - }); - if (o === u) j[_] = u; - else if (void 0 !== o && o !== w) return o; - } - } else j[_] === U && (j[_] = C); - } - }; - }; - mergeAll[Symbol.for('nodejs.util.promisify.custom')] = ( - s, - { - visitFnGetter: o = getVisitFn, - nodeTypeGetter: i = getNodeType, - breakSymbol: u = Ju, - deleteNodeSymbol: _ = null, - skipVisitingNodeSymbol: w = !1, - exposeEdits: x = !1 - } = {} - ) => { - const C = Symbol('skip'), - j = new Array(s.length).fill(C); - return { - async enter(L, B, $, V, U, z) { - let Y = L, - Z = !1; - const ee = { - ...z, - replaceWith(s, o) { - (z.replaceWith(s, o), (Y = s)); - } - }; - for (let L = 0; L < s.length; L += 1) - if (j[L] === C) { - const C = o(s[L], i(Y), !1); - if ('function' == typeof C) { - const o = await C.call(s[L], Y, B, $, V, U, ee); - if (o === w) j[L] = Y; - else if (o === u) j[L] = u; - else { - if (o === _) return o; - if (void 0 !== o) { - if (!x) return o; - ((Y = o), (Z = !0)); - } - } - } - } - return Z ? Y : void 0; - }, - async leave(_, x, L, B, $, V) { - let U = _; - const z = { - ...V, - replaceWith(s, o) { - (V.replaceWith(s, o), (U = s)); - } - }; - for (let _ = 0; _ < s.length; _ += 1) - if (j[_] === C) { - const C = o(s[_], i(U), !0); - if ('function' == typeof C) { - const o = await C.call(s[_], U, x, L, B, $, z); - if (o === u) j[_] = u; - else if (void 0 !== o && o !== w) return o; - } - } else j[_] === U && (j[_] = C); - } - }; - }; - const visit = ( - s, - o, - { - keyMap: i = null, - state: u = {}, - breakSymbol: _ = Ju, - deleteNodeSymbol: w = null, - skipVisitingNodeSymbol: x = !1, - visitFnGetter: C = getVisitFn, - nodeTypeGetter: j = getNodeType, - nodePredicate: L = isNode, - nodeCloneFn: B = cloneNode, - detectCycles: $ = !0 - } = {} - ) => { - const V = i || {}; - let U, - z, - Y = Array.isArray(s), - Z = [s], - ee = -1, - ie = [], - ae = s; - const le = [], - ce = []; - do { - ee += 1; - const s = ee === Z.length; - let i; - const fe = s && 0 !== ie.length; - if (s) { - if (((i = 0 === ce.length ? void 0 : le.pop()), (ae = z), (z = ce.pop()), fe)) - if (Y) { - ae = ae.slice(); - let s = 0; - for (const [o, i] of ie) { - const u = o - s; - i === w ? (ae.splice(u, 1), (s += 1)) : (ae[u] = i); - } - } else { - ae = B(ae); - for (const [s, o] of ie) ae[s] = o; - } - ((ee = U.index), (Z = U.keys), (ie = U.edits), (Y = U.inArray), (U = U.prev)); - } else if (z !== w && void 0 !== z) { - if (((i = Y ? ee : Z[ee]), (ae = z[i]), ae === w || void 0 === ae)) continue; - le.push(i); - } - let ye; - if (!Array.isArray(ae)) { - var pe; - if (!L(ae)) throw new Jo(`Invalid AST Node: ${String(ae)}`, { node: ae }); - if ($ && ce.includes(ae)) { - le.pop(); - continue; - } - const w = C(o, j(ae), s); - if (w) { - for (const [s, i] of Object.entries(u)) o[s] = i; - const _ = { - replaceWith(o, u) { - ('function' == typeof u ? u(o, ae, i, z, le, ce) : z && (z[i] = o), - s || (ae = o)); - } - }; - ye = w.call(o, ae, i, z, le, ce, _); - } - if ('function' == typeof (null === (pe = ye) || void 0 === pe ? void 0 : pe.then)) - throw new Jo('Async visitor not supported in sync mode', { - visitor: o, - visitFn: w - }); - if (ye === _) break; - if (ye === x) { - if (!s) { - le.pop(); - continue; - } - } else if (void 0 !== ye && (ie.push([i, ye]), !s)) { - if (!L(ye)) { - le.pop(); - continue; - } - ae = ye; - } - } - var de; - if ((void 0 === ye && fe && ie.push([i, ae]), !s)) - ((U = { inArray: Y, index: ee, keys: Z, edits: ie, prev: U }), - (Y = Array.isArray(ae)), - (Z = Y ? ae : null !== (de = V[j(ae)]) && void 0 !== de ? de : []), - (ee = -1), - (ie = []), - z !== w && void 0 !== z && ce.push(z), - (z = ae)); - } while (void 0 !== U); - return 0 !== ie.length ? ie[ie.length - 1][1] : s; - }; - visit[Symbol.for('nodejs.util.promisify.custom')] = async ( - s, - o, - { - keyMap: i = null, - state: u = {}, - breakSymbol: _ = Ju, - deleteNodeSymbol: w = null, - skipVisitingNodeSymbol: x = !1, - visitFnGetter: C = getVisitFn, - nodeTypeGetter: j = getNodeType, - nodePredicate: L = isNode, - nodeCloneFn: B = cloneNode, - detectCycles: $ = !0 - } = {} - ) => { - const V = i || {}; - let U, - z, - Y = Array.isArray(s), - Z = [s], - ee = -1, - ie = [], - ae = s; - const le = [], - ce = []; - do { - ee += 1; - const s = ee === Z.length; - let i; - const de = s && 0 !== ie.length; - if (s) { - if (((i = 0 === ce.length ? void 0 : le.pop()), (ae = z), (z = ce.pop()), de)) - if (Y) { - ae = ae.slice(); - let s = 0; - for (const [o, i] of ie) { - const u = o - s; - i === w ? (ae.splice(u, 1), (s += 1)) : (ae[u] = i); - } - } else { - ae = B(ae); - for (const [s, o] of ie) ae[s] = o; - } - ((ee = U.index), (Z = U.keys), (ie = U.edits), (Y = U.inArray), (U = U.prev)); - } else if (z !== w && void 0 !== z) { - if (((i = Y ? ee : Z[ee]), (ae = z[i]), ae === w || void 0 === ae)) continue; - le.push(i); - } - let fe; - if (!Array.isArray(ae)) { - if (!L(ae)) throw new Jo(`Invalid AST Node: ${String(ae)}`, { node: ae }); - if ($ && ce.includes(ae)) { - le.pop(); - continue; - } - const w = C(o, j(ae), s); - if (w) { - for (const [s, i] of Object.entries(u)) o[s] = i; - const _ = { - replaceWith(o, u) { - ('function' == typeof u ? u(o, ae, i, z, le, ce) : z && (z[i] = o), - s || (ae = o)); - } - }; - fe = await w.call(o, ae, i, z, le, ce, _); - } - if (fe === _) break; - if (fe === x) { - if (!s) { - le.pop(); - continue; - } - } else if (void 0 !== fe && (ie.push([i, fe]), !s)) { - if (!L(fe)) { - le.pop(); - continue; - } - ae = fe; - } - } - var pe; - if ((void 0 === fe && de && ie.push([i, ae]), !s)) - ((U = { inArray: Y, index: ee, keys: Z, edits: ie, prev: U }), - (Y = Array.isArray(ae)), - (Z = Y ? ae : null !== (pe = V[j(ae)]) && void 0 !== pe ? pe : []), - (ee = -1), - (ie = []), - z !== w && void 0 !== z && ce.push(z), - (z = ae)); - } while (void 0 !== U); - return 0 !== ie.length ? ie[ie.length - 1][1] : s; - }; - const Gu = class CloneError extends Jo { - value; - constructor(s, o) { - (super(s, o), void 0 !== o && (this.value = o.value)); - } - }; - const Yu = class DeepCloneError extends Gu {}; - const Xu = class ShallowCloneError extends Gu {}, - cloneDeep = (s, o = {}) => { - const { visited: i = new WeakMap() } = o, - u = { ...o, visited: i }; - if (i.has(s)) return i.get(s); - if (s instanceof Cu.KeyValuePair) { - const { key: o, value: _ } = s, - w = Nu(o) ? cloneDeep(o, u) : o, - x = Nu(_) ? cloneDeep(_, u) : _, - C = new Cu.KeyValuePair(w, x); - return (i.set(s, C), C); - } - if (s instanceof Cu.ot) { - const mapper = (s) => cloneDeep(s, u), - o = [...s].map(mapper), - _ = new Cu.ot(o); - return (i.set(s, _), _); - } - if (s instanceof Cu.G6) { - const mapper = (s) => cloneDeep(s, u), - o = [...s].map(mapper), - _ = new Cu.G6(o); - return (i.set(s, _), _); - } - if (Nu(s)) { - const o = cloneShallow(s); - if ((i.set(s, o), s.content)) - if (Nu(s.content)) o.content = cloneDeep(s.content, u); - else if (s.content instanceof Cu.KeyValuePair) o.content = cloneDeep(s.content, u); - else if (Array.isArray(s.content)) { - const mapper = (s) => cloneDeep(s, u); - o.content = s.content.map(mapper); - } else o.content = s.content; - else o.content = s.content; - return o; - } - throw new Yu("Value provided to cloneDeep function couldn't be cloned", { value: s }); - }; - cloneDeep.safe = (s) => { - try { - return cloneDeep(s); - } catch { - return s; - } - }; - const cloneShallowKeyValuePair = (s) => { - const { key: o, value: i } = s; - return new Cu.KeyValuePair(o, i); - }, - cloneShallowElement = (s) => { - const o = new s.constructor(); - if ( - ((o.element = s.element), - s.meta.length > 0 && (o._meta = cloneDeep(s.meta)), - s.attributes.length > 0 && (o._attributes = cloneDeep(s.attributes)), - Nu(s.content)) - ) { - const i = s.content; - o.content = cloneShallowElement(i); - } else - Array.isArray(s.content) - ? (o.content = [...s.content]) - : s.content instanceof Cu.KeyValuePair - ? (o.content = cloneShallowKeyValuePair(s.content)) - : (o.content = s.content); - return o; - }, - cloneShallow = (s) => { - if (s instanceof Cu.KeyValuePair) return cloneShallowKeyValuePair(s); - if (s instanceof Cu.ot) - return ((s) => { - const o = [...s]; - return new Cu.ot(o); - })(s); - if (s instanceof Cu.G6) - return ((s) => { - const o = [...s]; - return new Cu.G6(o); - })(s); - if (Nu(s)) return cloneShallowElement(s); - throw new Xu("Value provided to cloneShallow function couldn't be cloned", { - value: s - }); - }; - cloneShallow.safe = (s) => { - try { - return cloneShallow(s); - } catch { - return s; - } - }; - const visitor_getNodeType = (s) => - Fu(s) - ? 'ObjectElement' - : qu(s) - ? 'ArrayElement' - : $u(s) - ? 'MemberElement' - : Ru(s) - ? 'StringElement' - : Bu(s) - ? 'BooleanElement' - : Du(s) - ? 'NumberElement' - : Lu(s) - ? 'NullElement' - : Vu(s) - ? 'LinkElement' - : Uu(s) - ? 'RefElement' - : void 0, - visitor_cloneNode = (s) => (Nu(s) ? cloneShallow(s) : cloneNode(s)), - Zu = pipe(visitor_getNodeType, Yl), - Qu = { - ObjectElement: ['content'], - ArrayElement: ['content'], - MemberElement: ['key', 'value'], - StringElement: [], - BooleanElement: [], - NumberElement: [], - NullElement: [], - RefElement: [], - LinkElement: [], - Annotation: [], - Comment: [], - ParseResultElement: ['content'], - SourceMap: ['content'] - }; - class PredicateVisitor { - result; - predicate; - returnOnTrue; - returnOnFalse; - constructor({ predicate: s = es_F, returnOnTrue: o, returnOnFalse: i } = {}) { - ((this.result = []), - (this.predicate = s), - (this.returnOnTrue = o), - (this.returnOnFalse = i)); - } - enter(s) { - return this.predicate(s) - ? (this.result.push(s), this.returnOnTrue) - : this.returnOnFalse; - } - } - const visitor_visit = (s, o, { keyMap: i = Qu, ...u } = {}) => - visit(s, o, { - keyMap: i, - nodeTypeGetter: visitor_getNodeType, - nodePredicate: Zu, - nodeCloneFn: visitor_cloneNode, - ...u - }); - visitor_visit[Symbol.for('nodejs.util.promisify.custom')] = async ( - s, - o, - { keyMap: i = Qu, ...u } = {} - ) => - visit[Symbol.for('nodejs.util.promisify.custom')](s, o, { - keyMap: i, - nodeTypeGetter: visitor_getNodeType, - nodePredicate: Zu, - nodeCloneFn: visitor_cloneNode, - ...u - }); - const nodeTypeGetter = (s) => - 'string' == typeof (null == s ? void 0 : s.type) ? s.type : visitor_getNodeType(s), - ep = { EphemeralObject: ['content'], EphemeralArray: ['content'], ...Qu }, - value_visitor_visit = (s, o, { keyMap: i = ep, ...u } = {}) => - visitor_visit(s, o, { - keyMap: i, - nodeTypeGetter, - nodePredicate: es_T, - detectCycles: !1, - deleteNodeSymbol: Symbol.for('delete-node'), - skipVisitingNodeSymbol: Symbol.for('skip-visiting-node'), - ...u - }); - value_visitor_visit[Symbol.for('nodejs.util.promisify.custom')] = async ( - s, - { keyMap: o = ep, ...i } = {} - ) => - visitor_visit[Symbol.for('nodejs.util.promisify.custom')](s, visitor, { - keyMap: o, - nodeTypeGetter, - nodePredicate: es_T, - detectCycles: !1, - deleteNodeSymbol: Symbol.for('delete-node'), - skipVisitingNodeSymbol: Symbol.for('skip-visiting-node'), - ...i - }); - const tp = class EphemeralArray { - type = 'EphemeralArray'; - content = []; - reference = void 0; - constructor(s) { - ((this.content = s), (this.reference = [])); - } - toReference() { - return this.reference; - } - toArray() { - return (this.reference.push(...this.content), this.reference); - } - }; - const rp = class EphemeralObject { - type = 'EphemeralObject'; - content = []; - reference = void 0; - constructor(s) { - ((this.content = s), (this.reference = {})); - } - toReference() { - return this.reference; - } - toObject() { - return Object.assign(this.reference, Object.fromEntries(this.content)); - } - }; - class Visitor { - ObjectElement = { - enter: (s) => { - if (this.references.has(s)) return this.references.get(s).toReference(); - const o = new rp(s.content); - return (this.references.set(s, o), o); - } - }; - EphemeralObject = { leave: (s) => s.toObject() }; - MemberElement = { enter: (s) => [s.key, s.value] }; - ArrayElement = { - enter: (s) => { - if (this.references.has(s)) return this.references.get(s).toReference(); - const o = new tp(s.content); - return (this.references.set(s, o), o); - } - }; - EphemeralArray = { leave: (s) => s.toArray() }; - references = new WeakMap(); - BooleanElement(s) { - return s.toValue(); - } - NumberElement(s) { - return s.toValue(); - } - StringElement(s) { - return s.toValue(); - } - NullElement() { - return null; - } - RefElement(s, ...o) { - var i; - const u = o[3]; - return 'EphemeralObject' === - (null === (i = u[u.length - 1]) || void 0 === i ? void 0 : i.type) - ? Symbol.for('delete-node') - : String(s.toValue()); - } - LinkElement(s) { - return Ru(s.href) ? s.href.toValue() : ''; - } - } - const serializers_value = (s) => - Nu(s) - ? Ru(s) || Du(s) || Bu(s) || Lu(s) - ? s.toValue() - : value_visitor_visit(s, new Visitor()) - : s; - var np = _curry3(function mergeWithKey(s, o, i) { - var u, - _ = {}; - for (u in ((i = i || {}), (o = o || {}))) - _has(u, o) && (_[u] = _has(u, i) ? s(u, o[u], i[u]) : o[u]); - for (u in i) _has(u, i) && !_has(u, _) && (_[u] = i[u]); - return _; - }); - const sp = np; - var op = _curry3(function mergeDeepWithKey(s, o, i) { - return sp( - function (o, i, u) { - return _isObject(i) && _isObject(u) ? mergeDeepWithKey(s, i, u) : s(o, i, u); - }, - o, - i - ); - }); - const ip = op; - const lp = _curry2(function mergeDeepRight(s, o) { - return ip( - function (s, o, i) { - return i; - }, - s, - o - ); - }); - const cp = _curry2(_path); - const up = ja(0, -1); - var pp = _curry2(function apply(s, o) { - return s.apply(this, o); - }); - const hp = pp; - const dp = Ml(Wl); - var fp = _curry1(function empty(s) { - return null != s && 'function' == typeof s['fantasy-land/empty'] - ? s['fantasy-land/empty']() - : null != s && - null != s.constructor && - 'function' == typeof s.constructor['fantasy-land/empty'] - ? s.constructor['fantasy-land/empty']() - : null != s && 'function' == typeof s.empty - ? s.empty() - : null != s && null != s.constructor && 'function' == typeof s.constructor.empty - ? s.constructor.empty() - : aa(s) - ? [] - : _isString(s) - ? '' - : _isObject(s) - ? {} - : _i(s) - ? (function () { - return arguments; - })() - : (function _isTypedArray(s) { - var o = Object.prototype.toString.call(s); - return ( - '[object Uint8ClampedArray]' === o || - '[object Int8Array]' === o || - '[object Uint8Array]' === o || - '[object Int16Array]' === o || - '[object Uint16Array]' === o || - '[object Int32Array]' === o || - '[object Uint32Array]' === o || - '[object Float32Array]' === o || - '[object Float64Array]' === o || - '[object BigInt64Array]' === o || - '[object BigUint64Array]' === o - ); - })(s) - ? s.constructor.from('') - : void 0; - }); - const mp = fp; - const gp = _curry1(function isEmpty(s) { - return null != s && ra(s, mp(s)); - }); - const yp = za(1, Wl(Array.isArray) ? Array.isArray : pipe(ea, Vl('Array'))); - const vp = gu(yp, gp); - var bp = za(3, function (s, o, i) { - var u = cp(s, i), - _ = cp(up(s), i); - if (!dp(u) && !vp(s)) { - var w = Ea(u, _); - return hp(w, o); - } - }); - const _p = bp; - class Namespace extends Cu.g$ { - constructor() { - (super(), - this.register('annotation', Iu), - this.register('comment', Pu), - this.register('parseResult', Mu), - this.register('sourceMap', Tu)); - } - } - const Ep = new Namespace(), - createNamespace = (s) => { - const o = new Namespace(); - return (ku(s) && o.use(s), o); - }, - wp = Ep, - toolbox = () => ({ predicates: { ...le }, namespace: wp }), - Sp = { - toolboxCreator: toolbox, - visitorOptions: { nodeTypeGetter: visitor_getNodeType, exposeEdits: !0 } - }, - dispatchPluginsSync = (s, o, i = {}) => { - if (0 === o.length) return s; - const u = lp(Sp, i), - { toolboxCreator: _, visitorOptions: w } = u, - x = _(), - C = o.map((s) => s(x)), - j = mergeAll(C.map(La({}, 'visitor')), { ...w }); - C.forEach(_p(['pre'], [])); - const L = visitor_visit(s, j, w); - return (C.forEach(_p(['post'], [])), L); - }; - dispatchPluginsSync[Symbol.for('nodejs.util.promisify.custom')] = async (s, o, i = {}) => { - if (0 === o.length) return s; - const u = lp(Sp, i), - { toolboxCreator: _, visitorOptions: w } = u, - x = _(), - C = o.map((s) => s(x)), - j = mergeAll[Symbol.for('nodejs.util.promisify.custom')], - L = visitor_visit[Symbol.for('nodejs.util.promisify.custom')], - B = j(C.map(La({}, 'visitor')), { ...w }); - await Promise.allSettled(C.map(_p(['pre'], []))); - const $ = await L(s, B, w); - return (await Promise.allSettled(C.map(_p(['post'], []))), $); - }; - const refract = (s, { Type: o, plugins: i = [] }) => { - const u = new o(s); - return ( - Nu(s) && - (s.meta.length > 0 && (u.meta = cloneDeep(s.meta)), - s.attributes.length > 0 && (u.attributes = cloneDeep(s.attributes))), - dispatchPluginsSync(u, i, { - toolboxCreator: toolbox, - visitorOptions: { nodeTypeGetter: visitor_getNodeType } - }) - ); - }, - createRefractor = - (s) => - (o, i = {}) => - refract(o, { ...i, Type: s }); - ((Cu.Sh.refract = createRefractor(Cu.Sh)), - (Cu.wE.refract = createRefractor(Cu.wE)), - (Cu.Om.refract = createRefractor(Cu.Om)), - (Cu.bd.refract = createRefractor(Cu.bd)), - (Cu.Os.refract = createRefractor(Cu.Os)), - (Cu.kT.refract = createRefractor(Cu.kT)), - (Cu.Ft.refract = createRefractor(Cu.Ft)), - (Cu.sI.refract = createRefractor(Cu.sI)), - (Iu.refract = createRefractor(Iu)), - (Pu.refract = createRefractor(Pu)), - (Mu.refract = createRefractor(Mu)), - (Tu.refract = createRefractor(Tu))); - const computeEdges = (s, o = new WeakMap()) => ( - $u(s) - ? (o.set(s.key, s), computeEdges(s.key, o), o.set(s.value, s), computeEdges(s.value, o)) - : s.children.forEach((i) => { - (o.set(i, s), computeEdges(i, o)); - }), - o - ); - const xp = class Transcluder_Transcluder { - element; - edges; - constructor({ element: s }) { - this.element = s; - } - transclude(s, o) { - var i; - if (s === this.element) return o; - if (s === o) return this.element; - this.edges = - null !== (i = this.edges) && void 0 !== i ? i : computeEdges(this.element); - const u = this.edges.get(s); - return Rl(u) - ? void 0 - : (Fu(u) - ? ((s, o, i) => { - const u = i.get(s); - Fu(u) && - (u.content = u.map((_, w, x) => - x === s ? (i.delete(s), i.set(o, u), o) : x - )); - })(s, o, this.edges) - : qu(u) - ? ((s, o, i) => { - const u = i.get(s); - qu(u) && - (u.content = u.map((_) => - _ === s ? (i.delete(s), i.set(o, u), o) : _ - )); - })(s, o, this.edges) - : $u(u) && - ((s, o, i) => { - const u = i.get(s); - $u(u) && - (u.key === s && ((u.key = o), i.delete(s), i.set(o, u)), - u.value === s && ((u.value = o), i.delete(s), i.set(o, u))); - })(s, o, this.edges), - this.element); - } - }, - kp = pipe(Hl(/~/g, '~0'), Hl(/\//g, '~1'), encodeURIComponent); - const Cp = class JsonPointerError extends Jo {}; - const Op = class CompilationJsonPointerError extends Cp { - tokens; - constructor(s, o) { - (super(s, o), void 0 !== o && (this.tokens = [...o.tokens])); - } - }, - es_compile = (s) => { - try { - return 0 === s.length ? '' : `/${s.map(kp).join('/')}`; - } catch (o) { - throw new Op('JSON Pointer compilation of tokens encountered an error.', { - tokens: s, - cause: o - }); - } - }; - var Ap = _curry2(function converge(s, o) { - return za(Ca(Ll, 0, Fl('length', o)), function () { - var i = arguments, - u = this; - return s.apply( - u, - _map(function (s) { - return s.apply(u, i); - }, o) - ); - }); - }); - const jp = Ap; - function _identity(s) { - return s; - } - const Ip = _curry1(_identity); - var Pp = gu(za(1, pipe(ea, Vl('Number'))), isFinite); - var Mp = za(1, Pp); - var Tp = gu( - Wl(Number.isFinite) ? za(1, Ea(Number.isFinite, Number)) : Mp, - jp(ra, [Math.floor, Ip]) - ); - var Np = za(1, Tp); - const Rp = Wl(Number.isInteger) ? za(1, Ea(Number.isInteger, Number)) : Np; - var Dp = (function () { - function XTake(s, o) { - ((this.xf = o), (this.n = s), (this.i = 0)); - } - return ( - (XTake.prototype['@@transducer/init'] = _xfBase_init), - (XTake.prototype['@@transducer/result'] = _xfBase_result), - (XTake.prototype['@@transducer/step'] = function (s, o) { - this.i += 1; - var i = 0 === this.n ? s : this.xf['@@transducer/step'](s, o); - return this.n >= 0 && this.i >= this.n ? _reduced(i) : i; - }), - XTake - ); - })(); - function _xtake(s) { - return function (o) { - return new Dp(s, o); - }; - } - const Lp = _curry2( - _dispatchable(['take'], _xtake, function take(s, o) { - return ja(0, s < 0 ? 1 / 0 : s, o); - }) - ); - var Bp = _curry2(function (s, o) { - return ra(Lp(s.length, o), s); - }); - const Fp = Bp; - const qp = ra(''); - var $p = (function () { - function XDropWhile(s, o) { - ((this.xf = o), (this.f = s)); - } - return ( - (XDropWhile.prototype['@@transducer/init'] = _xfBase_init), - (XDropWhile.prototype['@@transducer/result'] = _xfBase_result), - (XDropWhile.prototype['@@transducer/step'] = function (s, o) { - if (this.f) { - if (this.f(o)) return s; - this.f = null; - } - return this.xf['@@transducer/step'](s, o); - }), - XDropWhile - ); - })(); - function _xdropWhile(s) { - return function (o) { - return new $p(s, o); - }; - } - const Vp = _curry2( - _dispatchable(['dropWhile'], _xdropWhile, function dropWhile(s, o) { - for (var i = 0, u = o.length; i < u && s(o[i]); ) i += 1; - return ja(i, 1 / 0, o); - }) - ); - const Up = Ja(function (s, o) { - return pipe(tl(''), Vp(_l(s)), yl(''))(o); - }), - zp = pipe(Hl(/~1/g, '/'), Hl(/~0/g, '~'), (s) => { - try { - return decodeURIComponent(s); - } catch { - return s; - } - }); - const Wp = class InvalidJsonPointerError extends Cp { - pointer; - constructor(s, o) { - (super(s, o), void 0 !== o && (this.pointer = o.pointer)); - } - }, - uriToPointer = (s) => { - const o = ((s) => { - const o = s.indexOf('#'); - return -1 !== o ? s.substring(o) : '#'; - })(s); - return Up('#', o); - }, - es_parse = (s) => { - if (qp(s)) return []; - if (!Fp('/', s)) - throw new Wp(`Invalid JSON Pointer "${s}". JSON Pointers must begin with "/"`, { - pointer: s - }); - try { - const o = pipe(tl('/'), kl(zp))(s); - return Ia(o); - } catch (o) { - throw new Wp(`JSON Pointer parsing of "${s}" encountered an error.`, { - pointer: s, - cause: o - }); - } - }; - const Kp = class EvaluationJsonPointerError extends Cp { - pointer; - tokens; - failedToken; - failedTokenPosition; - element; - constructor(s, o) { - (super(s, o), - void 0 !== o && - ((this.pointer = o.pointer), - Array.isArray(o.tokens) && (this.tokens = [...o.tokens]), - (this.failedToken = o.failedToken), - (this.failedTokenPosition = o.failedTokenPosition), - (this.element = o.element))); - } - }, - es_evaluate = (s, o) => { - let i; - try { - i = es_parse(s); - } catch (i) { - throw new Kp(`JSON Pointer evaluation failed while parsing the pointer "${s}".`, { - pointer: s, - element: cloneDeep(o), - cause: i - }); - } - return i.reduce((o, u, _) => { - if (Fu(o)) { - if (!o.hasKey(u)) - throw new Kp( - `JSON Pointer evaluation failed while evaluating token "${u}" against an ObjectElement`, - { - pointer: s, - tokens: i, - failedToken: u, - failedTokenPosition: _, - element: cloneDeep(o) - } - ); - return o.get(u); - } - if (qu(o)) { - if (!(u in o.content) || !Rp(Number(u))) - throw new Kp( - `JSON Pointer evaluation failed while evaluating token "${u}" against an ArrayElement`, - { - pointer: s, - tokens: i, - failedToken: u, - failedTokenPosition: _, - element: cloneDeep(o) - } - ); - return o.get(Number(u)); - } - throw new Kp( - `JSON Pointer evaluation failed while evaluating token "${u}" against an unexpected Element`, - { - pointer: s, - tokens: i, - failedToken: u, - failedTokenPosition: _, - element: cloneDeep(o) - } - ); - }, o); - }; - class Callback extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'callback')); - } - } - const Hp = Callback; - class Components extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'components')); - } - get schemas() { - return this.get('schemas'); - } - set schemas(s) { - this.set('schemas', s); - } - get responses() { - return this.get('responses'); - } - set responses(s) { - this.set('responses', s); - } - get parameters() { - return this.get('parameters'); - } - set parameters(s) { - this.set('parameters', s); - } - get examples() { - return this.get('examples'); - } - set examples(s) { - this.set('examples', s); - } - get requestBodies() { - return this.get('requestBodies'); - } - set requestBodies(s) { - this.set('requestBodies', s); - } - get headers() { - return this.get('headers'); - } - set headers(s) { - this.set('headers', s); - } - get securitySchemes() { - return this.get('securitySchemes'); - } - set securitySchemes(s) { - this.set('securitySchemes', s); - } - get links() { - return this.get('links'); - } - set links(s) { - this.set('links', s); - } - get callbacks() { - return this.get('callbacks'); - } - set callbacks(s) { - this.set('callbacks', s); - } - } - const Jp = Components; - class Contact extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'contact')); - } - get name() { - return this.get('name'); - } - set name(s) { - this.set('name', s); - } - get url() { - return this.get('url'); - } - set url(s) { - this.set('url', s); - } - get email() { - return this.get('email'); - } - set email(s) { - this.set('email', s); - } - } - const Gp = Contact; - class Discriminator extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'discriminator')); - } - get propertyName() { - return this.get('propertyName'); - } - set propertyName(s) { - this.set('propertyName', s); - } - get mapping() { - return this.get('mapping'); - } - set mapping(s) { - this.set('mapping', s); - } - } - const Yp = Discriminator; - class Encoding extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'encoding')); - } - get contentType() { - return this.get('contentType'); - } - set contentType(s) { - this.set('contentType', s); - } - get headers() { - return this.get('headers'); - } - set headers(s) { - this.set('headers', s); - } - get style() { - return this.get('style'); - } - set style(s) { - this.set('style', s); - } - get explode() { - return this.get('explode'); - } - set explode(s) { - this.set('explode', s); - } - get allowedReserved() { - return this.get('allowedReserved'); - } - set allowedReserved(s) { - this.set('allowedReserved', s); - } - } - const Xp = Encoding; - class Example extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'example')); - } - get summary() { - return this.get('summary'); - } - set summary(s) { - this.set('summary', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get value() { - return this.get('value'); - } - set value(s) { - this.set('value', s); - } - get externalValue() { - return this.get('externalValue'); - } - set externalValue(s) { - this.set('externalValue', s); - } - } - const Zp = Example; - class ExternalDocumentation extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'externalDocumentation')); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get url() { - return this.get('url'); - } - set url(s) { - this.set('url', s); - } - } - const Qp = ExternalDocumentation; - class Header extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'header')); - } - get required() { - return this.hasKey('required') ? this.get('required') : new Cu.bd(!1); - } - set required(s) { - this.set('required', s); - } - get deprecated() { - return this.hasKey('deprecated') ? this.get('deprecated') : new Cu.bd(!1); - } - set deprecated(s) { - this.set('deprecated', s); - } - get allowEmptyValue() { - return this.get('allowEmptyValue'); - } - set allowEmptyValue(s) { - this.set('allowEmptyValue', s); - } - get style() { - return this.get('style'); - } - set style(s) { - this.set('style', s); - } - get explode() { - return this.get('explode'); - } - set explode(s) { - this.set('explode', s); - } - get allowReserved() { - return this.get('allowReserved'); - } - set allowReserved(s) { - this.set('allowReserved', s); - } - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - get example() { - return this.get('example'); - } - set example(s) { - this.set('example', s); - } - get examples() { - return this.get('examples'); - } - set examples(s) { - this.set('examples', s); - } - get contentProp() { - return this.get('content'); - } - set contentProp(s) { - this.set('content', s); - } - } - Object.defineProperty(Header.prototype, 'description', { - get() { - return this.get('description'); - }, - set(s) { - this.set('description', s); - }, - enumerable: !0 - }); - const th = Header; - class Info extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'info'), this.classes.push('info')); - } - get title() { - return this.get('title'); - } - set title(s) { - this.set('title', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get termsOfService() { - return this.get('termsOfService'); - } - set termsOfService(s) { - this.set('termsOfService', s); - } - get contact() { - return this.get('contact'); - } - set contact(s) { - this.set('contact', s); - } - get license() { - return this.get('license'); - } - set license(s) { - this.set('license', s); - } - get version() { - return this.get('version'); - } - set version(s) { - this.set('version', s); - } - } - const rh = Info; - class License extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'license')); - } - get name() { - return this.get('name'); - } - set name(s) { - this.set('name', s); - } - get url() { - return this.get('url'); - } - set url(s) { - this.set('url', s); - } - } - const uh = License; - class Link extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'link')); - } - get operationRef() { - return this.get('operationRef'); - } - set operationRef(s) { - this.set('operationRef', s); - } - get operationId() { - return this.get('operationId'); - } - set operationId(s) { - this.set('operationId', s); - } - get operation() { - var s, o; - return Ru(this.operationRef) - ? null === (s = this.operationRef) || void 0 === s - ? void 0 - : s.meta.get('operation') - : Ru(this.operationId) - ? null === (o = this.operationId) || void 0 === o - ? void 0 - : o.meta.get('operation') - : void 0; - } - set operation(s) { - this.set('operation', s); - } - get parameters() { - return this.get('parameters'); - } - set parameters(s) { - this.set('parameters', s); - } - get requestBody() { - return this.get('requestBody'); - } - set requestBody(s) { - this.set('requestBody', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get server() { - return this.get('server'); - } - set server(s) { - this.set('server', s); - } - } - const dh = Link; - class MediaType extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'mediaType')); - } - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - get example() { - return this.get('example'); - } - set example(s) { - this.set('example', s); - } - get examples() { - return this.get('examples'); - } - set examples(s) { - this.set('examples', s); - } - get encoding() { - return this.get('encoding'); - } - set encoding(s) { - this.set('encoding', s); - } - } - const fh = MediaType; - class OAuthFlow extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'oAuthFlow')); - } - get authorizationUrl() { - return this.get('authorizationUrl'); - } - set authorizationUrl(s) { - this.set('authorizationUrl', s); - } - get tokenUrl() { - return this.get('tokenUrl'); - } - set tokenUrl(s) { - this.set('tokenUrl', s); - } - get refreshUrl() { - return this.get('refreshUrl'); - } - set refreshUrl(s) { - this.set('refreshUrl', s); - } - get scopes() { - return this.get('scopes'); - } - set scopes(s) { - this.set('scopes', s); - } - } - const vh = OAuthFlow; - class OAuthFlows extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'oAuthFlows')); - } - get implicit() { - return this.get('implicit'); - } - set implicit(s) { - this.set('implicit', s); - } - get password() { - return this.get('password'); - } - set password(s) { - this.set('password', s); - } - get clientCredentials() { - return this.get('clientCredentials'); - } - set clientCredentials(s) { - this.set('clientCredentials', s); - } - get authorizationCode() { - return this.get('authorizationCode'); - } - set authorizationCode(s) { - this.set('authorizationCode', s); - } - } - const _h = OAuthFlows; - class Openapi extends Cu.Om { - constructor(s, o, i) { - (super(s, o, i), - (this.element = 'openapi'), - this.classes.push('spec-version'), - this.classes.push('version')); - } - } - const wh = Openapi; - class OpenApi3_0 extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'openApi3_0'), this.classes.push('api')); - } - get openapi() { - return this.get('openapi'); - } - set openapi(s) { - this.set('openapi', s); - } - get info() { - return this.get('info'); - } - set info(s) { - this.set('info', s); - } - get servers() { - return this.get('servers'); - } - set servers(s) { - this.set('servers', s); - } - get paths() { - return this.get('paths'); - } - set paths(s) { - this.set('paths', s); - } - get components() { - return this.get('components'); - } - set components(s) { - this.set('components', s); - } - get security() { - return this.get('security'); - } - set security(s) { - this.set('security', s); - } - get tags() { - return this.get('tags'); - } - set tags(s) { - this.set('tags', s); - } - get externalDocs() { - return this.get('externalDocs'); - } - set externalDocs(s) { - this.set('externalDocs', s); - } - } - const Oh = OpenApi3_0; - class Operation extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'operation')); - } - get tags() { - return this.get('tags'); - } - set tags(s) { - this.set('tags', s); - } - get summary() { - return this.get('summary'); - } - set summary(s) { - this.set('summary', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - set externalDocs(s) { - this.set('externalDocs', s); - } - get externalDocs() { - return this.get('externalDocs'); - } - get operationId() { - return this.get('operationId'); - } - set operationId(s) { - this.set('operationId', s); - } - get parameters() { - return this.get('parameters'); - } - set parameters(s) { - this.set('parameters', s); - } - get requestBody() { - return this.get('requestBody'); - } - set requestBody(s) { - this.set('requestBody', s); - } - get responses() { - return this.get('responses'); - } - set responses(s) { - this.set('responses', s); - } - get callbacks() { - return this.get('callbacks'); - } - set callbacks(s) { - this.set('callbacks', s); - } - get deprecated() { - return this.hasKey('deprecated') ? this.get('deprecated') : new Cu.bd(!1); - } - set deprecated(s) { - this.set('deprecated', s); - } - get security() { - return this.get('security'); - } - set security(s) { - this.set('security', s); - } - get servers() { - return this.get('severs'); - } - set servers(s) { - this.set('servers', s); - } - } - const jh = Operation; - class Parameter extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'parameter')); - } - get name() { - return this.get('name'); - } - set name(s) { - this.set('name', s); - } - get in() { - return this.get('in'); - } - set in(s) { - this.set('in', s); - } - get required() { - return this.hasKey('required') ? this.get('required') : new Cu.bd(!1); - } - set required(s) { - this.set('required', s); - } - get deprecated() { - return this.hasKey('deprecated') ? this.get('deprecated') : new Cu.bd(!1); - } - set deprecated(s) { - this.set('deprecated', s); - } - get allowEmptyValue() { - return this.get('allowEmptyValue'); - } - set allowEmptyValue(s) { - this.set('allowEmptyValue', s); - } - get style() { - return this.get('style'); - } - set style(s) { - this.set('style', s); - } - get explode() { - return this.get('explode'); - } - set explode(s) { - this.set('explode', s); - } - get allowReserved() { - return this.get('allowReserved'); - } - set allowReserved(s) { - this.set('allowReserved', s); - } - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - get example() { - return this.get('example'); - } - set example(s) { - this.set('example', s); - } - get examples() { - return this.get('examples'); - } - set examples(s) { - this.set('examples', s); - } - get contentProp() { - return this.get('content'); - } - set contentProp(s) { - this.set('content', s); - } - } - Object.defineProperty(Parameter.prototype, 'description', { - get() { - return this.get('description'); - }, - set(s) { - this.set('description', s); - }, - enumerable: !0 - }); - const Ih = Parameter; - class PathItem extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'pathItem')); - } - get $ref() { - return this.get('$ref'); - } - set $ref(s) { - this.set('$ref', s); - } - get summary() { - return this.get('summary'); - } - set summary(s) { - this.set('summary', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get GET() { - return this.get('get'); - } - set GET(s) { - this.set('GET', s); - } - get PUT() { - return this.get('put'); - } - set PUT(s) { - this.set('PUT', s); - } - get POST() { - return this.get('post'); - } - set POST(s) { - this.set('POST', s); - } - get DELETE() { - return this.get('delete'); - } - set DELETE(s) { - this.set('DELETE', s); - } - get OPTIONS() { - return this.get('options'); - } - set OPTIONS(s) { - this.set('OPTIONS', s); - } - get HEAD() { - return this.get('head'); - } - set HEAD(s) { - this.set('HEAD', s); - } - get PATCH() { - return this.get('patch'); - } - set PATCH(s) { - this.set('PATCH', s); - } - get TRACE() { - return this.get('trace'); - } - set TRACE(s) { - this.set('TRACE', s); - } - get servers() { - return this.get('servers'); - } - set servers(s) { - this.set('servers', s); - } - get parameters() { - return this.get('parameters'); - } - set parameters(s) { - this.set('parameters', s); - } - } - const Ph = PathItem; - class Paths extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'paths')); - } - } - const Rh = Paths; - class Reference extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'reference'), this.classes.push('openapi-reference')); - } - get $ref() { - return this.get('$ref'); - } - set $ref(s) { - this.set('$ref', s); - } - } - const Dh = Reference; - class RequestBody extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'requestBody')); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get contentProp() { - return this.get('content'); - } - set contentProp(s) { - this.set('content', s); - } - get required() { - return this.hasKey('required') ? this.get('required') : new Cu.bd(!1); - } - set required(s) { - this.set('required', s); - } - } - const Lh = RequestBody; - class Response_Response extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'response')); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get headers() { - return this.get('headers'); - } - set headers(s) { - this.set('headers', s); - } - get contentProp() { - return this.get('content'); - } - set contentProp(s) { - this.set('content', s); - } - get links() { - return this.get('links'); - } - set links(s) { - this.set('links', s); - } - } - const Fh = Response_Response; - class Responses extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'responses')); - } - get default() { - return this.get('default'); - } - set default(s) { - this.set('default', s); - } - } - const Kh = Responses; - const Hh = class UnsupportedOperationError extends Ho {}; - class JSONSchema extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'JSONSchemaDraft4')); - } - get idProp() { - return this.get('id'); - } - set idProp(s) { - this.set('id', s); - } - get $schema() { - return this.get('$schema'); - } - set $schema(s) { - this.set('$schema', s); - } - get multipleOf() { - return this.get('multipleOf'); - } - set multipleOf(s) { - this.set('multipleOf', s); - } - get maximum() { - return this.get('maximum'); - } - set maximum(s) { - this.set('maximum', s); - } - get exclusiveMaximum() { - return this.get('exclusiveMaximum'); - } - set exclusiveMaximum(s) { - this.set('exclusiveMaximum', s); - } - get minimum() { - return this.get('minimum'); - } - set minimum(s) { - this.set('minimum', s); - } - get exclusiveMinimum() { - return this.get('exclusiveMinimum'); - } - set exclusiveMinimum(s) { - this.set('exclusiveMinimum', s); - } - get maxLength() { - return this.get('maxLength'); - } - set maxLength(s) { - this.set('maxLength', s); - } - get minLength() { - return this.get('minLength'); - } - set minLength(s) { - this.set('minLength', s); - } - get pattern() { - return this.get('pattern'); - } - set pattern(s) { - this.set('pattern', s); - } - get additionalItems() { - return this.get('additionalItems'); - } - set additionalItems(s) { - this.set('additionalItems', s); - } - get items() { - return this.get('items'); - } - set items(s) { - this.set('items', s); - } - get maxItems() { - return this.get('maxItems'); - } - set maxItems(s) { - this.set('maxItems', s); - } - get minItems() { - return this.get('minItems'); - } - set minItems(s) { - this.set('minItems', s); - } - get uniqueItems() { - return this.get('uniqueItems'); - } - set uniqueItems(s) { - this.set('uniqueItems', s); - } - get maxProperties() { - return this.get('maxProperties'); - } - set maxProperties(s) { - this.set('maxProperties', s); - } - get minProperties() { - return this.get('minProperties'); - } - set minProperties(s) { - this.set('minProperties', s); - } - get required() { - return this.get('required'); - } - set required(s) { - this.set('required', s); - } - get properties() { - return this.get('properties'); - } - set properties(s) { - this.set('properties', s); - } - get additionalProperties() { - return this.get('additionalProperties'); - } - set additionalProperties(s) { - this.set('additionalProperties', s); - } - get patternProperties() { - return this.get('patternProperties'); - } - set patternProperties(s) { - this.set('patternProperties', s); - } - get dependencies() { - return this.get('dependencies'); - } - set dependencies(s) { - this.set('dependencies', s); - } - get enum() { - return this.get('enum'); - } - set enum(s) { - this.set('enum', s); - } - get type() { - return this.get('type'); - } - set type(s) { - this.set('type', s); - } - get allOf() { - return this.get('allOf'); - } - set allOf(s) { - this.set('allOf', s); - } - get anyOf() { - return this.get('anyOf'); - } - set anyOf(s) { - this.set('anyOf', s); - } - get oneOf() { - return this.get('oneOf'); - } - set oneOf(s) { - this.set('oneOf', s); - } - get not() { - return this.get('not'); - } - set not(s) { - this.set('not', s); - } - get definitions() { - return this.get('definitions'); - } - set definitions(s) { - this.set('definitions', s); - } - get title() { - return this.get('title'); - } - set title(s) { - this.set('title', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get default() { - return this.get('default'); - } - set default(s) { - this.set('default', s); - } - get format() { - return this.get('format'); - } - set format(s) { - this.set('format', s); - } - get base() { - return this.get('base'); - } - set base(s) { - this.set('base', s); - } - get links() { - return this.get('links'); - } - set links(s) { - this.set('links', s); - } - get media() { - return this.get('media'); - } - set media(s) { - this.set('media', s); - } - get readOnly() { - return this.get('readOnly'); - } - set readOnly(s) { - this.set('readOnly', s); - } - } - const Jh = JSONSchema; - class JSONReference extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'JSONReference'), this.classes.push('json-reference')); - } - get $ref() { - return this.get('$ref'); - } - set $ref(s) { - this.set('$ref', s); - } - } - const Gh = JSONReference; - class Media extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'media')); - } - get binaryEncoding() { - return this.get('binaryEncoding'); - } - set binaryEncoding(s) { - this.set('binaryEncoding', s); - } - get type() { - return this.get('type'); - } - set type(s) { - this.set('type', s); - } - } - const Qh = Media; - class LinkDescription extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'linkDescription')); - } - get href() { - return this.get('href'); - } - set href(s) { - this.set('href', s); - } - get rel() { - return this.get('rel'); - } - set rel(s) { - this.set('rel', s); - } - get title() { - return this.get('title'); - } - set title(s) { - this.set('title', s); - } - get targetSchema() { - return this.get('targetSchema'); - } - set targetSchema(s) { - this.set('targetSchema', s); - } - get mediaType() { - return this.get('mediaType'); - } - set mediaType(s) { - this.set('mediaType', s); - } - get method() { - return this.get('method'); - } - set method(s) { - this.set('method', s); - } - get encType() { - return this.get('encType'); - } - set encType(s) { - this.set('encType', s); - } - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - } - const td = LinkDescription; - var sd = _curry2(function mapObjIndexed(s, o) { - return _arrayReduce( - function (i, u) { - return ((i[u] = s(o[u], u, o)), i); - }, - {}, - Wi(o) - ); - }); - const id = sd; - const ld = _curry1(function isNil(s) { - return null == s; - }); - var cd = _curry2(function hasPath(s, o) { - if (0 === s.length || ld(o)) return !1; - for (var i = o, u = 0; u < s.length; ) { - if (ld(i) || !_has(s[u], i)) return !1; - ((i = i[s[u]]), (u += 1)); - } - return !0; - }); - const ud = cd; - var dd = _curry2(function has(s, o) { - return ud([s], o); - }); - const md = dd; - const yd = _curry3(function propSatisfies(s, o, i) { - return s(Da(o, i)); - }), - dereference = (s, o) => { - const i = Na(s, o); - return id((s) => { - if (ku(s) && md('$ref', s) && yd(Yl, '$ref', s)) { - const o = cp(['$ref'], s), - u = Up('#/', o); - return cp(u.split('/'), i); - } - return ku(s) ? dereference(s, i) : s; - }, s); - }, - emptyElement = (s) => { - const o = s.meta.length > 0 ? cloneDeep(s.meta) : void 0, - i = s.attributes.length > 0 ? cloneDeep(s.attributes) : void 0; - return new s.constructor(void 0, o, i); - }, - cloneUnlessOtherwiseSpecified = (s, o) => - o.clone && o.isMergeableElement(s) ? deepmerge(emptyElement(s), s, o) : s, - getMetaMergeFunction = (s) => - 'function' != typeof s.customMetaMerge ? (s) => cloneDeep(s) : s.customMetaMerge, - getAttributesMergeFunction = (s) => - 'function' != typeof s.customAttributesMerge - ? (s) => cloneDeep(s) - : s.customAttributesMerge, - vd = { - clone: !0, - isMergeableElement: (s) => Fu(s) || qu(s), - arrayElementMerge: (s, o, i) => - s.concat(o)['fantasy-land/map']((s) => cloneUnlessOtherwiseSpecified(s, i)), - objectElementMerge: (s, o, i) => { - const u = Fu(s) ? emptyElement(s) : emptyElement(o); - return ( - Fu(s) && - s.forEach((s, o, _) => { - const w = cloneShallow(_); - ((w.value = cloneUnlessOtherwiseSpecified(s, i)), u.content.push(w)); - }), - o.forEach((o, _, w) => { - const x = serializers_value(_); - let C; - if (Fu(s) && s.hasKey(x) && i.isMergeableElement(o)) { - const u = s.get(x); - ((C = cloneShallow(w)), - (C.value = ((s, o) => { - if ('function' != typeof o.customMerge) return deepmerge; - const i = o.customMerge(s, o); - return 'function' == typeof i ? i : deepmerge; - })(_, i)(u, o))); - } else ((C = cloneShallow(w)), (C.value = cloneUnlessOtherwiseSpecified(o, i))); - (u.remove(x), u.content.push(C)); - }), - u - ); - }, - customMerge: void 0, - customMetaMerge: void 0, - customAttributesMerge: void 0 - }; - function deepmerge(s, o, i) { - var u, _, w; - const x = { ...vd, ...i }; - ((x.isMergeableElement = - null !== (u = x.isMergeableElement) && void 0 !== u ? u : vd.isMergeableElement), - (x.arrayElementMerge = - null !== (_ = x.arrayElementMerge) && void 0 !== _ ? _ : vd.arrayElementMerge), - (x.objectElementMerge = - null !== (w = x.objectElementMerge) && void 0 !== w ? w : vd.objectElementMerge)); - const C = qu(o); - if (!(C === qu(s))) return cloneUnlessOtherwiseSpecified(o, x); - const j = - C && 'function' == typeof x.arrayElementMerge - ? x.arrayElementMerge(s, o, x) - : x.objectElementMerge(s, o, x); - return ( - (j.meta = getMetaMergeFunction(x)(s.meta, o.meta)), - (j.attributes = getAttributesMergeFunction(x)(s.attributes, o.attributes)), - j - ); - } - deepmerge.all = (s, o) => { - if (!Array.isArray(s)) - throw new TypeError('First argument of deepmerge should be an array.'); - return 0 === s.length - ? new Cu.Sh() - : s.reduce((s, i) => deepmerge(s, i, o), emptyElement(s[0])); - }; - const _d = class Visitor_Visitor { - element; - constructor(s) { - Object.assign(this, s); - } - copyMetaAndAttributes(s, o) { - ((s.meta.length > 0 || o.meta.length > 0) && - ((o.meta = deepmerge(o.meta, s.meta)), - hasElementSourceMap(s) && o.meta.set('sourceMap', s.meta.get('sourceMap'))), - (s.attributes.length > 0 || s.meta.length > 0) && - (o.attributes = deepmerge(o.attributes, s.attributes))); - } - }; - const Ed = class FallbackVisitor extends _d { - enter(s) { - return ((this.element = cloneDeep(s)), Ju); - } - }, - copyProps = (s, o, i = []) => { - const u = Object.getOwnPropertyDescriptors(o); - for (let s of i) delete u[s]; - Object.defineProperties(s, u); - }, - protoChain = (s, o = [s]) => { - const i = Object.getPrototypeOf(s); - return null === i ? o : protoChain(i, [...o, i]); - }, - hardMixProtos = (s, o, i = []) => { - var u; - const _ = - null !== - (u = ((...s) => { - if (0 === s.length) return; - let o; - const i = s.map((s) => protoChain(s)); - for (; i.every((s) => s.length > 0); ) { - const s = i.map((s) => s.pop()), - u = s[0]; - if (!s.every((s) => s === u)) break; - o = u; - } - return o; - })(...s)) && void 0 !== u - ? u - : Object.prototype, - w = Object.create(_), - x = protoChain(_); - for (let o of s) { - let s = protoChain(o); - for (let o = s.length - 1; o >= 0; o--) { - let u = s[o]; - -1 === x.indexOf(u) && (copyProps(w, u, ['constructor', ...i]), x.push(u)); - } - } - return ((w.constructor = o), w); - }, - unique = (s) => s.filter((o, i) => s.indexOf(o) == i), - getIngredientWithProp = (s, o) => { - const i = o.map((s) => protoChain(s)); - let u = 0, - _ = !0; - for (; _; ) { - _ = !1; - for (let w = o.length - 1; w >= 0; w--) { - const o = i[w][u]; - if (null != o && ((_ = !0), null != Object.getOwnPropertyDescriptor(o, s))) - return i[w][0]; - } - u++; - } - }, - proxyMix = (s, o = Object.prototype) => - new Proxy( - {}, - { - getPrototypeOf: () => o, - setPrototypeOf() { - throw Error('Cannot set prototype of Proxies created by ts-mixer'); - }, - getOwnPropertyDescriptor: (o, i) => - Object.getOwnPropertyDescriptor(getIngredientWithProp(i, s) || {}, i), - defineProperty() { - throw new Error('Cannot define new properties on Proxies created by ts-mixer'); - }, - has: (i, u) => void 0 !== getIngredientWithProp(u, s) || void 0 !== o[u], - get: (i, u) => (getIngredientWithProp(u, s) || o)[u], - set(o, i, u) { - const _ = getIngredientWithProp(i, s); - if (void 0 === _) - throw new Error('Cannot set new properties on Proxies created by ts-mixer'); - return ((_[i] = u), !0); - }, - deleteProperty() { - throw new Error('Cannot delete properties on Proxies created by ts-mixer'); - }, - ownKeys: () => - s - .map(Object.getOwnPropertyNames) - .reduce((s, o) => o.concat(s.filter((s) => o.indexOf(s) < 0))) - } - ), - wd = null, - Sd = 'copy', - xd = 'copy', - kd = 'deep', - Cd = new WeakMap(), - getMixinsForClass = (s) => Cd.get(s), - mergeObjectsOfDecorators = (s, o) => { - var i, u; - const _ = unique([...Object.getOwnPropertyNames(s), ...Object.getOwnPropertyNames(o)]), - w = {}; - for (let x of _) - w[x] = unique([ - ...(null !== (i = null == s ? void 0 : s[x]) && void 0 !== i ? i : []), - ...(null !== (u = null == o ? void 0 : o[x]) && void 0 !== u ? u : []) - ]); - return w; - }, - mergePropertyAndMethodDecorators = (s, o) => { - var i, u, _, w; - return { - property: mergeObjectsOfDecorators( - null !== (i = null == s ? void 0 : s.property) && void 0 !== i ? i : {}, - null !== (u = null == o ? void 0 : o.property) && void 0 !== u ? u : {} - ), - method: mergeObjectsOfDecorators( - null !== (_ = null == s ? void 0 : s.method) && void 0 !== _ ? _ : {}, - null !== (w = null == o ? void 0 : o.method) && void 0 !== w ? w : {} - ) - }; - }, - mergeDecorators = (s, o) => { - var i, u, _, w, x, C; - return { - class: unique([ - ...(null !== (i = null == s ? void 0 : s.class) && void 0 !== i ? i : []), - ...(null !== (u = null == o ? void 0 : o.class) && void 0 !== u ? u : []) - ]), - static: mergePropertyAndMethodDecorators( - null !== (_ = null == s ? void 0 : s.static) && void 0 !== _ ? _ : {}, - null !== (w = null == o ? void 0 : o.static) && void 0 !== w ? w : {} - ), - instance: mergePropertyAndMethodDecorators( - null !== (x = null == s ? void 0 : s.instance) && void 0 !== x ? x : {}, - null !== (C = null == o ? void 0 : o.instance) && void 0 !== C ? C : {} - ) - }; - }, - Od = new Map(), - deepDecoratorSearch = (...s) => { - const o = ((...s) => { - var o; - const i = new Set(), - u = new Set([...s]); - for (; u.size > 0; ) - for (let s of u) { - const _ = protoChain(s.prototype).map((s) => s.constructor), - w = [ - ..._, - ...(null !== (o = getMixinsForClass(s)) && void 0 !== o ? o : []) - ].filter((s) => !i.has(s)); - for (let s of w) u.add(s); - (i.add(s), u.delete(s)); - } - return [...i]; - })(...s) - .map((s) => Od.get(s)) - .filter((s) => !!s); - return 0 == o.length - ? {} - : 1 == o.length - ? o[0] - : o.reduce((s, o) => mergeDecorators(s, o)); - }, - getDecoratorsForClass = (s) => { - let o = Od.get(s); - return (o || ((o = {}), Od.set(s, o)), o); - }; - function Mixin(...s) { - var o, i, u; - const _ = s.map((s) => s.prototype), - w = wd; - if (null !== w) { - const s = _.map((s) => s[w]).filter((s) => 'function' == typeof s), - combinedInitFunction = function (...o) { - for (let i of s) i.apply(this, o); - }, - o = { [w]: combinedInitFunction }; - _.push(o); - } - function MixedClass(...o) { - for (const i of s) copyProps(this, new i(...o)); - null !== w && 'function' == typeof this[w] && this[w].apply(this, o); - } - var x, C; - ((MixedClass.prototype = - 'copy' === xd - ? hardMixProtos(_, MixedClass) - : ((x = _), (C = MixedClass), proxyMix([...x, { constructor: C }]))), - Object.setPrototypeOf( - MixedClass, - 'copy' === Sd - ? hardMixProtos(s, null, ['prototype']) - : proxyMix(s, Function.prototype) - )); - let j = MixedClass; - if ('none' !== kd) { - const _ = - 'deep' === kd - ? deepDecoratorSearch(...s) - : ((...s) => { - const o = s.map((s) => getDecoratorsForClass(s)); - return 0 === o.length - ? {} - : 1 === o.length - ? o[0] - : o.reduce((s, o) => mergeDecorators(s, o)); - })(...s); - for (let s of null !== (o = null == _ ? void 0 : _.class) && void 0 !== o ? o : []) { - const o = s(j); - o && (j = o); - } - (applyPropAndMethodDecorators( - null !== (i = null == _ ? void 0 : _.static) && void 0 !== i ? i : {}, - j - ), - applyPropAndMethodDecorators( - null !== (u = null == _ ? void 0 : _.instance) && void 0 !== u ? u : {}, - j.prototype - )); - } - var L, B; - return ((L = j), (B = s), Cd.set(L, B), j); - } - const applyPropAndMethodDecorators = (s, o) => { - const i = s.property, - u = s.method; - if (i) for (let s in i) for (let u of i[s]) u(o, s); - if (u) - for (let s in u) for (let i of u[s]) i(o, s, Object.getOwnPropertyDescriptor(o, s)); - }; - const Ad = _curry2(function pick(s, o) { - for (var i = {}, u = 0; u < s.length; ) (s[u] in o && (i[s[u]] = o[s[u]]), (u += 1)); - return i; - }); - const Id = class SpecificationVisitor extends _d { - specObj; - passingOptionsNames = ['specObj']; - constructor({ specObj: s, ...o }) { - (super({ ...o }), (this.specObj = s)); - } - retrievePassingOptions() { - return Ad(this.passingOptionsNames, this); - } - retrieveFixedFields(s) { - const o = cp(['visitors', ...s, 'fixedFields'], this.specObj); - return 'object' == typeof o && null !== o ? Object.keys(o) : []; - } - retrieveVisitor(s) { - return Xo(Wl, ['visitors', ...s], this.specObj) - ? cp(['visitors', ...s], this.specObj) - : cp(['visitors', ...s, '$visitor'], this.specObj); - } - retrieveVisitorInstance(s, o = {}) { - const i = this.retrievePassingOptions(); - return new (this.retrieveVisitor(s))({ ...i, ...o }); - } - toRefractedElement(s, o, i = {}) { - const u = this.retrieveVisitorInstance(s, i); - return u instanceof Ed && (null == u ? void 0 : u.constructor) === Ed - ? cloneDeep(o) - : (visitor_visit(o, u, i), u.element); - } - }; - const Md = class FixedFieldsVisitor extends Id { - specPath; - ignoredFields; - constructor({ specPath: s, ignoredFields: o, ...i }) { - (super({ ...i }), (this.specPath = s), (this.ignoredFields = o || [])); - } - ObjectElement(s) { - const o = this.specPath(s), - i = this.retrieveFixedFields(o); - return ( - s.forEach((s, u, _) => { - if ( - Ru(u) && - i.includes(serializers_value(u)) && - !this.ignoredFields.includes(serializers_value(u)) - ) { - const i = this.toRefractedElement([...o, 'fixedFields', serializers_value(u)], s), - w = new Cu.Pr(cloneDeep(u), i); - (this.copyMetaAndAttributes(_, w), - w.classes.push('fixed-field'), - this.element.content.push(w)); - } else - this.ignoredFields.includes(serializers_value(u)) || - this.element.content.push(cloneDeep(_)); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - }; - class JSONSchemaVisitor extends Mixin(Md, Ed) { - constructor(s) { - (super(s), - (this.element = new Jh()), - (this.specPath = Tl(['document', 'objects', 'JSONSchema']))); - } - } - const Td = JSONSchemaVisitor; - const Nd = class ParentSchemaAwareVisitor { - parent; - constructor({ parent: s }) { - this.parent = s; - } - }, - isJSONReferenceLikeElement = (s) => Fu(s) && s.hasKey('$ref'); - class ItemsVisitor extends Mixin(Id, Nd, Ed) { - ObjectElement(s) { - const o = isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema']; - return ((this.element = this.toRefractedElement(o, s)), Ju); - } - ArrayElement(s) { - return ( - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-items'), - s.forEach((s) => { - const o = isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const Rd = ItemsVisitor; - const Dd = class RequiredVisitor extends Ed { - ArrayElement(s) { - const o = this.enter(s); - return (this.element.classes.push('json-schema-required'), o); - } - }; - const Ld = _curry1(function allPass(s) { - return za(Ca(Ll, 0, Fl('length', s)), function () { - for (var o = 0, i = s.length; o < i; ) { - if (!s[o].apply(this, arguments)) return !1; - o += 1; - } - return !0; - }); - }); - const Bd = _curry1(function isNotEmpty(s) { - return !gp(s); - }); - const Fd = _curry2(function or(s, o) { - return s || o; - }); - var $d = Ml( - za( - 1, - gu( - vu, - _curry2(function either(s, o) { - return _isFunction(s) - ? function _either() { - return s.apply(this, arguments) || o.apply(this, arguments); - } - : Pl(Fd)(s, o); - })(bu, Wl) - ) - ) - ); - const Vd = Ld([Yl, $d, Bd]); - const Ud = class PatternedFieldsVisitor extends Id { - specPath; - ignoredFields; - fieldPatternPredicate = es_F; - constructor({ specPath: s, ignoredFields: o, fieldPatternPredicate: i, ...u }) { - (super({ ...u }), - (this.specPath = s), - (this.ignoredFields = o || []), - 'function' == typeof i && (this.fieldPatternPredicate = i)); - } - ObjectElement(s) { - return ( - s.forEach((s, o, i) => { - if ( - !this.ignoredFields.includes(serializers_value(o)) && - this.fieldPatternPredicate(serializers_value(o)) - ) { - const u = this.specPath(s), - _ = this.toRefractedElement(u, s), - w = new Cu.Pr(cloneDeep(o), _); - (this.copyMetaAndAttributes(i, w), - w.classes.push('patterned-field'), - this.element.content.push(w)); - } else - this.ignoredFields.includes(serializers_value(o)) || - this.element.content.push(cloneDeep(i)); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - }; - const Wd = class MapVisitor extends Ud { - constructor(s) { - (super(s), (this.fieldPatternPredicate = Vd)); - } - }; - class PropertiesVisitor extends Mixin(Wd, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-properties'), - (this.specPath = (s) => - isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'])); - } - } - const Kd = PropertiesVisitor; - class PatternPropertiesVisitor extends Mixin(Wd, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-patternProperties'), - (this.specPath = (s) => - isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'])); - } - } - const Hd = PatternPropertiesVisitor; - class DependenciesVisitor extends Mixin(Wd, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-dependencies'), - (this.specPath = (s) => - isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'])); - } - } - const Jd = DependenciesVisitor; - const Gd = class EnumVisitor extends Ed { - ArrayElement(s) { - const o = this.enter(s); - return (this.element.classes.push('json-schema-enum'), o); - } - }; - const Yd = class TypeVisitor extends Ed { - StringElement(s) { - const o = this.enter(s); - return (this.element.classes.push('json-schema-type'), o); - } - ArrayElement(s) { - const o = this.enter(s); - return (this.element.classes.push('json-schema-type'), o); - } - }; - class AllOfVisitor extends Mixin(Id, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-allOf')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const Xd = AllOfVisitor; - class AnyOfVisitor extends Mixin(Id, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-anyOf')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const Zd = AnyOfVisitor; - class OneOfVisitor extends Mixin(Id, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-oneOf')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const Qd = OneOfVisitor; - class DefinitionsVisitor extends Mixin(Wd, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-definitions'), - (this.specPath = (s) => - isJSONReferenceLikeElement(s) - ? ['document', 'objects', 'JSONReference'] - : ['document', 'objects', 'JSONSchema'])); - } - } - const ef = DefinitionsVisitor; - class LinksVisitor extends Mixin(Id, Nd, Ed) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-links')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = this.toRefractedElement(['document', 'objects', 'LinkDescription'], s); - this.element.push(o); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const rf = LinksVisitor; - class JSONReferenceVisitor extends Mixin(Md, Ed) { - constructor(s) { - (super(s), - (this.element = new Gh()), - (this.specPath = Tl(['document', 'objects', 'JSONReference']))); - } - ObjectElement(s) { - const o = Md.prototype.ObjectElement.call(this, s); - return (Ru(this.element.$ref) && this.element.classes.push('reference-element'), o); - } - } - const of = JSONReferenceVisitor; - const af = class $RefVisitor extends Ed { - StringElement(s) { - const o = this.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - const lf = _curry3(function ifElse(s, o, i) { - return za(Math.max(s.length, o.length, i.length), function _ifElse() { - return s.apply(this, arguments) ? o.apply(this, arguments) : i.apply(this, arguments); - }); - }); - const cf = _curry1(function comparator(s) { - return function (o, i) { - return s(o, i) ? -1 : s(i, o) ? 1 : 0; - }; - }); - var uf = _curry2(function sort(s, o) { - return Array.prototype.slice.call(o, 0).sort(s); - }); - const hf = uf; - var df = _curry1(function (s) { - return _nth(0, s); - }); - const mf = df; - const gf = _curry1(_reduced); - const yf = Ml(ld); - const bf = gu(yp, Bd); - function _toConsumableArray(s) { - return ( - (function _arrayWithoutHoles(s) { - if (Array.isArray(s)) return _arrayLikeToArray(s); - })(s) || - (function _iterableToArray(s) { - if ( - ('undefined' != typeof Symbol && null != s[Symbol.iterator]) || - null != s['@@iterator'] - ) - return Array.from(s); - })(s) || - (function _unsupportedIterableToArray(s, o) { - if (s) { - if ('string' == typeof s) return _arrayLikeToArray(s, o); - var i = {}.toString.call(s).slice(8, -1); - return ( - 'Object' === i && s.constructor && (i = s.constructor.name), - 'Map' === i || 'Set' === i - ? Array.from(s) - : 'Arguments' === i || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i) - ? _arrayLikeToArray(s, o) - : void 0 - ); - } - })(s) || - (function _nonIterableSpread() { - throw new TypeError( - 'Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.' - ); - })() - ); - } - function _arrayLikeToArray(s, o) { - (null == o || o > s.length) && (o = s.length); - for (var i = 0, u = Array(o); i < o; i++) u[i] = s[i]; - return u; - } - var _f = pipe( - hf( - cf(function (s, o) { - return s.length > o.length; - }) - ), - mf, - Da('length') - ), - Sf = Ja(function (s, o, i) { - var u = i.apply(void 0, _toConsumableArray(s)); - return yf(u) ? gf(u) : o; - }); - const xf = lf( - bf, - function dispatchImpl(s) { - var o = _f(s); - return za(o, function () { - for (var o = arguments.length, i = new Array(o), u = 0; u < o; u++) - i[u] = arguments[u]; - return Ca(Sf(i), void 0, s); - }); - }, - Nl - ); - const kf = class AlternatingVisitor extends Id { - alternator; - constructor({ alternator: s, ...o }) { - (super({ ...o }), (this.alternator = s)); - } - enter(s) { - const o = this.alternator.map(({ predicate: s, specPath: o }) => lf(s, Tl(o), Nl)), - i = xf(o)(s); - return ((this.element = this.toRefractedElement(i, s)), Ju); - } - }; - const Cf = class SchemaOrReferenceVisitor extends kf { - constructor(s) { - (super(s), - (this.alternator = [ - { - predicate: isJSONReferenceLikeElement, - specPath: ['document', 'objects', 'JSONReference'] - }, - { predicate: es_T, specPath: ['document', 'objects', 'JSONSchema'] } - ])); - } - }; - class MediaVisitor extends Mixin(Md, Ed) { - constructor(s) { - (super(s), - (this.element = new Qh()), - (this.specPath = Tl(['document', 'objects', 'Media']))); - } - } - const Of = MediaVisitor; - class LinkDescriptionVisitor extends Mixin(Md, Ed) { - constructor(s) { - (super(s), - (this.element = new td()), - (this.specPath = Tl(['document', 'objects', 'LinkDescription']))); - } - } - const jf = { - visitors: { - value: Ed, - JSONSchemaOrJSONReferenceVisitor: Cf, - document: { - objects: { - JSONSchema: { - $visitor: Td, - fixedFields: { - id: { $ref: '#/visitors/value' }, - $schema: { $ref: '#/visitors/value' }, - multipleOf: { $ref: '#/visitors/value' }, - maximum: { $ref: '#/visitors/value' }, - exclusiveMaximum: { $ref: '#/visitors/value' }, - minimum: { $ref: '#/visitors/value' }, - exclusiveMinimum: { $ref: '#/visitors/value' }, - maxLength: { $ref: '#/visitors/value' }, - minLength: { $ref: '#/visitors/value' }, - pattern: { $ref: '#/visitors/value' }, - additionalItems: Cf, - items: Rd, - maxItems: { $ref: '#/visitors/value' }, - minItems: { $ref: '#/visitors/value' }, - uniqueItems: { $ref: '#/visitors/value' }, - maxProperties: { $ref: '#/visitors/value' }, - minProperties: { $ref: '#/visitors/value' }, - required: Dd, - properties: Kd, - additionalProperties: Cf, - patternProperties: Hd, - dependencies: Jd, - enum: Gd, - type: Yd, - allOf: Xd, - anyOf: Zd, - oneOf: Qd, - not: Cf, - definitions: ef, - title: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - default: { $ref: '#/visitors/value' }, - format: { $ref: '#/visitors/value' }, - base: { $ref: '#/visitors/value' }, - links: rf, - media: { $ref: '#/visitors/document/objects/Media' }, - readOnly: { $ref: '#/visitors/value' } - } - }, - JSONReference: { $visitor: of, fixedFields: { $ref: af } }, - Media: { - $visitor: Of, - fixedFields: { - binaryEncoding: { $ref: '#/visitors/value' }, - type: { $ref: '#/visitors/value' } - } - }, - LinkDescription: { - $visitor: LinkDescriptionVisitor, - fixedFields: { - href: { $ref: '#/visitors/value' }, - rel: { $ref: '#/visitors/value' }, - title: { $ref: '#/visitors/value' }, - targetSchema: Cf, - mediaType: { $ref: '#/visitors/value' }, - method: { $ref: '#/visitors/value' }, - encType: { $ref: '#/visitors/value' }, - schema: Cf - } - } - } - } - } - }, - traversal_visitor_getNodeType = (s) => { - if (Nu(s)) return `${s.element.charAt(0).toUpperCase() + s.element.slice(1)}Element`; - }, - Pf = { - JSONSchemaDraft4Element: ['content'], - JSONReferenceElement: ['content'], - MediaElement: ['content'], - LinkDescriptionElement: ['content'], - ...Qu - }, - Tf = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Jh || (s(u) && o('JSONSchemaDraft4', u) && i('object', u)) - ), - Nf = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Gh || (s(u) && o('JSONReference', u) && i('object', u)) - ), - Rf = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Qh || (s(u) && o('media', u) && i('object', u)) - ), - Df = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof td || (s(u) && o('linkDescription', u) && i('object', u)) - ), - Ff = { - namespace: (s) => { - const { base: o } = s; - return ( - o.register('jSONSchemaDraft4', Jh), - o.register('jSONReference', Gh), - o.register('media', Qh), - o.register('linkDescription', td), - o - ); - } - }, - Vf = Ff, - refractor_toolbox = () => { - const s = createNamespace(Vf); - return { predicates: { ...ce, isStringElement: Ru }, namespace: s }; - }, - refractor_refract = ( - s, - { - specPath: o = ['visitors', 'document', 'objects', 'JSONSchema', '$visitor'], - plugins: i = [], - specificationObj: u = jf - } = {} - ) => { - const _ = (0, Cu.e)(s), - w = dereference(u), - x = new (cp(o, w))({ specObj: w }); - return ( - visitor_visit(_, x), - dispatchPluginsSync(x.element, i, { - toolboxCreator: refractor_toolbox, - visitorOptions: { keyMap: Pf, nodeTypeGetter: traversal_visitor_getNodeType } - }) - ); - }, - refractor_createRefractor = - (s) => - (o, i = {}) => - refractor_refract(o, { specPath: s, ...i }); - ((Jh.refract = refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'JSONSchema', - '$visitor' - ])), - (Gh.refract = refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'JSONReference', - '$visitor' - ])), - (Qh.refract = refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Media', - '$visitor' - ])), - (td.refract = refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'LinkDescription', - '$visitor' - ]))); - const Wf = class Schema_Schema extends Jh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'schema'), this.classes.push('json-schema-draft-4')); - } - get idProp() { - throw new Hh('idProp getter in Schema class is not not supported.'); - } - set idProp(s) { - throw new Hh('idProp setter in Schema class is not not supported.'); - } - get $schema() { - throw new Hh('$schema getter in Schema class is not not supported.'); - } - set $schema(s) { - throw new Hh('$schema setter in Schema class is not not supported.'); - } - get additionalItems() { - return this.get('additionalItems'); - } - set additionalItems(s) { - this.set('additionalItems', s); - } - get items() { - return this.get('items'); - } - set items(s) { - this.set('items', s); - } - get additionalProperties() { - return this.get('additionalProperties'); - } - set additionalProperties(s) { - this.set('additionalProperties', s); - } - get patternProperties() { - throw new Hh('patternProperties getter in Schema class is not not supported.'); - } - set patternProperties(s) { - throw new Hh('patternProperties setter in Schema class is not not supported.'); - } - get dependencies() { - throw new Hh('dependencies getter in Schema class is not not supported.'); - } - set dependencies(s) { - throw new Hh('dependencies setter in Schema class is not not supported.'); - } - get type() { - return this.get('type'); - } - set type(s) { - this.set('type', s); - } - get not() { - return this.get('not'); - } - set not(s) { - this.set('not', s); - } - get definitions() { - throw new Hh('definitions getter in Schema class is not not supported.'); - } - set definitions(s) { - throw new Hh('definitions setter in Schema class is not not supported.'); - } - get base() { - throw new Hh('base getter in Schema class is not not supported.'); - } - set base(s) { - throw new Hh('base setter in Schema class is not not supported.'); - } - get links() { - throw new Hh('links getter in Schema class is not not supported.'); - } - set links(s) { - throw new Hh('links setter in Schema class is not not supported.'); - } - get media() { - throw new Hh('media getter in Schema class is not not supported.'); - } - set media(s) { - throw new Hh('media setter in Schema class is not not supported.'); - } - get nullable() { - return this.get('nullable'); - } - set nullable(s) { - this.set('nullable', s); - } - get discriminator() { - return this.get('discriminator'); - } - set discriminator(s) { - this.set('discriminator', s); - } - get writeOnly() { - return this.get('writeOnly'); - } - set writeOnly(s) { - this.set('writeOnly', s); - } - get xml() { - return this.get('xml'); - } - set xml(s) { - this.set('xml', s); - } - get externalDocs() { - return this.get('externalDocs'); - } - set externalDocs(s) { - this.set('externalDocs', s); - } - get example() { - return this.get('example'); - } - set example(s) { - this.set('example', s); - } - get deprecated() { - return this.get('deprecated'); - } - set deprecated(s) { - this.set('deprecated', s); - } - }; - class SecurityRequirement extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'securityRequirement')); - } - } - const Hf = SecurityRequirement; - class SecurityScheme extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'securityScheme')); - } - get type() { - return this.get('type'); - } - set type(s) { - this.set('type', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get name() { - return this.get('name'); - } - set name(s) { - this.set('name', s); - } - get in() { - return this.get('in'); - } - set in(s) { - this.set('in', s); - } - get scheme() { - return this.get('scheme'); - } - set scheme(s) { - this.set('scheme', s); - } - get bearerFormat() { - return this.get('bearerFormat'); - } - set bearerFormat(s) { - this.set('bearerFormat', s); - } - get flows() { - return this.get('flows'); - } - set flows(s) { - this.set('flows', s); - } - get openIdConnectUrl() { - return this.get('openIdConnectUrl'); - } - set openIdConnectUrl(s) { - this.set('openIdConnectUrl', s); - } - } - const Jf = SecurityScheme; - class Server extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'server')); - } - get url() { - return this.get('url'); - } - set url(s) { - this.set('url', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get variables() { - return this.get('variables'); - } - set variables(s) { - this.set('variables', s); - } - } - const Gf = Server; - class ServerVariable extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'serverVariable')); - } - get enum() { - return this.get('enum'); - } - set enum(s) { - this.set('enum', s); - } - get default() { - return this.get('default'); - } - set default(s) { - this.set('default', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - } - const Xf = ServerVariable; - class Tag extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'tag')); - } - get name() { - return this.get('name'); - } - set name(s) { - this.set('name', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get externalDocs() { - return this.get('externalDocs'); - } - set externalDocs(s) { - this.set('externalDocs', s); - } - } - const Qf = Tag; - class Xml extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'xml')); - } - get name() { - return this.get('name'); - } - set name(s) { - this.set('name', s); - } - get namespace() { - return this.get('namespace'); - } - set namespace(s) { - this.set('namespace', s); - } - get prefix() { - return this.get('prefix'); - } - set prefix(s) { - this.set('prefix', s); - } - get attribute() { - return this.get('attribute'); - } - set attribute(s) { - this.set('attribute', s); - } - get wrapped() { - return this.get('wrapped'); - } - set wrapped(s) { - this.set('wrapped', s); - } - } - const em = Xml; - const tm = class visitors_Visitor_Visitor { - element; - constructor(s = {}) { - Object.assign(this, s); - } - copyMetaAndAttributes(s, o) { - ((s.meta.length > 0 || o.meta.length > 0) && - ((o.meta = deepmerge(o.meta, s.meta)), - hasElementSourceMap(s) && o.meta.set('sourceMap', s.meta.get('sourceMap'))), - (s.attributes.length > 0 || s.meta.length > 0) && - (o.attributes = deepmerge(o.attributes, s.attributes))); - } - }; - const rm = class FallbackVisitor_FallbackVisitor extends tm { - enter(s) { - return ((this.element = cloneDeep(s)), Ju); - } - }; - const nm = class SpecificationVisitor_SpecificationVisitor extends tm { - specObj; - passingOptionsNames = ['specObj', 'openApiGenericElement', 'openApiSemanticElement']; - openApiGenericElement; - openApiSemanticElement; - constructor({ - specObj: s, - passingOptionsNames: o, - openApiGenericElement: i, - openApiSemanticElement: u, - ..._ - }) { - (super({ ..._ }), - (this.specObj = s), - (this.openApiGenericElement = i), - (this.openApiSemanticElement = u), - Array.isArray(o) && (this.passingOptionsNames = o)); - } - retrievePassingOptions() { - return Ad(this.passingOptionsNames, this); - } - retrieveFixedFields(s) { - const o = cp(['visitors', ...s, 'fixedFields'], this.specObj); - return 'object' == typeof o && null !== o ? Object.keys(o) : []; - } - retrieveVisitor(s) { - return Xo(Wl, ['visitors', ...s], this.specObj) - ? cp(['visitors', ...s], this.specObj) - : cp(['visitors', ...s, '$visitor'], this.specObj); - } - retrieveVisitorInstance(s, o = {}) { - const i = this.retrievePassingOptions(); - return new (this.retrieveVisitor(s))({ ...i, ...o }); - } - toRefractedElement(s, o, i = {}) { - const u = this.retrieveVisitorInstance(s, i); - return u instanceof rm && (null == u ? void 0 : u.constructor) === rm - ? cloneDeep(o) - : (visitor_visit(o, u, i), u.element); - } - }, - isReferenceLikeElement = (s) => Fu(s) && s.hasKey('$ref'), - sm = Fu, - om = Fu, - isOpenApiExtension = (s) => Ru(s.key) && Fp('x-', serializers_value(s.key)); - const im = class FixedFieldsVisitor_FixedFieldsVisitor extends nm { - specPath; - ignoredFields; - canSupportSpecificationExtensions = !0; - specificationExtensionPredicate = isOpenApiExtension; - constructor({ - specPath: s, - ignoredFields: o, - canSupportSpecificationExtensions: i, - specificationExtensionPredicate: u, - ..._ - }) { - (super({ ..._ }), - (this.specPath = s), - (this.ignoredFields = o || []), - 'boolean' == typeof i && (this.canSupportSpecificationExtensions = i), - 'function' == typeof u && (this.specificationExtensionPredicate = u)); - } - ObjectElement(s) { - const o = this.specPath(s), - i = this.retrieveFixedFields(o); - return ( - s.forEach((s, u, _) => { - if ( - Ru(u) && - i.includes(serializers_value(u)) && - !this.ignoredFields.includes(serializers_value(u)) - ) { - const i = this.toRefractedElement([...o, 'fixedFields', serializers_value(u)], s), - w = new Cu.Pr(cloneDeep(u), i); - (this.copyMetaAndAttributes(_, w), - w.classes.push('fixed-field'), - this.element.content.push(w)); - } else if ( - this.canSupportSpecificationExtensions && - this.specificationExtensionPredicate(_) - ) { - const s = this.toRefractedElement(['document', 'extension'], _); - this.element.content.push(s); - } else - this.ignoredFields.includes(serializers_value(u)) || - this.element.content.push(cloneDeep(_)); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - }; - class OpenApi3_0Visitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Oh()), - (this.specPath = Tl(['document', 'objects', 'OpenApi'])), - (this.canSupportSpecificationExtensions = !0)); - } - ObjectElement(s) { - return im.prototype.ObjectElement.call(this, s); - } - } - const am = OpenApi3_0Visitor; - class OpenapiVisitor extends Mixin(nm, rm) { - StringElement(s) { - const o = new wh(serializers_value(s)); - return (this.copyMetaAndAttributes(s, o), (this.element = o), Ju); - } - } - const lm = OpenapiVisitor; - const cm = class SpecificationExtensionVisitor extends nm { - MemberElement(s) { - return ( - (this.element = cloneDeep(s)), - this.element.classes.push('specification-extension'), - Ju - ); - } - }; - class InfoVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new rh()), - (this.specPath = Tl(['document', 'objects', 'Info'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const um = InfoVisitor; - const pm = class VersionVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return ( - this.element.classes.push('api-version'), - this.element.classes.push('version'), - o - ); - } - }; - class ContactVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Gp()), - (this.specPath = Tl(['document', 'objects', 'Contact'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const hm = ContactVisitor; - class LicenseVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new uh()), - (this.specPath = Tl(['document', 'objects', 'License'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const dm = LicenseVisitor; - class LinkVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new dh()), - (this.specPath = Tl(['document', 'objects', 'Link'])), - (this.canSupportSpecificationExtensions = !0)); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - (Ru(this.element.operationId) || Ru(this.element.operationRef)) && - this.element.classes.push('reference-element'), - o - ); - } - } - const fm = LinkVisitor; - const mm = class OperationRefVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - const gm = class OperationIdVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - const ym = class PatternedFieldsVisitor_PatternedFieldsVisitor extends nm { - specPath; - ignoredFields; - fieldPatternPredicate = es_F; - canSupportSpecificationExtensions = !1; - specificationExtensionPredicate = isOpenApiExtension; - constructor({ - specPath: s, - ignoredFields: o, - fieldPatternPredicate: i, - canSupportSpecificationExtensions: u, - specificationExtensionPredicate: _, - ...w - }) { - (super({ ...w }), - (this.specPath = s), - (this.ignoredFields = o || []), - 'function' == typeof i && (this.fieldPatternPredicate = i), - 'boolean' == typeof u && (this.canSupportSpecificationExtensions = u), - 'function' == typeof _ && (this.specificationExtensionPredicate = _)); - } - ObjectElement(s) { - return ( - s.forEach((s, o, i) => { - if ( - this.canSupportSpecificationExtensions && - this.specificationExtensionPredicate(i) - ) { - const s = this.toRefractedElement(['document', 'extension'], i); - this.element.content.push(s); - } else if ( - !this.ignoredFields.includes(serializers_value(o)) && - this.fieldPatternPredicate(serializers_value(o)) - ) { - const u = this.specPath(s), - _ = this.toRefractedElement(u, s), - w = new Cu.Pr(cloneDeep(o), _); - (this.copyMetaAndAttributes(i, w), - w.classes.push('patterned-field'), - this.element.content.push(w)); - } else - this.ignoredFields.includes(serializers_value(o)) || - this.element.content.push(cloneDeep(i)); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - }; - const vm = class MapVisitor_MapVisitor extends ym { - constructor(s) { - (super(s), (this.fieldPatternPredicate = Vd)); - } - }; - class LinkParameters extends Cu.Sh { - static primaryClass = 'link-parameters'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(LinkParameters.primaryClass)); - } - } - const bm = LinkParameters; - class ParametersVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), (this.element = new bm()), (this.specPath = Tl(['value']))); - } - } - const _m = ParametersVisitor; - class ServerVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Gf()), - (this.specPath = Tl(['document', 'objects', 'Server'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const Em = ServerVisitor; - const wm = class UrlVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('server-url'), o); - } - }; - class Servers extends Cu.wE { - static primaryClass = 'servers'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(Servers.primaryClass)); - } - } - const Sm = Servers; - class ServersVisitor extends Mixin(nm, rm) { - constructor(s) { - (super(s), (this.element = new Sm())); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = sm(s) ? ['document', 'objects', 'Server'] : ['value'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const xm = ServersVisitor; - class ServerVariableVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Xf()), - (this.specPath = Tl(['document', 'objects', 'ServerVariable'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const km = ServerVariableVisitor; - class ServerVariables extends Cu.Sh { - static primaryClass = 'server-variables'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ServerVariables.primaryClass)); - } - } - const Cm = ServerVariables; - class VariablesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Cm()), - (this.specPath = Tl(['document', 'objects', 'ServerVariable']))); - } - } - const Om = VariablesVisitor; - class MediaTypeVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new fh()), - (this.specPath = Tl(['document', 'objects', 'MediaType'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const Am = MediaTypeVisitor; - const jm = class AlternatingVisitor_AlternatingVisitor extends nm { - alternator; - constructor({ alternator: s, ...o }) { - (super({ ...o }), (this.alternator = s || [])); - } - enter(s) { - const o = this.alternator.map(({ predicate: s, specPath: o }) => lf(s, Tl(o), Nl)), - i = xf(o)(s); - return ((this.element = this.toRefractedElement(i, s)), Ju); - } - }, - Im = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Hp || (s(u) && o('callback', u) && i('object', u)) - ), - Pm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Jp || (s(u) && o('components', u) && i('object', u)) - ), - Mm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Gp || (s(u) && o('contact', u) && i('object', u)) - ), - Tm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Zp || (s(u) && o('example', u) && i('object', u)) - ), - Nm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Qp || (s(u) && o('externalDocumentation', u) && i('object', u)) - ), - Rm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof th || (s(u) && o('header', u) && i('object', u)) - ), - Dm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof rh || (s(u) && o('info', u) && i('object', u)) - ), - Lm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof uh || (s(u) && o('license', u) && i('object', u)) - ), - Bm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof dh || (s(u) && o('link', u) && i('object', u)) - ), - Fm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof wh || (s(u) && o('openapi', u) && i('string', u)) - ), - qm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i, hasClass: u }) => - (_) => - _ instanceof Oh || (s(_) && o('openApi3_0', _) && i('object', _) && u('api', _)) - ), - $m = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof jh || (s(u) && o('operation', u) && i('object', u)) - ), - Vm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Ih || (s(u) && o('parameter', u) && i('object', u)) - ), - Um = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Ph || (s(u) && o('pathItem', u) && i('object', u)) - ), - zm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Rh || (s(u) && o('paths', u) && i('object', u)) - ), - Wm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Dh || (s(u) && o('reference', u) && i('object', u)) - ), - Km = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Lh || (s(u) && o('requestBody', u) && i('object', u)) - ), - Hm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Fh || (s(u) && o('response', u) && i('object', u)) - ), - Jm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Kh || (s(u) && o('responses', u) && i('object', u)) - ), - Gm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Wf || (s(u) && o('schema', u) && i('object', u)) - ), - isBooleanJsonSchemaElement = (s) => Bu(s) && s.classes.includes('boolean-json-schema'), - Ym = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Hf || (s(u) && o('securityRequirement', u) && i('object', u)) - ), - Xm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Jf || (s(u) && o('securityScheme', u) && i('object', u)) - ), - Zm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Gf || (s(u) && o('server', u) && i('object', u)) - ), - Qm = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Xf || (s(u) && o('serverVariable', u) && i('object', u)) - ), - eg = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof fh || (s(u) && o('mediaType', u) && i('object', u)) - ), - rg = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i, hasClass: u }) => - (_) => - _ instanceof Sm || (s(_) && o('array', _) && i('array', _) && u('servers', _)) - ); - class SchemaVisitor extends Mixin(jm, rm) { - constructor(s) { - (super(s), - (this.alternator = [ - { - predicate: isReferenceLikeElement, - specPath: ['document', 'objects', 'Reference'] - }, - { predicate: es_T, specPath: ['document', 'objects', 'Schema'] } - ])); - } - ObjectElement(s) { - const o = jm.prototype.enter.call(this, s); - return ( - Wm(this.element) && this.element.setMetaProperty('referenced-element', 'schema'), - o - ); - } - } - const ng = SchemaVisitor; - class ExamplesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('examples'), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Example']), - (this.canSupportSpecificationExtensions = !0)); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'example'); - }), - o - ); - } - } - const sg = ExamplesVisitor; - class MediaTypeExamples extends Cu.Sh { - static primaryClass = 'media-type-examples'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(MediaTypeExamples.primaryClass), - this.classes.push('examples')); - } - } - const og = MediaTypeExamples; - const lg = class ExamplesVisitor_ExamplesVisitor extends sg { - constructor(s) { - (super(s), (this.element = new og())); - } - }; - class MediaTypeEncoding extends Cu.Sh { - static primaryClass = 'media-type-encoding'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(MediaTypeEncoding.primaryClass)); - } - } - const pg = MediaTypeEncoding; - class EncodingVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new pg()), - (this.specPath = Tl(['document', 'objects', 'Encoding']))); - } - } - const fg = EncodingVisitor; - class SecurityRequirementVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), (this.element = new Hf()), (this.specPath = Tl(['value']))); - } - } - const mg = SecurityRequirementVisitor; - class Security extends Cu.wE { - static primaryClass = 'security'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(Security.primaryClass)); - } - } - const gg = Security; - class SecurityVisitor extends Mixin(nm, rm) { - constructor(s) { - (super(s), (this.element = new gg())); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - if (Fu(s)) { - const o = this.toRefractedElement( - ['document', 'objects', 'SecurityRequirement'], - s - ); - this.element.push(o); - } else this.element.push(cloneDeep(s)); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const yg = SecurityVisitor; - class ComponentsVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Jp()), - (this.specPath = Tl(['document', 'objects', 'Components'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const _g = ComponentsVisitor; - class TagVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Qf()), - (this.specPath = Tl(['document', 'objects', 'Tag'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const xg = TagVisitor; - class ReferenceVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Dh()), - (this.specPath = Tl(['document', 'objects', 'Reference'])), - (this.canSupportSpecificationExtensions = !1)); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return (Ru(this.element.$ref) && this.element.classes.push('reference-element'), o); - } - } - const kg = ReferenceVisitor; - const qg = class $RefVisitor_$RefVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - class ParameterVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Ih()), - (this.specPath = Tl(['document', 'objects', 'Parameter'])), - (this.canSupportSpecificationExtensions = !0)); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - Fu(this.element.contentProp) && - this.element.contentProp.filter(eg).forEach((s, o) => { - s.setMetaProperty('media-type', serializers_value(o)); - }), - o - ); - } - } - const Vg = ParameterVisitor; - class SchemaVisitor_SchemaVisitor extends Mixin(jm, rm) { - constructor(s) { - (super(s), - (this.alternator = [ - { - predicate: isReferenceLikeElement, - specPath: ['document', 'objects', 'Reference'] - }, - { predicate: es_T, specPath: ['document', 'objects', 'Schema'] } - ])); - } - ObjectElement(s) { - const o = jm.prototype.enter.call(this, s); - return ( - Wm(this.element) && this.element.setMetaProperty('referenced-element', 'schema'), - o - ); - } - } - const Ug = SchemaVisitor_SchemaVisitor; - class HeaderVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new th()), - (this.specPath = Tl(['document', 'objects', 'Header'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const zg = HeaderVisitor; - class header_SchemaVisitor_SchemaVisitor extends Mixin(jm, rm) { - constructor(s) { - (super(s), - (this.alternator = [ - { - predicate: isReferenceLikeElement, - specPath: ['document', 'objects', 'Reference'] - }, - { predicate: es_T, specPath: ['document', 'objects', 'Schema'] } - ])); - } - ObjectElement(s) { - const o = jm.prototype.enter.call(this, s); - return ( - Wm(this.element) && this.element.setMetaProperty('referenced-element', 'schema'), - o - ); - } - } - const Wg = header_SchemaVisitor_SchemaVisitor; - class HeaderExamples extends Cu.Sh { - static primaryClass = 'header-examples'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(HeaderExamples.primaryClass), - this.classes.push('examples')); - } - } - const Kg = HeaderExamples; - const Yg = class header_ExamplesVisitor_ExamplesVisitor extends sg { - constructor(s) { - (super(s), (this.element = new Kg())); - } - }; - class ContentVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('content'), - (this.specPath = Tl(['document', 'objects', 'MediaType']))); - } - } - const Xg = ContentVisitor; - class HeaderContent extends Cu.Sh { - static primaryClass = 'header-content'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(HeaderContent.primaryClass), - this.classes.push('content')); - } - } - const Zg = HeaderContent; - const ey = class ContentVisitor_ContentVisitor extends Xg { - constructor(s) { - (super(s), (this.element = new Zg())); - } - }; - class schema_SchemaVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Wf()), - (this.specPath = Tl(['document', 'objects', 'Schema'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const ty = schema_SchemaVisitor, - { allOf: ry } = jf.visitors.document.objects.JSONSchema.fixedFields; - const ny = class AllOfVisitor_AllOfVisitor extends ry { - ArrayElement(s) { - const o = ry.prototype.ArrayElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'schema'); - }), - o - ); - } - }, - { anyOf: sy } = jf.visitors.document.objects.JSONSchema.fixedFields; - const oy = class AnyOfVisitor_AnyOfVisitor extends sy { - ArrayElement(s) { - const o = sy.prototype.ArrayElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'schema'); - }), - o - ); - } - }, - { oneOf: iy } = jf.visitors.document.objects.JSONSchema.fixedFields; - const ay = class OneOfVisitor_OneOfVisitor extends iy { - ArrayElement(s) { - const o = iy.prototype.ArrayElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'schema'); - }), - o - ); - } - }, - { items: ly } = jf.visitors.document.objects.JSONSchema.fixedFields; - const cy = class ItemsVisitor_ItemsVisitor extends ly { - ObjectElement(s) { - const o = ly.prototype.ObjectElement.call(this, s); - return ( - Wm(this.element) && this.element.setMetaProperty('referenced-element', 'schema'), - o - ); - } - ArrayElement(s) { - return this.enter(s); - } - }, - { properties: uy } = jf.visitors.document.objects.JSONSchema.fixedFields; - const py = class PropertiesVisitor_PropertiesVisitor extends uy { - ObjectElement(s) { - const o = uy.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'schema'); - }), - o - ); - } - }, - { type: hy } = jf.visitors.document.objects.JSONSchema.fixedFields; - const dy = class TypeVisitor_TypeVisitor extends hy { - ArrayElement(s) { - return this.enter(s); - } - }, - { JSONSchemaOrJSONReferenceVisitor: fy } = jf.visitors; - const my = class SchemaOrReferenceVisitor_SchemaOrReferenceVisitor extends fy { - ObjectElement(s) { - const o = fy.prototype.enter.call(this, s); - return ( - Wm(this.element) && this.element.setMetaProperty('referenced-element', 'schema'), - o - ); - } - }; - class DiscriminatorVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Yp()), - (this.specPath = Tl(['document', 'objects', 'Discriminator'])), - (this.canSupportSpecificationExtensions = !1)); - } - } - const gy = DiscriminatorVisitor; - class DiscriminatorMapping extends Cu.Sh { - static primaryClass = 'discriminator-mapping'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(DiscriminatorMapping.primaryClass)); - } - } - const yy = DiscriminatorMapping; - class MappingVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), (this.element = new yy()), (this.specPath = Tl(['value']))); - } - } - const vy = MappingVisitor; - class XmlVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new em()), - (this.specPath = Tl(['document', 'objects', 'XML'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const by = XmlVisitor; - class ParameterExamples extends Cu.Sh { - static primaryClass = 'parameter-examples'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(ParameterExamples.primaryClass), - this.classes.push('examples')); - } - } - const _y = ParameterExamples; - const Ey = class parameter_ExamplesVisitor_ExamplesVisitor extends sg { - constructor(s) { - (super(s), (this.element = new _y())); - } - }; - class ParameterContent extends Cu.Sh { - static primaryClass = 'parameter-content'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(ParameterContent.primaryClass), - this.classes.push('content')); - } - } - const wy = ParameterContent; - const Sy = class parameter_ContentVisitor_ContentVisitor extends Xg { - constructor(s) { - (super(s), (this.element = new wy())); - } - }; - class ComponentsSchemas extends Cu.Sh { - static primaryClass = 'components-schemas'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsSchemas.primaryClass)); - } - } - const xy = ComponentsSchemas; - class SchemasVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new xy()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Schema'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'schema'); - }), - o - ); - } - } - const ky = SchemasVisitor; - class ComponentsResponses extends Cu.Sh { - static primaryClass = 'components-responses'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsResponses.primaryClass)); - } - } - const Cy = ComponentsResponses; - class ResponsesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Cy()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Response'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'response'); - }), - this.element.filter(Hm).forEach((s, o) => { - s.setMetaProperty('http-status-code', serializers_value(o)); - }), - o - ); - } - } - const Oy = ResponsesVisitor; - class ComponentsParameters extends Cu.Sh { - static primaryClass = 'components-parameters'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(ComponentsParameters.primaryClass), - this.classes.push('parameters')); - } - } - const Ay = ComponentsParameters; - class ParametersVisitor_ParametersVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Ay()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Parameter'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'parameter'); - }), - o - ); - } - } - const jy = ParametersVisitor_ParametersVisitor; - class ComponentsExamples extends Cu.Sh { - static primaryClass = 'components-examples'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(ComponentsExamples.primaryClass), - this.classes.push('examples')); - } - } - const Iy = ComponentsExamples; - class components_ExamplesVisitor_ExamplesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Iy()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Example'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'example'); - }), - o - ); - } - } - const Py = components_ExamplesVisitor_ExamplesVisitor; - class ComponentsRequestBodies extends Cu.Sh { - static primaryClass = 'components-request-bodies'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsRequestBodies.primaryClass)); - } - } - const My = ComponentsRequestBodies; - class RequestBodiesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new My()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'RequestBody'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'requestBody'); - }), - o - ); - } - } - const Ty = RequestBodiesVisitor; - class ComponentsHeaders extends Cu.Sh { - static primaryClass = 'components-headers'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsHeaders.primaryClass)); - } - } - const Ny = ComponentsHeaders; - class HeadersVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Ny()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Header'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'header'); - }), - this.element.filter(Rm).forEach((s, o) => { - s.setMetaProperty('header-name', serializers_value(o)); - }), - o - ); - } - } - const Ry = HeadersVisitor; - class ComponentsSecuritySchemes extends Cu.Sh { - static primaryClass = 'components-security-schemes'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsSecuritySchemes.primaryClass)); - } - } - const Dy = ComponentsSecuritySchemes; - class SecuritySchemesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Dy()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'SecurityScheme'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'securityScheme'); - }), - o - ); - } - } - const Ly = SecuritySchemesVisitor; - class ComponentsLinks extends Cu.Sh { - static primaryClass = 'components-links'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsLinks.primaryClass)); - } - } - const By = ComponentsLinks; - class LinksVisitor_LinksVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new By()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Link'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'link'); - }), - o - ); - } - } - const Fy = LinksVisitor_LinksVisitor; - class ComponentsCallbacks extends Cu.Sh { - static primaryClass = 'components-callbacks'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsCallbacks.primaryClass)); - } - } - const qy = ComponentsCallbacks; - class CallbacksVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new qy()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Callback'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'callback'); - }), - o - ); - } - } - const $y = CallbacksVisitor; - class ExampleVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Zp()), - (this.specPath = Tl(['document', 'objects', 'Example'])), - (this.canSupportSpecificationExtensions = !0)); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - Ru(this.element.externalValue) && this.element.classes.push('reference-element'), - o - ); - } - } - const Vy = ExampleVisitor; - const Uy = class ExternalValueVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - class ExternalDocumentationVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Qp()), - (this.specPath = Tl(['document', 'objects', 'ExternalDocumentation'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const zy = ExternalDocumentationVisitor; - class encoding_EncodingVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Xp()), - (this.specPath = Tl(['document', 'objects', 'Encoding'])), - (this.canSupportSpecificationExtensions = !0)); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - Fu(this.element.headers) && - this.element.headers.filter(Rm).forEach((s, o) => { - s.setMetaProperty('header-name', serializers_value(o)); - }), - o - ); - } - } - const Wy = encoding_EncodingVisitor; - class EncodingHeaders extends Cu.Sh { - static primaryClass = 'encoding-headers'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(EncodingHeaders.primaryClass)); - } - } - const Ky = EncodingHeaders; - class HeadersVisitor_HeadersVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new Ky()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Header'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'header'); - }), - this.element.forEach((s, o) => { - if (!Rm(s)) return; - const i = serializers_value(o); - s.setMetaProperty('headerName', i); - }), - o - ); - } - } - const Hy = HeadersVisitor_HeadersVisitor; - class PathsVisitor extends Mixin(ym, rm) { - constructor(s) { - (super(s), - (this.element = new Rh()), - (this.specPath = Tl(['document', 'objects', 'PathItem'])), - (this.canSupportSpecificationExtensions = !0), - (this.fieldPatternPredicate = es_T)); - } - ObjectElement(s) { - const o = ym.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Um).forEach((s, o) => { - (o.classes.push('openapi-path-template'), - o.classes.push('path-template'), - s.setMetaProperty('path', cloneDeep(o))); - }), - o - ); - } - } - const Jy = PathsVisitor; - class RequestBodyVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Lh()), - (this.specPath = Tl(['document', 'objects', 'RequestBody']))); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - Fu(this.element.contentProp) && - this.element.contentProp.filter(eg).forEach((s, o) => { - s.setMetaProperty('media-type', serializers_value(o)); - }), - o - ); - } - } - const Gy = RequestBodyVisitor; - class RequestBodyContent extends Cu.Sh { - static primaryClass = 'request-body-content'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(RequestBodyContent.primaryClass), - this.classes.push('content')); - } - } - const Yy = RequestBodyContent; - const Xy = class request_body_ContentVisitor_ContentVisitor extends Xg { - constructor(s) { - (super(s), (this.element = new Yy())); - } - }; - class CallbackVisitor extends Mixin(ym, rm) { - constructor(s) { - (super(s), - (this.element = new Hp()), - (this.specPath = Tl(['document', 'objects', 'PathItem'])), - (this.canSupportSpecificationExtensions = !0), - (this.fieldPatternPredicate = (s) => - /{(?[^}]{1,2083})}/.test(String(s)))); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Um).forEach((s, o) => { - s.setMetaProperty('runtime-expression', serializers_value(o)); - }), - o - ); - } - } - const Zy = CallbackVisitor; - class ResponseVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Fh()), - (this.specPath = Tl(['document', 'objects', 'Response']))); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - Fu(this.element.contentProp) && - this.element.contentProp.filter(eg).forEach((s, o) => { - s.setMetaProperty('media-type', serializers_value(o)); - }), - Fu(this.element.headers) && - this.element.headers.filter(Rm).forEach((s, o) => { - s.setMetaProperty('header-name', serializers_value(o)); - }), - o - ); - } - } - const Qy = ResponseVisitor; - class ResponseHeaders extends Cu.Sh { - static primaryClass = 'response-headers'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ResponseHeaders.primaryClass)); - } - } - const ev = ResponseHeaders; - class response_HeadersVisitor_HeadersVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new ev()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Header'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'header'); - }), - this.element.forEach((s, o) => { - if (!Rm(s)) return; - const i = serializers_value(o); - s.setMetaProperty('header-name', i); - }), - o - ); - } - } - const tv = response_HeadersVisitor_HeadersVisitor; - class ResponseContent extends Cu.Sh { - static primaryClass = 'response-content'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(ResponseContent.primaryClass), - this.classes.push('content')); - } - } - const rv = ResponseContent; - const nv = class response_ContentVisitor_ContentVisitor extends Xg { - constructor(s) { - (super(s), (this.element = new rv())); - } - }; - class ResponseLinks extends Cu.Sh { - static primaryClass = 'response-links'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ResponseLinks.primaryClass)); - } - } - const sv = ResponseLinks; - class response_LinksVisitor_LinksVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new sv()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Link'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'link'); - }), - o - ); - } - } - const ov = response_LinksVisitor_LinksVisitor; - function _isNumber(s) { - return '[object Number]' === Object.prototype.toString.call(s); - } - var iv = _curry2(function range(s, o) { - if (!_isNumber(s) || !_isNumber(o)) - throw new TypeError('Both arguments to range must be numbers'); - for ( - var i = Array(s < o ? o - s : 0), u = s < 0 ? o + Math.abs(s) : o - s, _ = 0; - _ < u; - ) - ((i[_] = _ + s), (_ += 1)); - return i; - }); - const av = iv; - function hasOrAdd(s, o, i) { - var u, - _ = typeof s; - switch (_) { - case 'string': - case 'number': - return 0 === s && 1 / s == -1 / 0 - ? !!i._items['-0'] || (o && (i._items['-0'] = !0), !1) - : null !== i._nativeSet - ? o - ? ((u = i._nativeSet.size), i._nativeSet.add(s), i._nativeSet.size === u) - : i._nativeSet.has(s) - : _ in i._items - ? s in i._items[_] || (o && (i._items[_][s] = !0), !1) - : (o && ((i._items[_] = {}), (i._items[_][s] = !0)), !1); - case 'boolean': - if (_ in i._items) { - var w = s ? 1 : 0; - return !!i._items[_][w] || (o && (i._items[_][w] = !0), !1); - } - return (o && (i._items[_] = s ? [!1, !0] : [!0, !1]), !1); - case 'function': - return null !== i._nativeSet - ? o - ? ((u = i._nativeSet.size), i._nativeSet.add(s), i._nativeSet.size === u) - : i._nativeSet.has(s) - : _ in i._items - ? !!_includes(s, i._items[_]) || (o && i._items[_].push(s), !1) - : (o && (i._items[_] = [s]), !1); - case 'undefined': - return !!i._items[_] || (o && (i._items[_] = !0), !1); - case 'object': - if (null === s) return !!i._items.null || (o && (i._items.null = !0), !1); - default: - return (_ = Object.prototype.toString.call(s)) in i._items - ? !!_includes(s, i._items[_]) || (o && i._items[_].push(s), !1) - : (o && (i._items[_] = [s]), !1); - } - } - const lv = (function () { - function _Set() { - ((this._nativeSet = 'function' == typeof Set ? new Set() : null), (this._items = {})); - } - return ( - (_Set.prototype.add = function (s) { - return !hasOrAdd(s, !0, this); - }), - (_Set.prototype.has = function (s) { - return hasOrAdd(s, !1, this); - }), - _Set - ); - })(); - var cv = _curry2(function difference(s, o) { - for (var i = [], u = 0, _ = s.length, w = o.length, x = new lv(), C = 0; C < w; C += 1) - x.add(o[C]); - for (; u < _; ) (x.add(s[u]) && (i[i.length] = s[u]), (u += 1)); - return i; - }); - const uv = cv; - class MixedFieldsVisitor extends Mixin(im, ym) { - specPathFixedFields; - specPathPatternedFields; - constructor({ specPathFixedFields: s, specPathPatternedFields: o, ...i }) { - (super({ ...i }), (this.specPathFixedFields = s), (this.specPathPatternedFields = o)); - } - ObjectElement(s) { - const { specPath: o, ignoredFields: i } = this; - try { - this.specPath = this.specPathFixedFields; - const o = this.retrieveFixedFields(this.specPath(s)); - ((this.ignoredFields = [...i, ...uv(s.keys(), o)]), - im.prototype.ObjectElement.call(this, s), - (this.specPath = this.specPathPatternedFields), - (this.ignoredFields = o), - ym.prototype.ObjectElement.call(this, s)); - } catch (s) { - throw ((this.specPath = o), s); - } - return Ju; - } - } - const pv = MixedFieldsVisitor; - class responses_ResponsesVisitor extends Mixin(pv, rm) { - constructor(s) { - (super(s), - (this.element = new Kh()), - (this.specPathFixedFields = Tl(['document', 'objects', 'Responses'])), - (this.canSupportSpecificationExtensions = !0), - (this.specPathPatternedFields = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Response']), - (this.fieldPatternPredicate = (s) => - new RegExp(`^(1XX|2XX|3XX|4XX|5XX|${av(100, 600).join('|')})$`).test(String(s)))); - } - ObjectElement(s) { - const o = pv.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'response'); - }), - this.element.filter(Hm).forEach((s, o) => { - const i = cloneDeep(o); - this.fieldPatternPredicate(serializers_value(i)) && - s.setMetaProperty('http-status-code', i); - }), - o - ); - } - } - const hv = responses_ResponsesVisitor; - class DefaultVisitor extends Mixin(jm, rm) { - constructor(s) { - (super(s), - (this.alternator = [ - { - predicate: isReferenceLikeElement, - specPath: ['document', 'objects', 'Reference'] - }, - { predicate: es_T, specPath: ['document', 'objects', 'Response'] } - ])); - } - ObjectElement(s) { - const o = jm.prototype.enter.call(this, s); - return ( - Wm(this.element) - ? this.element.setMetaProperty('referenced-element', 'response') - : Hm(this.element) && this.element.setMetaProperty('http-status-code', 'default'), - o - ); - } - } - const dv = DefaultVisitor; - class OperationVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new jh()), - (this.specPath = Tl(['document', 'objects', 'Operation']))); - } - } - const fv = OperationVisitor; - class OperationTags extends Cu.wE { - static primaryClass = 'operation-tags'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(OperationTags.primaryClass)); - } - } - const mv = OperationTags; - const gv = class TagsVisitor extends rm { - constructor(s) { - (super(s), (this.element = new mv())); - } - ArrayElement(s) { - return ((this.element = this.element.concat(cloneDeep(s))), Ju); - } - }; - class OperationParameters extends Cu.wE { - static primaryClass = 'operation-parameters'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(OperationParameters.primaryClass), - this.classes.push('parameters')); - } - } - const yv = OperationParameters; - class open_api_3_0_ParametersVisitor_ParametersVisitor extends Mixin(nm, rm) { - constructor(s) { - (super(s), (this.element = new Cu.wE()), this.element.classes.push('parameters')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Parameter'], - i = this.toRefractedElement(o, s); - (Wm(i) && i.setMetaProperty('referenced-element', 'parameter'), - this.element.push(i)); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const vv = open_api_3_0_ParametersVisitor_ParametersVisitor; - const bv = class operation_ParametersVisitor_ParametersVisitor extends vv { - constructor(s) { - (super(s), (this.element = new yv())); - } - }; - const _v = class RequestBodyVisitor_RequestBodyVisitor extends jm { - constructor(s) { - (super(s), - (this.alternator = [ - { - predicate: isReferenceLikeElement, - specPath: ['document', 'objects', 'Reference'] - }, - { predicate: es_T, specPath: ['document', 'objects', 'RequestBody'] } - ])); - } - ObjectElement(s) { - const o = jm.prototype.enter.call(this, s); - return ( - Wm(this.element) && this.element.setMetaProperty('referenced-element', 'requestBody'), - o - ); - } - }; - class OperationCallbacks extends Cu.Sh { - static primaryClass = 'operation-callbacks'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(OperationCallbacks.primaryClass)); - } - } - const Ev = OperationCallbacks; - class CallbacksVisitor_CallbacksVisitor extends Mixin(vm, rm) { - specPath; - constructor(s) { - (super(s), - (this.element = new Ev()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'Callback'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(Wm).forEach((s) => { - s.setMetaProperty('referenced-element', 'callback'); - }), - o - ); - } - } - const wv = CallbacksVisitor_CallbacksVisitor; - class OperationSecurity extends Cu.wE { - static primaryClass = 'operation-security'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(OperationSecurity.primaryClass), - this.classes.push('security')); - } - } - const Sv = OperationSecurity; - class SecurityVisitor_SecurityVisitor extends Mixin(nm, rm) { - constructor(s) { - (super(s), (this.element = new Sv())); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = Fu(s) ? ['document', 'objects', 'SecurityRequirement'] : ['value'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const xv = SecurityVisitor_SecurityVisitor; - class OperationServers extends Cu.wE { - static primaryClass = 'operation-servers'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(OperationServers.primaryClass), - this.classes.push('servers')); - } - } - const kv = OperationServers; - const Cv = class ServersVisitor_ServersVisitor extends xm { - constructor(s) { - (super(s), (this.element = new kv())); - } - }; - class PathItemVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Ph()), - (this.specPath = Tl(['document', 'objects', 'PathItem']))); - } - ObjectElement(s) { - const o = im.prototype.ObjectElement.call(this, s); - return ( - this.element.filter($m).forEach((s, o) => { - const i = cloneDeep(o); - ((i.content = serializers_value(i).toUpperCase()), - s.setMetaProperty('http-method', i)); - }), - Ru(this.element.$ref) && this.element.classes.push('reference-element'), - o - ); - } - } - const Ov = PathItemVisitor; - const Av = class path_item_$RefVisitor_$RefVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - class PathItemServers extends Cu.wE { - static primaryClass = 'path-item-servers'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(PathItemServers.primaryClass), - this.classes.push('servers')); - } - } - const jv = PathItemServers; - const Iv = class path_item_ServersVisitor_ServersVisitor extends xm { - constructor(s) { - (super(s), (this.element = new jv())); - } - }; - class PathItemParameters extends Cu.wE { - static primaryClass = 'path-item-parameters'; - constructor(s, o, i) { - (super(s, o, i), - this.classes.push(PathItemParameters.primaryClass), - this.classes.push('parameters')); - } - } - const Pv = PathItemParameters; - const Mv = class path_item_ParametersVisitor_ParametersVisitor extends vv { - constructor(s) { - (super(s), (this.element = new Pv())); - } - }; - class SecuritySchemeVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new Jf()), - (this.specPath = Tl(['document', 'objects', 'SecurityScheme'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const Tv = SecuritySchemeVisitor; - class OAuthFlowsVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new _h()), - (this.specPath = Tl(['document', 'objects', 'OAuthFlows'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const Nv = OAuthFlowsVisitor; - class OAuthFlowVisitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new vh()), - (this.specPath = Tl(['document', 'objects', 'OAuthFlow'])), - (this.canSupportSpecificationExtensions = !0)); - } - } - const Rv = OAuthFlowVisitor; - class OAuthFlowScopes extends Cu.Sh { - static primaryClass = 'oauth-flow-scopes'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(OAuthFlowScopes.primaryClass)); - } - } - const Dv = OAuthFlowScopes; - class ScopesVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), (this.element = new Dv()), (this.specPath = Tl(['value']))); - } - } - const Lv = ScopesVisitor; - class Tags extends Cu.wE { - static primaryClass = 'tags'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(Tags.primaryClass)); - } - } - const Bv = Tags; - class TagsVisitor_TagsVisitor extends Mixin(nm, rm) { - constructor(s) { - (super(s), (this.element = new Bv())); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - const o = om(s) ? ['document', 'objects', 'Tag'] : ['value'], - i = this.toRefractedElement(o, s); - this.element.push(i); - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const Fv = TagsVisitor_TagsVisitor, - { fixedFields: qv } = jf.visitors.document.objects.JSONSchema, - $v = { - visitors: { - value: rm, - document: { - objects: { - OpenApi: { - $visitor: am, - fixedFields: { - openapi: lm, - info: { $ref: '#/visitors/document/objects/Info' }, - servers: xm, - paths: { $ref: '#/visitors/document/objects/Paths' }, - components: { $ref: '#/visitors/document/objects/Components' }, - security: yg, - tags: Fv, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' } - } - }, - Info: { - $visitor: um, - fixedFields: { - title: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - termsOfService: { $ref: '#/visitors/value' }, - contact: { $ref: '#/visitors/document/objects/Contact' }, - license: { $ref: '#/visitors/document/objects/License' }, - version: pm - } - }, - Contact: { - $visitor: hm, - fixedFields: { - name: { $ref: '#/visitors/value' }, - url: { $ref: '#/visitors/value' }, - email: { $ref: '#/visitors/value' } - } - }, - License: { - $visitor: dm, - fixedFields: { - name: { $ref: '#/visitors/value' }, - url: { $ref: '#/visitors/value' } - } - }, - Server: { - $visitor: Em, - fixedFields: { - url: wm, - description: { $ref: '#/visitors/value' }, - variables: Om - } - }, - ServerVariable: { - $visitor: km, - fixedFields: { - enum: { $ref: '#/visitors/value' }, - default: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' } - } - }, - Components: { - $visitor: _g, - fixedFields: { - schemas: ky, - responses: Oy, - parameters: jy, - examples: Py, - requestBodies: Ty, - headers: Ry, - securitySchemes: Ly, - links: Fy, - callbacks: $y - } - }, - Paths: { $visitor: Jy }, - PathItem: { - $visitor: Ov, - fixedFields: { - $ref: Av, - summary: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - get: { $ref: '#/visitors/document/objects/Operation' }, - put: { $ref: '#/visitors/document/objects/Operation' }, - post: { $ref: '#/visitors/document/objects/Operation' }, - delete: { $ref: '#/visitors/document/objects/Operation' }, - options: { $ref: '#/visitors/document/objects/Operation' }, - head: { $ref: '#/visitors/document/objects/Operation' }, - patch: { $ref: '#/visitors/document/objects/Operation' }, - trace: { $ref: '#/visitors/document/objects/Operation' }, - servers: Iv, - parameters: Mv - } - }, - Operation: { - $visitor: fv, - fixedFields: { - tags: gv, - summary: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' }, - operationId: { $ref: '#/visitors/value' }, - parameters: bv, - requestBody: _v, - responses: { $ref: '#/visitors/document/objects/Responses' }, - callbacks: wv, - deprecated: { $ref: '#/visitors/value' }, - security: xv, - servers: Cv - } - }, - ExternalDocumentation: { - $visitor: zy, - fixedFields: { - description: { $ref: '#/visitors/value' }, - url: { $ref: '#/visitors/value' } - } - }, - Parameter: { - $visitor: Vg, - fixedFields: { - name: { $ref: '#/visitors/value' }, - in: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - required: { $ref: '#/visitors/value' }, - deprecated: { $ref: '#/visitors/value' }, - allowEmptyValue: { $ref: '#/visitors/value' }, - style: { $ref: '#/visitors/value' }, - explode: { $ref: '#/visitors/value' }, - allowReserved: { $ref: '#/visitors/value' }, - schema: Ug, - example: { $ref: '#/visitors/value' }, - examples: Ey, - content: Sy - } - }, - RequestBody: { - $visitor: Gy, - fixedFields: { - description: { $ref: '#/visitors/value' }, - content: Xy, - required: { $ref: '#/visitors/value' } - } - }, - MediaType: { - $visitor: Am, - fixedFields: { - schema: ng, - example: { $ref: '#/visitors/value' }, - examples: lg, - encoding: fg - } - }, - Encoding: { - $visitor: Wy, - fixedFields: { - contentType: { $ref: '#/visitors/value' }, - headers: Hy, - style: { $ref: '#/visitors/value' }, - explode: { $ref: '#/visitors/value' }, - allowReserved: { $ref: '#/visitors/value' } - } - }, - Responses: { $visitor: hv, fixedFields: { default: dv } }, - Response: { - $visitor: Qy, - fixedFields: { - description: { $ref: '#/visitors/value' }, - headers: tv, - content: nv, - links: ov - } - }, - Callback: { $visitor: Zy }, - Example: { - $visitor: Vy, - fixedFields: { - summary: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - value: { $ref: '#/visitors/value' }, - externalValue: Uy - } - }, - Link: { - $visitor: fm, - fixedFields: { - operationRef: mm, - operationId: gm, - parameters: _m, - requestBody: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - server: { $ref: '#/visitors/document/objects/Server' } - } - }, - Header: { - $visitor: zg, - fixedFields: { - description: { $ref: '#/visitors/value' }, - required: { $ref: '#/visitors/value' }, - deprecated: { $ref: '#/visitors/value' }, - allowEmptyValue: { $ref: '#/visitors/value' }, - style: { $ref: '#/visitors/value' }, - explode: { $ref: '#/visitors/value' }, - allowReserved: { $ref: '#/visitors/value' }, - schema: Wg, - example: { $ref: '#/visitors/value' }, - examples: Yg, - content: ey - } - }, - Tag: { - $visitor: xg, - fixedFields: { - name: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' } - } - }, - Reference: { $visitor: kg, fixedFields: { $ref: qg } }, - JSONSchema: { $ref: '#/visitors/document/objects/Schema' }, - JSONReference: { $ref: '#/visitors/document/objects/Reference' }, - Schema: { - $visitor: ty, - fixedFields: { - title: qv.title, - multipleOf: qv.multipleOf, - maximum: qv.maximum, - exclusiveMaximum: qv.exclusiveMaximum, - minimum: qv.minimum, - exclusiveMinimum: qv.exclusiveMinimum, - maxLength: qv.maxLength, - minLength: qv.minLength, - pattern: qv.pattern, - maxItems: qv.maxItems, - minItems: qv.minItems, - uniqueItems: qv.uniqueItems, - maxProperties: qv.maxProperties, - minProperties: qv.minProperties, - required: qv.required, - enum: qv.enum, - type: dy, - allOf: ny, - anyOf: oy, - oneOf: ay, - not: my, - items: cy, - properties: py, - additionalProperties: my, - description: qv.description, - format: qv.format, - default: qv.default, - nullable: { $ref: '#/visitors/value' }, - discriminator: { $ref: '#/visitors/document/objects/Discriminator' }, - writeOnly: { $ref: '#/visitors/value' }, - xml: { $ref: '#/visitors/document/objects/XML' }, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' }, - example: { $ref: '#/visitors/value' }, - deprecated: { $ref: '#/visitors/value' } - } - }, - Discriminator: { - $visitor: gy, - fixedFields: { propertyName: { $ref: '#/visitors/value' }, mapping: vy } - }, - XML: { - $visitor: by, - fixedFields: { - name: { $ref: '#/visitors/value' }, - namespace: { $ref: '#/visitors/value' }, - prefix: { $ref: '#/visitors/value' }, - attribute: { $ref: '#/visitors/value' }, - wrapped: { $ref: '#/visitors/value' } - } - }, - SecurityScheme: { - $visitor: Tv, - fixedFields: { - type: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - name: { $ref: '#/visitors/value' }, - in: { $ref: '#/visitors/value' }, - scheme: { $ref: '#/visitors/value' }, - bearerFormat: { $ref: '#/visitors/value' }, - flows: { $ref: '#/visitors/document/objects/OAuthFlows' }, - openIdConnectUrl: { $ref: '#/visitors/value' } - } - }, - OAuthFlows: { - $visitor: Nv, - fixedFields: { - implicit: { $ref: '#/visitors/document/objects/OAuthFlow' }, - password: { $ref: '#/visitors/document/objects/OAuthFlow' }, - clientCredentials: { $ref: '#/visitors/document/objects/OAuthFlow' }, - authorizationCode: { $ref: '#/visitors/document/objects/OAuthFlow' } - } - }, - OAuthFlow: { - $visitor: Rv, - fixedFields: { - authorizationUrl: { $ref: '#/visitors/value' }, - tokenUrl: { $ref: '#/visitors/value' }, - refreshUrl: { $ref: '#/visitors/value' }, - scopes: Lv - } - }, - SecurityRequirement: { $visitor: mg } - }, - extension: { $visitor: cm } - } - } - }, - es_traversal_visitor_getNodeType = (s) => { - if (Nu(s)) return `${s.element.charAt(0).toUpperCase() + s.element.slice(1)}Element`; - }, - Vv = { - CallbackElement: ['content'], - ComponentsElement: ['content'], - ContactElement: ['content'], - DiscriminatorElement: ['content'], - Encoding: ['content'], - Example: ['content'], - ExternalDocumentationElement: ['content'], - HeaderElement: ['content'], - InfoElement: ['content'], - LicenseElement: ['content'], - MediaTypeElement: ['content'], - OAuthFlowElement: ['content'], - OAuthFlowsElement: ['content'], - OpenApi3_0Element: ['content'], - OperationElement: ['content'], - ParameterElement: ['content'], - PathItemElement: ['content'], - PathsElement: ['content'], - ReferenceElement: ['content'], - RequestBodyElement: ['content'], - ResponseElement: ['content'], - ResponsesElement: ['content'], - SchemaElement: ['content'], - SecurityRequirementElement: ['content'], - SecuritySchemeElement: ['content'], - ServerElement: ['content'], - ServerVariableElement: ['content'], - TagElement: ['content'], - ...Qu - }, - Uv = { - namespace: (s) => { - const { base: o } = s; - return ( - o.register('callback', Hp), - o.register('components', Jp), - o.register('contact', Gp), - o.register('discriminator', Yp), - o.register('encoding', Xp), - o.register('example', Zp), - o.register('externalDocumentation', Qp), - o.register('header', th), - o.register('info', rh), - o.register('license', uh), - o.register('link', dh), - o.register('mediaType', fh), - o.register('oAuthFlow', vh), - o.register('oAuthFlows', _h), - o.register('openapi', wh), - o.register('openApi3_0', Oh), - o.register('operation', jh), - o.register('parameter', Ih), - o.register('pathItem', Ph), - o.register('paths', Rh), - o.register('reference', Dh), - o.register('requestBody', Lh), - o.register('response', Fh), - o.register('responses', Kh), - o.register('schema', Wf), - o.register('securityRequirement', Hf), - o.register('securityScheme', Jf), - o.register('server', Gf), - o.register('serverVariable', Xf), - o.register('tag', Qf), - o.register('xml', em), - o - ); - } - }, - zv = Uv, - es_refractor_toolbox = () => { - const s = createNamespace(zv); - return { - predicates: { - ...pe, - isElement: Nu, - isStringElement: Ru, - isArrayElement: qu, - isObjectElement: Fu, - isMemberElement: $u, - includesClasses, - hasElementSourceMap - }, - namespace: s - }; - }, - es_refractor_refract = ( - s, - { - specPath: o = ['visitors', 'document', 'objects', 'OpenApi', '$visitor'], - plugins: i = [] - } = {} - ) => { - const u = (0, Cu.e)(s), - _ = dereference($v), - w = new (cp(o, _))({ specObj: _ }); - return ( - visitor_visit(u, w), - dispatchPluginsSync(w.element, i, { - toolboxCreator: es_refractor_toolbox, - visitorOptions: { keyMap: Vv, nodeTypeGetter: es_traversal_visitor_getNodeType } - }) - ); - }, - es_refractor_createRefractor = - (s) => - (o, i = {}) => - es_refractor_refract(o, { specPath: s, ...i }); - ((Hp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Callback', - '$visitor' - ])), - (Jp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Components', - '$visitor' - ])), - (Gp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Contact', - '$visitor' - ])), - (Zp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Example', - '$visitor' - ])), - (Yp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Discriminator', - '$visitor' - ])), - (Xp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Encoding', - '$visitor' - ])), - (Qp.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'ExternalDocumentation', - '$visitor' - ])), - (th.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Header', - '$visitor' - ])), - (rh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Info', - '$visitor' - ])), - (uh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'License', - '$visitor' - ])), - (dh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Link', - '$visitor' - ])), - (fh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'MediaType', - '$visitor' - ])), - (vh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OAuthFlow', - '$visitor' - ])), - (_h.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OAuthFlows', - '$visitor' - ])), - (wh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OpenApi', - 'fixedFields', - 'openapi' - ])), - (Oh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OpenApi', - '$visitor' - ])), - (jh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Operation', - '$visitor' - ])), - (Ih.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Parameter', - '$visitor' - ])), - (Ph.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'PathItem', - '$visitor' - ])), - (Rh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Paths', - '$visitor' - ])), - (Dh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Reference', - '$visitor' - ])), - (Lh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'RequestBody', - '$visitor' - ])), - (Fh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Response', - '$visitor' - ])), - (Kh.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Responses', - '$visitor' - ])), - (Wf.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Schema', - '$visitor' - ])), - (Hf.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'SecurityRequirement', - '$visitor' - ])), - (Jf.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'SecurityScheme', - '$visitor' - ])), - (Gf.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Server', - '$visitor' - ])), - (Xf.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'ServerVariable', - '$visitor' - ])), - (Qf.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Tag', - '$visitor' - ])), - (em.refract = es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'XML', - '$visitor' - ]))); - const Wv = class Callback_Callback extends Hp {}; - const Kv = class Components_Components extends Jp { - get pathItems() { - return this.get('pathItems'); - } - set pathItems(s) { - this.set('pathItems', s); - } - }; - const Hv = class Contact_Contact extends Gp {}; - const Jv = class Discriminator_Discriminator extends Yp {}; - const Gv = class Encoding_Encoding extends Xp {}; - const Yv = class Example_Example extends Zp {}; - const Xv = class ExternalDocumentation_ExternalDocumentation extends Qp {}; - const Zv = class Header_Header extends th { - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - }; - const Qv = class Info_Info extends rh { - get license() { - return this.get('license'); - } - set license(s) { - this.set('license', s); - } - get summary() { - return this.get('summary'); - } - set summary(s) { - this.set('summary', s); - } - }; - class JsonSchemaDialect extends Cu.Om { - static default = new JsonSchemaDialect('https://spec.openapis.org/oas/3.1/dialect/base'); - constructor(s, o, i) { - (super(s, o, i), (this.element = 'jsonSchemaDialect')); - } - } - const eb = JsonSchemaDialect; - const tb = class License_License extends uh { - get identifier() { - return this.get('identifier'); - } - set identifier(s) { - this.set('identifier', s); - } - }; - const nb = class Link_Link extends dh {}; - const pb = class MediaType_MediaType extends fh { - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - }; - const mb = class OAuthFlow_OAuthFlow extends vh {}; - const yb = class OAuthFlows_OAuthFlows extends _h {}; - const _b = class Openapi_Openapi extends wh {}; - class OpenApi3_1 extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'openApi3_1'), this.classes.push('api')); - } - get openapi() { - return this.get('openapi'); - } - set openapi(s) { - this.set('openapi', s); - } - get info() { - return this.get('info'); - } - set info(s) { - this.set('info', s); - } - get jsonSchemaDialect() { - return this.get('jsonSchemaDialect'); - } - set jsonSchemaDialect(s) { - this.set('jsonSchemaDialect', s); - } - get servers() { - return this.get('servers'); - } - set servers(s) { - this.set('servers', s); - } - get paths() { - return this.get('paths'); - } - set paths(s) { - this.set('paths', s); - } - get components() { - return this.get('components'); - } - set components(s) { - this.set('components', s); - } - get security() { - return this.get('security'); - } - set security(s) { - this.set('security', s); - } - get tags() { - return this.get('tags'); - } - set tags(s) { - this.set('tags', s); - } - get externalDocs() { - return this.get('externalDocs'); - } - set externalDocs(s) { - this.set('externalDocs', s); - } - get webhooks() { - return this.get('webhooks'); - } - set webhooks(s) { - this.set('webhooks', s); - } - } - const wb = OpenApi3_1; - const Sb = class Operation_Operation extends jh { - get requestBody() { - return this.get('requestBody'); - } - set requestBody(s) { - this.set('requestBody', s); - } - }; - const Ob = class Parameter_Parameter extends Ih { - get schema() { - return this.get('schema'); - } - set schema(s) { - this.set('schema', s); - } - }; - const Ab = class PathItem_PathItem extends Ph { - get GET() { - return this.get('get'); - } - set GET(s) { - this.set('GET', s); - } - get PUT() { - return this.get('put'); - } - set PUT(s) { - this.set('PUT', s); - } - get POST() { - return this.get('post'); - } - set POST(s) { - this.set('POST', s); - } - get DELETE() { - return this.get('delete'); - } - set DELETE(s) { - this.set('DELETE', s); - } - get OPTIONS() { - return this.get('options'); - } - set OPTIONS(s) { - this.set('OPTIONS', s); - } - get HEAD() { - return this.get('head'); - } - set HEAD(s) { - this.set('HEAD', s); - } - get PATCH() { - return this.get('patch'); - } - set PATCH(s) { - this.set('PATCH', s); - } - get TRACE() { - return this.get('trace'); - } - set TRACE(s) { - this.set('TRACE', s); - } - }; - const Ib = class Paths_Paths extends Rh {}; - class Reference_Reference extends Dh {} - (Object.defineProperty(Reference_Reference.prototype, 'description', { - get() { - return this.get('description'); - }, - set(s) { - this.set('description', s); - }, - enumerable: !0 - }), - Object.defineProperty(Reference_Reference.prototype, 'summary', { - get() { - return this.get('summary'); - }, - set(s) { - this.set('summary', s); - }, - enumerable: !0 - })); - const Pb = Reference_Reference; - const Mb = class RequestBody_RequestBody extends Lh {}; - const Rb = class elements_Response_Response extends Fh {}; - const Lb = class Responses_Responses extends Kh {}; - class elements_Schema_Schema extends Cu.Sh { - constructor(s, o, i) { - (super(s, o, i), (this.element = 'schema')); - } - get $schema() { - return this.get('$schema'); - } - set $schema(s) { - this.set('$schema', s); - } - get $vocabulary() { - return this.get('$vocabulary'); - } - set $vocabulary(s) { - this.set('$vocabulary', s); - } - get $id() { - return this.get('$id'); - } - set $id(s) { - this.set('$id', s); - } - get $anchor() { - return this.get('$anchor'); - } - set $anchor(s) { - this.set('$anchor', s); - } - get $dynamicAnchor() { - return this.get('$dynamicAnchor'); - } - set $dynamicAnchor(s) { - this.set('$dynamicAnchor', s); - } - get $dynamicRef() { - return this.get('$dynamicRef'); - } - set $dynamicRef(s) { - this.set('$dynamicRef', s); - } - get $ref() { - return this.get('$ref'); - } - set $ref(s) { - this.set('$ref', s); - } - get $defs() { - return this.get('$defs'); - } - set $defs(s) { - this.set('$defs', s); - } - get $comment() { - return this.get('$comment'); - } - set $comment(s) { - this.set('$comment', s); - } - get allOf() { - return this.get('allOf'); - } - set allOf(s) { - this.set('allOf', s); - } - get anyOf() { - return this.get('anyOf'); - } - set anyOf(s) { - this.set('anyOf', s); - } - get oneOf() { - return this.get('oneOf'); - } - set oneOf(s) { - this.set('oneOf', s); - } - get not() { - return this.get('not'); - } - set not(s) { - this.set('not', s); - } - get if() { - return this.get('if'); - } - set if(s) { - this.set('if', s); - } - get then() { - return this.get('then'); - } - set then(s) { - this.set('then', s); - } - get else() { - return this.get('else'); - } - set else(s) { - this.set('else', s); - } - get dependentSchemas() { - return this.get('dependentSchemas'); - } - set dependentSchemas(s) { - this.set('dependentSchemas', s); - } - get prefixItems() { - return this.get('prefixItems'); - } - set prefixItems(s) { - this.set('prefixItems', s); - } - get items() { - return this.get('items'); - } - set items(s) { - this.set('items', s); - } - get containsProp() { - return this.get('contains'); - } - set containsProp(s) { - this.set('contains', s); - } - get properties() { - return this.get('properties'); - } - set properties(s) { - this.set('properties', s); - } - get patternProperties() { - return this.get('patternProperties'); - } - set patternProperties(s) { - this.set('patternProperties', s); - } - get additionalProperties() { - return this.get('additionalProperties'); - } - set additionalProperties(s) { - this.set('additionalProperties', s); - } - get propertyNames() { - return this.get('propertyNames'); - } - set propertyNames(s) { - this.set('propertyNames', s); - } - get unevaluatedItems() { - return this.get('unevaluatedItems'); - } - set unevaluatedItems(s) { - this.set('unevaluatedItems', s); - } - get unevaluatedProperties() { - return this.get('unevaluatedProperties'); - } - set unevaluatedProperties(s) { - this.set('unevaluatedProperties', s); - } - get type() { - return this.get('type'); - } - set type(s) { - this.set('type', s); - } - get enum() { - return this.get('enum'); - } - set enum(s) { - this.set('enum', s); - } - get const() { - return this.get('const'); - } - set const(s) { - this.set('const', s); - } - get multipleOf() { - return this.get('multipleOf'); - } - set multipleOf(s) { - this.set('multipleOf', s); - } - get maximum() { - return this.get('maximum'); - } - set maximum(s) { - this.set('maximum', s); - } - get exclusiveMaximum() { - return this.get('exclusiveMaximum'); - } - set exclusiveMaximum(s) { - this.set('exclusiveMaximum', s); - } - get minimum() { - return this.get('minimum'); - } - set minimum(s) { - this.set('minimum', s); - } - get exclusiveMinimum() { - return this.get('exclusiveMinimum'); - } - set exclusiveMinimum(s) { - this.set('exclusiveMinimum', s); - } - get maxLength() { - return this.get('maxLength'); - } - set maxLength(s) { - this.set('maxLength', s); - } - get minLength() { - return this.get('minLength'); - } - set minLength(s) { - this.set('minLength', s); - } - get pattern() { - return this.get('pattern'); - } - set pattern(s) { - this.set('pattern', s); - } - get maxItems() { - return this.get('maxItems'); - } - set maxItems(s) { - this.set('maxItems', s); - } - get minItems() { - return this.get('minItems'); - } - set minItems(s) { - this.set('minItems', s); - } - get uniqueItems() { - return this.get('uniqueItems'); - } - set uniqueItems(s) { - this.set('uniqueItems', s); - } - get maxContains() { - return this.get('maxContains'); - } - set maxContains(s) { - this.set('maxContains', s); - } - get minContains() { - return this.get('minContains'); - } - set minContains(s) { - this.set('minContains', s); - } - get maxProperties() { - return this.get('maxProperties'); - } - set maxProperties(s) { - this.set('maxProperties', s); - } - get minProperties() { - return this.get('minProperties'); - } - set minProperties(s) { - this.set('minProperties', s); - } - get required() { - return this.get('required'); - } - set required(s) { - this.set('required', s); - } - get dependentRequired() { - return this.get('dependentRequired'); - } - set dependentRequired(s) { - this.set('dependentRequired', s); - } - get title() { - return this.get('title'); - } - set title(s) { - this.set('title', s); - } - get description() { - return this.get('description'); - } - set description(s) { - this.set('description', s); - } - get default() { - return this.get('default'); - } - set default(s) { - this.set('default', s); - } - get deprecated() { - return this.get('deprecated'); - } - set deprecated(s) { - this.set('deprecated', s); - } - get readOnly() { - return this.get('readOnly'); - } - set readOnly(s) { - this.set('readOnly', s); - } - get writeOnly() { - return this.get('writeOnly'); - } - set writeOnly(s) { - this.set('writeOnly', s); - } - get examples() { - return this.get('examples'); - } - set examples(s) { - this.set('examples', s); - } - get format() { - return this.get('format'); - } - set format(s) { - this.set('format', s); - } - get contentEncoding() { - return this.get('contentEncoding'); - } - set contentEncoding(s) { - this.set('contentEncoding', s); - } - get contentMediaType() { - return this.get('contentMediaType'); - } - set contentMediaType(s) { - this.set('contentMediaType', s); - } - get contentSchema() { - return this.get('contentSchema'); - } - set contentSchema(s) { - this.set('contentSchema', s); - } - get discriminator() { - return this.get('discriminator'); - } - set discriminator(s) { - this.set('discriminator', s); - } - get xml() { - return this.get('xml'); - } - set xml(s) { - this.set('xml', s); - } - get externalDocs() { - return this.get('externalDocs'); - } - set externalDocs(s) { - this.set('externalDocs', s); - } - get example() { - return this.get('example'); - } - set example(s) { - this.set('example', s); - } - } - const qb = elements_Schema_Schema; - const zb = class SecurityRequirement_SecurityRequirement extends Hf {}; - const Qb = class SecurityScheme_SecurityScheme extends Jf {}; - const e_ = class Server_Server extends Gf {}; - const t_ = class ServerVariable_ServerVariable extends Xf {}; - const r_ = class Tag_Tag extends Qf {}; - const n_ = class Xml_Xml extends em {}; - class OpenApi3_1Visitor extends Mixin(im, rm) { - constructor(s) { - (super(s), - (this.element = new wb()), - (this.specPath = Tl(['document', 'objects', 'OpenApi'])), - (this.canSupportSpecificationExtensions = !0), - (this.openApiSemanticElement = this.element)); - } - ObjectElement(s) { - return ((this.openApiGenericElement = s), im.prototype.ObjectElement.call(this, s)); - } - } - const s_ = OpenApi3_1Visitor, - { - visitors: { - document: { - objects: { - Info: { $visitor: o_ } - } - } - } - } = $v; - const i_ = class info_InfoVisitor extends o_ { - constructor(s) { - (super(s), (this.element = new Qv())); - } - }, - { - visitors: { - document: { - objects: { - Contact: { $visitor: a_ } - } - } - } - } = $v; - const l_ = class contact_ContactVisitor extends a_ { - constructor(s) { - (super(s), (this.element = new Hv())); - } - }, - { - visitors: { - document: { - objects: { - License: { $visitor: c_ } - } - } - } - } = $v; - const u_ = class license_LicenseVisitor extends c_ { - constructor(s) { - (super(s), (this.element = new tb())); - } - }, - { - visitors: { - document: { - objects: { - Link: { $visitor: p_ } - } - } - } - } = $v; - const h_ = class link_LinkVisitor extends p_ { - constructor(s) { - (super(s), (this.element = new nb())); - } - }; - class JsonSchemaDialectVisitor extends Mixin(nm, rm) { - StringElement(s) { - const o = new eb(serializers_value(s)); - return (this.copyMetaAndAttributes(s, o), (this.element = o), Ju); - } - } - const d_ = JsonSchemaDialectVisitor, - { - visitors: { - document: { - objects: { - Server: { $visitor: f_ } - } - } - } - } = $v; - const m_ = class server_ServerVisitor extends f_ { - constructor(s) { - (super(s), (this.element = new e_())); - } - }, - { - visitors: { - document: { - objects: { - ServerVariable: { $visitor: g_ } - } - } - } - } = $v; - const y_ = class server_variable_ServerVariableVisitor extends g_ { - constructor(s) { - (super(s), (this.element = new t_())); - } - }, - { - visitors: { - document: { - objects: { - MediaType: { $visitor: v_ } - } - } - } - } = $v; - const b_ = class media_type_MediaTypeVisitor extends v_ { - constructor(s) { - (super(s), (this.element = new pb())); - } - }, - { - visitors: { - document: { - objects: { - SecurityRequirement: { $visitor: E_ } - } - } - } - } = $v; - const w_ = class security_requirement_SecurityRequirementVisitor extends E_ { - constructor(s) { - (super(s), (this.element = new zb())); - } - }, - { - visitors: { - document: { - objects: { - Components: { $visitor: S_ } - } - } - } - } = $v; - const x_ = class components_ComponentsVisitor extends S_ { - constructor(s) { - (super(s), (this.element = new Kv())); - } - }, - { - visitors: { - document: { - objects: { - Tag: { $visitor: k_ } - } - } - } - } = $v; - const C_ = class tag_TagVisitor extends k_ { - constructor(s) { - (super(s), (this.element = new r_())); - } - }, - { - visitors: { - document: { - objects: { - Reference: { $visitor: O_ } - } - } - } - } = $v; - const A_ = class reference_ReferenceVisitor extends O_ { - constructor(s) { - (super(s), (this.element = new Pb())); - } - }, - { - visitors: { - document: { - objects: { - Parameter: { $visitor: j_ } - } - } - } - } = $v; - const I_ = class parameter_ParameterVisitor extends j_ { - constructor(s) { - (super(s), (this.element = new Ob())); - } - }, - { - visitors: { - document: { - objects: { - Header: { $visitor: P_ } - } - } - } - } = $v; - const M_ = class header_HeaderVisitor extends P_ { - constructor(s) { - (super(s), (this.element = new Zv())); - } - }, - T_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Wv || (s(u) && o('callback', u) && i('object', u)) - ), - N_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Kv || (s(u) && o('components', u) && i('object', u)) - ), - R_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Hv || (s(u) && o('contact', u) && i('object', u)) - ), - D_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Yv || (s(u) && o('example', u) && i('object', u)) - ), - L_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Xv || (s(u) && o('externalDocumentation', u) && i('object', u)) - ), - B_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Zv || (s(u) && o('header', u) && i('object', u)) - ), - F_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Qv || (s(u) && o('info', u) && i('object', u)) - ), - q_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof eb || (s(u) && o('jsonSchemaDialect', u) && i('string', u)) - ), - $_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof tb || (s(u) && o('license', u) && i('object', u)) - ), - V_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof nb || (s(u) && o('link', u) && i('object', u)) - ), - U_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof _b || (s(u) && o('openapi', u) && i('string', u)) - ), - z_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i, hasClass: u }) => - (_) => - _ instanceof wb || (s(_) && o('openApi3_1', _) && i('object', _) && u('api', _)) - ), - W_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Sb || (s(u) && o('operation', u) && i('object', u)) - ), - K_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Ob || (s(u) && o('parameter', u) && i('object', u)) - ), - H_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Ab || (s(u) && o('pathItem', u) && i('object', u)) - ), - isPathItemElementExternal = (s) => { - if (!H_(s)) return !1; - if (!Ru(s.$ref)) return !1; - const o = serializers_value(s.$ref); - return 'string' == typeof o && o.length > 0 && !o.startsWith('#'); - }, - J_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Ib || (s(u) && o('paths', u) && i('object', u)) - ), - G_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Pb || (s(u) && o('reference', u) && i('object', u)) - ), - isReferenceElementExternal = (s) => { - if (!G_(s)) return !1; - if (!Ru(s.$ref)) return !1; - const o = serializers_value(s.$ref); - return 'string' == typeof o && o.length > 0 && !o.startsWith('#'); - }, - Y_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Mb || (s(u) && o('requestBody', u) && i('object', u)) - ), - X_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Rb || (s(u) && o('response', u) && i('object', u)) - ), - Z_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Lb || (s(u) && o('responses', u) && i('object', u)) - ), - Q_ = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof qb || (s(u) && o('schema', u) && i('object', u)) - ), - predicates_isBooleanJsonSchemaElement = (s) => - Bu(s) && s.classes.includes('boolean-json-schema'), - eE = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof zb || (s(u) && o('securityRequirement', u) && i('object', u)) - ), - tE = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof Qb || (s(u) && o('securityScheme', u) && i('object', u)) - ), - rE = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof e_ || (s(u) && o('server', u) && i('object', u)) - ), - nE = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof t_ || (s(u) && o('serverVariable', u) && i('object', u)) - ), - sE = helpers( - ({ hasBasicElementProps: s, isElementType: o, primitiveEq: i }) => - (u) => - u instanceof pb || (s(u) && o('mediaType', u) && i('object', u)) - ); - const oE = class ParentSchemaAwareVisitor_ParentSchemaAwareVisitor { - parent; - constructor({ parent: s }) { - this.parent = s; - } - }; - class open_api_3_1_schema_SchemaVisitor extends Mixin(im, oE, rm) { - constructor(s) { - (super(s), - (this.element = new qb()), - (this.specPath = Tl(['document', 'objects', 'Schema'])), - (this.canSupportSpecificationExtensions = !0), - (this.jsonSchemaDefaultDialect = eb.default), - this.passingOptionsNames.push('parent')); - } - ObjectElement(s) { - (this.handle$schema(s), this.handle$id(s), (this.parent = this.element)); - const o = im.prototype.ObjectElement.call(this, s); - return ( - Ru(this.element.$ref) && - (this.element.classes.push('reference-element'), - this.element.setMetaProperty('referenced-element', 'schema')), - o - ); - } - BooleanElement(s) { - const o = super.enter(s); - return (this.element.classes.push('boolean-json-schema'), o); - } - getJsonSchemaDialect() { - let s; - return ( - (s = - void 0 !== this.openApiSemanticElement && - q_(this.openApiSemanticElement.jsonSchemaDialect) - ? serializers_value(this.openApiSemanticElement.jsonSchemaDialect) - : void 0 !== this.openApiGenericElement && - Ru(this.openApiGenericElement.get('jsonSchemaDialect')) - ? serializers_value(this.openApiGenericElement.get('jsonSchemaDialect')) - : serializers_value(this.jsonSchemaDefaultDialect)), - s - ); - } - handle$schema(s) { - if (Rl(this.parent) && !Ru(s.get('$schema'))) - this.element.setMetaProperty('inherited$schema', this.getJsonSchemaDialect()); - else if (Q_(this.parent) && !Ru(s.get('$schema'))) { - const s = Na( - serializers_value(this.parent.meta.get('inherited$schema')), - serializers_value(this.parent.$schema) - ); - this.element.setMetaProperty('inherited$schema', s); - } - } - handle$id(s) { - const o = - void 0 !== this.parent - ? cloneDeep(this.parent.getMetaProperty('inherited$id', [])) - : new Cu.wE(), - i = serializers_value(s.get('$id')); - (Vd(i) && o.push(i), this.element.setMetaProperty('inherited$id', o)); - } - } - const iE = open_api_3_1_schema_SchemaVisitor; - const aE = class $vocabularyVisitor extends rm { - ObjectElement(s) { - const o = super.enter(s); - return (this.element.classes.push('json-schema-$vocabulary'), o); - } - }; - const lE = class $refVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('reference-value'), o); - } - }; - class $defsVisitor extends Mixin(vm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-$defs'), - (this.specPath = Tl(['document', 'objects', 'Schema'])), - this.passingOptionsNames.push('parent')); - } - } - const cE = $defsVisitor; - class schema_AllOfVisitor_AllOfVisitor extends Mixin(nm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-allOf'), - this.passingOptionsNames.push('parent')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - if (Fu(s)) { - const o = this.toRefractedElement(['document', 'objects', 'Schema'], s); - this.element.push(o); - } else { - const o = cloneDeep(s); - this.element.push(o); - } - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const uE = schema_AllOfVisitor_AllOfVisitor; - class schema_AnyOfVisitor_AnyOfVisitor extends Mixin(nm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-anyOf'), - this.passingOptionsNames.push('parent')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - if (Fu(s)) { - const o = this.toRefractedElement(['document', 'objects', 'Schema'], s); - this.element.push(o); - } else { - const o = cloneDeep(s); - this.element.push(o); - } - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const pE = schema_AnyOfVisitor_AnyOfVisitor; - class schema_OneOfVisitor_OneOfVisitor extends Mixin(nm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-oneOf'), - this.passingOptionsNames.push('parent')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - if (Fu(s)) { - const o = this.toRefractedElement(['document', 'objects', 'Schema'], s); - this.element.push(o); - } else { - const o = cloneDeep(s); - this.element.push(o); - } - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const hE = schema_OneOfVisitor_OneOfVisitor; - class DependentSchemasVisitor extends Mixin(vm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-dependentSchemas'), - (this.specPath = Tl(['document', 'objects', 'Schema'])), - this.passingOptionsNames.push('parent')); - } - } - const dE = DependentSchemasVisitor; - class PrefixItemsVisitor extends Mixin(nm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.wE()), - this.element.classes.push('json-schema-prefixItems'), - this.passingOptionsNames.push('parent')); - } - ArrayElement(s) { - return ( - s.forEach((s) => { - if (Fu(s)) { - const o = this.toRefractedElement(['document', 'objects', 'Schema'], s); - this.element.push(o); - } else { - const o = cloneDeep(s); - this.element.push(o); - } - }), - this.copyMetaAndAttributes(s, this.element), - Ju - ); - } - } - const fE = PrefixItemsVisitor; - class schema_PropertiesVisitor_PropertiesVisitor extends Mixin(vm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-properties'), - (this.specPath = Tl(['document', 'objects', 'Schema'])), - this.passingOptionsNames.push('parent')); - } - } - const mE = schema_PropertiesVisitor_PropertiesVisitor; - class PatternPropertiesVisitor_PatternPropertiesVisitor extends Mixin(vm, oE, rm) { - constructor(s) { - (super(s), - (this.element = new Cu.Sh()), - this.element.classes.push('json-schema-patternProperties'), - (this.specPath = Tl(['document', 'objects', 'Schema'])), - this.passingOptionsNames.push('parent')); - } - } - const gE = PatternPropertiesVisitor_PatternPropertiesVisitor; - const yE = class schema_TypeVisitor_TypeVisitor extends rm { - StringElement(s) { - const o = super.enter(s); - return (this.element.classes.push('json-schema-type'), o); - } - ArrayElement(s) { - const o = super.enter(s); - return (this.element.classes.push('json-schema-type'), o); - } - }; - const vE = class EnumVisitor_EnumVisitor extends rm { - ArrayElement(s) { - const o = super.enter(s); - return (this.element.classes.push('json-schema-enum'), o); - } - }; - const bE = class DependentRequiredVisitor extends rm { - ObjectElement(s) { - const o = super.enter(s); - return (this.element.classes.push('json-schema-dependentRequired'), o); - } - }; - const _E = class schema_ExamplesVisitor_ExamplesVisitor extends rm { - ArrayElement(s) { - const o = super.enter(s); - return (this.element.classes.push('json-schema-examples'), o); - } - }, - { - visitors: { - document: { - objects: { - Discriminator: { $visitor: EE } - } - } - } - } = $v; - const wE = class distriminator_DiscriminatorVisitor extends EE { - constructor(s) { - (super(s), (this.element = new Jv()), (this.canSupportSpecificationExtensions = !0)); - } - }, - { - visitors: { - document: { - objects: { - XML: { $visitor: SE } - } - } - } - } = $v; - const xE = class xml_XmlVisitor extends SE { - constructor(s) { - (super(s), (this.element = new n_())); - } - }; - class SchemasVisitor_SchemasVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new xy()), - (this.specPath = Tl(['document', 'objects', 'Schema']))); - } - } - const kE = SchemasVisitor_SchemasVisitor; - class ComponentsPathItems extends Cu.Sh { - static primaryClass = 'components-path-items'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(ComponentsPathItems.primaryClass)); - } - } - const CE = ComponentsPathItems; - class PathItemsVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new CE()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'PathItem'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(G_).forEach((s) => { - s.setMetaProperty('referenced-element', 'pathItem'); - }), - o - ); - } - } - const OE = PathItemsVisitor, - { - visitors: { - document: { - objects: { - Example: { $visitor: AE } - } - } - } - } = $v; - const jE = class example_ExampleVisitor extends AE { - constructor(s) { - (super(s), (this.element = new Yv())); - } - }, - { - visitors: { - document: { - objects: { - ExternalDocumentation: { $visitor: IE } - } - } - } - } = $v; - const PE = class external_documentation_ExternalDocumentationVisitor extends IE { - constructor(s) { - (super(s), (this.element = new Xv())); - } - }, - { - visitors: { - document: { - objects: { - Encoding: { $visitor: ME } - } - } - } - } = $v; - const TE = class open_api_3_1_encoding_EncodingVisitor extends ME { - constructor(s) { - (super(s), (this.element = new Gv())); - } - }, - { - visitors: { - document: { - objects: { - Paths: { $visitor: NE } - } - } - } - } = $v; - const RE = class paths_PathsVisitor extends NE { - constructor(s) { - (super(s), (this.element = new Ib())); - } - }, - { - visitors: { - document: { - objects: { - RequestBody: { $visitor: DE } - } - } - } - } = $v; - const LE = class request_body_RequestBodyVisitor extends DE { - constructor(s) { - (super(s), (this.element = new Mb())); - } - }, - { - visitors: { - document: { - objects: { - Callback: { $visitor: BE } - } - } - } - } = $v; - const FE = class callback_CallbackVisitor extends BE { - constructor(s) { - (super(s), - (this.element = new Wv()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'PathItem'])); - } - ObjectElement(s) { - const o = BE.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(G_).forEach((s) => { - s.setMetaProperty('referenced-element', 'pathItem'); - }), - o - ); - } - }, - { - visitors: { - document: { - objects: { - Response: { $visitor: qE } - } - } - } - } = $v; - const $E = class response_ResponseVisitor extends qE { - constructor(s) { - (super(s), (this.element = new Rb())); - } - }, - { - visitors: { - document: { - objects: { - Responses: { $visitor: VE } - } - } - } - } = $v; - const UE = class open_api_3_1_responses_ResponsesVisitor extends VE { - constructor(s) { - (super(s), (this.element = new Lb())); - } - }, - { - visitors: { - document: { - objects: { - Operation: { $visitor: zE } - } - } - } - } = $v; - const WE = class operation_OperationVisitor extends zE { - constructor(s) { - (super(s), (this.element = new Sb())); - } - }, - { - visitors: { - document: { - objects: { - PathItem: { $visitor: KE } - } - } - } - } = $v; - const HE = class path_item_PathItemVisitor extends KE { - constructor(s) { - (super(s), (this.element = new Ab())); - } - }, - { - visitors: { - document: { - objects: { - SecurityScheme: { $visitor: JE } - } - } - } - } = $v; - const GE = class security_scheme_SecuritySchemeVisitor extends JE { - constructor(s) { - (super(s), (this.element = new Qb())); - } - }, - { - visitors: { - document: { - objects: { - OAuthFlows: { $visitor: YE } - } - } - } - } = $v; - const XE = class oauth_flows_OAuthFlowsVisitor extends YE { - constructor(s) { - (super(s), (this.element = new yb())); - } - }, - { - visitors: { - document: { - objects: { - OAuthFlow: { $visitor: ZE } - } - } - } - } = $v; - const QE = class oauth_flow_OAuthFlowVisitor extends ZE { - constructor(s) { - (super(s), (this.element = new mb())); - } - }; - class Webhooks extends Cu.Sh { - static primaryClass = 'webhooks'; - constructor(s, o, i) { - (super(s, o, i), this.classes.push(Webhooks.primaryClass)); - } - } - const ew = Webhooks; - class WebhooksVisitor extends Mixin(vm, rm) { - constructor(s) { - (super(s), - (this.element = new ew()), - (this.specPath = (s) => - isReferenceLikeElement(s) - ? ['document', 'objects', 'Reference'] - : ['document', 'objects', 'PathItem'])); - } - ObjectElement(s) { - const o = vm.prototype.ObjectElement.call(this, s); - return ( - this.element.filter(G_).forEach((s) => { - s.setMetaProperty('referenced-element', 'pathItem'); - }), - this.element.filter(H_).forEach((s, o) => { - s.setMetaProperty('webhook-name', serializers_value(o)); - }), - o - ); - } - } - const tw = WebhooksVisitor, - rw = { - visitors: { - value: $v.visitors.value, - document: { - objects: { - OpenApi: { - $visitor: s_, - fixedFields: { - openapi: $v.visitors.document.objects.OpenApi.fixedFields.openapi, - info: { $ref: '#/visitors/document/objects/Info' }, - jsonSchemaDialect: d_, - servers: $v.visitors.document.objects.OpenApi.fixedFields.servers, - paths: { $ref: '#/visitors/document/objects/Paths' }, - webhooks: tw, - components: { $ref: '#/visitors/document/objects/Components' }, - security: $v.visitors.document.objects.OpenApi.fixedFields.security, - tags: $v.visitors.document.objects.OpenApi.fixedFields.tags, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' } - } - }, - Info: { - $visitor: i_, - fixedFields: { - title: $v.visitors.document.objects.Info.fixedFields.title, - description: $v.visitors.document.objects.Info.fixedFields.description, - summary: { $ref: '#/visitors/value' }, - termsOfService: $v.visitors.document.objects.Info.fixedFields.termsOfService, - contact: { $ref: '#/visitors/document/objects/Contact' }, - license: { $ref: '#/visitors/document/objects/License' }, - version: $v.visitors.document.objects.Info.fixedFields.version - } - }, - Contact: { - $visitor: l_, - fixedFields: { - name: $v.visitors.document.objects.Contact.fixedFields.name, - url: $v.visitors.document.objects.Contact.fixedFields.url, - email: $v.visitors.document.objects.Contact.fixedFields.email - } - }, - License: { - $visitor: u_, - fixedFields: { - name: $v.visitors.document.objects.License.fixedFields.name, - identifier: { $ref: '#/visitors/value' }, - url: $v.visitors.document.objects.License.fixedFields.url - } - }, - Server: { - $visitor: m_, - fixedFields: { - url: $v.visitors.document.objects.Server.fixedFields.url, - description: $v.visitors.document.objects.Server.fixedFields.description, - variables: $v.visitors.document.objects.Server.fixedFields.variables - } - }, - ServerVariable: { - $visitor: y_, - fixedFields: { - enum: $v.visitors.document.objects.ServerVariable.fixedFields.enum, - default: $v.visitors.document.objects.ServerVariable.fixedFields.default, - description: - $v.visitors.document.objects.ServerVariable.fixedFields.description - } - }, - Components: { - $visitor: x_, - fixedFields: { - schemas: kE, - responses: $v.visitors.document.objects.Components.fixedFields.responses, - parameters: $v.visitors.document.objects.Components.fixedFields.parameters, - examples: $v.visitors.document.objects.Components.fixedFields.examples, - requestBodies: - $v.visitors.document.objects.Components.fixedFields.requestBodies, - headers: $v.visitors.document.objects.Components.fixedFields.headers, - securitySchemes: - $v.visitors.document.objects.Components.fixedFields.securitySchemes, - links: $v.visitors.document.objects.Components.fixedFields.links, - callbacks: $v.visitors.document.objects.Components.fixedFields.callbacks, - pathItems: OE - } - }, - Paths: { $visitor: RE }, - PathItem: { - $visitor: HE, - fixedFields: { - $ref: $v.visitors.document.objects.PathItem.fixedFields.$ref, - summary: $v.visitors.document.objects.PathItem.fixedFields.summary, - description: $v.visitors.document.objects.PathItem.fixedFields.description, - get: { $ref: '#/visitors/document/objects/Operation' }, - put: { $ref: '#/visitors/document/objects/Operation' }, - post: { $ref: '#/visitors/document/objects/Operation' }, - delete: { $ref: '#/visitors/document/objects/Operation' }, - options: { $ref: '#/visitors/document/objects/Operation' }, - head: { $ref: '#/visitors/document/objects/Operation' }, - patch: { $ref: '#/visitors/document/objects/Operation' }, - trace: { $ref: '#/visitors/document/objects/Operation' }, - servers: $v.visitors.document.objects.PathItem.fixedFields.servers, - parameters: $v.visitors.document.objects.PathItem.fixedFields.parameters - } - }, - Operation: { - $visitor: WE, - fixedFields: { - tags: $v.visitors.document.objects.Operation.fixedFields.tags, - summary: $v.visitors.document.objects.Operation.fixedFields.summary, - description: $v.visitors.document.objects.Operation.fixedFields.description, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' }, - operationId: $v.visitors.document.objects.Operation.fixedFields.operationId, - parameters: $v.visitors.document.objects.Operation.fixedFields.parameters, - requestBody: $v.visitors.document.objects.Operation.fixedFields.requestBody, - responses: { $ref: '#/visitors/document/objects/Responses' }, - callbacks: $v.visitors.document.objects.Operation.fixedFields.callbacks, - deprecated: $v.visitors.document.objects.Operation.fixedFields.deprecated, - security: $v.visitors.document.objects.Operation.fixedFields.security, - servers: $v.visitors.document.objects.Operation.fixedFields.servers - } - }, - ExternalDocumentation: { - $visitor: PE, - fixedFields: { - description: - $v.visitors.document.objects.ExternalDocumentation.fixedFields.description, - url: $v.visitors.document.objects.ExternalDocumentation.fixedFields.url - } - }, - Parameter: { - $visitor: I_, - fixedFields: { - name: $v.visitors.document.objects.Parameter.fixedFields.name, - in: $v.visitors.document.objects.Parameter.fixedFields.in, - description: $v.visitors.document.objects.Parameter.fixedFields.description, - required: $v.visitors.document.objects.Parameter.fixedFields.required, - deprecated: $v.visitors.document.objects.Parameter.fixedFields.deprecated, - allowEmptyValue: - $v.visitors.document.objects.Parameter.fixedFields.allowEmptyValue, - style: $v.visitors.document.objects.Parameter.fixedFields.style, - explode: $v.visitors.document.objects.Parameter.fixedFields.explode, - allowReserved: - $v.visitors.document.objects.Parameter.fixedFields.allowReserved, - schema: { $ref: '#/visitors/document/objects/Schema' }, - example: $v.visitors.document.objects.Parameter.fixedFields.example, - examples: $v.visitors.document.objects.Parameter.fixedFields.examples, - content: $v.visitors.document.objects.Parameter.fixedFields.content - } - }, - RequestBody: { - $visitor: LE, - fixedFields: { - description: $v.visitors.document.objects.RequestBody.fixedFields.description, - content: $v.visitors.document.objects.RequestBody.fixedFields.content, - required: $v.visitors.document.objects.RequestBody.fixedFields.required - } - }, - MediaType: { - $visitor: b_, - fixedFields: { - schema: { $ref: '#/visitors/document/objects/Schema' }, - example: $v.visitors.document.objects.MediaType.fixedFields.example, - examples: $v.visitors.document.objects.MediaType.fixedFields.examples, - encoding: $v.visitors.document.objects.MediaType.fixedFields.encoding - } - }, - Encoding: { - $visitor: TE, - fixedFields: { - contentType: $v.visitors.document.objects.Encoding.fixedFields.contentType, - headers: $v.visitors.document.objects.Encoding.fixedFields.headers, - style: $v.visitors.document.objects.Encoding.fixedFields.style, - explode: $v.visitors.document.objects.Encoding.fixedFields.explode, - allowReserved: $v.visitors.document.objects.Encoding.fixedFields.allowReserved - } - }, - Responses: { - $visitor: UE, - fixedFields: { - default: $v.visitors.document.objects.Responses.fixedFields.default - } - }, - Response: { - $visitor: $E, - fixedFields: { - description: $v.visitors.document.objects.Response.fixedFields.description, - headers: $v.visitors.document.objects.Response.fixedFields.headers, - content: $v.visitors.document.objects.Response.fixedFields.content, - links: $v.visitors.document.objects.Response.fixedFields.links - } - }, - Callback: { $visitor: FE }, - Example: { - $visitor: jE, - fixedFields: { - summary: $v.visitors.document.objects.Example.fixedFields.summary, - description: $v.visitors.document.objects.Example.fixedFields.description, - value: $v.visitors.document.objects.Example.fixedFields.value, - externalValue: $v.visitors.document.objects.Example.fixedFields.externalValue - } - }, - Link: { - $visitor: h_, - fixedFields: { - operationRef: $v.visitors.document.objects.Link.fixedFields.operationRef, - operationId: $v.visitors.document.objects.Link.fixedFields.operationId, - parameters: $v.visitors.document.objects.Link.fixedFields.parameters, - requestBody: $v.visitors.document.objects.Link.fixedFields.requestBody, - description: $v.visitors.document.objects.Link.fixedFields.description, - server: { $ref: '#/visitors/document/objects/Server' } - } - }, - Header: { - $visitor: M_, - fixedFields: { - description: $v.visitors.document.objects.Header.fixedFields.description, - required: $v.visitors.document.objects.Header.fixedFields.required, - deprecated: $v.visitors.document.objects.Header.fixedFields.deprecated, - allowEmptyValue: - $v.visitors.document.objects.Header.fixedFields.allowEmptyValue, - style: $v.visitors.document.objects.Header.fixedFields.style, - explode: $v.visitors.document.objects.Header.fixedFields.explode, - allowReserved: $v.visitors.document.objects.Header.fixedFields.allowReserved, - schema: { $ref: '#/visitors/document/objects/Schema' }, - example: $v.visitors.document.objects.Header.fixedFields.example, - examples: $v.visitors.document.objects.Header.fixedFields.examples, - content: $v.visitors.document.objects.Header.fixedFields.content - } - }, - Tag: { - $visitor: C_, - fixedFields: { - name: $v.visitors.document.objects.Tag.fixedFields.name, - description: $v.visitors.document.objects.Tag.fixedFields.description, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' } - } - }, - Reference: { - $visitor: A_, - fixedFields: { - $ref: $v.visitors.document.objects.Reference.fixedFields.$ref, - summary: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' } - } - }, - Schema: { - $visitor: iE, - fixedFields: { - $schema: { $ref: '#/visitors/value' }, - $vocabulary: aE, - $id: { $ref: '#/visitors/value' }, - $anchor: { $ref: '#/visitors/value' }, - $dynamicAnchor: { $ref: '#/visitors/value' }, - $dynamicRef: { $ref: '#/visitors/value' }, - $ref: lE, - $defs: cE, - $comment: { $ref: '#/visitors/value' }, - allOf: uE, - anyOf: pE, - oneOf: hE, - not: { $ref: '#/visitors/document/objects/Schema' }, - if: { $ref: '#/visitors/document/objects/Schema' }, - then: { $ref: '#/visitors/document/objects/Schema' }, - else: { $ref: '#/visitors/document/objects/Schema' }, - dependentSchemas: dE, - prefixItems: fE, - items: { $ref: '#/visitors/document/objects/Schema' }, - contains: { $ref: '#/visitors/document/objects/Schema' }, - properties: mE, - patternProperties: gE, - additionalProperties: { $ref: '#/visitors/document/objects/Schema' }, - propertyNames: { $ref: '#/visitors/document/objects/Schema' }, - unevaluatedItems: { $ref: '#/visitors/document/objects/Schema' }, - unevaluatedProperties: { $ref: '#/visitors/document/objects/Schema' }, - type: yE, - enum: vE, - const: { $ref: '#/visitors/value' }, - multipleOf: { $ref: '#/visitors/value' }, - maximum: { $ref: '#/visitors/value' }, - exclusiveMaximum: { $ref: '#/visitors/value' }, - minimum: { $ref: '#/visitors/value' }, - exclusiveMinimum: { $ref: '#/visitors/value' }, - maxLength: { $ref: '#/visitors/value' }, - minLength: { $ref: '#/visitors/value' }, - pattern: { $ref: '#/visitors/value' }, - maxItems: { $ref: '#/visitors/value' }, - minItems: { $ref: '#/visitors/value' }, - uniqueItems: { $ref: '#/visitors/value' }, - maxContains: { $ref: '#/visitors/value' }, - minContains: { $ref: '#/visitors/value' }, - maxProperties: { $ref: '#/visitors/value' }, - minProperties: { $ref: '#/visitors/value' }, - required: { $ref: '#/visitors/value' }, - dependentRequired: bE, - title: { $ref: '#/visitors/value' }, - description: { $ref: '#/visitors/value' }, - default: { $ref: '#/visitors/value' }, - deprecated: { $ref: '#/visitors/value' }, - readOnly: { $ref: '#/visitors/value' }, - writeOnly: { $ref: '#/visitors/value' }, - examples: _E, - format: { $ref: '#/visitors/value' }, - contentEncoding: { $ref: '#/visitors/value' }, - contentMediaType: { $ref: '#/visitors/value' }, - contentSchema: { $ref: '#/visitors/document/objects/Schema' }, - discriminator: { $ref: '#/visitors/document/objects/Discriminator' }, - xml: { $ref: '#/visitors/document/objects/XML' }, - externalDocs: { $ref: '#/visitors/document/objects/ExternalDocumentation' }, - example: { $ref: '#/visitors/value' } - } - }, - Discriminator: { - $visitor: wE, - fixedFields: { - propertyName: - $v.visitors.document.objects.Discriminator.fixedFields.propertyName, - mapping: $v.visitors.document.objects.Discriminator.fixedFields.mapping - } - }, - XML: { - $visitor: xE, - fixedFields: { - name: $v.visitors.document.objects.XML.fixedFields.name, - namespace: $v.visitors.document.objects.XML.fixedFields.namespace, - prefix: $v.visitors.document.objects.XML.fixedFields.prefix, - attribute: $v.visitors.document.objects.XML.fixedFields.attribute, - wrapped: $v.visitors.document.objects.XML.fixedFields.wrapped - } - }, - SecurityScheme: { - $visitor: GE, - fixedFields: { - type: $v.visitors.document.objects.SecurityScheme.fixedFields.type, - description: - $v.visitors.document.objects.SecurityScheme.fixedFields.description, - name: $v.visitors.document.objects.SecurityScheme.fixedFields.name, - in: $v.visitors.document.objects.SecurityScheme.fixedFields.in, - scheme: $v.visitors.document.objects.SecurityScheme.fixedFields.scheme, - bearerFormat: - $v.visitors.document.objects.SecurityScheme.fixedFields.bearerFormat, - flows: { $ref: '#/visitors/document/objects/OAuthFlows' }, - openIdConnectUrl: - $v.visitors.document.objects.SecurityScheme.fixedFields.openIdConnectUrl - } - }, - OAuthFlows: { - $visitor: XE, - fixedFields: { - implicit: { $ref: '#/visitors/document/objects/OAuthFlow' }, - password: { $ref: '#/visitors/document/objects/OAuthFlow' }, - clientCredentials: { $ref: '#/visitors/document/objects/OAuthFlow' }, - authorizationCode: { $ref: '#/visitors/document/objects/OAuthFlow' } - } - }, - OAuthFlow: { - $visitor: QE, - fixedFields: { - authorizationUrl: - $v.visitors.document.objects.OAuthFlow.fixedFields.authorizationUrl, - tokenUrl: $v.visitors.document.objects.OAuthFlow.fixedFields.tokenUrl, - refreshUrl: $v.visitors.document.objects.OAuthFlow.fixedFields.refreshUrl, - scopes: $v.visitors.document.objects.OAuthFlow.fixedFields.scopes - } - }, - SecurityRequirement: { $visitor: w_ } - }, - extension: { $visitor: $v.visitors.document.extension.$visitor } - } - } - }, - apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType = (s) => { - if (Nu(s)) return `${s.element.charAt(0).toUpperCase() + s.element.slice(1)}Element`; - }, - nw = { - CallbackElement: ['content'], - ComponentsElement: ['content'], - ContactElement: ['content'], - DiscriminatorElement: ['content'], - Encoding: ['content'], - Example: ['content'], - ExternalDocumentationElement: ['content'], - HeaderElement: ['content'], - InfoElement: ['content'], - LicenseElement: ['content'], - MediaTypeElement: ['content'], - OAuthFlowElement: ['content'], - OAuthFlowsElement: ['content'], - OpenApi3_1Element: ['content'], - OperationElement: ['content'], - ParameterElement: ['content'], - PathItemElement: ['content'], - PathsElement: ['content'], - ReferenceElement: ['content'], - RequestBodyElement: ['content'], - ResponseElement: ['content'], - ResponsesElement: ['content'], - SchemaElement: ['content'], - SecurityRequirementElement: ['content'], - SecuritySchemeElement: ['content'], - ServerElement: ['content'], - ServerVariableElement: ['content'], - TagElement: ['content'], - ...Qu - }, - sw = { - namespace: (s) => { - const { base: o } = s; - return ( - o.register('callback', Wv), - o.register('components', Kv), - o.register('contact', Hv), - o.register('discriminator', Jv), - o.register('encoding', Gv), - o.register('example', Yv), - o.register('externalDocumentation', Xv), - o.register('header', Zv), - o.register('info', Qv), - o.register('jsonSchemaDialect', eb), - o.register('license', tb), - o.register('link', nb), - o.register('mediaType', pb), - o.register('oAuthFlow', mb), - o.register('oAuthFlows', yb), - o.register('openapi', _b), - o.register('openApi3_1', wb), - o.register('operation', Sb), - o.register('parameter', Ob), - o.register('pathItem', Ab), - o.register('paths', Ib), - o.register('reference', Pb), - o.register('requestBody', Mb), - o.register('response', Rb), - o.register('responses', Lb), - o.register('schema', qb), - o.register('securityRequirement', zb), - o.register('securityScheme', Qb), - o.register('server', e_), - o.register('serverVariable', t_), - o.register('tag', r_), - o.register('xml', n_), - o - ); - } - }, - ow = sw, - ancestorLineageToJSONPointer = (s) => { - const o = s.reduce((o, i, u) => { - if ($u(i)) { - const s = String(serializers_value(i.key)); - o.push(s); - } else if (qu(s[u - 2])) { - const _ = String(s[u - 2].content.indexOf(i)); - o.push(_); - } - return o; - }, []); - return es_compile(o); - }, - apidom_ns_openapi_3_1_es_refractor_toolbox = () => { - const s = createNamespace(ow); - return { - predicates: { - ...de, - isElement: Nu, - isStringElement: Ru, - isArrayElement: qu, - isObjectElement: Fu, - isMemberElement: $u, - isServersElement: rg, - includesClasses, - hasElementSourceMap - }, - ancestorLineageToJSONPointer, - namespace: s - }; - }, - apidom_ns_openapi_3_1_es_refractor_refract = ( - s, - { - specPath: o = ['visitors', 'document', 'objects', 'OpenApi', '$visitor'], - plugins: i = [] - } = {} - ) => { - const u = (0, Cu.e)(s), - _ = dereference(rw), - w = new (cp(o, _))({ specObj: _ }); - return ( - visitor_visit(u, w), - dispatchPluginsSync(w.element, i, { - toolboxCreator: apidom_ns_openapi_3_1_es_refractor_toolbox, - visitorOptions: { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - } - }) - ); - }, - apidom_ns_openapi_3_1_es_refractor_createRefractor = - (s) => - (o, i = {}) => - apidom_ns_openapi_3_1_es_refractor_refract(o, { specPath: s, ...i }); - ((Wv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Callback', - '$visitor' - ])), - (Kv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Components', - '$visitor' - ])), - (Hv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Contact', - '$visitor' - ])), - (Yv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Example', - '$visitor' - ])), - (Jv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Discriminator', - '$visitor' - ])), - (Gv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Encoding', - '$visitor' - ])), - (Xv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'ExternalDocumentation', - '$visitor' - ])), - (Zv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Header', - '$visitor' - ])), - (Qv.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Info', - '$visitor' - ])), - (eb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OpenApi', - 'fixedFields', - 'jsonSchemaDialect' - ])), - (tb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'License', - '$visitor' - ])), - (nb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Link', - '$visitor' - ])), - (pb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'MediaType', - '$visitor' - ])), - (mb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OAuthFlow', - '$visitor' - ])), - (yb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OAuthFlows', - '$visitor' - ])), - (_b.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OpenApi', - 'fixedFields', - 'openapi' - ])), - (wb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'OpenApi', - '$visitor' - ])), - (Sb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Operation', - '$visitor' - ])), - (Ob.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Parameter', - '$visitor' - ])), - (Ab.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'PathItem', - '$visitor' - ])), - (Ib.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Paths', - '$visitor' - ])), - (Pb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Reference', - '$visitor' - ])), - (Mb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'RequestBody', - '$visitor' - ])), - (Rb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Response', - '$visitor' - ])), - (Lb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Responses', - '$visitor' - ])), - (qb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Schema', - '$visitor' - ])), - (zb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'SecurityRequirement', - '$visitor' - ])), - (Qb.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'SecurityScheme', - '$visitor' - ])), - (e_.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Server', - '$visitor' - ])), - (t_.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'ServerVariable', - '$visitor' - ])), - (r_.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'Tag', - '$visitor' - ])), - (n_.refract = apidom_ns_openapi_3_1_es_refractor_createRefractor([ - 'visitors', - 'document', - 'objects', - 'XML', - '$visitor' - ]))); - const iw = class NotImplementedError extends Hh {}; - const aw = class MediaTypes extends Array { - unknownMediaType = 'application/octet-stream'; - filterByFormat() { - throw new iw('filterByFormat method in MediaTypes class is not yet implemented.'); - } - findBy() { - throw new iw('findBy method in MediaTypes class is not yet implemented.'); - } - latest() { - throw new iw('latest method in MediaTypes class is not yet implemented.'); - } - }; - class OpenAPIMediaTypes extends aw { - filterByFormat(s = 'generic') { - const o = 'generic' === s ? 'openapi;version' : s; - return this.filter((s) => s.includes(o)); - } - findBy(s = '3.1.0', o = 'generic') { - const i = - 'generic' === o - ? `vnd.oai.openapi;version=${s}` - : `vnd.oai.openapi+${o};version=${s}`; - return this.find((s) => s.includes(i)) || this.unknownMediaType; - } - latest(s = 'generic') { - return Fa(this.filterByFormat(s)); - } - } - const lw = new OpenAPIMediaTypes( - 'application/vnd.oai.openapi;version=3.1.0', - 'application/vnd.oai.openapi+json;version=3.1.0', - 'application/vnd.oai.openapi+yaml;version=3.1.0' - ); - const cw = class es_Reference_Reference { - uri; - depth; - value; - refSet; - errors; - constructor({ uri: s, depth: o = 0, refSet: i, value: u }) { - ((this.uri = s), - (this.value = u), - (this.depth = o), - (this.refSet = i), - (this.errors = [])); - } - }; - const uw = class ReferenceSet { - rootRef; - refs; - circular; - constructor({ refs: s = [], circular: o = !1 } = {}) { - ((this.refs = []), (this.circular = o), s.forEach(this.add.bind(this))); - } - get size() { - return this.refs.length; - } - add(s) { - return ( - this.has(s) || - (this.refs.push(s), - (this.rootRef = void 0 === this.rootRef ? s : this.rootRef), - (s.refSet = this)), - this - ); - } - merge(s) { - for (const o of s.values()) this.add(o); - return this; - } - has(s) { - const o = Yl(s) ? s : s.uri; - return Dl(this.find((s) => s.uri === o)); - } - find(s) { - return this.refs.find(s); - } - *values() { - yield* this.refs; - } - clean() { - (this.refs.forEach((s) => { - s.refSet = void 0; - }), - (this.rootRef = void 0), - (this.refs.length = 0)); - } - }, - pw = { - parse: { mediaType: 'text/plain', parsers: [], parserOpts: {} }, - resolve: { - baseURI: '', - resolvers: [], - resolverOpts: {}, - strategies: [], - strategyOpts: {}, - internal: !0, - external: !0, - maxDepth: 1 / 0 - }, - dereference: { - strategies: [], - strategyOpts: {}, - refSet: null, - maxDepth: 1 / 0, - circular: 'ignore', - circularReplacer: Ip, - immutable: !0 - }, - bundle: { strategies: [], refSet: null, maxDepth: 1 / 0 } - }; - const hw = _curry2(function lens(s, o) { - return function (i) { - return function (u) { - return kl( - function (s) { - return o(s, u); - }, - i(s(u)) - ); - }; - }; - }); - var dw = _curry3(function assocPath(s, o, i) { - if (0 === s.length) return o; - var u = s[0]; - if (s.length > 1) { - var _ = !ld(i) && _has(u, i) && 'object' == typeof i[u] ? i[u] : Yo(s[1]) ? [] : {}; - o = assocPath(Array.prototype.slice.call(s, 1), o, _); - } - return (function _assoc(s, o, i) { - if (Yo(s) && aa(i)) { - var u = [].concat(i); - return ((u[s] = o), u); - } - var _ = {}; - for (var w in i) _[w] = i[w]; - return ((_[s] = o), _); - })(u, o, i); - }); - const fw = dw; - var Identity = function (s) { - return { - value: s, - map: function (o) { - return Identity(o(s)); - } - }; - }, - mw = _curry3(function over(s, o, i) { - return s(function (s) { - return Identity(o(s)); - })(i).value; - }); - const gw = mw, - yw = hw(cp(['resolve', 'baseURI']), fw(['resolve', 'baseURI'])), - baseURIDefault = (s) => (qp(s) ? url_cwd() : s), - util_merge = (s, o) => { - const i = lp(s, o); - return gw(yw, baseURIDefault, i); - }; - const vw = class File_File { - uri; - mediaType; - data; - parseResult; - constructor({ uri: s, mediaType: o = 'text/plain', data: i, parseResult: u }) { - ((this.uri = s), (this.mediaType = o), (this.data = i), (this.parseResult = u)); - } - get extension() { - return Yl(this.uri) - ? ((s) => { - const o = s.lastIndexOf('.'); - return o >= 0 ? s.substring(o).toLowerCase() : ''; - })(this.uri) - : ''; - } - toString() { - if ('string' == typeof this.data) return this.data; - if ( - this.data instanceof ArrayBuffer || - ['ArrayBuffer'].includes(ea(this.data)) || - ArrayBuffer.isView(this.data) - ) { - return new TextDecoder('utf-8').decode(this.data); - } - return String(this.data); - } - }; - const bw = class PluginError extends Ho { - plugin; - constructor(s, o) { - (super(s, { cause: o.cause }), (this.plugin = o.plugin)); - } - }, - plugins_filter = async (s, o, i) => { - const u = await Promise.all(i.map(_p([s], o))); - return i.filter((s, o) => u[o]); - }, - run = async (s, o, i) => { - let u; - for (const _ of i) - try { - const i = await _[s].call(_, ...o); - return { plugin: _, result: i }; - } catch (s) { - u = new bw('Error while running plugin', { cause: s, plugin: _ }); - } - return Promise.reject(u); - }; - const _w = class DereferenceError extends Ho {}; - const Ew = class UnmatchedDereferenceStrategyError extends _w {}, - dereferenceApiDOM = async (s, o) => { - let i = s, - u = !1; - if (!Ku(s)) { - const o = cloneShallow(s); - (o.classes.push('result'), (i = new Mu([o])), (u = !0)); - } - const _ = new vw({ - uri: o.resolve.baseURI, - parseResult: i, - mediaType: o.parse.mediaType - }), - w = await plugins_filter('canDereference', [_, o], o.dereference.strategies); - if (gp(w)) throw new Ew(_.uri); - try { - const { result: s } = await run('dereference', [_, o], w); - return u ? s.get(0) : s; - } catch (s) { - throw new _w(`Error while dereferencing file "${_.uri}"`, { cause: s }); - } - }; - const ww = class ParseError extends Ho {}; - const Sw = class ParserError extends ww {}; - const xw = class Parser { - name; - allowEmpty; - sourceMap; - fileExtensions; - mediaTypes; - constructor({ - name: s, - allowEmpty: o = !0, - sourceMap: i = !1, - fileExtensions: u = [], - mediaTypes: _ = [] - }) { - ((this.name = s), - (this.allowEmpty = o), - (this.sourceMap = i), - (this.fileExtensions = u), - (this.mediaTypes = _)); - } - }; - const kw = class BinaryParser extends xw { - constructor(s) { - super({ ...(null != s ? s : {}), name: 'binary' }); - } - canParse(s) { - return 0 === this.fileExtensions.length || this.fileExtensions.includes(s.extension); - } - parse(s) { - try { - const o = unescape(encodeURIComponent(s.toString())), - i = btoa(o), - u = new Mu(); - if (0 !== i.length) { - const s = new Cu.Om(i); - (s.classes.push('result'), u.push(s)); - } - return u; - } catch (o) { - throw new Sw(`Error parsing "${s.uri}"`, { cause: o }); - } - } - }; - const Cw = class ResolveStrategy { - name; - constructor({ name: s }) { - this.name = s; - } - }; - const Ow = class OpenAPI3_1ResolveStrategy extends Cw { - constructor(s) { - super({ ...(null != s ? s : {}), name: 'openapi-3-1' }); - } - canResolve(s, o) { - const i = o.dereference.strategies.find((s) => 'openapi-3-1' === s.name); - return void 0 !== i && i.canDereference(s, o); - } - async resolve(s, o) { - const i = o.dereference.strategies.find((s) => 'openapi-3-1' === s.name); - if (void 0 === i) throw new Ew('"openapi-3-1" dereference strategy is not available.'); - const u = new uw(), - _ = util_merge(o, { resolve: { internal: !1 }, dereference: { refSet: u } }); - return (await i.dereference(s, _), u); - } - }; - const Aw = class Resolver { - name; - constructor({ name: s }) { - this.name = s; - } - }; - const jw = class HTTPResolver extends Aw { - timeout; - redirects; - withCredentials; - constructor(s) { - const { - name: o = 'http-resolver', - timeout: i = 5e3, - redirects: u = 5, - withCredentials: _ = !1 - } = null != s ? s : {}; - (super({ name: o }), - (this.timeout = i), - (this.redirects = u), - (this.withCredentials = _)); - } - canRead(s) { - return isHttpUrl(s.uri); - } - }; - const Iw = class ResolveError extends Ho {}; - const Pw = class ResolverError extends Iw {}, - { AbortController: Mw, AbortSignal: Tw } = globalThis; - (void 0 === globalThis.AbortController && (globalThis.AbortController = Mw), - void 0 === globalThis.AbortSignal && (globalThis.AbortSignal = Tw)); - const Nw = class HTTPResolverSwaggerClient extends jw { - swaggerHTTPClient = http_http; - swaggerHTTPClientConfig; - constructor({ - swaggerHTTPClient: s = http_http, - swaggerHTTPClientConfig: o = {}, - ...i - } = {}) { - (super({ ...i, name: 'http-swagger-client' }), - (this.swaggerHTTPClient = s), - (this.swaggerHTTPClientConfig = o)); - } - getHttpClient() { - return this.swaggerHTTPClient; - } - async read(s) { - const o = this.getHttpClient(), - i = new AbortController(), - { signal: u } = i, - _ = setTimeout(() => { - i.abort(); - }, this.timeout), - w = - this.getHttpClient().withCredentials || this.withCredentials - ? 'include' - : 'same-origin', - x = 0 === this.redirects ? 'error' : 'follow', - C = this.redirects > 0 ? this.redirects : void 0; - try { - return ( - await o({ - url: s.uri, - signal: u, - userFetch: async (s, o) => { - let i = await fetch(s, o); - try { - i.headers.delete('Content-Type'); - } catch { - ((i = new Response(i.body, { ...i, headers: new Headers(i.headers) })), - i.headers.delete('Content-Type')); - } - return i; - }, - credentials: w, - redirect: x, - follow: C, - ...this.swaggerHTTPClientConfig - }) - ).text.arrayBuffer(); - } catch (o) { - throw new Pw(`Error downloading "${s.uri}"`, { cause: o }); - } finally { - clearTimeout(_); - } - } - }, - from = (s, o = wp) => { - if (Yl(s)) - try { - return o.fromRefract(JSON.parse(s)); - } catch {} - return ku(s) && md('element', s) ? o.fromRefract(s) : o.toElement(s); - }; - const Rw = class JSONParser extends xw { - constructor(s = {}) { - super({ name: 'json-swagger-client', mediaTypes: ['application/json'], ...s }); - } - async canParse(s) { - const o = 0 === this.fileExtensions.length || this.fileExtensions.includes(s.extension), - i = this.mediaTypes.includes(s.mediaType); - if (!o) return !1; - if (i) return !0; - if (!i) - try { - return (JSON.parse(s.toString()), !0); - } catch (s) { - return !1; - } - return !1; - } - async parse(s) { - if (this.sourceMap) - throw new Sw("json-swagger-client parser plugin doesn't support sourceMaps option"); - const o = new Mu(), - i = s.toString(); - if (this.allowEmpty && '' === i.trim()) return o; - try { - const s = from(JSON.parse(i)); - return (s.classes.push('result'), o.push(s), o); - } catch (o) { - throw new Sw(`Error parsing "${s.uri}"`, { cause: o }); - } - } - }; - const Dw = class YAMLParser extends xw { - constructor(s = {}) { - super({ - name: 'yaml-1-2-swagger-client', - mediaTypes: ['text/yaml', 'application/yaml'], - ...s - }); - } - async canParse(s) { - const o = 0 === this.fileExtensions.length || this.fileExtensions.includes(s.extension), - i = this.mediaTypes.includes(s.mediaType); - if (!o) return !1; - if (i) return !0; - if (!i) - try { - return (mn.load(s.toString(), { schema: nn }), !0); - } catch (s) { - return !1; - } - return !1; - } - async parse(s) { - if (this.sourceMap) - throw new Sw( - "yaml-1-2-swagger-client parser plugin doesn't support sourceMaps option" - ); - const o = new Mu(), - i = s.toString(); - try { - const s = mn.load(i, { schema: nn }); - if (this.allowEmpty && void 0 === s) return o; - const u = from(s); - return (u.classes.push('result'), o.push(u), o); - } catch (o) { - throw new Sw(`Error parsing "${s.uri}"`, { cause: o }); - } - } - }; - const Lw = class OpenAPIJSON3_1Parser extends xw { - detectionRegExp = /"openapi"\s*:\s*"(?3\.1\.(?:[1-9]\d*|0))"/; - constructor(s = {}) { - super({ - name: 'openapi-json-3-1-swagger-client', - mediaTypes: new OpenAPIMediaTypes( - ...lw.filterByFormat('generic'), - ...lw.filterByFormat('json') - ), - ...s - }); - } - async canParse(s) { - const o = 0 === this.fileExtensions.length || this.fileExtensions.includes(s.extension), - i = this.mediaTypes.includes(s.mediaType); - if (!o) return !1; - if (i) return !0; - if (!i) - try { - const o = s.toString(); - return (JSON.parse(o), this.detectionRegExp.test(o)); - } catch (s) { - return !1; - } - return !1; - } - async parse(s) { - if (this.sourceMap) - throw new Sw( - "openapi-json-3-1-swagger-client parser plugin doesn't support sourceMaps option" - ); - const o = new Mu(), - i = s.toString(); - if (this.allowEmpty && '' === i.trim()) return o; - try { - const s = JSON.parse(i), - u = wb.refract(s, this.refractorOpts); - return (u.classes.push('result'), o.push(u), o); - } catch (o) { - throw new Sw(`Error parsing "${s.uri}"`, { cause: o }); - } - } - }; - const Bw = class OpenAPIYAML31Parser extends xw { - detectionRegExp = - /(?^(["']?)openapi\2\s*:\s*(["']?)(?3\.1\.(?:[1-9]\d*|0))\3(?:\s+|$))|(?"openapi"\s*:\s*"(?3\.1\.(?:[1-9]\d*|0))")/m; - constructor(s = {}) { - super({ - name: 'openapi-yaml-3-1-swagger-client', - mediaTypes: new OpenAPIMediaTypes( - ...lw.filterByFormat('generic'), - ...lw.filterByFormat('yaml') - ), - ...s - }); - } - async canParse(s) { - const o = 0 === this.fileExtensions.length || this.fileExtensions.includes(s.extension), - i = this.mediaTypes.includes(s.mediaType); - if (!o) return !1; - if (i) return !0; - if (!i) - try { - const o = s.toString(); - return (mn.load(o), this.detectionRegExp.test(o)); - } catch (s) { - return !1; - } - return !1; - } - async parse(s) { - if (this.sourceMap) - throw new Sw( - "openapi-yaml-3-1-swagger-client parser plugin doesn't support sourceMaps option" - ); - const o = new Mu(), - i = s.toString(); - try { - const s = mn.load(i, { schema: nn }); - if (this.allowEmpty && void 0 === s) return o; - const u = wb.refract(s, this.refractorOpts); - return (u.classes.push('result'), o.push(u), o); - } catch (o) { - throw new Sw(`Error parsing "${s.uri}"`, { cause: o }); - } - } - }; - const Fw = _curry3(function propEq(s, o, i) { - return ra(s, Da(o, i)); - }); - const qw = class DereferenceStrategy { - name; - constructor({ name: s }) { - this.name = s; - } - }; - var $w = _curry2(function none(s, o) { - return ju(_complement(s), o); - }); - const Vw = $w; - var Uw = __webpack_require__(8068); - const zw = class ElementIdentityError extends Jo { - value; - constructor(s, o) { - (super(s, o), void 0 !== o && (this.value = o.value)); - } - }; - class IdentityManager { - uuid; - identityMap; - constructor({ length: s = 6 } = {}) { - ((this.uuid = new Uw({ length: s })), (this.identityMap = new WeakMap())); - } - identify(s) { - if (!Nu(s)) - throw new zw( - 'Cannot not identify the element. `element` is neither structurally compatible nor a subclass of an Element class.', - { value: s } - ); - if (s.meta.hasKey('id') && Ru(s.meta.get('id')) && !s.meta.get('id').equals('')) - return s.id; - if (this.identityMap.has(s)) return this.identityMap.get(s); - const o = new Cu.Om(this.generateId()); - return (this.identityMap.set(s, o), o); - } - forget(s) { - return !!this.identityMap.has(s) && (this.identityMap.delete(s), !0); - } - generateId() { - return this.uuid.randomUUID(); - } - } - new IdentityManager(); - const Ww = _curry3(function pathOr(s, o, i) { - return Na(s, _path(o, i)); - }), - traversal_find = (s, o) => { - const i = new PredicateVisitor({ predicate: s, returnOnTrue: Ju }); - return (visitor_visit(o, i), Ww(void 0, [0], i.result)); - }; - const Kw = class JsonSchema$anchorError extends Ho {}; - const Hw = class EvaluationJsonSchema$anchorError extends Kw {}; - const Jw = class InvalidJsonSchema$anchorError extends Kw { - constructor(s) { - super(`Invalid JSON Schema $anchor "${s}".`); - } - }, - isAnchor = (s) => /^[A-Za-z_][A-Za-z_0-9.-]*$/.test(s), - uriToAnchor = (s) => { - const o = getHash(s); - return Up('#', o); - }, - $anchor_evaluate = (s, o) => { - const i = ((s) => { - if (!isAnchor(s)) throw new Jw(s); - return s; - })(s), - u = traversal_find((s) => Q_(s) && serializers_value(s.$anchor) === i, o); - if (Rl(u)) throw new Hw(`Evaluation failed on token: "${i}"`); - return u; - }, - traversal_filter = (s, o) => { - const i = new PredicateVisitor({ predicate: s }); - return (visitor_visit(o, i), new Cu.G6(i.result)); - }; - const Gw = class JsonSchemaUriError extends Ho {}; - const Yw = class EvaluationJsonSchemaUriError extends Gw {}, - resolveSchema$refField = (s, o) => { - if (void 0 === o.$ref) return; - const i = getHash(serializers_value(o.$ref)), - u = serializers_value(o.meta.get('inherited$id')), - _ = Ca((s, o) => resolve(s, sanitize(stripHash(o))), s, [ - ...u, - serializers_value(o.$ref) - ]); - return `${_}${'#' === i ? '' : i}`; - }, - refractToSchemaElement = (s) => { - if (refractToSchemaElement.cache.has(s)) return refractToSchemaElement.cache.get(s); - const o = qb.refract(s); - return (refractToSchemaElement.cache.set(s, o), o); - }; - refractToSchemaElement.cache = new WeakMap(); - const maybeRefractToSchemaElement = (s) => - isPrimitiveElement(s) ? refractToSchemaElement(s) : s, - uri_evaluate = (s, o) => { - const { cache: i } = uri_evaluate, - u = stripHash(s), - isSchemaElementWith$id = (s) => Q_(s) && void 0 !== s.$id; - if (!i.has(o)) { - const s = traversal_filter(isSchemaElementWith$id, o); - i.set(o, Array.from(s)); - } - const _ = i.get(o).find((s) => { - const o = ((s, o) => { - if (void 0 === o.$id) return; - const i = serializers_value(o.meta.get('inherited$id')); - return Ca((s, o) => resolve(s, sanitize(stripHash(o))), s, [ - ...i, - serializers_value(o.$id) - ]); - })(u, s); - return o === u; - }); - if (Rl(_)) throw new Yw(`Evaluation failed on URI: "${s}"`); - let w, x; - return ( - isAnchor(uriToAnchor(s)) - ? ((w = $anchor_evaluate), (x = uriToAnchor(s))) - : ((w = es_evaluate), (x = uriToPointer(s))), - w(x, _) - ); - }; - uri_evaluate.cache = new WeakMap(); - const Xw = class MaximumDereferenceDepthError extends _w {}; - const Zw = class MaximumResolveDepthError extends Iw {}; - const Qw = class UnmatchedResolverError extends Pw {}, - _swagger_api_apidom_reference_es_parse = async (s, o) => { - const i = new vw({ uri: sanitize(stripHash(s)), mediaType: o.parse.mediaType }), - u = await (async (s, o) => { - const i = o.resolve.resolvers.map((s) => { - const i = Object.create(s); - return Object.assign(i, o.resolve.resolverOpts); - }), - u = await plugins_filter('canRead', [s, o], i); - if (gp(u)) throw new Qw(s.uri); - try { - const { result: o } = await run('read', [s], u); - return o; - } catch (o) { - throw new Iw(`Error while reading file "${s.uri}"`, { cause: o }); - } - })(i, o); - return (async (s, o) => { - const i = o.parse.parsers.map((s) => { - const i = Object.create(s); - return Object.assign(i, o.parse.parserOpts); - }), - u = await plugins_filter('canParse', [s, o], i); - if (gp(u)) throw new Qw(s.uri); - try { - const { plugin: i, result: _ } = await run('parse', [s, o], u); - return !i.allowEmpty && _.isEmpty - ? Promise.reject(new ww(`Error while parsing file "${s.uri}". File is empty.`)) - : _; - } catch (o) { - throw new ww(`Error while parsing file "${s.uri}"`, { cause: o }); - } - })(new vw({ ...i, data: u }), o); - }; - class AncestorLineage extends Array { - includesCycle(s) { - return this.filter((o) => o.has(s)).length > 1; - } - includes(s, o) { - return s instanceof Set ? super.includes(s, o) : this.some((o) => o.has(s)); - } - findItem(s) { - for (const o of this) for (const i of o) if (Nu(i) && s(i)) return i; - } - } - const eS = visitor_visit[Symbol.for('nodejs.util.promisify.custom')], - tS = new IdentityManager(), - mutationReplacer = (s, o, i, u) => { - $u(u) ? (u.value = s) : Array.isArray(u) && (u[i] = s); - }; - class OpenAPI3_1DereferenceVisitor { - indirections; - namespace; - reference; - options; - ancestors; - refractCache; - constructor({ - reference: s, - namespace: o, - options: i, - indirections: u = [], - ancestors: _ = new AncestorLineage(), - refractCache: w = new Map() - }) { - ((this.indirections = u), - (this.namespace = o), - (this.reference = s), - (this.options = i), - (this.ancestors = new AncestorLineage(..._)), - (this.refractCache = w)); - } - toBaseURI(s) { - return resolve(this.reference.uri, sanitize(stripHash(s))); - } - async toReference(s) { - if (this.reference.depth >= this.options.resolve.maxDepth) - throw new Zw( - `Maximum resolution depth of ${this.options.resolve.maxDepth} has been exceeded by file "${this.reference.uri}"` - ); - const o = this.toBaseURI(s), - { refSet: i } = this.reference; - if (i.has(o)) return i.find(Fw(o, 'uri')); - const u = await _swagger_api_apidom_reference_es_parse(unsanitize(o), { - ...this.options, - parse: { ...this.options.parse, mediaType: 'text/plain' } - }), - _ = new cw({ uri: o, value: cloneDeep(u), depth: this.reference.depth + 1 }); - if ((i.add(_), this.options.dereference.immutable)) { - const s = new cw({ - uri: `immutable://${o}`, - value: u, - depth: this.reference.depth + 1 - }); - i.add(s); - } - return _; - } - toAncestorLineage(s) { - const o = new Set(s.filter(Nu)); - return [new AncestorLineage(...this.ancestors, o), o]; - } - async ReferenceElement(s, o, i, u, _, w) { - if (this.indirections.includes(s)) return !1; - const [x, C] = this.toAncestorLineage([..._, i]), - j = this.toBaseURI(serializers_value(s.$ref)), - L = stripHash(this.reference.uri) === j, - B = !L; - if (!this.options.resolve.internal && L) return !1; - if (!this.options.resolve.external && B) return !1; - const $ = await this.toReference(serializers_value(s.$ref)), - V = resolve(j, serializers_value(s.$ref)); - this.indirections.push(s); - const U = uriToPointer(V); - let z = es_evaluate(U, $.value.result); - if (((z.id = tS.identify(z)), isPrimitiveElement(z))) { - const o = serializers_value(s.meta.get('referenced-element')), - i = `${o}-${serializers_value(tS.identify(z))}`; - if (this.refractCache.has(i)) z = this.refractCache.get(i); - else if (isReferenceLikeElement(z)) - ((z = Pb.refract(z)), - z.setMetaProperty('referenced-element', o), - this.refractCache.set(i, z)); - else { - ((z = this.namespace.getElementClass(o).refract(z)), this.refractCache.set(i, z)); - } - } - if (s === z) throw new Ho('Recursive Reference Object detected'); - if (this.indirections.length > this.options.dereference.maxDepth) - throw new Xw( - `Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"` - ); - if (x.includes(z)) { - if ((($.refSet.circular = !0), 'error' === this.options.dereference.circular)) - throw new Ho('Circular reference detected'); - if ('replace' === this.options.dereference.circular) { - var Y, Z; - const o = new Cu.sI(z.id, { - type: 'reference', - uri: $.uri, - $ref: serializers_value(s.$ref) - }), - u = ( - null !== - (Y = - null === (Z = this.options.dereference.strategyOpts['openapi-3-1']) || - void 0 === Z - ? void 0 - : Z.circularReplacer) && void 0 !== Y - ? Y - : this.options.dereference.circularReplacer - )(o); - return (w.replaceWith(u, mutationReplacer), !i && u); - } - } - const ee = stripHash($.refSet.rootRef.uri) !== $.uri, - ie = ['error', 'replace'].includes(this.options.dereference.circular); - if ((B || ee || G_(z) || ie) && !x.includesCycle(z)) { - C.add(s); - const o = new OpenAPI3_1DereferenceVisitor({ - reference: $, - namespace: this.namespace, - indirections: [...this.indirections], - options: this.options, - refractCache: this.refractCache, - ancestors: x - }); - ((z = await eS(z, o, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - })), - C.delete(s)); - } - this.indirections.pop(); - const ae = cloneShallow(z); - return ( - ae.setMetaProperty('id', tS.generateId()), - ae.setMetaProperty('ref-fields', { - $ref: serializers_value(s.$ref), - description: serializers_value(s.description), - summary: serializers_value(s.summary) - }), - ae.setMetaProperty('ref-origin', $.uri), - ae.setMetaProperty('ref-referencing-element-id', cloneDeep(tS.identify(s))), - Fu(z) && - Fu(ae) && - (s.hasKey('description') && - 'description' in z && - (ae.remove('description'), ae.set('description', s.get('description'))), - s.hasKey('summary') && - 'summary' in z && - (ae.remove('summary'), ae.set('summary', s.get('summary')))), - w.replaceWith(ae, mutationReplacer), - !i && ae - ); - } - async PathItemElement(s, o, i, u, _, w) { - if (!Ru(s.$ref)) return; - if (this.indirections.includes(s)) return !1; - const [x, C] = this.toAncestorLineage([..._, i]), - j = this.toBaseURI(serializers_value(s.$ref)), - L = stripHash(this.reference.uri) === j, - B = !L; - if (!this.options.resolve.internal && L) return; - if (!this.options.resolve.external && B) return; - const $ = await this.toReference(serializers_value(s.$ref)), - V = resolve(j, serializers_value(s.$ref)); - this.indirections.push(s); - const U = uriToPointer(V); - let z = es_evaluate(U, $.value.result); - if (((z.id = tS.identify(z)), isPrimitiveElement(z))) { - const s = `path-item-${serializers_value(tS.identify(z))}`; - this.refractCache.has(s) - ? (z = this.refractCache.get(s)) - : ((z = Ab.refract(z)), this.refractCache.set(s, z)); - } - if (s === z) throw new Ho('Recursive Path Item Object reference detected'); - if (this.indirections.length > this.options.dereference.maxDepth) - throw new Xw( - `Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"` - ); - if (x.includes(z)) { - if ((($.refSet.circular = !0), 'error' === this.options.dereference.circular)) - throw new Ho('Circular reference detected'); - if ('replace' === this.options.dereference.circular) { - var Y, Z; - const o = new Cu.sI(z.id, { - type: 'path-item', - uri: $.uri, - $ref: serializers_value(s.$ref) - }), - u = ( - null !== - (Y = - null === (Z = this.options.dereference.strategyOpts['openapi-3-1']) || - void 0 === Z - ? void 0 - : Z.circularReplacer) && void 0 !== Y - ? Y - : this.options.dereference.circularReplacer - )(o); - return (w.replaceWith(u, mutationReplacer), !i && u); - } - } - const ee = stripHash($.refSet.rootRef.uri) !== $.uri, - ie = ['error', 'replace'].includes(this.options.dereference.circular); - if ((B || ee || (H_(z) && Ru(z.$ref)) || ie) && !x.includesCycle(z)) { - C.add(s); - const o = new OpenAPI3_1DereferenceVisitor({ - reference: $, - namespace: this.namespace, - indirections: [...this.indirections], - options: this.options, - refractCache: this.refractCache, - ancestors: x - }); - ((z = await eS(z, o, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - })), - C.delete(s)); - } - if ((this.indirections.pop(), H_(z))) { - const o = new Ab([...z.content], cloneDeep(z.meta), cloneDeep(z.attributes)); - (o.setMetaProperty('id', tS.generateId()), - s.forEach((s, i, u) => { - (o.remove(serializers_value(i)), o.content.push(u)); - }), - o.remove('$ref'), - o.setMetaProperty('ref-fields', { $ref: serializers_value(s.$ref) }), - o.setMetaProperty('ref-origin', $.uri), - o.setMetaProperty('ref-referencing-element-id', cloneDeep(tS.identify(s))), - (z = o)); - } - return (w.replaceWith(z, mutationReplacer), i ? void 0 : z); - } - async LinkElement(s, o, i, u, _, w) { - if (!Ru(s.operationRef) && !Ru(s.operationId)) return; - if (Ru(s.operationRef) && Ru(s.operationId)) - throw new Ho( - 'LinkElement operationRef and operationId fields are mutually exclusive.' - ); - let x; - if (Ru(s.operationRef)) { - var C; - const o = uriToPointer(serializers_value(s.operationRef)), - u = this.toBaseURI(serializers_value(s.operationRef)), - _ = stripHash(this.reference.uri) === u, - j = !_; - if (!this.options.resolve.internal && _) return; - if (!this.options.resolve.external && j) return; - const L = await this.toReference(serializers_value(s.operationRef)); - if (((x = es_evaluate(o, L.value.result)), isPrimitiveElement(x))) { - const s = `operation-${serializers_value(tS.identify(x))}`; - this.refractCache.has(s) - ? (x = this.refractCache.get(s)) - : ((x = Sb.refract(x)), this.refractCache.set(s, x)); - } - ((x = cloneShallow(x)), x.setMetaProperty('ref-origin', L.uri)); - const B = cloneShallow(s); - return ( - null === (C = B.operationRef) || void 0 === C || C.meta.set('operation', x), - w.replaceWith(B, mutationReplacer), - i ? void 0 : B - ); - } - if (Ru(s.operationId)) { - var j; - const o = serializers_value(s.operationId), - u = await this.toReference(unsanitize(this.reference.uri)); - if ( - ((x = traversal_find( - (s) => W_(s) && Nu(s.operationId) && s.operationId.equals(o), - u.value.result - )), - Rl(x)) - ) - throw new Ho(`OperationElement(operationId=${o}) not found.`); - const _ = cloneShallow(s); - return ( - null === (j = _.operationId) || void 0 === j || j.meta.set('operation', x), - w.replaceWith(_, mutationReplacer), - i ? void 0 : _ - ); - } - } - async ExampleElement(s, o, i, u, _, w) { - if (!Ru(s.externalValue)) return; - if (s.hasKey('value') && Ru(s.externalValue)) - throw new Ho('ExampleElement value and externalValue fields are mutually exclusive.'); - const x = this.toBaseURI(serializers_value(s.externalValue)), - C = stripHash(this.reference.uri) === x, - j = !C; - if (!this.options.resolve.internal && C) return; - if (!this.options.resolve.external && j) return; - const L = await this.toReference(serializers_value(s.externalValue)), - B = cloneShallow(L.value.result); - B.setMetaProperty('ref-origin', L.uri); - const $ = cloneShallow(s); - return (($.value = B), w.replaceWith($, mutationReplacer), i ? void 0 : $); - } - async SchemaElement(s, o, i, u, _, w) { - if (!Ru(s.$ref)) return; - if (this.indirections.includes(s)) return !1; - const [x, C] = this.toAncestorLineage([..._, i]); - let j = await this.toReference(unsanitize(this.reference.uri)), - { uri: L } = j; - const B = resolveSchema$refField(L, s), - $ = stripHash(B), - V = new vw({ uri: $ }), - U = Vw((s) => s.canRead(V), this.options.resolve.resolvers), - z = !U; - let Y, - Z = stripHash(this.reference.uri) === B, - ee = !Z; - this.indirections.push(s); - try { - if (U || z) { - L = this.toBaseURI(B); - const s = B, - o = maybeRefractToSchemaElement(j.value.result); - if ( - ((Y = uri_evaluate(s, o)), - (Y = maybeRefractToSchemaElement(Y)), - (Y.id = tS.identify(Y)), - !this.options.resolve.internal && Z) - ) - return; - if (!this.options.resolve.external && ee) return; - } else { - if ( - ((L = this.toBaseURI(B)), - (Z = stripHash(this.reference.uri) === L), - (ee = !Z), - !this.options.resolve.internal && Z) - ) - return; - if (!this.options.resolve.external && ee) return; - j = await this.toReference(unsanitize(B)); - const s = uriToPointer(B), - o = maybeRefractToSchemaElement(j.value.result); - ((Y = es_evaluate(s, o)), - (Y = maybeRefractToSchemaElement(Y)), - (Y.id = tS.identify(Y))); - } - } catch (s) { - if (!(z && s instanceof Yw)) throw s; - if (isAnchor(uriToAnchor(B))) { - if ( - ((Z = stripHash(this.reference.uri) === L), - (ee = !Z), - !this.options.resolve.internal && Z) - ) - return; - if (!this.options.resolve.external && ee) return; - j = await this.toReference(unsanitize(B)); - const s = uriToAnchor(B), - o = maybeRefractToSchemaElement(j.value.result); - ((Y = $anchor_evaluate(s, o)), - (Y = maybeRefractToSchemaElement(Y)), - (Y.id = tS.identify(Y))); - } else { - if ( - ((L = this.toBaseURI(B)), - (Z = stripHash(this.reference.uri) === L), - (ee = !Z), - !this.options.resolve.internal && Z) - ) - return; - if (!this.options.resolve.external && ee) return; - j = await this.toReference(unsanitize(B)); - const s = uriToPointer(B), - o = maybeRefractToSchemaElement(j.value.result); - ((Y = es_evaluate(s, o)), - (Y = maybeRefractToSchemaElement(Y)), - (Y.id = tS.identify(Y))); - } - } - if (s === Y) throw new Ho('Recursive Schema Object reference detected'); - if (this.indirections.length > this.options.dereference.maxDepth) - throw new Xw( - `Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"` - ); - if (x.includes(Y)) { - if (((j.refSet.circular = !0), 'error' === this.options.dereference.circular)) - throw new Ho('Circular reference detected'); - if ('replace' === this.options.dereference.circular) { - var ie, ae; - const o = new Cu.sI(Y.id, { - type: 'json-schema', - uri: j.uri, - $ref: serializers_value(s.$ref) - }), - u = ( - null !== - (ie = - null === (ae = this.options.dereference.strategyOpts['openapi-3-1']) || - void 0 === ae - ? void 0 - : ae.circularReplacer) && void 0 !== ie - ? ie - : this.options.dereference.circularReplacer - )(o); - return (w.replaceWith(u, mutationReplacer), !i && u); - } - } - const le = stripHash(j.refSet.rootRef.uri) !== j.uri, - ce = ['error', 'replace'].includes(this.options.dereference.circular); - if ((ee || le || (Q_(Y) && Ru(Y.$ref)) || ce) && !x.includesCycle(Y)) { - C.add(s); - const o = new OpenAPI3_1DereferenceVisitor({ - reference: j, - namespace: this.namespace, - indirections: [...this.indirections], - options: this.options, - refractCache: this.refractCache, - ancestors: x - }); - ((Y = await eS(Y, o, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - })), - C.delete(s)); - } - if ((this.indirections.pop(), predicates_isBooleanJsonSchemaElement(Y))) { - const o = cloneDeep(Y); - return ( - o.setMetaProperty('id', tS.generateId()), - o.setMetaProperty('ref-fields', { $ref: serializers_value(s.$ref) }), - o.setMetaProperty('ref-origin', j.uri), - o.setMetaProperty('ref-referencing-element-id', cloneDeep(tS.identify(s))), - w.replaceWith(o, mutationReplacer), - !i && o - ); - } - if (Q_(Y)) { - const o = new qb([...Y.content], cloneDeep(Y.meta), cloneDeep(Y.attributes)); - (o.setMetaProperty('id', tS.generateId()), - s.forEach((s, i, u) => { - (o.remove(serializers_value(i)), o.content.push(u)); - }), - o.remove('$ref'), - o.setMetaProperty('ref-fields', { $ref: serializers_value(s.$ref) }), - o.setMetaProperty('ref-origin', j.uri), - o.setMetaProperty('ref-referencing-element-id', cloneDeep(tS.identify(s))), - (Y = o)); - } - return (w.replaceWith(Y, mutationReplacer), i ? void 0 : Y); - } - } - const rS = OpenAPI3_1DereferenceVisitor, - nS = visitor_visit[Symbol.for('nodejs.util.promisify.custom')]; - const sS = class OpenAPI3_1DereferenceStrategy extends qw { - constructor(s) { - super({ ...(null != s ? s : {}), name: 'openapi-3-1' }); - } - canDereference(s) { - var o; - return 'text/plain' !== s.mediaType - ? lw.includes(s.mediaType) - : z_(null === (o = s.parseResult) || void 0 === o ? void 0 : o.result); - } - async dereference(s, o) { - var i; - const u = createNamespace(ow), - _ = null !== (i = o.dereference.refSet) && void 0 !== i ? i : new uw(), - w = new uw(); - let x, - C = _; - (_.has(s.uri) - ? (x = _.find(Fw(s.uri, 'uri'))) - : ((x = new cw({ uri: s.uri, value: s.parseResult })), _.add(x)), - o.dereference.immutable && - (_.refs - .map((s) => new cw({ ...s, value: cloneDeep(s.value) })) - .forEach((s) => w.add(s)), - (x = w.find((o) => o.uri === s.uri)), - (C = w))); - const j = new rS({ reference: x, namespace: u, options: o }), - L = await nS(C.rootRef.value, j, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - }); - return ( - o.dereference.immutable && - w.refs - .filter((s) => s.uri.startsWith('immutable://')) - .map((s) => new cw({ ...s, uri: s.uri.replace(/^immutable:\/\//, '') })) - .forEach((s) => _.add(s)), - null === o.dereference.refSet && _.clean(), - w.clean(), - L - ); - } - }, - to_path = (s) => { - const o = ((s) => s.slice(2))(s); - return o.reduce((s, i, u) => { - if ($u(i)) { - const o = String(serializers_value(i.key)); - s.push(o); - } else if (qu(o[u - 2])) { - const _ = o[u - 2].content.indexOf(i); - s.push(_); - } - return s; - }, []); - }; - const oS = class ModelPropertyMacroVisitor { - modelPropertyMacro; - options; - SchemaElement = { - leave: (s, o, i, u, _) => { - void 0 !== s.properties && - Fu(s.properties) && - s.properties.forEach((o) => { - if (Fu(o)) - try { - const s = this.modelPropertyMacro(serializers_value(o)); - o.set('default', s); - } catch (o) { - var u, w; - const x = new Error(o, { cause: o }); - ((x.fullPath = [...to_path([..._, i, s]), 'properties']), - null === (u = this.options.dereference.dereferenceOpts) || - void 0 === u || - null === (u = u.errors) || - void 0 === u || - null === (w = u.push) || - void 0 === w || - w.call(u, x)); - } - }); - } - }; - constructor({ modelPropertyMacro: s, options: o }) { - ((this.modelPropertyMacro = s), (this.options = o)); - } - }; - const iS = class all_of_AllOfVisitor { - options; - SchemaElement = { - leave(s, o, i, u, _) { - if (void 0 === s.allOf) return; - if (!qu(s.allOf)) { - var w, x; - const o = new TypeError('allOf must be an array'); - return ( - (o.fullPath = [...to_path([..._, i, s]), 'allOf']), - void ( - null === (w = this.options.dereference.dereferenceOpts) || - void 0 === w || - null === (w = w.errors) || - void 0 === w || - null === (x = w.push) || - void 0 === x || - x.call(w, o) - ) - ); - } - if (s.allOf.isEmpty) return void s.remove('allOf'); - if (!s.allOf.content.every(Q_)) { - var C, j; - const o = new TypeError('Elements in allOf must be objects'); - return ( - (o.fullPath = [...to_path([..._, i, s]), 'allOf']), - void ( - null === (C = this.options.dereference.dereferenceOpts) || - void 0 === C || - null === (C = C.errors) || - void 0 === C || - null === (j = C.push) || - void 0 === j || - j.call(C, o) - ) - ); - } - for (; s.hasKey('allOf'); ) { - const { allOf: o } = s; - s.remove('allOf'); - const i = deepmerge.all([...o.content, s]); - if ((s.hasKey('$$ref') || i.remove('$$ref'), s.hasKey('example'))) { - const o = i.getMember('example'); - o && (o.value = s.get('example')); - } - if (s.hasKey('examples')) { - const o = i.getMember('examples'); - o && (o.value = s.get('examples')); - } - s.content = i.content; - } - } - }; - constructor({ options: s }) { - this.options = s; - } - }; - const aS = class ParameterMacroVisitor { - parameterMacro; - options; - #e; - OperationElement = { - enter: (s) => { - this.#e = s; - }, - leave: () => { - this.#e = void 0; - } - }; - ParameterElement = { - leave: (s, o, i, u, _) => { - const w = this.#e ? serializers_value(this.#e) : null, - x = serializers_value(s); - try { - const o = this.parameterMacro(w, x); - s.set('default', o); - } catch (s) { - var C, j; - const o = new Error(s, { cause: s }); - ((o.fullPath = to_path([..._, i])), - null === (C = this.options.dereference.dereferenceOpts) || - void 0 === C || - null === (C = C.errors) || - void 0 === C || - null === (j = C.push) || - void 0 === j || - j.call(C, o)); - } - } - }; - constructor({ parameterMacro: s, options: o }) { - ((this.parameterMacro = s), (this.options = o)); - } - }, - get_root_cause = (s) => { - if (null == s.cause) return s; - let { cause: o } = s; - for (; null != o.cause; ) o = o.cause; - return o; - }; - const lS = class SchemaRefError extends Jo {}, - { wrapError: cS } = ru, - uS = visitor_visit[Symbol.for('nodejs.util.promisify.custom')], - pS = new IdentityManager(), - dereference_mutationReplacer = (s, o, i, u) => { - $u(u) ? (u.value = s) : Array.isArray(u) && (u[i] = s); - }; - class OpenAPI3_1SwaggerClientDereferenceVisitor extends rS { - useCircularStructures; - allowMetaPatches; - basePath; - constructor({ - allowMetaPatches: s = !0, - useCircularStructures: o = !1, - basePath: i = null, - ...u - }) { - (super(u), - (this.allowMetaPatches = s), - (this.useCircularStructures = o), - (this.basePath = i)); - } - async ReferenceElement(s, o, i, u, _, w) { - try { - if (this.indirections.includes(s)) return !1; - const [o, u] = this.toAncestorLineage([..._, i]), - L = this.toBaseURI(serializers_value(s.$ref)), - B = stripHash(this.reference.uri) === L, - $ = !B; - if (!this.options.resolve.internal && B) return !1; - if (!this.options.resolve.external && $) return !1; - const V = await this.toReference(serializers_value(s.$ref)), - U = resolve(L, serializers_value(s.$ref)); - this.indirections.push(s); - const z = uriToPointer(U); - let Y = es_evaluate(z, V.value.result); - if (((Y.id = pS.identify(Y)), isPrimitiveElement(Y))) { - const o = serializers_value(s.meta.get('referenced-element')), - i = `${o}-${serializers_value(pS.identify(Y))}`; - if (this.refractCache.has(i)) Y = this.refractCache.get(i); - else if (isReferenceLikeElement(Y)) - ((Y = Pb.refract(Y)), - Y.setMetaProperty('referenced-element', o), - this.refractCache.set(i, Y)); - else { - ((Y = this.namespace.getElementClass(o).refract(Y)), this.refractCache.set(i, Y)); - } - } - if (s === Y) throw new Ho('Recursive Reference Object detected'); - if (this.indirections.length > this.options.dereference.maxDepth) - throw new Xw( - `Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"` - ); - if (o.includes(Y)) { - if (((V.refSet.circular = !0), 'error' === this.options.dereference.circular)) - throw new Ho('Circular reference detected'); - if ('replace' === this.options.dereference.circular) { - var x, C; - const o = new Cu.sI(Y.id, { - type: 'reference', - uri: V.uri, - $ref: serializers_value(s.$ref), - baseURI: U, - referencingElement: s - }), - u = ( - null !== - (x = - null === (C = this.options.dereference.strategyOpts['openapi-3-1']) || - void 0 === C - ? void 0 - : C.circularReplacer) && void 0 !== x - ? x - : this.options.dereference.circularReplacer - )(o); - return (w.replaceWith(o, dereference_mutationReplacer), !i && u); - } - } - const Z = stripHash(V.refSet.rootRef.uri) !== V.uri, - ee = ['error', 'replace'].includes(this.options.dereference.circular); - if (($ || Z || G_(Y) || ee) && !o.includesCycle(Y)) { - var j; - u.add(s); - const w = new OpenAPI3_1SwaggerClientDereferenceVisitor({ - reference: V, - namespace: this.namespace, - indirections: [...this.indirections], - options: this.options, - refractCache: this.refractCache, - ancestors: o, - allowMetaPatches: this.allowMetaPatches, - useCircularStructures: this.useCircularStructures, - basePath: - null !== (j = this.basePath) && void 0 !== j - ? j - : [...to_path([..._, i, s]), '$ref'] - }); - ((Y = await uS(Y, w, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - })), - u.delete(s)); - } - this.indirections.pop(); - const ie = cloneShallow(Y); - if ( - (ie.setMetaProperty('ref-fields', { - $ref: serializers_value(s.$ref), - description: serializers_value(s.description), - summary: serializers_value(s.summary) - }), - ie.setMetaProperty('ref-origin', V.uri), - ie.setMetaProperty('ref-referencing-element-id', cloneDeep(pS.identify(s))), - Fu(Y) && - (s.hasKey('description') && - 'description' in Y && - (ie.remove('description'), ie.set('description', s.get('description'))), - s.hasKey('summary') && - 'summary' in Y && - (ie.remove('summary'), ie.set('summary', s.get('summary')))), - this.allowMetaPatches && Fu(ie) && !ie.hasKey('$$ref')) - ) { - const s = resolve(L, U); - ie.set('$$ref', s); - } - return (w.replaceWith(ie, dereference_mutationReplacer), !i && ie); - } catch (o) { - var L, B, $; - const u = get_root_cause(o), - w = cS(u, { - baseDoc: this.reference.uri, - $ref: serializers_value(s.$ref), - pointer: uriToPointer(serializers_value(s.$ref)), - fullPath: - null !== (L = this.basePath) && void 0 !== L - ? L - : [...to_path([..._, i, s]), '$ref'] - }); - return void ( - null === (B = this.options.dereference.dereferenceOpts) || - void 0 === B || - null === (B = B.errors) || - void 0 === B || - null === ($ = B.push) || - void 0 === $ || - $.call(B, w) - ); - } - } - async PathItemElement(s, o, i, u, _, w) { - try { - if (!Ru(s.$ref)) return; - if (this.indirections.includes(s)) return !1; - if (includesClasses(['cycle'], s.$ref)) return !1; - const [o, u] = this.toAncestorLineage([..._, i]), - L = this.toBaseURI(serializers_value(s.$ref)), - B = stripHash(this.reference.uri) === L, - $ = !B; - if (!this.options.resolve.internal && B) return; - if (!this.options.resolve.external && $) return; - const V = await this.toReference(serializers_value(s.$ref)), - U = resolve(L, serializers_value(s.$ref)); - this.indirections.push(s); - const z = uriToPointer(U); - let Y = es_evaluate(z, V.value.result); - if (((Y.id = pS.identify(Y)), isPrimitiveElement(Y))) { - const s = `path-item-${serializers_value(pS.identify(Y))}`; - this.refractCache.has(s) - ? (Y = this.refractCache.get(s)) - : ((Y = Ab.refract(Y)), this.refractCache.set(s, Y)); - } - if (s === Y) throw new Ho('Recursive Path Item Object reference detected'); - if (this.indirections.length > this.options.dereference.maxDepth) - throw new Xw( - `Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"` - ); - if (o.includes(Y)) { - if (((V.refSet.circular = !0), 'error' === this.options.dereference.circular)) - throw new Ho('Circular reference detected'); - if ('replace' === this.options.dereference.circular) { - var x, C; - const o = new Cu.sI(Y.id, { - type: 'path-item', - uri: V.uri, - $ref: serializers_value(s.$ref), - baseURI: U, - referencingElement: s - }), - u = ( - null !== - (x = - null === (C = this.options.dereference.strategyOpts['openapi-3-1']) || - void 0 === C - ? void 0 - : C.circularReplacer) && void 0 !== x - ? x - : this.options.dereference.circularReplacer - )(o); - return (w.replaceWith(o, dereference_mutationReplacer), !i && u); - } - } - const Z = stripHash(V.refSet.rootRef.uri) !== V.uri, - ee = ['error', 'replace'].includes(this.options.dereference.circular); - if (($ || Z || (H_(Y) && Ru(Y.$ref)) || ee) && !o.includesCycle(Y)) { - var j; - u.add(s); - const w = new OpenAPI3_1SwaggerClientDereferenceVisitor({ - reference: V, - namespace: this.namespace, - indirections: [...this.indirections], - options: this.options, - ancestors: o, - allowMetaPatches: this.allowMetaPatches, - useCircularStructures: this.useCircularStructures, - basePath: - null !== (j = this.basePath) && void 0 !== j - ? j - : [...to_path([..._, i, s]), '$ref'] - }); - ((Y = await uS(Y, w, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - })), - u.delete(s)); - } - if ((this.indirections.pop(), H_(Y))) { - const o = new Ab([...Y.content], cloneDeep(Y.meta), cloneDeep(Y.attributes)); - if ( - (s.forEach((s, i, u) => { - (o.remove(serializers_value(i)), o.content.push(u)); - }), - o.remove('$ref'), - o.setMetaProperty('ref-fields', { $ref: serializers_value(s.$ref) }), - o.setMetaProperty('ref-origin', V.uri), - o.setMetaProperty('ref-referencing-element-id', cloneDeep(pS.identify(s))), - this.allowMetaPatches && void 0 === o.get('$$ref')) - ) { - const s = resolve(L, U); - o.set('$$ref', s); - } - Y = o; - } - return (w.replaceWith(Y, dereference_mutationReplacer), i ? void 0 : Y); - } catch (o) { - var L, B, $; - const u = get_root_cause(o), - w = cS(u, { - baseDoc: this.reference.uri, - $ref: serializers_value(s.$ref), - pointer: uriToPointer(serializers_value(s.$ref)), - fullPath: - null !== (L = this.basePath) && void 0 !== L - ? L - : [...to_path([..._, i, s]), '$ref'] - }); - return void ( - null === (B = this.options.dereference.dereferenceOpts) || - void 0 === B || - null === (B = B.errors) || - void 0 === B || - null === ($ = B.push) || - void 0 === $ || - $.call(B, w) - ); - } - } - async SchemaElement(s, o, i, u, _, w) { - try { - if (!Ru(s.$ref)) return; - if (this.indirections.includes(s)) return !1; - const [o, u] = this.toAncestorLineage([..._, i]); - let L = await this.toReference(unsanitize(this.reference.uri)), - { uri: B } = L; - const $ = resolveSchema$refField(B, s), - V = stripHash($), - U = new vw({ uri: V }), - z = !this.options.resolve.resolvers.some((s) => s.canRead(U)), - Y = !z; - let Z, - ee = stripHash(this.reference.uri) === $, - ie = !ee; - this.indirections.push(s); - try { - if (z || Y) { - B = this.toBaseURI($); - const s = $, - o = maybeRefractToSchemaElement(L.value.result); - if ( - ((Z = uri_evaluate(s, o)), - (Z = maybeRefractToSchemaElement(Z)), - (Z.id = pS.identify(Z)), - !this.options.resolve.internal && ee) - ) - return; - if (!this.options.resolve.external && ie) return; - } else { - if ( - ((B = this.toBaseURI($)), - (ee = stripHash(this.reference.uri) === B), - (ie = !ee), - !this.options.resolve.internal && ee) - ) - return; - if (!this.options.resolve.external && ie) return; - L = await this.toReference(unsanitize($)); - const s = uriToPointer($), - o = maybeRefractToSchemaElement(L.value.result); - ((Z = es_evaluate(s, o)), - (Z = maybeRefractToSchemaElement(Z)), - (Z.id = pS.identify(Z))); - } - } catch (s) { - if (!(Y && s instanceof Yw)) throw s; - if (isAnchor(uriToAnchor($))) { - if ( - ((ee = stripHash(this.reference.uri) === B), - (ie = !ee), - !this.options.resolve.internal && ee) - ) - return; - if (!this.options.resolve.external && ie) return; - L = await this.toReference(unsanitize($)); - const s = uriToAnchor($), - o = maybeRefractToSchemaElement(L.value.result); - ((Z = $anchor_evaluate(s, o)), - (Z = maybeRefractToSchemaElement(Z)), - (Z.id = pS.identify(Z))); - } else { - if ( - ((B = this.toBaseURI(serializers_value($))), - (ee = stripHash(this.reference.uri) === B), - (ie = !ee), - !this.options.resolve.internal && ee) - ) - return; - if (!this.options.resolve.external && ie) return; - L = await this.toReference(unsanitize($)); - const s = uriToPointer($), - o = maybeRefractToSchemaElement(L.value.result); - ((Z = es_evaluate(s, o)), - (Z = maybeRefractToSchemaElement(Z)), - (Z.id = pS.identify(Z))); - } - } - if (s === Z) throw new Ho('Recursive Schema Object reference detected'); - if (this.indirections.length > this.options.dereference.maxDepth) - throw new Xw( - `Maximum dereference depth of "${this.options.dereference.maxDepth}" has been exceeded in file "${this.reference.uri}"` - ); - if (o.includes(Z)) { - if (((L.refSet.circular = !0), 'error' === this.options.dereference.circular)) - throw new Ho('Circular reference detected'); - if ('replace' === this.options.dereference.circular) { - var x, C; - const o = new Cu.sI(Z.id, { - type: 'json-schema', - uri: L.uri, - $ref: serializers_value(s.$ref), - baseURI: resolve(B, $), - referencingElement: s - }), - u = ( - null !== - (x = - null === (C = this.options.dereference.strategyOpts['openapi-3-1']) || - void 0 === C - ? void 0 - : C.circularReplacer) && void 0 !== x - ? x - : this.options.dereference.circularReplacer - )(o); - return (w.replaceWith(u, dereference_mutationReplacer), !i && u); - } - } - const ae = stripHash(L.refSet.rootRef.uri) !== L.uri, - le = ['error', 'replace'].includes(this.options.dereference.circular); - if ((ie || ae || (Q_(Z) && Ru(Z.$ref)) || le) && !o.includesCycle(Z)) { - var j; - u.add(s); - const w = new OpenAPI3_1SwaggerClientDereferenceVisitor({ - reference: L, - namespace: this.namespace, - indirections: [...this.indirections], - options: this.options, - useCircularStructures: this.useCircularStructures, - allowMetaPatches: this.allowMetaPatches, - ancestors: o, - basePath: - null !== (j = this.basePath) && void 0 !== j - ? j - : [...to_path([..._, i, s]), '$ref'] - }); - ((Z = await uS(Z, w, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - })), - u.delete(s)); - } - if ((this.indirections.pop(), predicates_isBooleanJsonSchemaElement(Z))) { - const o = cloneDeep(Z); - return ( - o.setMetaProperty('ref-fields', { $ref: serializers_value(s.$ref) }), - o.setMetaProperty('ref-origin', L.uri), - o.setMetaProperty('ref-referencing-element-id', cloneDeep(pS.identify(s))), - w.replaceWith(o, dereference_mutationReplacer), - !i && o - ); - } - if (Q_(Z)) { - const o = new qb([...Z.content], cloneDeep(Z.meta), cloneDeep(Z.attributes)); - if ( - (s.forEach((s, i, u) => { - (o.remove(serializers_value(i)), o.content.push(u)); - }), - o.remove('$ref'), - o.setMetaProperty('ref-fields', { $ref: serializers_value(s.$ref) }), - o.setMetaProperty('ref-origin', L.uri), - o.setMetaProperty('ref-referencing-element-id', cloneDeep(pS.identify(s))), - this.allowMetaPatches && void 0 === o.get('$$ref')) - ) { - const s = resolve(B, $); - o.set('$$ref', s); - } - Z = o; - } - return (w.replaceWith(Z, dereference_mutationReplacer), i ? void 0 : Z); - } catch (o) { - var L, B, $; - const u = get_root_cause(o), - w = new lS(`Could not resolve reference: ${u.message}`, { - baseDoc: this.reference.uri, - $ref: serializers_value(s.$ref), - fullPath: - null !== (L = this.basePath) && void 0 !== L - ? L - : [...to_path([..._, i, s]), '$ref'], - cause: u - }); - return void ( - null === (B = this.options.dereference.dereferenceOpts) || - void 0 === B || - null === (B = B.errors) || - void 0 === B || - null === ($ = B.push) || - void 0 === $ || - $.call(B, w) - ); - } - } - async LinkElement() {} - async ExampleElement(s, o, i, u, _, w) { - try { - return await super.ExampleElement(s, o, i, u, _, w); - } catch (o) { - var x, C, j; - const u = get_root_cause(o), - w = cS(u, { - baseDoc: this.reference.uri, - externalValue: serializers_value(s.externalValue), - fullPath: - null !== (x = this.basePath) && void 0 !== x - ? x - : [...to_path([..._, i, s]), 'externalValue'] - }); - return void ( - null === (C = this.options.dereference.dereferenceOpts) || - void 0 === C || - null === (C = C.errors) || - void 0 === C || - null === (j = C.push) || - void 0 === j || - j.call(C, w) - ); - } - } - } - const hS = OpenAPI3_1SwaggerClientDereferenceVisitor, - dS = mergeAll[Symbol.for('nodejs.util.promisify.custom')]; - const fS = class RootVisitor { - constructor({ parameterMacro: s, modelPropertyMacro: o, mode: i, options: u, ..._ }) { - const w = []; - (w.push(new hS({ ..._, options: u })), - 'function' == typeof o && w.push(new oS({ modelPropertyMacro: o, options: u })), - 'strict' !== i && w.push(new iS({ options: u })), - 'function' == typeof s && w.push(new aS({ parameterMacro: s, options: u }))); - const x = dS(w, { - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - }); - Object.assign(this, x); - } - }, - mS = visitor_visit[Symbol.for('nodejs.util.promisify.custom')]; - const gS = class OpenAPI3_1SwaggerClientDereferenceStrategy extends sS { - allowMetaPatches; - parameterMacro; - modelPropertyMacro; - mode; - ancestors; - constructor({ - allowMetaPatches: s = !1, - parameterMacro: o = null, - modelPropertyMacro: i = null, - mode: u = 'non-strict', - ancestors: _ = [], - ...w - } = {}) { - (super({ ...w }), - (this.name = 'openapi-3-1-swagger-client'), - (this.allowMetaPatches = s), - (this.parameterMacro = o), - (this.modelPropertyMacro = i), - (this.mode = u), - (this.ancestors = [..._])); - } - async dereference(s, o) { - var i; - const u = createNamespace(ow), - _ = null !== (i = o.dereference.refSet) && void 0 !== i ? i : new uw(), - w = new uw(); - let x, - C = _; - (_.has(s.uri) - ? (x = _.find((o) => o.uri === s.uri)) - : ((x = new cw({ uri: s.uri, value: s.parseResult })), _.add(x)), - o.dereference.immutable && - (_.refs - .map((s) => new cw({ ...s, value: cloneDeep(s.value) })) - .forEach((s) => w.add(s)), - (x = w.find((o) => o.uri === s.uri)), - (C = w))); - const j = new fS({ - reference: x, - namespace: u, - options: o, - allowMetaPatches: this.allowMetaPatches, - ancestors: this.ancestors, - modelPropertyMacro: this.modelPropertyMacro, - mode: this.mode, - parameterMacro: this.parameterMacro - }), - L = await mS(C.rootRef.value, j, { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - }); - return ( - o.dereference.immutable && - w.refs - .filter((s) => s.uri.startsWith('immutable://')) - .map((s) => new cw({ ...s, uri: s.uri.replace(/^immutable:\/\//, '') })) - .forEach((s) => _.add(s)), - null === o.dereference.refSet && _.clean(), - w.clean(), - L - ); - } - }, - circularReplacer = (s) => { - const o = serializers_value(s.meta.get('baseURI')), - i = s.meta.get('referencingElement'); - return new Cu.Sh({ $ref: o }, cloneDeep(i.meta), cloneDeep(i.attributes)); - }, - resolveOpenAPI31Strategy = async (s) => { - const { - spec: o, - timeout: i, - redirects: u, - requestInterceptor: _, - responseInterceptor: w, - pathDiscriminator: x = [], - allowMetaPatches: C = !1, - useCircularStructures: j = !1, - skipNormalization: L = !1, - parameterMacro: B = null, - modelPropertyMacro: $ = null, - mode: V = 'non-strict', - strategies: U - } = s; - try { - const { cache: z } = resolveOpenAPI31Strategy, - Y = U.find((s) => s.match(o)), - Z = isHttpUrl(url_cwd()) ? url_cwd() : Nc, - ee = options_retrievalURI(s), - ie = resolve(Z, ee); - let ae; - z.has(o) - ? (ae = z.get(o)) - : ((ae = wb.refract(o)), ae.classes.push('result'), z.set(o, ae)); - const le = new Mu([ae]), - ce = es_compile(x), - pe = '' === ce ? '' : `#${ce}`, - de = es_evaluate(ce, ae), - fe = new cw({ uri: ie, value: le }), - ye = new uw({ refs: [fe] }); - '' !== ce && (ye.rootRef = void 0); - const be = [new Set([de])], - _e = [], - we = await (async (s, o = {}) => { - const i = util_merge(pw, o); - return dereferenceApiDOM(s, i); - })(de, { - resolve: { - baseURI: `${ie}${pe}`, - resolvers: [new Nw({ timeout: i || 1e4, redirects: u || 10 })], - resolverOpts: { - swaggerHTTPClientConfig: { requestInterceptor: _, responseInterceptor: w } - }, - strategies: [new Ow()] - }, - parse: { - mediaType: lw.latest(), - parsers: [ - new Lw({ allowEmpty: !1, sourceMap: !1 }), - new Bw({ allowEmpty: !1, sourceMap: !1 }), - new Rw({ allowEmpty: !1, sourceMap: !1 }), - new Dw({ allowEmpty: !1, sourceMap: !1 }), - new kw({ allowEmpty: !1, sourceMap: !1 }) - ] - }, - dereference: { - maxDepth: 100, - strategies: [ - new gS({ - allowMetaPatches: C, - useCircularStructures: j, - parameterMacro: B, - modelPropertyMacro: $, - mode: V, - ancestors: be - }) - ], - refSet: ye, - dereferenceOpts: { errors: _e }, - immutable: !1, - circular: j ? 'ignore' : 'replace', - circularReplacer: j ? pw.dereference.circularReplacer : circularReplacer - } - }), - Se = ((s, o, i) => new xp({ element: i }).transclude(s, o))(de, we, ae), - xe = L ? Se : Y.normalize(Se); - return { spec: serializers_value(xe), errors: _e }; - } catch (s) { - if (s instanceof Wp || s instanceof Kp) return { spec: null, errors: [] }; - throw s; - } - }; - resolveOpenAPI31Strategy.cache = new WeakMap(); - const yS = resolveOpenAPI31Strategy; - function _clone(s, o, i) { - if ( - (i || (i = new vS()), - (function _isPrimitive(s) { - var o = typeof s; - return null == s || ('object' != o && 'function' != o); - })(s)) - ) - return s; - var u = function copy(u) { - var _ = i.get(s); - if (_) return _; - for (var w in (i.set(s, u), s)) - Object.prototype.hasOwnProperty.call(s, w) && (u[w] = o ? _clone(s[w], !0, i) : s[w]); - return u; - }; - switch (ea(s)) { - case 'Object': - return u(Object.create(Object.getPrototypeOf(s))); - case 'Array': - return u(Array(s.length)); - case 'Date': - return new Date(s.valueOf()); - case 'RegExp': - return _cloneRegExp(s); - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float32Array': - case 'Float64Array': - case 'BigInt64Array': - case 'BigUint64Array': - return s.slice(); - default: - return s; - } - } - var vS = (function () { - function _ObjectMap() { - ((this.map = {}), (this.length = 0)); - } - return ( - (_ObjectMap.prototype.set = function (s, o) { - var i = this.hash(s), - u = this.map[i]; - (u || (this.map[i] = u = []), u.push([s, o]), (this.length += 1)); - }), - (_ObjectMap.prototype.hash = function (s) { - var o = []; - for (var i in s) o.push(Object.prototype.toString.call(s[i])); - return o.join(); - }), - (_ObjectMap.prototype.get = function (s) { - if (this.length <= 180) - for (var o in this.map) - for (var i = this.map[o], u = 0; u < i.length; u += 1) { - if ((w = i[u])[0] === s) return w[1]; - } - else { - var _ = this.hash(s); - if ((i = this.map[_])) - for (u = 0; u < i.length; u += 1) { - var w; - if ((w = i[u])[0] === s) return w[1]; - } - } - }), - _ObjectMap - ); - })(), - bS = (function () { - function XReduceBy(s, o, i, u) { - ((this.valueFn = s), - (this.valueAcc = o), - (this.keyFn = i), - (this.xf = u), - (this.inputs = {})); - } - return ( - (XReduceBy.prototype['@@transducer/init'] = _xfBase_init), - (XReduceBy.prototype['@@transducer/result'] = function (s) { - var o; - for (o in this.inputs) - if ( - _has(o, this.inputs) && - (s = this.xf['@@transducer/step'](s, this.inputs[o]))['@@transducer/reduced'] - ) { - s = s['@@transducer/value']; - break; - } - return ((this.inputs = null), this.xf['@@transducer/result'](s)); - }), - (XReduceBy.prototype['@@transducer/step'] = function (s, o) { - var i = this.keyFn(o); - return ( - (this.inputs[i] = this.inputs[i] || [i, _clone(this.valueAcc, !1)]), - (this.inputs[i][1] = this.valueFn(this.inputs[i][1], o)), - s - ); - }), - XReduceBy - ); - })(); - function _xreduceBy(s, o, i) { - return function (u) { - return new bS(s, o, i, u); - }; - } - var _S = _curryN( - 4, - [], - _dispatchable([], _xreduceBy, function reduceBy(s, o, i, u) { - var _ = _xwrap(function (u, _) { - var w = i(_), - x = s(_has(w, u) ? u[w] : _clone(o, !1), _); - return x && x['@@transducer/reduced'] ? _reduced(u) : ((u[w] = x), u); - }); - return wa(_, {}, u); - }) - ); - const ES = _curry2( - _checkForMethod( - 'groupBy', - _S(function (s, o) { - return (s.push(o), s); - }, []) - ) - ); - const wS = class NormalizeStorage { - internalStore; - constructor(s, o, i) { - ((this.storageElement = s), (this.storageField = o), (this.storageSubField = i)); - } - get store() { - if (!this.internalStore) { - let s = this.storageElement.get(this.storageField); - Fu(s) || ((s = new Cu.Sh()), this.storageElement.set(this.storageField, s)); - let o = s.get(this.storageSubField); - (qu(o) || ((o = new Cu.wE()), s.set(this.storageSubField, o)), - (this.internalStore = o)); - } - return this.internalStore; - } - append(s) { - this.includes(s) || this.store.push(s); - } - includes(s) { - return this.store.includes(s); - } - }, - removeSpaces = (s) => s.replace(/\s/g, ''), - normalize_operation_ids_replaceSpecialCharsWithUnderscore = (s) => s.replace(/\W/gi, '_'), - normalizeOperationId = (s, o, i) => { - const u = removeSpaces(s); - return u.length > 0 - ? normalize_operation_ids_replaceSpecialCharsWithUnderscore(u) - : ((s, o) => - `${normalize_operation_ids_replaceSpecialCharsWithUnderscore(removeSpaces(o.toLowerCase()))}${normalize_operation_ids_replaceSpecialCharsWithUnderscore(removeSpaces(s))}`)( - o, - i - ); - }, - normalize_operation_ids = - ({ - storageField: s = 'x-normalized', - operationIdNormalizer: o = normalizeOperationId - } = {}) => - (i) => { - const { predicates: u, ancestorLineageToJSONPointer: _, namespace: w } = i, - x = [], - C = [], - j = []; - let L; - return { - visitor: { - OpenApi3_1Element: { - enter(o) { - L = new wS(o, s, 'operation-ids'); - }, - leave() { - const s = ES((s) => serializers_value(s.operationId), C); - (Object.entries(s).forEach(([s, o]) => { - Array.isArray(o) && - (o.length <= 1 || - o.forEach((o, i) => { - const u = `${s}${i + 1}`; - o.operationId = new w.elements.String(u); - })); - }), - j.forEach((s) => { - if (void 0 === s.operationId) return; - const o = String(serializers_value(s.operationId)), - i = C.find( - (s) => serializers_value(s.meta.get('originalOperationId')) === o - ); - void 0 !== i && - ((s.operationId = cloneDeep.safe(i.operationId)), - s.meta.set('originalOperationId', o), - s.set('__originalOperationId', o)); - }), - (C.length = 0), - (j.length = 0), - (L = void 0)); - } - }, - PathItemElement: { - enter(s) { - const o = Na('path', serializers_value(s.meta.get('path'))); - x.push(o); - }, - leave() { - x.pop(); - } - }, - OperationElement: { - enter(s, i, u, j, B) { - if (void 0 === s.operationId) return; - const $ = _([...B, u, s]); - if (L.includes($)) return; - const V = String(serializers_value(s.operationId)), - U = Fa(x), - z = Na('method', serializers_value(s.meta.get('http-method'))), - Y = o(V, U, z); - V !== Y && - ((s.operationId = new w.elements.String(Y)), - s.set('__originalOperationId', V), - s.meta.set('originalOperationId', V), - C.push(s), - L.append($)); - } - }, - LinkElement: { - leave(s) { - u.isLinkElement(s) && void 0 !== s.operationId && j.push(s); - } - } - } - }; - }; - var SS = (function () { - function XUniqWith(s, o) { - ((this.xf = o), (this.pred = s), (this.items = [])); - } - return ( - (XUniqWith.prototype['@@transducer/init'] = _xfBase_init), - (XUniqWith.prototype['@@transducer/result'] = _xfBase_result), - (XUniqWith.prototype['@@transducer/step'] = function (s, o) { - return _includesWith(this.pred, o, this.items) - ? s - : (this.items.push(o), this.xf['@@transducer/step'](s, o)); - }), - XUniqWith - ); - })(); - function _xuniqWith(s) { - return function (o) { - return new SS(s, o); - }; - } - var xS = _curry2( - _dispatchable([], _xuniqWith, function (s, o) { - for (var i, u = 0, _ = o.length, w = []; u < _; ) - (_includesWith(s, (i = o[u]), w) || (w[w.length] = i), (u += 1)); - return w; - }) - ); - const kS = xS, - normalize_parameters = - ({ storageField: s = 'x-normalized' } = {}) => - (o) => { - const { predicates: i, ancestorLineageToJSONPointer: u } = o, - parameterEquals = (s, o) => - !!i.isParameterElement(s) && - !!i.isParameterElement(o) && - !!i.isStringElement(s.name) && - !!i.isStringElement(s.in) && - !!i.isStringElement(o.name) && - !!i.isStringElement(o.in) && - serializers_value(s.name) === serializers_value(o.name) && - serializers_value(s.in) === serializers_value(o.in), - _ = []; - let w; - return { - visitor: { - OpenApi3_1Element: { - enter(o) { - w = new wS(o, s, 'parameters'); - }, - leave() { - w = void 0; - } - }, - PathItemElement: { - enter(s, o, u, w, x) { - if (x.some(i.isComponentsElement)) return; - const { parameters: C } = s; - i.isArrayElement(C) ? _.push([...C.content]) : _.push([]); - }, - leave() { - _.pop(); - } - }, - OperationElement: { - leave(s, o, i, x, C) { - const j = Fa(_); - if (!Array.isArray(j) || 0 === j.length) return; - const L = u([...C, i, s]); - if (w.includes(L)) return; - const B = Ww([], ['parameters', 'content'], s), - $ = kS(parameterEquals, [...B, ...j]); - ((s.parameters = new yv($)), w.append(L)); - } - } - } - }; - }, - normalize_security_requirements = - ({ storageField: s = 'x-normalized' } = {}) => - (o) => { - const { predicates: i, ancestorLineageToJSONPointer: u } = o; - let _, w; - return { - visitor: { - OpenApi3_1Element: { - enter(o) { - ((w = new wS(o, s, 'security-requirements')), - i.isArrayElement(o.security) && (_ = o.security)); - }, - leave() { - ((w = void 0), (_ = void 0)); - } - }, - OperationElement: { - leave(s, o, x, C, j) { - if (j.some(i.isComponentsElement)) return; - const L = u([...j, x, s]); - if (w.includes(L)) return; - var B; - void 0 === s.security && - void 0 !== _ && - ((s.security = new Sv( - null === (B = _) || void 0 === B ? void 0 : B.content - )), - w.append(L)); - } - } - } - }; - }, - normalize_parameter_examples = - ({ storageField: s = 'x-normalized' } = {}) => - (o) => { - const { predicates: i, ancestorLineageToJSONPointer: u } = o; - let _; - return { - visitor: { - OpenApi3_1Element: { - enter(o) { - _ = new wS(o, s, 'parameter-examples'); - }, - leave() { - _ = void 0; - } - }, - ParameterElement: { - leave(s, o, w, x, C) { - var j, L; - if (C.some(i.isComponentsElement)) return; - if (void 0 === s.schema || !i.isSchemaElement(s.schema)) return; - if ( - void 0 === (null === (j = s.schema) || void 0 === j ? void 0 : j.example) && - void 0 === (null === (L = s.schema) || void 0 === L ? void 0 : L.examples) - ) - return; - const B = u([...C, w, s]); - if (!_.includes(B)) { - if (void 0 !== s.examples && i.isObjectElement(s.examples)) { - const o = s.examples.map((s) => cloneDeep.safe(s.value)); - return ( - void 0 !== s.schema.examples && - (s.schema.set('examples', o), _.append(B)), - void ( - void 0 !== s.schema.example && - (s.schema.set('example', o[0]), _.append(B)) - ) - ); - } - void 0 !== s.example && - (void 0 !== s.schema.examples && - (s.schema.set('examples', [cloneDeep(s.example)]), _.append(B)), - void 0 !== s.schema.example && - (s.schema.set('example', cloneDeep(s.example)), _.append(B))); - } - } - } - } - }; - }, - normalize_header_examples = - ({ storageField: s = 'x-normalized' } = {}) => - (o) => { - const { predicates: i, ancestorLineageToJSONPointer: u } = o; - let _; - return { - visitor: { - OpenApi3_1Element: { - enter(o) { - _ = new wS(o, s, 'header-examples'); - }, - leave() { - _ = void 0; - } - }, - HeaderElement: { - leave(s, o, w, x, C) { - var j, L; - if (C.some(i.isComponentsElement)) return; - if (void 0 === s.schema || !i.isSchemaElement(s.schema)) return; - if ( - void 0 === (null === (j = s.schema) || void 0 === j ? void 0 : j.example) && - void 0 === (null === (L = s.schema) || void 0 === L ? void 0 : L.examples) - ) - return; - const B = u([...C, w, s]); - if (!_.includes(B)) { - if (void 0 !== s.examples && i.isObjectElement(s.examples)) { - const o = s.examples.map((s) => cloneDeep.safe(s.value)); - return ( - void 0 !== s.schema.examples && - (s.schema.set('examples', o), _.append(B)), - void ( - void 0 !== s.schema.example && - (s.schema.set('example', o[0]), _.append(B)) - ) - ); - } - void 0 !== s.example && - (void 0 !== s.schema.examples && - (s.schema.set('examples', [cloneDeep(s.example)]), _.append(B)), - void 0 !== s.schema.example && - (s.schema.set('example', cloneDeep(s.example)), _.append(B))); - } - } - } - } - }; - }, - openapi_3_1_apidom_normalize = (s) => { - if (!Fu(s)) return s; - const o = [ - normalize_operation_ids({ - operationIdNormalizer: (s, o, i) => - opId({ operationId: s }, o, i, { v2OperationIdCompatibilityMode: !1 }) - }), - normalize_parameters(), - normalize_security_requirements(), - normalize_parameter_examples(), - normalize_header_examples() - ]; - return dispatchPluginsSync(s, o, { - toolboxCreator: apidom_ns_openapi_3_1_es_refractor_toolbox, - visitorOptions: { - keyMap: nw, - nodeTypeGetter: apidom_ns_openapi_3_1_es_traversal_visitor_getNodeType - } - }); - }, - CS = { - name: 'openapi-3-1-apidom', - match: (s) => isOpenAPI31(s), - normalize(s) { - if (!Nu(s) && ku(s) && !s.$$normalized) { - const i = ((o = openapi_3_1_apidom_normalize), - (s) => { - const i = wb.refract(s); - i.classes.push('result'); - const u = o(i), - _ = serializers_value(u); - return (yS.cache.set(_, u), serializers_value(u)); - })(s); - return ((i.$$normalized = !0), i); - } - var o; - return Nu(s) ? openapi_3_1_apidom_normalize(s) : s; - }, - resolve: async (s) => yS(s) - }, - OS = CS, - makeResolve = (s) => async (o) => - (async (s) => { - const { spec: o, requestInterceptor: i, responseInterceptor: u } = s, - _ = options_retrievalURI(s), - w = options_httpClient(s), - x = - o || - (await makeFetchJSON(w, { requestInterceptor: i, responseInterceptor: u })(_)), - C = { ...s, spec: x }; - return s.strategies.find((s) => s.match(x)).resolve(C); - })({ ...s, ...o }), - AS = makeResolve({ strategies: [fu, hu, uu] }); - var jS = __webpack_require__(69883); - const IS = function fnparser() { - const s = TS, - o = MS, - i = this, - u = 'parser.js: Parser(): '; - ((i.ast = void 0), (i.stats = void 0), (i.trace = void 0), (i.callbacks = [])); - let _, - w, - x, - C, - j, - L, - B, - $ = 0, - V = 0, - U = 0, - z = 0, - Y = 0, - Z = new (function systemData() { - ((this.state = s.ACTIVE), - (this.phraseLength = 0), - (this.refresh = () => { - ((this.state = s.ACTIVE), (this.phraseLength = 0)); - })); - })(); - i.parse = (ee, ie, ae, le) => { - const ce = `${u}parse(): `; - (($ = 0), - (V = 0), - (U = 0), - (z = 0), - (Y = 0), - (_ = void 0), - (w = void 0), - (x = void 0), - (C = void 0), - Z.refresh(), - (j = void 0), - (L = void 0), - (B = void 0), - (C = o.stringToChars(ae)), - (_ = ee.rules), - (w = ee.udts)); - const pe = ie.toLowerCase(); - let de; - for (const s in _) - if (_.hasOwnProperty(s) && pe === _[s].lower) { - de = _[s].index; - break; - } - if (void 0 === de) - throw new Error(`${ce}start rule name '${startRule}' not recognized`); - ((() => { - const s = `${u}initializeCallbacks(): `; - let o, x; - for (j = [], L = [], o = 0; o < _.length; o += 1) j[o] = void 0; - for (o = 0; o < w.length; o += 1) L[o] = void 0; - const C = []; - for (o = 0; o < _.length; o += 1) C.push(_[o].lower); - for (o = 0; o < w.length; o += 1) C.push(w[o].lower); - for (const u in i.callbacks) - if (i.callbacks.hasOwnProperty(u)) { - if (((o = C.indexOf(u.toLowerCase())), o < 0)) - throw new Error(`${s}syntax callback '${u}' not a rule or udt name`); - if ( - ((x = i.callbacks[u] ? i.callbacks[u] : void 0), - 'function' != typeof x && void 0 !== x) - ) - throw new Error( - `${s}syntax callback[${u}] must be function reference or falsy)` - ); - o < _.length ? (j[o] = x) : (L[o - _.length] = x); - } - })(), - i.trace && i.trace.init(_, w, C), - i.stats && i.stats.init(_, w), - i.ast && i.ast.init(_, w, C), - (B = le), - (x = [{ type: s.RNM, index: de }]), - opExecute(0, 0), - (x = void 0)); - let fe = !1; - switch (Z.state) { - case s.ACTIVE: - throw new Error(`${ce}final state should never be 'ACTIVE'`); - case s.NOMATCH: - fe = !1; - break; - case s.EMPTY: - case s.MATCH: - fe = Z.phraseLength === C.length; - break; - default: - throw new Error('unrecognized state'); - } - return { - success: fe, - state: Z.state, - stateName: s.idName(Z.state), - length: C.length, - matched: Z.phraseLength, - maxMatched: Y, - maxTreeDepth: U, - nodeHits: z - }; - }; - const validateRnmCallbackResult = (o, i, _, w) => { - if (i.phraseLength > _) { - let s = `${u}opRNM(${o.name}): callback function error: `; - throw ( - (s += `sysData.phraseLength: ${i.phraseLength}`), - (s += ` must be <= remaining chars: ${_}`), - new Error(s) - ); - } - switch (i.state) { - case s.ACTIVE: - if (!w) - throw new Error( - `${u}opRNM(${o.name}): callback function return error. ACTIVE state not allowed.` - ); - break; - case s.EMPTY: - i.phraseLength = 0; - break; - case s.MATCH: - 0 === i.phraseLength && (i.state = s.EMPTY); - break; - case s.NOMATCH: - i.phraseLength = 0; - break; - default: - throw new Error( - `${u}opRNM(${o.name}): callback function return error. Unrecognized return state: ${i.state}` - ); - } - }, - opUDT = (o, j) => { - let V, U, z; - const Y = x[o], - ee = w[Y.index]; - ((Z.UdtIndex = ee.index), - $ || - ((z = i.ast && i.ast.udtDefined(Y.index)), - z && - ((U = _.length + Y.index), (V = i.ast.getLength()), i.ast.down(U, ee.name)))); - const ie = C.length - j; - (L[Y.index](Z, C, j, B), - ((o, i, _) => { - if (i.phraseLength > _) { - let s = `${u}opUDT(${o.name}): callback function error: `; - throw ( - (s += `sysData.phraseLength: ${i.phraseLength}`), - (s += ` must be <= remaining chars: ${_}`), - new Error(s) - ); - } - switch (i.state) { - case s.ACTIVE: - throw new Error(`${u}opUDT(${o.name}) ACTIVE state return not allowed.`); - case s.EMPTY: - if (!o.empty) throw new Error(`${u}opUDT(${o.name}) may not return EMPTY.`); - i.phraseLength = 0; - break; - case s.MATCH: - if (0 === i.phraseLength) { - if (!o.empty) - throw new Error(`${u}opUDT(${o.name}) may not return EMPTY.`); - i.state = s.EMPTY; - } - break; - case s.NOMATCH: - i.phraseLength = 0; - break; - default: - throw new Error( - `${u}opUDT(${o.name}): callback function return error. Unrecognized return state: ${i.state}` - ); - } - })(ee, Z, ie), - $ || - (z && - (Z.state === s.NOMATCH - ? i.ast.setLength(V) - : i.ast.up(U, ee.name, j, Z.phraseLength)))); - }, - opExecute = (o, w) => { - const L = `${u}opExecute(): `, - ee = x[o]; - switch ( - ((z += 1), - V > U && (U = V), - (V += 1), - Z.refresh(), - i.trace && i.trace.down(ee, w), - ee.type) - ) { - case s.ALT: - ((o, i) => { - const u = x[o]; - for ( - let o = 0; - o < u.children.length && - (opExecute(u.children[o], i), Z.state === s.NOMATCH); - o += 1 - ); - })(o, w); - break; - case s.CAT: - ((o, u) => { - let _, w, C, j; - const L = x[o]; - (i.ast && (w = i.ast.getLength()), (_ = !0), (C = u), (j = 0)); - for (let o = 0; o < L.children.length; o += 1) { - if ((opExecute(L.children[o], C), Z.state === s.NOMATCH)) { - _ = !1; - break; - } - ((C += Z.phraseLength), (j += Z.phraseLength)); - } - _ - ? ((Z.state = 0 === j ? s.EMPTY : s.MATCH), (Z.phraseLength = j)) - : ((Z.state = s.NOMATCH), - (Z.phraseLength = 0), - i.ast && i.ast.setLength(w)); - })(o, w); - break; - case s.REP: - ((o, u) => { - let _, w, j, L; - const B = x[o]; - if (0 === B.max) return ((Z.state = s.EMPTY), void (Z.phraseLength = 0)); - for ( - w = u, j = 0, L = 0, i.ast && (_ = i.ast.getLength()); - !(w >= C.length) && - (opExecute(o + 1, w), Z.state !== s.NOMATCH) && - Z.state !== s.EMPTY && - ((L += 1), (j += Z.phraseLength), (w += Z.phraseLength), L !== B.max); - ); - Z.state === s.EMPTY || L >= B.min - ? ((Z.state = 0 === j ? s.EMPTY : s.MATCH), (Z.phraseLength = j)) - : ((Z.state = s.NOMATCH), - (Z.phraseLength = 0), - i.ast && i.ast.setLength(_)); - })(o, w); - break; - case s.RNM: - ((o, u) => { - let w, L, V; - const U = x[o], - z = _[U.index], - Y = j[z.index]; - if ( - ($ || - ((L = i.ast && i.ast.ruleDefined(U.index)), - L && ((w = i.ast.getLength()), i.ast.down(U.index, _[U.index].name))), - Y) - ) { - const o = C.length - u; - (Y(Z, C, u, B), - validateRnmCallbackResult(z, Z, o, !0), - Z.state === s.ACTIVE && - ((V = x), - (x = z.opcodes), - opExecute(0, u), - (x = V), - Y(Z, C, u, B), - validateRnmCallbackResult(z, Z, o, !1))); - } else ((V = x), (x = z.opcodes), opExecute(0, u, Z), (x = V)); - $ || - (L && - (Z.state === s.NOMATCH - ? i.ast.setLength(w) - : i.ast.up(U.index, z.name, u, Z.phraseLength))); - })(o, w); - break; - case s.TRG: - ((o, i) => { - const u = x[o]; - ((Z.state = s.NOMATCH), - i < C.length && - u.min <= C[i] && - C[i] <= u.max && - ((Z.state = s.MATCH), (Z.phraseLength = 1))); - })(o, w); - break; - case s.TBS: - ((o, i) => { - const u = x[o], - _ = u.string.length; - if (((Z.state = s.NOMATCH), i + _ <= C.length)) { - for (let s = 0; s < _; s += 1) if (C[i + s] !== u.string[s]) return; - ((Z.state = s.MATCH), (Z.phraseLength = _)); - } - })(o, w); - break; - case s.TLS: - ((o, i) => { - let u; - const _ = x[o]; - Z.state = s.NOMATCH; - const w = _.string.length; - if (0 !== w) { - if (i + w <= C.length) { - for (let s = 0; s < w; s += 1) - if ( - ((u = C[i + s]), u >= 65 && u <= 90 && (u += 32), u !== _.string[s]) - ) - return; - ((Z.state = s.MATCH), (Z.phraseLength = w)); - } - } else Z.state = s.EMPTY; - })(o, w); - break; - case s.UDT: - opUDT(o, w); - break; - case s.AND: - ((o, i) => { - switch ( - (($ += 1), opExecute(o + 1, i), ($ -= 1), (Z.phraseLength = 0), Z.state) - ) { - case s.EMPTY: - case s.MATCH: - Z.state = s.EMPTY; - break; - case s.NOMATCH: - Z.state = s.NOMATCH; - break; - default: - throw new Error(`opAND: invalid state ${Z.state}`); - } - })(o, w); - break; - case s.NOT: - ((o, i) => { - switch ( - (($ += 1), opExecute(o + 1, i), ($ -= 1), (Z.phraseLength = 0), Z.state) - ) { - case s.EMPTY: - case s.MATCH: - Z.state = s.NOMATCH; - break; - case s.NOMATCH: - Z.state = s.EMPTY; - break; - default: - throw new Error(`opNOT: invalid state ${Z.state}`); - } - })(o, w); - break; - default: - throw new Error(`${L}unrecognized operator`); - } - ($ || (w + Z.phraseLength > Y && (Y = w + Z.phraseLength)), - i.stats && i.stats.collect(ee, Z), - i.trace && i.trace.up(ee, Z.state, w, Z.phraseLength), - (V -= 1)); - }; - }, - PS = function fnast() { - const s = TS, - o = MS, - i = this; - let u, - _, - w, - x = 0; - const C = [], - j = [], - L = []; - function indent(s) { - let o = ''; - for (; s-- > 0; ) o += ' '; - return o; - } - ((i.callbacks = []), - (i.init = (s, o, B) => { - let $; - ((j.length = 0), (L.length = 0), (x = 0), (u = s), (_ = o), (w = B)); - const V = []; - for ($ = 0; $ < u.length; $ += 1) V.push(u[$].lower); - for ($ = 0; $ < _.length; $ += 1) V.push(_[$].lower); - for (x = u.length + _.length, $ = 0; $ < x; $ += 1) C[$] = void 0; - for (const s in i.callbacks) - if (i.callbacks.hasOwnProperty(s)) { - const o = s.toLowerCase(); - if ((($ = V.indexOf(o)), $ < 0)) - throw new Error( - `parser.js: Ast()): init: node '${s}' not a rule or udt name` - ); - C[$] = i.callbacks[s]; - } - }), - (i.ruleDefined = (s) => !!C[s]), - (i.udtDefined = (s) => !!C[u.length + s]), - (i.down = (o, i) => { - const u = L.length; - return ( - j.push(u), - L.push({ - name: i, - thisIndex: u, - thatIndex: void 0, - state: s.SEM_PRE, - callbackIndex: o, - phraseIndex: void 0, - phraseLength: void 0, - stack: j.length - }), - u - ); - }), - (i.up = (o, i, u, _) => { - const w = L.length, - x = j.pop(); - return ( - L.push({ - name: i, - thisIndex: w, - thatIndex: x, - state: s.SEM_POST, - callbackIndex: o, - phraseIndex: u, - phraseLength: _, - stack: j.length - }), - (L[x].thatIndex = w), - (L[x].phraseIndex = u), - (L[x].phraseLength = _), - w - ); - }), - (i.translate = (o) => { - let i, u; - for (let _ = 0; _ < L.length; _ += 1) - ((u = L[_]), - (i = C[u.callbackIndex]), - i && - (u.state === s.SEM_PRE - ? i(s.SEM_PRE, w, u.phraseIndex, u.phraseLength, o) - : i && i(s.SEM_POST, w, u.phraseIndex, u.phraseLength, o))); - }), - (i.setLength = (s) => { - ((L.length = s), (j.length = s > 0 ? L[s - 1].stack : 0)); - }), - (i.getLength = () => L.length), - (i.toXml = () => { - let i = '', - u = 0; - return ( - (i += '\n'), - (i += `\n`), - (i += '\x3c!-- input string --\x3e\n'), - (i += indent(u + 2)), - (i += o.charsToString(w)), - (i += '\n'), - L.forEach((_) => { - _.state === s.SEM_PRE - ? ((u += 1), - (i += indent(u)), - (i += `\n`), - (i += indent(u + 2)), - (i += o.charsToString(w, _.phraseIndex, _.phraseLength)), - (i += '\n')) - : ((i += indent(u)), - (i += `\x3c!-- name="${_.name}" --\x3e\n`), - (u -= 1)); - }), - (i += '\n'), - i - ); - })); - }, - MS = { - stringToChars: (s) => [...s].map((s) => s.codePointAt(0)), - charsToString: (s, o, i) => { - let u = s; - for (; !(void 0 === o || o < 0); ) { - if (void 0 === i) { - u = s.slice(o); - break; - } - if (i <= 0) return ''; - u = s.slice(o, o + i); - break; - } - return String.fromCodePoint(...u); - } - }, - TS = { - ALT: 1, - CAT: 2, - REP: 3, - RNM: 4, - TRG: 5, - TBS: 6, - TLS: 7, - UDT: 11, - AND: 12, - NOT: 13, - ACTIVE: 100, - MATCH: 101, - EMPTY: 102, - NOMATCH: 103, - SEM_PRE: 200, - SEM_POST: 201, - SEM_OK: 300, - idName: (s) => { - switch (s) { - case TS.ALT: - return 'ALT'; - case TS.CAT: - return 'CAT'; - case TS.REP: - return 'REP'; - case TS.RNM: - return 'RNM'; - case TS.TRG: - return 'TRG'; - case TS.TBS: - return 'TBS'; - case TS.TLS: - return 'TLS'; - case TS.UDT: - return 'UDT'; - case TS.AND: - return 'AND'; - case TS.NOT: - return 'NOT'; - case TS.ACTIVE: - return 'ACTIVE'; - case TS.EMPTY: - return 'EMPTY'; - case TS.MATCH: - return 'MATCH'; - case TS.NOMATCH: - return 'NOMATCH'; - case TS.SEM_PRE: - return 'SEM_PRE'; - case TS.SEM_POST: - return 'SEM_POST'; - case TS.SEM_OK: - return 'SEM_OK'; - default: - return 'UNRECOGNIZED STATE'; - } - } - }; - const server_url_template = (s, o, i, u, _) => { - if (s === TS.SEM_PRE) { - if (!1 === Array.isArray(_)) throw new Error("parser's user data must be an array"); - _.push(['server-url-template', MS.charsToString(o, i, u)]); - } - return TS.SEM_OK; - }, - callbacks_server_variable = (s, o, i, u, _) => { - if (s === TS.SEM_PRE) { - if (!1 === Array.isArray(_)) throw new Error("parser's user data must be an array"); - _.push(['server-variable', MS.charsToString(o, i, u)]); - } - return TS.SEM_OK; - }, - server_variable_name = (s, o, i, u, _) => { - if (s === TS.SEM_PRE) { - if (!1 === Array.isArray(_)) throw new Error("parser's user data must be an array"); - _.push(['server-variable-name', MS.charsToString(o, i, u)]); - } - return TS.SEM_OK; - }, - callbacks_literals = (s, o, i, u, _) => { - if (s === TS.SEM_PRE) { - if (!1 === Array.isArray(_)) throw new Error("parser's user data must be an array"); - _.push(['literals', MS.charsToString(o, i, u)]); - } - return TS.SEM_OK; - }, - NS = new (function grammar() { - ((this.grammarObject = 'grammarObject'), - (this.rules = []), - (this.rules[0] = { - name: 'server-url-template', - lower: 'server-url-template', - index: 0, - isBkr: !1 - }), - (this.rules[1] = { - name: 'server-variable', - lower: 'server-variable', - index: 1, - isBkr: !1 - }), - (this.rules[2] = { - name: 'server-variable-name', - lower: 'server-variable-name', - index: 2, - isBkr: !1 - }), - (this.rules[3] = { name: 'literals', lower: 'literals', index: 3, isBkr: !1 }), - (this.rules[4] = { name: 'ALPHA', lower: 'alpha', index: 4, isBkr: !1 }), - (this.rules[5] = { name: 'DIGIT', lower: 'digit', index: 5, isBkr: !1 }), - (this.rules[6] = { name: 'HEXDIG', lower: 'hexdig', index: 6, isBkr: !1 }), - (this.rules[7] = { name: 'pct-encoded', lower: 'pct-encoded', index: 7, isBkr: !1 }), - (this.rules[8] = { name: 'unreserved', lower: 'unreserved', index: 8, isBkr: !1 }), - (this.rules[9] = { name: 'sub-delims', lower: 'sub-delims', index: 9, isBkr: !1 }), - (this.rules[10] = { name: 'ucschar', lower: 'ucschar', index: 10, isBkr: !1 }), - (this.rules[11] = { name: 'iprivate', lower: 'iprivate', index: 11, isBkr: !1 }), - (this.udts = []), - (this.rules[0].opcodes = []), - (this.rules[0].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[0].opcodes[1] = { type: 1, children: [2, 3] }), - (this.rules[0].opcodes[2] = { type: 4, index: 3 }), - (this.rules[0].opcodes[3] = { type: 4, index: 1 }), - (this.rules[1].opcodes = []), - (this.rules[1].opcodes[0] = { type: 2, children: [1, 2, 3] }), - (this.rules[1].opcodes[1] = { type: 7, string: [123] }), - (this.rules[1].opcodes[2] = { type: 4, index: 2 }), - (this.rules[1].opcodes[3] = { type: 7, string: [125] }), - (this.rules[2].opcodes = []), - (this.rules[2].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[2].opcodes[1] = { type: 1, children: [2, 3, 4, 5, 6] }), - (this.rules[2].opcodes[2] = { type: 4, index: 8 }), - (this.rules[2].opcodes[3] = { type: 4, index: 7 }), - (this.rules[2].opcodes[4] = { type: 4, index: 9 }), - (this.rules[2].opcodes[5] = { type: 7, string: [58] }), - (this.rules[2].opcodes[6] = { type: 7, string: [64] }), - (this.rules[3].opcodes = []), - (this.rules[3].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[3].opcodes[1] = { - type: 1, - children: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] - }), - (this.rules[3].opcodes[2] = { type: 6, string: [33] }), - (this.rules[3].opcodes[3] = { type: 5, min: 35, max: 36 }), - (this.rules[3].opcodes[4] = { type: 6, string: [38] }), - (this.rules[3].opcodes[5] = { type: 5, min: 40, max: 59 }), - (this.rules[3].opcodes[6] = { type: 6, string: [61] }), - (this.rules[3].opcodes[7] = { type: 5, min: 63, max: 91 }), - (this.rules[3].opcodes[8] = { type: 6, string: [93] }), - (this.rules[3].opcodes[9] = { type: 6, string: [95] }), - (this.rules[3].opcodes[10] = { type: 5, min: 97, max: 122 }), - (this.rules[3].opcodes[11] = { type: 6, string: [126] }), - (this.rules[3].opcodes[12] = { type: 4, index: 10 }), - (this.rules[3].opcodes[13] = { type: 4, index: 11 }), - (this.rules[3].opcodes[14] = { type: 4, index: 7 }), - (this.rules[4].opcodes = []), - (this.rules[4].opcodes[0] = { type: 1, children: [1, 2] }), - (this.rules[4].opcodes[1] = { type: 5, min: 65, max: 90 }), - (this.rules[4].opcodes[2] = { type: 5, min: 97, max: 122 }), - (this.rules[5].opcodes = []), - (this.rules[5].opcodes[0] = { type: 5, min: 48, max: 57 }), - (this.rules[6].opcodes = []), - (this.rules[6].opcodes[0] = { type: 1, children: [1, 2, 3, 4, 5, 6, 7] }), - (this.rules[6].opcodes[1] = { type: 4, index: 5 }), - (this.rules[6].opcodes[2] = { type: 7, string: [97] }), - (this.rules[6].opcodes[3] = { type: 7, string: [98] }), - (this.rules[6].opcodes[4] = { type: 7, string: [99] }), - (this.rules[6].opcodes[5] = { type: 7, string: [100] }), - (this.rules[6].opcodes[6] = { type: 7, string: [101] }), - (this.rules[6].opcodes[7] = { type: 7, string: [102] }), - (this.rules[7].opcodes = []), - (this.rules[7].opcodes[0] = { type: 2, children: [1, 2, 3] }), - (this.rules[7].opcodes[1] = { type: 7, string: [37] }), - (this.rules[7].opcodes[2] = { type: 4, index: 6 }), - (this.rules[7].opcodes[3] = { type: 4, index: 6 }), - (this.rules[8].opcodes = []), - (this.rules[8].opcodes[0] = { type: 1, children: [1, 2, 3, 4, 5, 6] }), - (this.rules[8].opcodes[1] = { type: 4, index: 4 }), - (this.rules[8].opcodes[2] = { type: 4, index: 5 }), - (this.rules[8].opcodes[3] = { type: 7, string: [45] }), - (this.rules[8].opcodes[4] = { type: 7, string: [46] }), - (this.rules[8].opcodes[5] = { type: 7, string: [95] }), - (this.rules[8].opcodes[6] = { type: 7, string: [126] }), - (this.rules[9].opcodes = []), - (this.rules[9].opcodes[0] = { - type: 1, - children: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] - }), - (this.rules[9].opcodes[1] = { type: 7, string: [33] }), - (this.rules[9].opcodes[2] = { type: 7, string: [36] }), - (this.rules[9].opcodes[3] = { type: 7, string: [38] }), - (this.rules[9].opcodes[4] = { type: 7, string: [39] }), - (this.rules[9].opcodes[5] = { type: 7, string: [40] }), - (this.rules[9].opcodes[6] = { type: 7, string: [41] }), - (this.rules[9].opcodes[7] = { type: 7, string: [42] }), - (this.rules[9].opcodes[8] = { type: 7, string: [43] }), - (this.rules[9].opcodes[9] = { type: 7, string: [44] }), - (this.rules[9].opcodes[10] = { type: 7, string: [59] }), - (this.rules[9].opcodes[11] = { type: 7, string: [61] }), - (this.rules[10].opcodes = []), - (this.rules[10].opcodes[0] = { - type: 1, - children: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17] - }), - (this.rules[10].opcodes[1] = { type: 5, min: 160, max: 55295 }), - (this.rules[10].opcodes[2] = { type: 5, min: 63744, max: 64975 }), - (this.rules[10].opcodes[3] = { type: 5, min: 65008, max: 65519 }), - (this.rules[10].opcodes[4] = { type: 5, min: 65536, max: 131069 }), - (this.rules[10].opcodes[5] = { type: 5, min: 131072, max: 196605 }), - (this.rules[10].opcodes[6] = { type: 5, min: 196608, max: 262141 }), - (this.rules[10].opcodes[7] = { type: 5, min: 262144, max: 327677 }), - (this.rules[10].opcodes[8] = { type: 5, min: 327680, max: 393213 }), - (this.rules[10].opcodes[9] = { type: 5, min: 393216, max: 458749 }), - (this.rules[10].opcodes[10] = { type: 5, min: 458752, max: 524285 }), - (this.rules[10].opcodes[11] = { type: 5, min: 524288, max: 589821 }), - (this.rules[10].opcodes[12] = { type: 5, min: 589824, max: 655357 }), - (this.rules[10].opcodes[13] = { type: 5, min: 655360, max: 720893 }), - (this.rules[10].opcodes[14] = { type: 5, min: 720896, max: 786429 }), - (this.rules[10].opcodes[15] = { type: 5, min: 786432, max: 851965 }), - (this.rules[10].opcodes[16] = { type: 5, min: 851968, max: 917501 }), - (this.rules[10].opcodes[17] = { type: 5, min: 921600, max: 983037 }), - (this.rules[11].opcodes = []), - (this.rules[11].opcodes[0] = { type: 1, children: [1, 2, 3] }), - (this.rules[11].opcodes[1] = { type: 5, min: 57344, max: 63743 }), - (this.rules[11].opcodes[2] = { type: 5, min: 983040, max: 1048573 }), - (this.rules[11].opcodes[3] = { type: 5, min: 1048576, max: 1114109 }), - (this.toString = function toString() { - let s = ''; - return ( - (s += '; OpenAPI Server URL templating ABNF syntax\n'), - (s += 'server-url-template = 1*( literals / server-variable )\n'), - (s += 'server-variable = "{" server-variable-name "}"\n'), - (s += - 'server-variable-name = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )\n'), - (s += - 'literals = 1*( %x21 / %x23-24 / %x26 / %x28-3B / %x3D / %x3F-5B\n'), - (s += - ' / %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate\n'), - (s += ' / pct-encoded)\n'), - (s += ' ; any Unicode character except: CTL, SP,\n'), - (s += - ' ; DQUOTE, "\'", "%" (aside from pct-encoded),\n'), - (s += ' ; "<", ">", "\\", "^", "`", "{", "|", "}"\n'), - (s += '\n'), - (s += '; Characters definitions (from RFC 6570)\n'), - (s += 'ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n'), - (s += 'DIGIT = %x30-39 ; 0-9\n'), - (s += 'HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\n'), - (s += ' ; case-insensitive\n'), - (s += '\n'), - (s += 'pct-encoded = "%" HEXDIG HEXDIG\n'), - (s += 'unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"\n'), - (s += 'sub-delims = "!" / "$" / "&" / "\'" / "(" / ")"\n'), - (s += ' / "*" / "+" / "," / ";" / "="\n'), - (s += '\n'), - (s += 'ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF\n'), - (s += ' / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD\n'), - (s += ' / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD\n'), - (s += ' / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD\n'), - (s += ' / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD\n'), - (s += ' / %xD0000-DFFFD / %xE1000-EFFFD\n'), - (s += '\n'), - (s += 'iprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD\n'), - '; OpenAPI Server URL templating ABNF syntax\nserver-url-template = 1*( literals / server-variable )\nserver-variable = "{" server-variable-name "}"\nserver-variable-name = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )\nliterals = 1*( %x21 / %x23-24 / %x26 / %x28-3B / %x3D / %x3F-5B\n / %x5D / %x5F / %x61-7A / %x7E / ucschar / iprivate\n / pct-encoded)\n ; any Unicode character except: CTL, SP,\n ; DQUOTE, "\'", "%" (aside from pct-encoded),\n ; "<", ">", "\\", "^", "`", "{", "|", "}"\n\n; Characters definitions (from RFC 6570)\nALPHA = %x41-5A / %x61-7A ; A-Z / a-z\nDIGIT = %x30-39 ; 0-9\nHEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\n ; case-insensitive\n\npct-encoded = "%" HEXDIG HEXDIG\nunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"\nsub-delims = "!" / "$" / "&" / "\'" / "(" / ")"\n / "*" / "+" / "," / ";" / "="\n\nucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF\n / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD\n / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD\n / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD\n / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD\n / %xD0000-DFFFD / %xE1000-EFFFD\n\niprivate = %xE000-F8FF / %xF0000-FFFFD / %x100000-10FFFD\n' - ); - })); - })(), - openapi_server_url_templating_es_parse = (s) => { - const o = new IS(); - ((o.ast = new PS()), - (o.ast.callbacks['server-url-template'] = server_url_template), - (o.ast.callbacks['server-variable'] = callbacks_server_variable), - (o.ast.callbacks['server-variable-name'] = server_variable_name), - (o.ast.callbacks.literals = callbacks_literals)); - return { result: o.parse(NS, 'server-url-template', s), ast: o.ast }; - }, - openapi_server_url_templating_es_test = (s, { strict: o = !1 } = {}) => { - try { - const i = openapi_server_url_templating_es_parse(s); - if (!i.result.success) return !1; - const u = []; - i.ast.translate(u); - const _ = u.some(([s]) => 'server-variable' === s); - if (!o && !_) - try { - return (new URL(s, 'https://vladimirgorej.com'), !0); - } catch { - return !1; - } - return !o || _; - } catch { - return !1; - } - }, - encodeServerVariable = (s) => - ((s) => { - try { - return 'string' == typeof s && decodeURIComponent(s) !== s; - } catch { - return !1; - } - })(s) - ? s - : encodeURIComponent(s).replace(/%5B/g, '[').replace(/%5D/g, ']'), - RS = ['literals', 'server-variable-name'], - es_substitute = (s, o, i = {}) => { - const u = { ...{ encoder: encodeServerVariable }, ...i }, - _ = openapi_server_url_templating_es_parse(s); - if (!_.result.success) return s; - const w = []; - _.ast.translate(w); - const x = w - .filter(([s]) => RS.includes(s)) - .map(([s, i]) => - 'server-variable-name' === s - ? Object.hasOwn(o, i) - ? u.encoder(o[i], i) - : `{${i}}` - : i - ); - return x.join(''); - }; - const callbacks_slash = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['slash', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - path_template = (s, o, i, u, _) => { - if (s === TS.SEM_PRE) { - if (!1 === Array.isArray(_)) throw new Error("parser's user data must be an array"); - _.push(['path-template', MS.charsToString(o, i, u)]); - } - return TS.SEM_OK; - }, - callbacks_path = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['path', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - path_literal = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['path-literal', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - callbacks_query = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['query', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - query_marker = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['query-marker', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - callbacks_fragment = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['fragment', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - fragment_marker = (s, o, i, u, _) => ( - s === TS.SEM_PRE ? _.push(['fragment-marker', MS.charsToString(o, i, u)]) : TS.SEM_POST, - TS.SEM_OK - ), - template_expression = (s, o, i, u, _) => ( - s === TS.SEM_PRE - ? _.push(['template-expression', MS.charsToString(o, i, u)]) - : TS.SEM_POST, - TS.SEM_OK - ), - template_expression_param_name = (s, o, i, u, _) => ( - s === TS.SEM_PRE - ? _.push(['template-expression-param-name', MS.charsToString(o, i, u)]) - : TS.SEM_POST, - TS.SEM_OK - ), - DS = new (function path_templating_grammar() { - ((this.grammarObject = 'grammarObject'), - (this.rules = []), - (this.rules[0] = { - name: 'path-template', - lower: 'path-template', - index: 0, - isBkr: !1 - }), - (this.rules[1] = { name: 'path', lower: 'path', index: 1, isBkr: !1 }), - (this.rules[2] = { - name: 'path-segment', - lower: 'path-segment', - index: 2, - isBkr: !1 - }), - (this.rules[3] = { name: 'query', lower: 'query', index: 3, isBkr: !1 }), - (this.rules[4] = { - name: 'query-literal', - lower: 'query-literal', - index: 4, - isBkr: !1 - }), - (this.rules[5] = { - name: 'query-marker', - lower: 'query-marker', - index: 5, - isBkr: !1 - }), - (this.rules[6] = { name: 'fragment', lower: 'fragment', index: 6, isBkr: !1 }), - (this.rules[7] = { - name: 'fragment-literal', - lower: 'fragment-literal', - index: 7, - isBkr: !1 - }), - (this.rules[8] = { - name: 'fragment-marker', - lower: 'fragment-marker', - index: 8, - isBkr: !1 - }), - (this.rules[9] = { name: 'slash', lower: 'slash', index: 9, isBkr: !1 }), - (this.rules[10] = { - name: 'path-literal', - lower: 'path-literal', - index: 10, - isBkr: !1 - }), - (this.rules[11] = { - name: 'template-expression', - lower: 'template-expression', - index: 11, - isBkr: !1 - }), - (this.rules[12] = { - name: 'template-expression-param-name', - lower: 'template-expression-param-name', - index: 12, - isBkr: !1 - }), - (this.rules[13] = { name: 'unreserved', lower: 'unreserved', index: 13, isBkr: !1 }), - (this.rules[14] = { - name: 'pct-encoded', - lower: 'pct-encoded', - index: 14, - isBkr: !1 - }), - (this.rules[15] = { name: 'sub-delims', lower: 'sub-delims', index: 15, isBkr: !1 }), - (this.rules[16] = { name: 'ALPHA', lower: 'alpha', index: 16, isBkr: !1 }), - (this.rules[17] = { name: 'DIGIT', lower: 'digit', index: 17, isBkr: !1 }), - (this.rules[18] = { name: 'HEXDIG', lower: 'hexdig', index: 18, isBkr: !1 }), - (this.udts = []), - (this.rules[0].opcodes = []), - (this.rules[0].opcodes[0] = { type: 2, children: [1, 2, 6] }), - (this.rules[0].opcodes[1] = { type: 4, index: 1 }), - (this.rules[0].opcodes[2] = { type: 3, min: 0, max: 1 }), - (this.rules[0].opcodes[3] = { type: 2, children: [4, 5] }), - (this.rules[0].opcodes[4] = { type: 4, index: 5 }), - (this.rules[0].opcodes[5] = { type: 4, index: 3 }), - (this.rules[0].opcodes[6] = { type: 3, min: 0, max: 1 }), - (this.rules[0].opcodes[7] = { type: 2, children: [8, 9] }), - (this.rules[0].opcodes[8] = { type: 4, index: 8 }), - (this.rules[0].opcodes[9] = { type: 4, index: 6 }), - (this.rules[1].opcodes = []), - (this.rules[1].opcodes[0] = { type: 2, children: [1, 2, 6] }), - (this.rules[1].opcodes[1] = { type: 4, index: 9 }), - (this.rules[1].opcodes[2] = { type: 3, min: 0, max: 1 / 0 }), - (this.rules[1].opcodes[3] = { type: 2, children: [4, 5] }), - (this.rules[1].opcodes[4] = { type: 4, index: 2 }), - (this.rules[1].opcodes[5] = { type: 4, index: 9 }), - (this.rules[1].opcodes[6] = { type: 3, min: 0, max: 1 }), - (this.rules[1].opcodes[7] = { type: 4, index: 2 }), - (this.rules[2].opcodes = []), - (this.rules[2].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[2].opcodes[1] = { type: 1, children: [2, 3] }), - (this.rules[2].opcodes[2] = { type: 4, index: 10 }), - (this.rules[2].opcodes[3] = { type: 4, index: 11 }), - (this.rules[3].opcodes = []), - (this.rules[3].opcodes[0] = { type: 3, min: 0, max: 1 / 0 }), - (this.rules[3].opcodes[1] = { type: 4, index: 4 }), - (this.rules[4].opcodes = []), - (this.rules[4].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[4].opcodes[1] = { type: 1, children: [2, 3, 4, 5, 6, 7, 8, 9, 10] }), - (this.rules[4].opcodes[2] = { type: 4, index: 13 }), - (this.rules[4].opcodes[3] = { type: 4, index: 14 }), - (this.rules[4].opcodes[4] = { type: 4, index: 15 }), - (this.rules[4].opcodes[5] = { type: 7, string: [58] }), - (this.rules[4].opcodes[6] = { type: 7, string: [64] }), - (this.rules[4].opcodes[7] = { type: 7, string: [47] }), - (this.rules[4].opcodes[8] = { type: 7, string: [63] }), - (this.rules[4].opcodes[9] = { type: 7, string: [38] }), - (this.rules[4].opcodes[10] = { type: 7, string: [61] }), - (this.rules[5].opcodes = []), - (this.rules[5].opcodes[0] = { type: 7, string: [63] }), - (this.rules[6].opcodes = []), - (this.rules[6].opcodes[0] = { type: 3, min: 0, max: 1 / 0 }), - (this.rules[6].opcodes[1] = { type: 4, index: 7 }), - (this.rules[7].opcodes = []), - (this.rules[7].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[7].opcodes[1] = { type: 1, children: [2, 3, 4, 5, 6, 7, 8] }), - (this.rules[7].opcodes[2] = { type: 4, index: 13 }), - (this.rules[7].opcodes[3] = { type: 4, index: 14 }), - (this.rules[7].opcodes[4] = { type: 4, index: 15 }), - (this.rules[7].opcodes[5] = { type: 7, string: [58] }), - (this.rules[7].opcodes[6] = { type: 7, string: [64] }), - (this.rules[7].opcodes[7] = { type: 7, string: [47] }), - (this.rules[7].opcodes[8] = { type: 7, string: [63] }), - (this.rules[8].opcodes = []), - (this.rules[8].opcodes[0] = { type: 7, string: [35] }), - (this.rules[9].opcodes = []), - (this.rules[9].opcodes[0] = { type: 7, string: [47] }), - (this.rules[10].opcodes = []), - (this.rules[10].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[10].opcodes[1] = { type: 1, children: [2, 3, 4, 5, 6] }), - (this.rules[10].opcodes[2] = { type: 4, index: 13 }), - (this.rules[10].opcodes[3] = { type: 4, index: 14 }), - (this.rules[10].opcodes[4] = { type: 4, index: 15 }), - (this.rules[10].opcodes[5] = { type: 7, string: [58] }), - (this.rules[10].opcodes[6] = { type: 7, string: [64] }), - (this.rules[11].opcodes = []), - (this.rules[11].opcodes[0] = { type: 2, children: [1, 2, 3] }), - (this.rules[11].opcodes[1] = { type: 7, string: [123] }), - (this.rules[11].opcodes[2] = { type: 4, index: 12 }), - (this.rules[11].opcodes[3] = { type: 7, string: [125] }), - (this.rules[12].opcodes = []), - (this.rules[12].opcodes[0] = { type: 3, min: 1, max: 1 / 0 }), - (this.rules[12].opcodes[1] = { type: 1, children: [2, 3, 4, 5, 6] }), - (this.rules[12].opcodes[2] = { type: 4, index: 13 }), - (this.rules[12].opcodes[3] = { type: 4, index: 14 }), - (this.rules[12].opcodes[4] = { type: 4, index: 15 }), - (this.rules[12].opcodes[5] = { type: 7, string: [58] }), - (this.rules[12].opcodes[6] = { type: 7, string: [64] }), - (this.rules[13].opcodes = []), - (this.rules[13].opcodes[0] = { type: 1, children: [1, 2, 3, 4, 5, 6] }), - (this.rules[13].opcodes[1] = { type: 4, index: 16 }), - (this.rules[13].opcodes[2] = { type: 4, index: 17 }), - (this.rules[13].opcodes[3] = { type: 7, string: [45] }), - (this.rules[13].opcodes[4] = { type: 7, string: [46] }), - (this.rules[13].opcodes[5] = { type: 7, string: [95] }), - (this.rules[13].opcodes[6] = { type: 7, string: [126] }), - (this.rules[14].opcodes = []), - (this.rules[14].opcodes[0] = { type: 2, children: [1, 2, 3] }), - (this.rules[14].opcodes[1] = { type: 7, string: [37] }), - (this.rules[14].opcodes[2] = { type: 4, index: 18 }), - (this.rules[14].opcodes[3] = { type: 4, index: 18 }), - (this.rules[15].opcodes = []), - (this.rules[15].opcodes[0] = { - type: 1, - children: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] - }), - (this.rules[15].opcodes[1] = { type: 7, string: [33] }), - (this.rules[15].opcodes[2] = { type: 7, string: [36] }), - (this.rules[15].opcodes[3] = { type: 7, string: [38] }), - (this.rules[15].opcodes[4] = { type: 7, string: [39] }), - (this.rules[15].opcodes[5] = { type: 7, string: [40] }), - (this.rules[15].opcodes[6] = { type: 7, string: [41] }), - (this.rules[15].opcodes[7] = { type: 7, string: [42] }), - (this.rules[15].opcodes[8] = { type: 7, string: [43] }), - (this.rules[15].opcodes[9] = { type: 7, string: [44] }), - (this.rules[15].opcodes[10] = { type: 7, string: [59] }), - (this.rules[15].opcodes[11] = { type: 7, string: [61] }), - (this.rules[16].opcodes = []), - (this.rules[16].opcodes[0] = { type: 1, children: [1, 2] }), - (this.rules[16].opcodes[1] = { type: 5, min: 65, max: 90 }), - (this.rules[16].opcodes[2] = { type: 5, min: 97, max: 122 }), - (this.rules[17].opcodes = []), - (this.rules[17].opcodes[0] = { type: 5, min: 48, max: 57 }), - (this.rules[18].opcodes = []), - (this.rules[18].opcodes[0] = { type: 1, children: [1, 2, 3, 4, 5, 6, 7] }), - (this.rules[18].opcodes[1] = { type: 4, index: 17 }), - (this.rules[18].opcodes[2] = { type: 7, string: [97] }), - (this.rules[18].opcodes[3] = { type: 7, string: [98] }), - (this.rules[18].opcodes[4] = { type: 7, string: [99] }), - (this.rules[18].opcodes[5] = { type: 7, string: [100] }), - (this.rules[18].opcodes[6] = { type: 7, string: [101] }), - (this.rules[18].opcodes[7] = { type: 7, string: [102] }), - (this.toString = function toString() { - let s = ''; - return ( - (s += '; OpenAPI Path Templating ABNF syntax\n'), - (s += - 'path-template = path [ query-marker query ] [ fragment-marker fragment ]\n'), - (s += - 'path = slash *( path-segment slash ) [ path-segment ]\n'), - (s += - 'path-segment = 1*( path-literal / template-expression )\n'), - (s += 'query = *( query-literal )\n'), - (s += - 'query-literal = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" / "/" / "?" / "&" / "=" )\n'), - (s += 'query-marker = "?"\n'), - (s += 'fragment = *( fragment-literal )\n'), - (s += - 'fragment-literal = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" / "/" / "?" )\n'), - (s += 'fragment-marker = "#"\n'), - (s += 'slash = "/"\n'), - (s += - 'path-literal = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )\n'), - (s += - 'template-expression = "{" template-expression-param-name "}"\n'), - (s += - 'template-expression-param-name = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )\n'), - (s += '\n'), - (s += '; Characters definitions (from RFC 3986)\n'), - (s += 'unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"\n'), - (s += 'pct-encoded = "%" HEXDIG HEXDIG\n'), - (s += 'sub-delims = "!" / "$" / "&" / "\'" / "(" / ")"\n'), - (s += ' / "*" / "+" / "," / ";" / "="\n'), - (s += 'ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n'), - (s += 'DIGIT = %x30-39 ; 0-9\n'), - (s += 'HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\n'), - '; OpenAPI Path Templating ABNF syntax\npath-template = path [ query-marker query ] [ fragment-marker fragment ]\npath = slash *( path-segment slash ) [ path-segment ]\npath-segment = 1*( path-literal / template-expression )\nquery = *( query-literal )\nquery-literal = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" / "/" / "?" / "&" / "=" )\nquery-marker = "?"\nfragment = *( fragment-literal )\nfragment-literal = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" / "/" / "?" )\nfragment-marker = "#"\nslash = "/"\npath-literal = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )\ntemplate-expression = "{" template-expression-param-name "}"\ntemplate-expression-param-name = 1*( unreserved / pct-encoded / sub-delims / ":" / "@" )\n\n; Characters definitions (from RFC 3986)\nunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"\npct-encoded = "%" HEXDIG HEXDIG\nsub-delims = "!" / "$" / "&" / "\'" / "(" / ")"\n / "*" / "+" / "," / ";" / "="\nALPHA = %x41-5A / %x61-7A ; A-Z / a-z\nDIGIT = %x30-39 ; 0-9\nHEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"\n' - ); - })); - })(), - openapi_path_templating_es_parse = (s) => { - const o = new IS(); - ((o.ast = new PS()), - (o.ast.callbacks['path-template'] = path_template), - (o.ast.callbacks.path = callbacks_path), - (o.ast.callbacks.query = callbacks_query), - (o.ast.callbacks['query-marker'] = query_marker), - (o.ast.callbacks.fragment = callbacks_fragment), - (o.ast.callbacks['fragment-marker'] = fragment_marker), - (o.ast.callbacks.slash = callbacks_slash), - (o.ast.callbacks['path-literal'] = path_literal), - (o.ast.callbacks['template-expression'] = template_expression), - (o.ast.callbacks['template-expression-param-name'] = template_expression_param_name)); - return { result: o.parse(DS, 'path-template', s), ast: o.ast }; - }, - encodePathComponent = (s) => - ((s) => { - try { - return 'string' == typeof s && decodeURIComponent(s) !== s; - } catch { - return !1; - } - })(s) - ? s - : encodeURIComponent(s).replace(/%5B/g, '[').replace(/%5D/g, ']'), - LS = [ - 'slash', - 'path-literal', - 'query-marker', - 'query-literal', - 'template-expression-param-name' - ], - openapi_path_templating_es_resolve = (s, o, i = {}) => { - const u = { ...{ encoder: encodePathComponent }, ...i }, - _ = openapi_path_templating_es_parse(s); - if (!_.result.success) return s; - const w = []; - _.ast.translate(w); - const x = w - .filter(([s]) => LS.includes(s)) - .map(([s, i]) => - 'template-expression-param-name' === s - ? Object.hasOwn(o, i) - ? u.encoder(o[i], i) - : `{${i}}` - : i - ); - return x.join(''); - }, - BS = { - body: function bodyBuilder({ req: s, value: o }) { - void 0 !== o && (s.body = o); - }, - header: function headerBuilder({ req: s, parameter: o, value: i }) { - ((s.headers = s.headers || {}), void 0 !== i && (s.headers[o.name] = i)); - }, - query: function queryBuilder({ req: s, value: o, parameter: i }) { - ((s.query = s.query || {}), !1 === o && 'boolean' === i.type && (o = 'false')); - 0 === o && ['number', 'integer'].indexOf(i.type) > -1 && (o = '0'); - if (o) s.query[i.name] = { collectionFormat: i.collectionFormat, value: o }; - else if (i.allowEmptyValue && void 0 !== o) { - const o = i.name; - ((s.query[o] = s.query[o] || {}), (s.query[o].allowEmptyValue = !0)); - } - }, - path: function pathBuilder({ req: s, value: o, parameter: i, baseURL: u }) { - if (void 0 !== o) { - const _ = s.url.replace(u, ''), - w = openapi_path_templating_es_resolve(_, { [i.name]: o }); - s.url = u + w; - } - }, - formData: function formDataBuilder({ req: s, value: o, parameter: i }) { - !1 === o && 'boolean' === i.type && (o = 'false'); - 0 === o && ['number', 'integer'].indexOf(i.type) > -1 && (o = '0'); - if (o) - ((s.form = s.form || {}), - (s.form[i.name] = { collectionFormat: i.collectionFormat, value: o })); - else if (i.allowEmptyValue && void 0 !== o) { - s.form = s.form || {}; - const o = i.name; - ((s.form[o] = s.form[o] || {}), (s.form[o].allowEmptyValue = !0)); - } - } - }; - function serialize(s, o) { - return o.includes('application/json') - ? 'string' == typeof s - ? s - : (Array.isArray(s) && - (s = s.map((s) => { - try { - return JSON.parse(s); - } catch (o) { - return s; - } - })), - JSON.stringify(s)) - : String(s); - } - function parameter_builders_path({ req: s, value: o, parameter: i, baseURL: u }) { - const { name: _, style: w, explode: x, content: C } = i; - if (void 0 === o) return; - const j = s.url.replace(u, ''); - let L; - if (C) { - const s = Object.keys(C)[0]; - L = openapi_path_templating_es_resolve( - j, - { [_]: o }, - { encoder: (o) => encodeCharacters(serialize(o, s)) } - ); - } else - L = openapi_path_templating_es_resolve( - j, - { [_]: o }, - { - encoder: (s) => - stylize({ - key: i.name, - value: s, - style: w || 'simple', - explode: x || !1, - escape: 'reserved' - }) - } - ); - s.url = u + L; - } - function parameter_builders_query({ req: s, value: o, parameter: i }) { - if (((s.query = s.query || {}), void 0 !== o && i.content)) { - const u = serialize(o, Object.keys(i.content)[0]); - if (u) s.query[i.name] = u; - else if (i.allowEmptyValue) { - const o = i.name; - ((s.query[o] = s.query[o] || {}), (s.query[o].allowEmptyValue = !0)); - } - } else if ((!1 === o && (o = 'false'), 0 === o && (o = '0'), o)) { - const { style: u, explode: _, allowReserved: w } = i; - s.query[i.name] = { - value: o, - serializationOption: { style: u, explode: _, allowReserved: w } - }; - } else if (i.allowEmptyValue && void 0 !== o) { - const o = i.name; - ((s.query[o] = s.query[o] || {}), (s.query[o].allowEmptyValue = !0)); - } - } - const FS = ['accept', 'authorization', 'content-type']; - function parameter_builders_header({ req: s, parameter: o, value: i }) { - if (((s.headers = s.headers || {}), !(FS.indexOf(o.name.toLowerCase()) > -1))) - if (void 0 !== i && o.content) { - const u = Object.keys(o.content)[0]; - s.headers[o.name] = serialize(i, u); - } else - void 0 === i || - (Array.isArray(i) && 0 === i.length) || - (s.headers[o.name] = stylize({ - key: o.name, - value: i, - style: o.style || 'simple', - explode: void 0 !== o.explode && o.explode, - escape: !1 - })); - } - function parameter_builders_cookie({ req: s, parameter: o, value: i }) { - s.headers = s.headers || {}; - const u = typeof i; - if (void 0 !== i && o.content) { - const u = Object.keys(o.content)[0]; - s.headers.Cookie = `${o.name}=${serialize(i, u)}`; - } else if (void 0 !== i && (!Array.isArray(i) || 0 !== i.length)) { - const _ = 'object' === u && !Array.isArray(i) && o.explode ? '' : `${o.name}=`; - s.headers.Cookie = - _ + - stylize({ - key: o.name, - value: i, - escape: !1, - style: o.style || 'form', - explode: void 0 !== o.explode && o.explode - }); - } - } - const qS = - 'undefined' != typeof globalThis - ? globalThis - : 'undefined' != typeof self - ? self - : window, - { btoa: $S } = qS, - VS = $S; - function buildRequest(s, o) { - const { - operation: i, - requestBody: u, - securities: _, - spec: w, - attachContentTypeForEmptyPayload: x - } = s; - let { requestContentType: C } = s; - o = (function applySecurities({ - request: s, - securities: o = {}, - operation: i = {}, - spec: u - }) { - var _; - const w = { ...s }, - { authorized: x = {} } = o, - C = i.security || u.security || [], - j = x && !!Object.keys(x).length, - L = - (null == u || null === (_ = u.components) || void 0 === _ - ? void 0 - : _.securitySchemes) || {}; - if ( - ((w.headers = w.headers || {}), - (w.query = w.query || {}), - !Object.keys(o).length || - !j || - !C || - (Array.isArray(i.security) && !i.security.length)) - ) - return s; - return ( - C.forEach((s) => { - Object.keys(s).forEach((s) => { - const o = x[s], - i = L[s]; - if (!o) return; - const u = o.value || o, - { type: _ } = i; - if (o) - if ('apiKey' === _) - ('query' === i.in && (w.query[i.name] = u), - 'header' === i.in && (w.headers[i.name] = u), - 'cookie' === i.in && (w.cookies[i.name] = u)); - else if ('http' === _) { - if (/^basic$/i.test(i.scheme)) { - const s = u.username || '', - o = u.password || '', - i = VS(`${s}:${o}`); - w.headers.Authorization = `Basic ${i}`; - } - /^bearer$/i.test(i.scheme) && (w.headers.Authorization = `Bearer ${u}`); - } else if ('oauth2' === _ || 'openIdConnect' === _) { - const s = o.token || {}, - u = s[i['x-tokenName'] || 'access_token']; - let _ = s.token_type; - ((_ && 'bearer' !== _.toLowerCase()) || (_ = 'Bearer'), - (w.headers.Authorization = `${_} ${u}`)); - } - }); - }), - w - ); - })({ request: o, securities: _, operation: i, spec: w }); - const j = i.requestBody || {}, - L = Object.keys(j.content || {}), - B = C && L.indexOf(C) > -1; - if (u || x) { - if (C && B) o.headers['Content-Type'] = C; - else if (!C) { - const s = L[0]; - s && ((o.headers['Content-Type'] = s), (C = s)); - } - } else C && B && (o.headers['Content-Type'] = C); - if (!s.responseContentType && i.responses) { - const s = Object.entries(i.responses) - .filter(([s, o]) => { - const i = parseInt(s, 10); - return i >= 200 && i < 300 && ku(o.content); - }) - .reduce((s, [, o]) => s.concat(Object.keys(o.content)), []); - s.length > 0 && (o.headers.accept = s.join(', ')); - } - if (u) - if (C) { - if (L.indexOf(C) > -1) - if ('application/x-www-form-urlencoded' === C || 'multipart/form-data' === C) - if ('object' == typeof u) { - var $, V; - const s = - null !== - ($ = null === (V = j.content[C]) || void 0 === V ? void 0 : V.encoding) && - void 0 !== $ - ? $ - : {}; - ((o.form = {}), - Object.keys(u).forEach((i) => { - let _; - try { - _ = JSON.parse(u[i]); - } catch { - _ = u[i]; - } - o.form[i] = { value: _, encoding: s[i] || {} }; - })); - } else if ('string' == typeof u) { - var U, z; - const s = - null !== - (U = null === (z = j.content[C]) || void 0 === z ? void 0 : z.encoding) && - void 0 !== U - ? U - : {}; - try { - o.form = {}; - const i = JSON.parse(u); - Object.entries(i).forEach(([i, u]) => { - o.form[i] = { value: u, encoding: s[i] || {} }; - }); - } catch { - o.form = u; - } - } else o.form = u; - else o.body = u; - } else o.body = u; - return o; - } - function build_request_buildRequest(s, o) { - const { - spec: i, - operation: u, - securities: _, - requestContentType: w, - responseContentType: x, - attachContentTypeForEmptyPayload: C - } = s; - if ( - ((o = (function build_request_applySecurities({ - request: s, - securities: o = {}, - operation: i = {}, - spec: u - }) { - const _ = { ...s }, - { authorized: w = {}, specSecurity: x = [] } = o, - C = i.security || x, - j = w && !!Object.keys(w).length, - L = u.securityDefinitions; - if ( - ((_.headers = _.headers || {}), - (_.query = _.query || {}), - !Object.keys(o).length || - !j || - !C || - (Array.isArray(i.security) && !i.security.length)) - ) - return s; - return ( - C.forEach((s) => { - Object.keys(s).forEach((s) => { - const o = w[s]; - if (!o) return; - const { token: i } = o, - u = o.value || o, - x = L[s], - { type: C } = x, - j = x['x-tokenName'] || 'access_token', - B = i && i[j]; - let $ = i && i.token_type; - if (o) - if ('apiKey' === C) { - const s = 'query' === x.in ? 'query' : 'headers'; - ((_[s] = _[s] || {}), (_[s][x.name] = u)); - } else if ('basic' === C) - if (u.header) _.headers.authorization = u.header; - else { - const s = u.username || '', - o = u.password || ''; - ((u.base64 = VS(`${s}:${o}`)), - (_.headers.authorization = `Basic ${u.base64}`)); - } - else - 'oauth2' === C && - B && - (($ = $ && 'bearer' !== $.toLowerCase() ? $ : 'Bearer'), - (_.headers.authorization = `${$} ${B}`)); - }); - }), - _ - ); - })({ request: o, securities: _, operation: u, spec: i })), - o.body || o.form || C) - ) - w - ? (o.headers['Content-Type'] = w) - : Array.isArray(u.consumes) - ? ([o.headers['Content-Type']] = u.consumes) - : Array.isArray(i.consumes) - ? ([o.headers['Content-Type']] = i.consumes) - : u.parameters && u.parameters.filter((s) => 'file' === s.type).length - ? (o.headers['Content-Type'] = 'multipart/form-data') - : u.parameters && - u.parameters.filter((s) => 'formData' === s.in).length && - (o.headers['Content-Type'] = 'application/x-www-form-urlencoded'); - else if (w) { - const s = u.parameters && u.parameters.filter((s) => 'body' === s.in).length > 0, - i = u.parameters && u.parameters.filter((s) => 'formData' === s.in).length > 0; - (s || i) && (o.headers['Content-Type'] = w); - } - return ( - !x && - Array.isArray(u.produces) && - u.produces.length > 0 && - (o.headers.accept = u.produces.join(', ')), - o - ); - } - function idFromPathMethodLegacy(s, o) { - return `${o.toLowerCase()}-${s}`; - } - const arrayOrEmpty = (s) => (Array.isArray(s) ? s : []), - parseURIReference = (s) => { - try { - return new URL(s); - } catch { - const o = new URL(s, Nc), - i = String(s).startsWith('/') ? o.pathname : o.pathname.substring(1); - return { - hash: o.hash, - host: '', - hostname: '', - href: '', - origin: '', - password: '', - pathname: i, - port: '', - protocol: '', - search: o.search, - searchParams: o.searchParams - }; - } - }; - class OperationNotFoundError extends Jo {} - const US = { buildRequest: execute_buildRequest }; - function execute_execute({ - http: s, - fetch: o, - spec: i, - operationId: u, - pathName: _, - method: w, - parameters: x, - securities: C, - ...j - }) { - const L = s || o || http_http; - _ && w && !u && (u = idFromPathMethodLegacy(_, w)); - const B = US.buildRequest({ - spec: i, - operationId: u, - parameters: x, - securities: C, - http: L, - ...j - }); - return ( - B.body && (ku(B.body) || Array.isArray(B.body)) && (B.body = JSON.stringify(B.body)), - L(B) - ); - } - function execute_buildRequest(s) { - var o; - const { - spec: i, - operationId: u, - responseContentType: _, - scheme: w, - requestInterceptor: x, - responseInterceptor: C, - contextUrl: j, - userFetch: L, - server: B, - serverVariables: $, - http: V, - signal: U, - serverVariableEncoder: z - } = s; - let { parameters: Y, parameterBuilders: Z, baseURL: ee } = s; - const ie = isOpenAPI3(i); - Z || (Z = ie ? fe : BS); - let ae = { - url: '', - credentials: V && V.withCredentials ? 'include' : 'same-origin', - headers: {}, - cookies: {} - }; - (U && (ae.signal = U), - x && (ae.requestInterceptor = x), - C && (ae.responseInterceptor = C), - L && (ae.userFetch = L)); - const le = (function getOperationRaw(s, o) { - return s && s.paths - ? (function findOperation(s, o) { - return ( - (function eachOperation(s, o, i) { - if (!s || 'object' != typeof s || !s.paths || 'object' != typeof s.paths) - return null; - const { paths: u } = s; - for (const _ in u) - for (const w in u[_]) { - if ('PARAMETERS' === w.toUpperCase()) continue; - const x = u[_][w]; - if (!x || 'object' != typeof x) continue; - const C = { spec: s, pathName: _, method: w.toUpperCase(), operation: x }, - j = o(C); - if (i && j) return C; - } - })(s, o, !0) || null - ); - })(s, ({ pathName: s, method: i, operation: u }) => { - if (!u || 'object' != typeof u) return !1; - const _ = u.operationId; - return [opId(u, s, i), idFromPathMethodLegacy(s, i), _].some((s) => s && s === o); - }) - : null; - })(i, u); - if (!le) throw new OperationNotFoundError(`Operation ${u} not found`); - const { operation: ce = {}, method: pe, pathName: de } = le; - if ( - ((ee = - null !== (o = ee) && void 0 !== o - ? o - : (function baseUrl(s) { - const o = isOpenAPI3(s.spec); - return o - ? (function oas3BaseUrl({ - spec: s, - pathName: o, - method: i, - server: u, - contextUrl: _, - serverVariables: w = {}, - serverVariableEncoder: x - }) { - var C, j; - let L, - B = [], - $ = ''; - const V = - null == s || - null === (C = s.paths) || - void 0 === C || - null === (C = C[o]) || - void 0 === C || - null === (C = C[(i || '').toLowerCase()]) || - void 0 === C - ? void 0 - : C.servers, - U = - null == s || - null === (j = s.paths) || - void 0 === j || - null === (j = j[o]) || - void 0 === j - ? void 0 - : j.servers, - z = null == s ? void 0 : s.servers; - ((B = isNonEmptyServerList(V) - ? V - : isNonEmptyServerList(U) - ? U - : isNonEmptyServerList(z) - ? z - : [Rc]), - u && ((L = B.find((s) => s.url === u)), L && ($ = u))); - $ || (([L] = B), ($ = L.url)); - if (openapi_server_url_templating_es_test($, { strict: !0 })) { - const s = Object.entries({ ...L.variables }).reduce( - (s, [o, i]) => ((s[o] = i.default), s), - {} - ); - $ = es_substitute( - $, - { ...s, ...w }, - { encoder: 'function' == typeof x ? x : Ip } - ); - } - return (function buildOas3UrlWithContext(s = '', o = '') { - const i = parseURIReference(s && o ? resolve(o, s) : s), - u = parseURIReference(o), - _ = stripNonAlpha(i.protocol) || stripNonAlpha(u.protocol), - w = i.host || u.host, - x = i.pathname; - let C; - C = _ && w ? `${_}://${w + x}` : x; - return '/' === C[C.length - 1] ? C.slice(0, -1) : C; - })($, _); - })(s) - : (function swagger2BaseUrl({ spec: s, scheme: o, contextUrl: i = '' }) { - const u = parseURIReference(i), - _ = Array.isArray(s.schemes) ? s.schemes[0] : null, - w = o || _ || stripNonAlpha(u.protocol) || 'http', - x = s.host || u.host || '', - C = s.basePath || ''; - let j; - j = w && x ? `${w}://${x + C}` : C; - return '/' === j[j.length - 1] ? j.slice(0, -1) : j; - })(s); - })({ - spec: i, - scheme: w, - contextUrl: j, - server: B, - serverVariables: $, - pathName: de, - method: pe, - serverVariableEncoder: z - })), - (ae.url += ee), - !u) - ) - return (delete ae.cookies, ae); - ((ae.url += de), (ae.method = `${pe}`.toUpperCase()), (Y = Y || {})); - const ye = i.paths[de] || {}; - _ && (ae.headers.accept = _); - const be = ((s) => { - const o = {}; - s.forEach((s) => { - (o[s.in] || (o[s.in] = {}), (o[s.in][s.name] = s)); - }); - const i = []; - return ( - Object.keys(o).forEach((s) => { - Object.keys(o[s]).forEach((u) => { - i.push(o[s][u]); - }); - }), - i - ); - })([].concat(arrayOrEmpty(ce.parameters)).concat(arrayOrEmpty(ye.parameters))); - be.forEach((s) => { - const o = Z[s.in]; - let u; - if ( - ('body' === s.in && s.schema && s.schema.properties && (u = Y), - (u = s && s.name && Y[s.name]), - void 0 === u - ? (u = s && s.name && Y[`${s.in}.${s.name}`]) - : ((s, o) => o.filter((o) => o.name === s))(s.name, be).length > 1 && - console.warn( - `Parameter '${s.name}' is ambiguous because the defined spec has more than one parameter with the name: '${s.name}' and the passed-in parameter values did not define an 'in' value.` - ), - null !== u) - ) { - if ( - (void 0 !== s.default && void 0 === u && (u = s.default), - void 0 === u && s.required && !s.allowEmptyValue) - ) - throw new Error(`Required parameter ${s.name} is not provided`); - if (ie && s.schema && 'object' === s.schema.type && 'string' == typeof u) - try { - u = JSON.parse(u); - } catch (s) { - throw new Error('Could not parse object parameter value string as JSON'); - } - o && o({ req: ae, parameter: s, value: u, operation: ce, spec: i, baseURL: ee }); - } - }); - const _e = { ...s, operation: ce }; - if ( - ((ae = ie ? buildRequest(_e, ae) : build_request_buildRequest(_e, ae)), - ae.cookies && Object.keys(ae.cookies).length) - ) { - const s = Object.keys(ae.cookies).reduce((s, o) => { - const i = ae.cookies[o]; - return s + (s ? '&' : '') + jS.serialize(o, i); - }, ''); - ae.headers.Cookie = s; - } - return (ae.cookies && delete ae.cookies, serializeRequest(ae)); - } - const stripNonAlpha = (s) => (s ? s.replace(/\W/g, '') : null); - const isNonEmptyServerList = (s) => Array.isArray(s) && s.length > 0; - const makeResolveSubtree = - (s) => - async (o, i, u = {}) => - (async (s, o, i = {}) => { - const { - returnEntireTree: u, - baseDoc: _, - requestInterceptor: w, - responseInterceptor: x, - parameterMacro: C, - modelPropertyMacro: j, - useCircularStructures: L, - strategies: B - } = i, - $ = { - spec: s, - pathDiscriminator: o, - baseDoc: _, - requestInterceptor: w, - responseInterceptor: x, - parameterMacro: C, - modelPropertyMacro: j, - useCircularStructures: L, - strategies: B - }, - V = B.find((o) => o.match(s)).normalize(s), - U = await AS({ - spec: V, - ...$, - allowMetaPatches: !0, - skipNormalization: !isOpenAPI31(s) - }); - return ( - !u && - Array.isArray(o) && - o.length && - (U.spec = o.reduce((s, o) => (null == s ? void 0 : s[o]), U.spec) || null), - U - ); - })(o, i, { ...s, ...u }), - zS = - (makeResolveSubtree({ strategies: [fu, hu, uu] }), - (s, o) => - (...i) => { - s(...i); - const u = o.getConfigs().withCredentials; - o.fn.fetch.withCredentials = u; - }); - function swagger_client({ configs: s, getConfigs: o }) { - return { - fn: { - fetch: - ((i = http_http), - (u = s.preFetch), - (_ = s.postFetch), - (_ = _ || ((s) => s)), - (u = u || ((s) => s)), - (s) => ( - 'string' == typeof s && (s = { url: s }), - (s = serializeRequest(s)), - (s = u(s)), - _(i(s)) - )), - buildRequest: execute_buildRequest, - execute: execute_execute, - resolve: makeResolve({ strategies: [OS, fu, hu, uu] }), - resolveSubtree: async (s, i, u = {}) => { - const _ = o(), - w = { - modelPropertyMacro: _.modelPropertyMacro, - parameterMacro: _.parameterMacro, - requestInterceptor: _.requestInterceptor, - responseInterceptor: _.responseInterceptor, - strategies: [OS, fu, hu, uu] - }; - return makeResolveSubtree(w)(s, i, u); - }, - serializeRes: serializeResponse, - opId - }, - statePlugins: { configs: { wrapActions: { loaded: zS } } } - }; - var i, u, _; - } - function util() { - return { fn: { shallowEqualKeys } }; - } - var WS = __webpack_require__(40961), - KS = __webpack_require__(78418), - HS = Pe, - JS = Symbol.for('react-redux-context'), - GS = 'undefined' != typeof globalThis ? globalThis : {}; - function getContext() { - if (!HS.createContext) return {}; - const s = GS[JS] ?? (GS[JS] = new Map()); - let o = s.get(HS.createContext); - return (o || ((o = HS.createContext(null)), s.set(HS.createContext, o)), o); - } - var YS = getContext(), - notInitialized = () => { - throw new Error('uSES not initialized!'); - }; - var XS = Symbol.for('react.element'), - ZS = Symbol.for('react.portal'), - QS = Symbol.for('react.fragment'), - ex = Symbol.for('react.strict_mode'), - tx = Symbol.for('react.profiler'), - rx = Symbol.for('react.provider'), - nx = Symbol.for('react.context'), - sx = Symbol.for('react.server_context'), - ox = Symbol.for('react.forward_ref'), - ix = Symbol.for('react.suspense'), - ax = Symbol.for('react.suspense_list'), - lx = Symbol.for('react.memo'), - cx = Symbol.for('react.lazy'), - ux = (Symbol.for('react.offscreen'), Symbol.for('react.client.reference'), ox), - px = lx; - function typeOf(s) { - if ('object' == typeof s && null !== s) { - const o = s.$$typeof; - switch (o) { - case XS: { - const i = s.type; - switch (i) { - case QS: - case tx: - case ex: - case ix: - case ax: - return i; - default: { - const s = i && i.$$typeof; - switch (s) { - case sx: - case nx: - case ox: - case cx: - case lx: - case rx: - return s; - default: - return o; - } - } - } - } - case ZS: - return o; - } - } - } - function pureFinalPropsSelectorFactory( - s, - o, - i, - u, - { areStatesEqual: _, areOwnPropsEqual: w, areStatePropsEqual: x } - ) { - let C, - j, - L, - B, - $, - V = !1; - function handleSubsequentCalls(V, U) { - const z = !w(U, j), - Y = !_(V, C, U, j); - return ( - (C = V), - (j = U), - z && Y - ? (function handleNewPropsAndNewState() { - return ( - (L = s(C, j)), - o.dependsOnOwnProps && (B = o(u, j)), - ($ = i(L, B, j)), - $ - ); - })() - : z - ? (function handleNewProps() { - return ( - s.dependsOnOwnProps && (L = s(C, j)), - o.dependsOnOwnProps && (B = o(u, j)), - ($ = i(L, B, j)), - $ - ); - })() - : Y - ? (function handleNewState() { - const o = s(C, j), - u = !x(o, L); - return ((L = o), u && ($ = i(L, B, j)), $); - })() - : $ - ); - } - return function pureFinalPropsSelector(_, w) { - return V - ? handleSubsequentCalls(_, w) - : (function handleFirstCall(_, w) { - return ( - (C = _), - (j = w), - (L = s(C, j)), - (B = o(u, j)), - ($ = i(L, B, j)), - (V = !0), - $ - ); - })(_, w); - }; - } - function wrapMapToPropsConstant(s) { - return function initConstantSelector(o) { - const i = s(o); - function constantSelector() { - return i; - } - return ((constantSelector.dependsOnOwnProps = !1), constantSelector); - }; - } - function getDependsOnOwnProps(s) { - return s.dependsOnOwnProps ? Boolean(s.dependsOnOwnProps) : 1 !== s.length; - } - function wrapMapToPropsFunc(s, o) { - return function initProxySelector(o, { displayName: i }) { - const u = function mapToPropsProxy(s, o) { - return u.dependsOnOwnProps ? u.mapToProps(s, o) : u.mapToProps(s, void 0); - }; - return ( - (u.dependsOnOwnProps = !0), - (u.mapToProps = function detectFactoryAndVerify(o, i) { - ((u.mapToProps = s), (u.dependsOnOwnProps = getDependsOnOwnProps(s))); - let _ = u(o, i); - return ( - 'function' == typeof _ && - ((u.mapToProps = _), - (u.dependsOnOwnProps = getDependsOnOwnProps(_)), - (_ = u(o, i))), - _ - ); - }), - u - ); - }; - } - function createInvalidArgFactory(s, o) { - return (i, u) => { - throw new Error( - `Invalid value of type ${typeof s} for ${o} argument when connecting component ${u.wrappedComponentName}.` - ); - }; - } - function defaultMergeProps(s, o, i) { - return { ...i, ...s, ...o }; - } - function defaultNoopBatch(s) { - s(); - } - var hx = { notify() {}, get: () => [] }; - function createSubscription(s, o) { - let i, - u = hx, - _ = 0, - w = !1; - function handleChangeWrapper() { - x.onStateChange && x.onStateChange(); - } - function trySubscribe() { - (_++, - i || - ((i = o ? o.addNestedSub(handleChangeWrapper) : s.subscribe(handleChangeWrapper)), - (u = (function createListenerCollection() { - let s = null, - o = null; - return { - clear() { - ((s = null), (o = null)); - }, - notify() { - defaultNoopBatch(() => { - let o = s; - for (; o; ) (o.callback(), (o = o.next)); - }); - }, - get() { - const o = []; - let i = s; - for (; i; ) (o.push(i), (i = i.next)); - return o; - }, - subscribe(i) { - let u = !0; - const _ = (o = { callback: i, next: null, prev: o }); - return ( - _.prev ? (_.prev.next = _) : (s = _), - function unsubscribe() { - u && - null !== s && - ((u = !1), - _.next ? (_.next.prev = _.prev) : (o = _.prev), - _.prev ? (_.prev.next = _.next) : (s = _.next)); - } - ); - } - }; - })()))); - } - function tryUnsubscribe() { - (_--, i && 0 === _ && (i(), (i = void 0), u.clear(), (u = hx))); - } - const x = { - addNestedSub: function addNestedSub(s) { - trySubscribe(); - const o = u.subscribe(s); - let i = !1; - return () => { - i || ((i = !0), o(), tryUnsubscribe()); - }; - }, - notifyNestedSubs: function notifyNestedSubs() { - u.notify(); - }, - handleChangeWrapper, - isSubscribed: function isSubscribed() { - return w; - }, - trySubscribe: function trySubscribeSelf() { - w || ((w = !0), trySubscribe()); - }, - tryUnsubscribe: function tryUnsubscribeSelf() { - w && ((w = !1), tryUnsubscribe()); - }, - getListeners: () => u - }; - return x; - } - var dx = !( - 'undefined' == typeof window || - void 0 === window.document || - void 0 === window.document.createElement - ), - fx = 'undefined' != typeof navigator && 'ReactNative' === navigator.product, - mx = dx || fx ? HS.useLayoutEffect : HS.useEffect; - function is(s, o) { - return s === o ? 0 !== s || 0 !== o || 1 / s == 1 / o : s != s && o != o; - } - function shallowEqual(s, o) { - if (is(s, o)) return !0; - if ('object' != typeof s || null === s || 'object' != typeof o || null === o) return !1; - const i = Object.keys(s), - u = Object.keys(o); - if (i.length !== u.length) return !1; - for (let u = 0; u < i.length; u++) - if (!Object.prototype.hasOwnProperty.call(o, i[u]) || !is(s[i[u]], o[i[u]])) return !1; - return !0; - } - var gx = { - childContextTypes: !0, - contextType: !0, - contextTypes: !0, - defaultProps: !0, - displayName: !0, - getDefaultProps: !0, - getDerivedStateFromError: !0, - getDerivedStateFromProps: !0, - mixins: !0, - propTypes: !0, - type: !0 - }, - yx = { - name: !0, - length: !0, - prototype: !0, - caller: !0, - callee: !0, - arguments: !0, - arity: !0 - }, - vx = { - $$typeof: !0, - compare: !0, - defaultProps: !0, - displayName: !0, - propTypes: !0, - type: !0 - }, - bx = { - [ux]: { $$typeof: !0, render: !0, defaultProps: !0, displayName: !0, propTypes: !0 }, - [px]: vx - }; - function getStatics(s) { - return (function isMemo(s) { - return typeOf(s) === lx; - })(s) - ? vx - : bx[s.$$typeof] || gx; - } - var _x = Object.defineProperty, - Ex = Object.getOwnPropertyNames, - wx = Object.getOwnPropertySymbols, - Sx = Object.getOwnPropertyDescriptor, - xx = Object.getPrototypeOf, - kx = Object.prototype; - function hoistNonReactStatics(s, o) { - if ('string' != typeof o) { - if (kx) { - const i = xx(o); - i && i !== kx && hoistNonReactStatics(s, i); - } - let i = Ex(o); - wx && (i = i.concat(wx(o))); - const u = getStatics(s), - _ = getStatics(o); - for (let w = 0; w < i.length; ++w) { - const x = i[w]; - if (!(yx[x] || (_ && _[x]) || (u && u[x]))) { - const i = Sx(o, x); - try { - _x(s, x, i); - } catch (s) {} - } - } - } - return s; - } - var Cx = notInitialized, - Ox = [null, null]; - function captureWrapperProps(s, o, i, u, _, w) { - ((s.current = u), (i.current = !1), _.current && ((_.current = null), w())); - } - function strictEqual(s, o) { - return s === o; - } - var Ax = function connect( - s, - o, - i, - { - pure: u, - areStatesEqual: _ = strictEqual, - areOwnPropsEqual: w = shallowEqual, - areStatePropsEqual: x = shallowEqual, - areMergedPropsEqual: C = shallowEqual, - forwardRef: j = !1, - context: L = YS - } = {} - ) { - const B = L, - $ = (function mapStateToPropsFactory(s) { - return s - ? 'function' == typeof s - ? wrapMapToPropsFunc(s) - : createInvalidArgFactory(s, 'mapStateToProps') - : wrapMapToPropsConstant(() => ({})); - })(s), - V = (function mapDispatchToPropsFactory(s) { - return s && 'object' == typeof s - ? wrapMapToPropsConstant((o) => - (function react_redux_bindActionCreators(s, o) { - const i = {}; - for (const u in s) { - const _ = s[u]; - 'function' == typeof _ && (i[u] = (...s) => o(_(...s))); - } - return i; - })(s, o) - ) - : s - ? 'function' == typeof s - ? wrapMapToPropsFunc(s) - : createInvalidArgFactory(s, 'mapDispatchToProps') - : wrapMapToPropsConstant((s) => ({ dispatch: s })); - })(o), - U = (function mergePropsFactory(s) { - return s - ? 'function' == typeof s - ? (function wrapMergePropsFunc(s) { - return function initMergePropsProxy( - o, - { displayName: i, areMergedPropsEqual: u } - ) { - let _, - w = !1; - return function mergePropsProxy(o, i, x) { - const C = s(o, i, x); - return (w ? u(C, _) || (_ = C) : ((w = !0), (_ = C)), _); - }; - }; - })(s) - : createInvalidArgFactory(s, 'mergeProps') - : () => defaultMergeProps; - })(i), - z = Boolean(s); - return (s) => { - const o = s.displayName || s.name || 'Component', - i = `Connect(${o})`, - u = { - shouldHandleStateChanges: z, - displayName: i, - wrappedComponentName: o, - WrappedComponent: s, - initMapStateToProps: $, - initMapDispatchToProps: V, - initMergeProps: U, - areStatesEqual: _, - areStatePropsEqual: x, - areOwnPropsEqual: w, - areMergedPropsEqual: C - }; - function ConnectFunction(o) { - const [i, _, w] = HS.useMemo(() => { - const { reactReduxForwardedRef: s, ...i } = o; - return [o.context, s, i]; - }, [o]), - x = HS.useMemo(() => B, [i, B]), - C = HS.useContext(x), - j = Boolean(o.store) && Boolean(o.store.getState) && Boolean(o.store.dispatch), - L = Boolean(C) && Boolean(C.store); - const $ = j ? o.store : C.store, - V = L ? C.getServerState : $.getState, - U = HS.useMemo( - () => - (function finalPropsSelectorFactory( - s, - { initMapStateToProps: o, initMapDispatchToProps: i, initMergeProps: u, ..._ } - ) { - return pureFinalPropsSelectorFactory(o(s, _), i(s, _), u(s, _), s, _); - })($.dispatch, u), - [$] - ), - [Y, Z] = HS.useMemo(() => { - if (!z) return Ox; - const s = createSubscription($, j ? void 0 : C.subscription), - o = s.notifyNestedSubs.bind(s); - return [s, o]; - }, [$, j, C]), - ee = HS.useMemo(() => (j ? C : { ...C, subscription: Y }), [j, C, Y]), - ie = HS.useRef(void 0), - ae = HS.useRef(w), - le = HS.useRef(void 0), - ce = HS.useRef(!1), - pe = HS.useRef(!1), - de = HS.useRef(void 0); - mx( - () => ( - (pe.current = !0), - () => { - pe.current = !1; - } - ), - [] - ); - const fe = HS.useMemo( - () => () => (le.current && w === ae.current ? le.current : U($.getState(), w)), - [$, w] - ), - ye = HS.useMemo( - () => (s) => - Y - ? (function subscribeUpdates(s, o, i, u, _, w, x, C, j, L, B) { - if (!s) return () => {}; - let $ = !1, - V = null; - const checkForUpdates = () => { - if ($ || !C.current) return; - const s = o.getState(); - let i, U; - try { - i = u(s, _.current); - } catch (s) { - ((U = s), (V = s)); - } - (U || (V = null), - i === w.current - ? x.current || L() - : ((w.current = i), (j.current = i), (x.current = !0), B())); - }; - return ( - (i.onStateChange = checkForUpdates), - i.trySubscribe(), - checkForUpdates(), - () => { - if ((($ = !0), i.tryUnsubscribe(), (i.onStateChange = null), V)) - throw V; - } - ); - })(z, $, Y, U, ae, ie, ce, pe, le, Z, s) - : () => {}, - [Y] - ); - let be; - !(function useIsomorphicLayoutEffectWithArgs(s, o, i) { - mx(() => s(...o), i); - })(captureWrapperProps, [ae, ie, ce, w, le, Z]); - try { - be = Cx(ye, fe, V ? () => U(V(), w) : fe); - } catch (s) { - throw ( - de.current && - (s.message += `\nThe error may be correlated with this previous error:\n${de.current.stack}\n\n`), - s - ); - } - mx(() => { - ((de.current = void 0), (le.current = void 0), (ie.current = be)); - }); - const _e = HS.useMemo(() => HS.createElement(s, { ...be, ref: _ }), [_, s, be]); - return HS.useMemo( - () => (z ? HS.createElement(x.Provider, { value: ee }, _e) : _e), - [x, _e, ee] - ); - } - const L = HS.memo(ConnectFunction); - if (((L.WrappedComponent = s), (L.displayName = ConnectFunction.displayName = i), j)) { - const o = HS.forwardRef(function forwardConnectRef(s, o) { - return HS.createElement(L, { ...s, reactReduxForwardedRef: o }); - }); - return ((o.displayName = i), (o.WrappedComponent = s), hoistNonReactStatics(o, s)); - } - return hoistNonReactStatics(L, s); - }; - }; - var jx = function Provider({ - store: s, - context: o, - children: i, - serverState: u, - stabilityCheck: _ = 'once', - identityFunctionCheck: w = 'once' - }) { - const x = HS.useMemo(() => { - const o = createSubscription(s); - return { - store: s, - subscription: o, - getServerState: u ? () => u : void 0, - stabilityCheck: _, - identityFunctionCheck: w - }; - }, [s, u, _, w]), - C = HS.useMemo(() => s.getState(), [s]); - mx(() => { - const { subscription: o } = x; - return ( - (o.onStateChange = o.notifyNestedSubs), - o.trySubscribe(), - C !== s.getState() && o.notifyNestedSubs(), - () => { - (o.tryUnsubscribe(), (o.onStateChange = void 0)); - } - ); - }, [x, C]); - const j = o || YS; - return HS.createElement(j.Provider, { value: x }, i); - }; - var Ix; - ((Ix = KS.useSyncExternalStoreWithSelector), - ((s) => { - Cx = s; - })(Pe.useSyncExternalStore)); - var Px = __webpack_require__(83488), - Mx = __webpack_require__.n(Px); - const withSystem = (s) => (o) => { - const { fn: i } = s(); - class WithSystem extends Pe.Component { - render() { - return Pe.createElement(o, Rn()({}, s(), this.props, this.context)); - } - } - return ((WithSystem.displayName = `WithSystem(${i.getDisplayName(o)})`), WithSystem); - }, - withRoot = (s, o) => (i) => { - const { fn: u } = s(); - class WithRoot extends Pe.Component { - render() { - return Pe.createElement( - jx, - { store: o }, - Pe.createElement(i, Rn()({}, this.props, this.context)) - ); - } - } - return ((WithRoot.displayName = `WithRoot(${u.getDisplayName(i)})`), WithRoot); - }, - withConnect = (s, o, i) => - compose( - i ? withRoot(s, i) : Mx(), - Ax((i, u) => { - const _ = { ...u, ...s() }, - w = o.prototype?.mapStateToProps || ((s) => ({ state: s })); - return w(i, _); - }), - withSystem(s) - )(o), - handleProps = (s, o, i, u) => { - for (const _ in o) { - const w = o[_]; - 'function' == typeof w && w(i[_], u[_], s()); - } - }, - withMappedContainer = (s, o, i) => (o, u) => { - const { fn: _ } = s(), - w = i(o, 'root'); - class WithMappedContainer extends Pe.Component { - constructor(o, i) { - (super(o, i), handleProps(s, u, o, {})); - } - UNSAFE_componentWillReceiveProps(o) { - handleProps(s, u, o, this.props); - } - render() { - const s = Yt()(this.props, u ? Object.keys(u) : []); - return Pe.createElement(w, s); - } - } - return ( - (WithMappedContainer.displayName = `WithMappedContainer(${_.getDisplayName(w)})`), - WithMappedContainer - ); - }, - render = (s, o, i, u) => (_) => { - const w = i(s, o, u)('App', 'root'), - { createRoot: x } = WS; - x(_).render(Pe.createElement(w, null)); - }, - getComponent = - (s, o, i) => - (u, _, w = {}) => { - if ('string' != typeof u) - throw new TypeError('Need a string, to fetch a component. Was given a ' + typeof u); - const x = i(u); - return x - ? _ - ? 'root' === _ - ? withConnect(s, x, o()) - : withConnect(s, x) - : x - : (w.failSilently || s().log.warn('Could not find component:', u), null); - }, - getDisplayName = (s) => s.displayName || s.name || 'Component', - view = ({ getComponents: s, getStore: o, getSystem: i }) => { - const u = ((s) => jt(s, (...s) => JSON.stringify(s)))(getComponent(i, o, s)), - _ = ((s) => utils_memoizeN(s, (...s) => s))(withMappedContainer(i, 0, u)); - return { - rootInjects: { - getComponent: u, - makeMappedContainer: _, - render: render(i, o, getComponent, s) - }, - fn: { getDisplayName } - }; - }, - view_legacy = ({ React: s, getSystem: o, getStore: i, getComponents: u }) => { - const _ = {}, - w = parseInt(s?.version, 10); - return ( - w >= 16 && - w < 18 && - (_.render = ((s, o, i, u) => (_) => { - const w = i(s, o, u)('App', 'root'); - WS.render(Pe.createElement(w, null), _); - })(o, i, getComponent, u)), - { rootInjects: _ } - ); - }; - function downloadUrlPlugin(s) { - let { fn: o } = s; - const i = { - download: - (s) => - ({ errActions: i, specSelectors: u, specActions: _, getConfigs: w }) => { - let { fetch: x } = o; - const C = w(); - function next(o) { - if (o instanceof Error || o.status >= 400) - return ( - _.updateLoadingStatus('failed'), - i.newThrownErr( - Object.assign(new Error((o.message || o.statusText) + ' ' + s), { - source: 'fetch' - }) - ), - void ( - !o.status && - o instanceof Error && - (function checkPossibleFailReasons() { - try { - let o; - if ( - ('URL' in at - ? (o = new URL(s)) - : ((o = document.createElement('a')), (o.href = s)), - 'https:' !== o.protocol && 'https:' === at.location.protocol) - ) { - const s = Object.assign( - new Error( - `Possible mixed-content issue? The page was loaded over https:// but a ${o.protocol}// URL was specified. Check that you are not attempting to load mixed content.` - ), - { source: 'fetch' } - ); - return void i.newThrownErr(s); - } - if (o.origin !== at.location.origin) { - const s = Object.assign( - new Error( - `Possible cross-origin (CORS) issue? The URL origin (${o.origin}) does not match the page (${at.location.origin}). Check the server returns the correct 'Access-Control-Allow-*' headers.` - ), - { source: 'fetch' } - ); - i.newThrownErr(s); - } - } catch (s) { - return; - } - })() - ) - ); - (_.updateLoadingStatus('success'), - _.updateSpec(o.text), - u.url() !== s && _.updateUrl(s)); - } - ((s = s || u.url()), - _.updateLoadingStatus('loading'), - i.clear({ source: 'fetch' }), - x({ - url: s, - loadSpec: !0, - requestInterceptor: C.requestInterceptor || ((s) => s), - responseInterceptor: C.responseInterceptor || ((s) => s), - credentials: 'same-origin', - headers: { Accept: 'application/json,*/*' } - }).then(next, next)); - }, - updateLoadingStatus: (s) => { - let o = [null, 'loading', 'failed', 'success', 'failedConfig']; - return ( - -1 === o.indexOf(s) && - console.error(`Error: ${s} is not one of ${JSON.stringify(o)}`), - { type: 'spec_update_loading_status', payload: s } - ); - } - }; - let u = { - loadingStatus: Ut( - (s) => s || (0, qe.Map)(), - (s) => s.get('loadingStatus') || null - ) - }; - return { - statePlugins: { - spec: { - actions: i, - reducers: { - spec_update_loading_status: (s, o) => - 'string' == typeof o.payload ? s.set('loadingStatus', o.payload) : s - }, - selectors: u - } - } - }; - } - function arrayLikeToArray_arrayLikeToArray(s, o) { - (null == o || o > s.length) && (o = s.length); - for (var i = 0, u = Array(o); i < o; i++) u[i] = s[i]; - return u; - } - function toConsumableArray_toConsumableArray(s) { - return ( - (function arrayWithoutHoles_arrayWithoutHoles(s) { - if (Array.isArray(s)) return arrayLikeToArray_arrayLikeToArray(s); - })(s) || - (function iterableToArray_iterableToArray(s) { - if ( - ('undefined' != typeof Symbol && null != s[Symbol.iterator]) || - null != s['@@iterator'] - ) - return Array.from(s); - })(s) || - (function unsupportedIterableToArray_unsupportedIterableToArray(s, o) { - if (s) { - if ('string' == typeof s) return arrayLikeToArray_arrayLikeToArray(s, o); - var i = {}.toString.call(s).slice(8, -1); - return ( - 'Object' === i && s.constructor && (i = s.constructor.name), - 'Map' === i || 'Set' === i - ? Array.from(s) - : 'Arguments' === i || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i) - ? arrayLikeToArray_arrayLikeToArray(s, o) - : void 0 - ); - } - })(s) || - (function nonIterableSpread_nonIterableSpread() { - throw new TypeError( - 'Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.' - ); - })() - ); - } - function typeof_typeof(s) { - return ( - (typeof_typeof = - 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator - ? function (s) { - return typeof s; - } - : function (s) { - return s && - 'function' == typeof Symbol && - s.constructor === Symbol && - s !== Symbol.prototype - ? 'symbol' - : typeof s; - }), - typeof_typeof(s) - ); - } - function toPropertyKey(s) { - var o = (function toPrimitive(s, o) { - if ('object' != typeof_typeof(s) || !s) return s; - var i = s[Symbol.toPrimitive]; - if (void 0 !== i) { - var u = i.call(s, o || 'default'); - if ('object' != typeof_typeof(u)) return u; - throw new TypeError('@@toPrimitive must return a primitive value.'); - } - return ('string' === o ? String : Number)(s); - })(s, 'string'); - return 'symbol' == typeof_typeof(o) ? o : o + ''; - } - function defineProperty_defineProperty(s, o, i) { - return ( - (o = toPropertyKey(o)) in s - ? Object.defineProperty(s, o, { - value: i, - enumerable: !0, - configurable: !0, - writable: !0 - }) - : (s[o] = i), - s - ); - } - function extends_extends() { - return ( - (extends_extends = Object.assign - ? Object.assign.bind() - : function (s) { - for (var o = 1; o < arguments.length; o++) { - var i = arguments[o]; - for (var u in i) ({}).hasOwnProperty.call(i, u) && (s[u] = i[u]); - } - return s; - }), - extends_extends.apply(null, arguments) - ); - } - function create_element_ownKeys(s, o) { - var i = Object.keys(s); - if (Object.getOwnPropertySymbols) { - var u = Object.getOwnPropertySymbols(s); - (o && - (u = u.filter(function (o) { - return Object.getOwnPropertyDescriptor(s, o).enumerable; - })), - i.push.apply(i, u)); - } - return i; - } - function _objectSpread(s) { - for (var o = 1; o < arguments.length; o++) { - var i = null != arguments[o] ? arguments[o] : {}; - o % 2 - ? create_element_ownKeys(Object(i), !0).forEach(function (o) { - defineProperty_defineProperty(s, o, i[o]); - }) - : Object.getOwnPropertyDescriptors - ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(i)) - : create_element_ownKeys(Object(i)).forEach(function (o) { - Object.defineProperty(s, o, Object.getOwnPropertyDescriptor(i, o)); - }); - } - return s; - } - var Tx = {}; - function createStyleObject(s) { - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, - i = arguments.length > 2 ? arguments[2] : void 0; - return (function getClassNameCombinations(s) { - if (0 === s.length || 1 === s.length) return s; - var o = s.join('.'); - return ( - Tx[o] || - (Tx[o] = (function powerSetPermutations(s) { - var o = s.length; - return 0 === o || 1 === o - ? s - : 2 === o - ? [ - s[0], - s[1], - ''.concat(s[0], '.').concat(s[1]), - ''.concat(s[1], '.').concat(s[0]) - ] - : 3 === o - ? [ - s[0], - s[1], - s[2], - ''.concat(s[0], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[0]), - ''.concat(s[1], '.').concat(s[2]), - ''.concat(s[2], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[1], '.').concat(s[2]), - ''.concat(s[0], '.').concat(s[2], '.').concat(s[1]), - ''.concat(s[1], '.').concat(s[0], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[2], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[0], '.').concat(s[1]), - ''.concat(s[2], '.').concat(s[1], '.').concat(s[0]) - ] - : o >= 4 - ? [ - s[0], - s[1], - s[2], - s[3], - ''.concat(s[0], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[2]), - ''.concat(s[0], '.').concat(s[3]), - ''.concat(s[1], '.').concat(s[0]), - ''.concat(s[1], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[3]), - ''.concat(s[2], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[1]), - ''.concat(s[2], '.').concat(s[3]), - ''.concat(s[3], '.').concat(s[0]), - ''.concat(s[3], '.').concat(s[1]), - ''.concat(s[3], '.').concat(s[2]), - ''.concat(s[0], '.').concat(s[1], '.').concat(s[2]), - ''.concat(s[0], '.').concat(s[1], '.').concat(s[3]), - ''.concat(s[0], '.').concat(s[2], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[2], '.').concat(s[3]), - ''.concat(s[0], '.').concat(s[3], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[3], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[0], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[0], '.').concat(s[3]), - ''.concat(s[1], '.').concat(s[2], '.').concat(s[0]), - ''.concat(s[1], '.').concat(s[2], '.').concat(s[3]), - ''.concat(s[1], '.').concat(s[3], '.').concat(s[0]), - ''.concat(s[1], '.').concat(s[3], '.').concat(s[2]), - ''.concat(s[2], '.').concat(s[0], '.').concat(s[1]), - ''.concat(s[2], '.').concat(s[0], '.').concat(s[3]), - ''.concat(s[2], '.').concat(s[1], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[1], '.').concat(s[3]), - ''.concat(s[2], '.').concat(s[3], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[3], '.').concat(s[1]), - ''.concat(s[3], '.').concat(s[0], '.').concat(s[1]), - ''.concat(s[3], '.').concat(s[0], '.').concat(s[2]), - ''.concat(s[3], '.').concat(s[1], '.').concat(s[0]), - ''.concat(s[3], '.').concat(s[1], '.').concat(s[2]), - ''.concat(s[3], '.').concat(s[2], '.').concat(s[0]), - ''.concat(s[3], '.').concat(s[2], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[1], '.').concat(s[2], '.').concat(s[3]), - ''.concat(s[0], '.').concat(s[1], '.').concat(s[3], '.').concat(s[2]), - ''.concat(s[0], '.').concat(s[2], '.').concat(s[1], '.').concat(s[3]), - ''.concat(s[0], '.').concat(s[2], '.').concat(s[3], '.').concat(s[1]), - ''.concat(s[0], '.').concat(s[3], '.').concat(s[1], '.').concat(s[2]), - ''.concat(s[0], '.').concat(s[3], '.').concat(s[2], '.').concat(s[1]), - ''.concat(s[1], '.').concat(s[0], '.').concat(s[2], '.').concat(s[3]), - ''.concat(s[1], '.').concat(s[0], '.').concat(s[3], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[2], '.').concat(s[0], '.').concat(s[3]), - ''.concat(s[1], '.').concat(s[2], '.').concat(s[3], '.').concat(s[0]), - ''.concat(s[1], '.').concat(s[3], '.').concat(s[0], '.').concat(s[2]), - ''.concat(s[1], '.').concat(s[3], '.').concat(s[2], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[0], '.').concat(s[1], '.').concat(s[3]), - ''.concat(s[2], '.').concat(s[0], '.').concat(s[3], '.').concat(s[1]), - ''.concat(s[2], '.').concat(s[1], '.').concat(s[0], '.').concat(s[3]), - ''.concat(s[2], '.').concat(s[1], '.').concat(s[3], '.').concat(s[0]), - ''.concat(s[2], '.').concat(s[3], '.').concat(s[0], '.').concat(s[1]), - ''.concat(s[2], '.').concat(s[3], '.').concat(s[1], '.').concat(s[0]), - ''.concat(s[3], '.').concat(s[0], '.').concat(s[1], '.').concat(s[2]), - ''.concat(s[3], '.').concat(s[0], '.').concat(s[2], '.').concat(s[1]), - ''.concat(s[3], '.').concat(s[1], '.').concat(s[0], '.').concat(s[2]), - ''.concat(s[3], '.').concat(s[1], '.').concat(s[2], '.').concat(s[0]), - ''.concat(s[3], '.').concat(s[2], '.').concat(s[0], '.').concat(s[1]), - ''.concat(s[3], '.').concat(s[2], '.').concat(s[1], '.').concat(s[0]) - ] - : void 0; - })(s)), - Tx[o] - ); - })( - s.filter(function (s) { - return 'token' !== s; - }) - ).reduce(function (s, o) { - return _objectSpread(_objectSpread({}, s), i[o]); - }, o); - } - function createClassNameString(s) { - return s.join(' '); - } - function createElement(s) { - var o = s.node, - i = s.stylesheet, - u = s.style, - _ = void 0 === u ? {} : u, - w = s.useInlineStyles, - x = s.key, - C = o.properties, - j = o.type, - L = o.tagName, - B = o.value; - if ('text' === j) return B; - if (L) { - var $, - V = (function createChildren(s, o) { - var i = 0; - return function (u) { - return ( - (i += 1), - u.map(function (u, _) { - return createElement({ - node: u, - stylesheet: s, - useInlineStyles: o, - key: 'code-segment-'.concat(i, '-').concat(_) - }); - }) - ); - }; - })(i, w); - if (w) { - var U = Object.keys(i).reduce(function (s, o) { - return ( - o.split('.').forEach(function (o) { - s.includes(o) || s.push(o); - }), - s - ); - }, []), - z = C.className && C.className.includes('token') ? ['token'] : [], - Y = - C.className && - z.concat( - C.className.filter(function (s) { - return !U.includes(s); - }) - ); - $ = _objectSpread( - _objectSpread({}, C), - {}, - { - className: createClassNameString(Y) || void 0, - style: createStyleObject(C.className, Object.assign({}, C.style, _), i) - } - ); - } else - $ = _objectSpread( - _objectSpread({}, C), - {}, - { className: createClassNameString(C.className) } - ); - var Z = V(o.children); - return Pe.createElement(L, extends_extends({ key: x }, $), Z); - } - } - var Nx = [ - 'language', - 'children', - 'style', - 'customStyle', - 'codeTagProps', - 'useInlineStyles', - 'showLineNumbers', - 'showInlineLineNumbers', - 'startingLineNumber', - 'lineNumberContainerStyle', - 'lineNumberStyle', - 'wrapLines', - 'wrapLongLines', - 'lineProps', - 'renderer', - 'PreTag', - 'CodeTag', - 'code', - 'astGenerator' - ]; - function highlight_ownKeys(s, o) { - var i = Object.keys(s); - if (Object.getOwnPropertySymbols) { - var u = Object.getOwnPropertySymbols(s); - (o && - (u = u.filter(function (o) { - return Object.getOwnPropertyDescriptor(s, o).enumerable; - })), - i.push.apply(i, u)); - } - return i; - } - function highlight_objectSpread(s) { - for (var o = 1; o < arguments.length; o++) { - var i = null != arguments[o] ? arguments[o] : {}; - o % 2 - ? highlight_ownKeys(Object(i), !0).forEach(function (o) { - defineProperty_defineProperty(s, o, i[o]); - }) - : Object.getOwnPropertyDescriptors - ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(i)) - : highlight_ownKeys(Object(i)).forEach(function (o) { - Object.defineProperty(s, o, Object.getOwnPropertyDescriptor(i, o)); - }); - } - return s; - } - var Rx = /\n/g; - function AllLineNumbers(s) { - var o = s.codeString, - i = s.codeStyle, - u = s.containerStyle, - _ = void 0 === u ? { float: 'left', paddingRight: '10px' } : u, - w = s.numberStyle, - x = void 0 === w ? {} : w, - C = s.startingLineNumber; - return Pe.createElement( - 'code', - { style: Object.assign({}, i, _) }, - (function getAllLineNumbers(s) { - var o = s.lines, - i = s.startingLineNumber, - u = s.style; - return o.map(function (s, o) { - var _ = o + i; - return Pe.createElement( - 'span', - { - key: 'line-'.concat(o), - className: 'react-syntax-highlighter-line-number', - style: 'function' == typeof u ? u(_) : u - }, - ''.concat(_, '\n') - ); - }); - })({ lines: o.replace(/\n$/, '').split('\n'), style: x, startingLineNumber: C }) - ); - } - function getInlineLineNumber(s, o) { - return { - type: 'element', - tagName: 'span', - properties: { - key: 'line-number--'.concat(s), - className: ['comment', 'linenumber', 'react-syntax-highlighter-line-number'], - style: o - }, - children: [{ type: 'text', value: s }] - }; - } - function assembleLineNumberStyles(s, o, i) { - var u, - _ = { - display: 'inline-block', - minWidth: ((u = i), ''.concat(u.toString().length, '.25em')), - paddingRight: '1em', - textAlign: 'right', - userSelect: 'none' - }, - w = 'function' == typeof s ? s(o) : s; - return highlight_objectSpread(highlight_objectSpread({}, _), w); - } - function createLineElement(s) { - var o = s.children, - i = s.lineNumber, - u = s.lineNumberStyle, - _ = s.largestLineNumber, - w = s.showInlineLineNumbers, - x = s.lineProps, - C = void 0 === x ? {} : x, - j = s.className, - L = void 0 === j ? [] : j, - B = s.showLineNumbers, - $ = s.wrapLongLines, - V = s.wrapLines, - U = - void 0 !== V && V - ? highlight_objectSpread({}, 'function' == typeof C ? C(i) : C) - : {}; - if ( - ((U.className = U.className - ? [].concat( - toConsumableArray_toConsumableArray(U.className.trim().split(/\s+/)), - toConsumableArray_toConsumableArray(L) - ) - : L), - i && w) - ) { - var z = assembleLineNumberStyles(u, i, _); - o.unshift(getInlineLineNumber(i, z)); - } - return ( - $ & B && (U.style = highlight_objectSpread({ display: 'flex' }, U.style)), - { type: 'element', tagName: 'span', properties: U, children: o } - ); - } - function flattenCodeTree(s) { - for ( - var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], - i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : [], - u = 0; - u < s.length; - u++ - ) { - var _ = s[u]; - if ('text' === _.type) - i.push( - createLineElement({ - children: [_], - className: toConsumableArray_toConsumableArray(new Set(o)) - }) - ); - else if (_.children) { - var w = o.concat(_.properties.className); - flattenCodeTree(_.children, w).forEach(function (s) { - return i.push(s); - }); - } - } - return i; - } - function processLines(s, o, i, u, _, w, x, C, j) { - var L, - B = flattenCodeTree(s.value), - $ = [], - V = -1, - U = 0; - function createLine(s, w) { - var L = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : []; - return o || L.length > 0 - ? (function createWrappedLine(s, w) { - return createLineElement({ - children: s, - lineNumber: w, - lineNumberStyle: C, - largestLineNumber: x, - showInlineLineNumbers: _, - lineProps: i, - className: arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : [], - showLineNumbers: u, - wrapLongLines: j, - wrapLines: o - }); - })(s, w, L) - : (function createUnwrappedLine(s, o) { - if (u && o && _) { - var i = assembleLineNumberStyles(C, o, x); - s.unshift(getInlineLineNumber(o, i)); - } - return s; - })(s, w); - } - for ( - var z = function _loop() { - var s = B[U], - o = s.children[0].value, - i = (function getNewLines(s) { - return s.match(Rx); - })(o); - if (i) { - var _ = o.split('\n'); - (_.forEach(function (o, i) { - var x = u && $.length + w, - C = { type: 'text', value: ''.concat(o, '\n') }; - if (0 === i) { - var j = createLine( - B.slice(V + 1, U).concat( - createLineElement({ children: [C], className: s.properties.className }) - ), - x - ); - $.push(j); - } else if (i === _.length - 1) { - var L = B[U + 1] && B[U + 1].children && B[U + 1].children[0], - z = { type: 'text', value: ''.concat(o) }; - if (L) { - var Y = createLineElement({ - children: [z], - className: s.properties.className - }); - B.splice(U + 1, 0, Y); - } else { - var Z = createLine([z], x, s.properties.className); - $.push(Z); - } - } else { - var ee = createLine([C], x, s.properties.className); - $.push(ee); - } - }), - (V = U)); - } - U++; - }; - U < B.length; - ) - z(); - if (V !== B.length - 1) { - var Y = B.slice(V + 1, B.length); - if (Y && Y.length) { - var Z = createLine(Y, u && $.length + w); - $.push(Z); - } - } - return o ? $ : (L = []).concat.apply(L, $); - } - function defaultRenderer(s) { - var o = s.rows, - i = s.stylesheet, - u = s.useInlineStyles; - return o.map(function (s, o) { - return createElement({ - node: s, - stylesheet: i, - useInlineStyles: u, - key: 'code-segement'.concat(o) - }); - }); - } - function isHighlightJs(s) { - return s && void 0 !== s.highlightAuto; - } - var Dx = __webpack_require__(43768), - Lx = (function highlight(s, o) { - return function SyntaxHighlighter(i) { - var u = i.language, - _ = i.children, - w = i.style, - x = void 0 === w ? o : w, - C = i.customStyle, - j = void 0 === C ? {} : C, - L = i.codeTagProps, - B = - void 0 === L - ? { - className: u ? 'language-'.concat(u) : void 0, - style: highlight_objectSpread( - highlight_objectSpread({}, x['code[class*="language-"]']), - x['code[class*="language-'.concat(u, '"]')] - ) - } - : L, - $ = i.useInlineStyles, - V = void 0 === $ || $, - U = i.showLineNumbers, - z = void 0 !== U && U, - Y = i.showInlineLineNumbers, - Z = void 0 === Y || Y, - ee = i.startingLineNumber, - ie = void 0 === ee ? 1 : ee, - ae = i.lineNumberContainerStyle, - le = i.lineNumberStyle, - ce = void 0 === le ? {} : le, - pe = i.wrapLines, - de = i.wrapLongLines, - fe = void 0 !== de && de, - ye = i.lineProps, - be = void 0 === ye ? {} : ye, - _e = i.renderer, - we = i.PreTag, - Se = void 0 === we ? 'pre' : we, - xe = i.CodeTag, - Te = void 0 === xe ? 'code' : xe, - Re = i.code, - qe = void 0 === Re ? (Array.isArray(_) ? _[0] : _) || '' : Re, - $e = i.astGenerator, - ze = (function _objectWithoutProperties(s, o) { - if (null == s) return {}; - var i, - u, - _ = (function _objectWithoutPropertiesLoose(s, o) { - if (null == s) return {}; - var i = {}; - for (var u in s) - if ({}.hasOwnProperty.call(s, u)) { - if (o.includes(u)) continue; - i[u] = s[u]; - } - return i; - })(s, o); - if (Object.getOwnPropertySymbols) { - var w = Object.getOwnPropertySymbols(s); - for (u = 0; u < w.length; u++) - ((i = w[u]), - o.includes(i) || ({}.propertyIsEnumerable.call(s, i) && (_[i] = s[i]))); - } - return _; - })(i, Nx); - $e = $e || s; - var We = z - ? Pe.createElement(AllLineNumbers, { - containerStyle: ae, - codeStyle: B.style || {}, - numberStyle: ce, - startingLineNumber: ie, - codeString: qe - }) - : null, - He = x.hljs || x['pre[class*="language-"]'] || { backgroundColor: '#fff' }, - Ye = isHighlightJs($e) ? 'hljs' : 'prismjs', - Xe = V - ? Object.assign({}, ze, { style: Object.assign({}, He, j) }) - : Object.assign({}, ze, { - className: ze.className ? ''.concat(Ye, ' ').concat(ze.className) : Ye, - style: Object.assign({}, j) - }); - if ( - ((B.style = highlight_objectSpread( - fe ? { whiteSpace: 'pre-wrap' } : { whiteSpace: 'pre' }, - B.style - )), - !$e) - ) - return Pe.createElement(Se, Xe, We, Pe.createElement(Te, B, qe)); - (((void 0 === pe && _e) || fe) && (pe = !0), (_e = _e || defaultRenderer)); - var Qe = [{ type: 'text', value: qe }], - et = (function getCodeTree(s) { - var o = s.astGenerator, - i = s.language, - u = s.code, - _ = s.defaultCodeValue; - if (isHighlightJs(o)) { - var w = (function (s, o) { - return -1 !== s.listLanguages().indexOf(o); - })(o, i); - return 'text' === i - ? { value: _, language: 'text' } - : w - ? o.highlight(i, u) - : o.highlightAuto(u); - } - try { - return i && 'text' !== i ? { value: o.highlight(u, i) } : { value: _ }; - } catch (s) { - return { value: _ }; - } - })({ astGenerator: $e, language: u, code: qe, defaultCodeValue: Qe }); - null === et.language && (et.value = Qe); - var tt = et.value.length; - 1 === tt && - 'text' === et.value[0].type && - (tt = et.value[0].value.split('\n').length); - var rt = processLines(et, pe, be, z, Z, ie, tt + ie, ce, fe); - return Pe.createElement( - Se, - Xe, - Pe.createElement( - Te, - B, - !Z && We, - _e({ rows: rt, stylesheet: x, useInlineStyles: V }) - ) - ); - }; - })(Dx, {}); - Lx.registerLanguage = Dx.registerLanguage; - const Bx = Lx; - var Fx = __webpack_require__(95089); - const qx = __webpack_require__.n(Fx)(); - var $x = __webpack_require__(65772); - const Vx = __webpack_require__.n($x)(); - var Ux = __webpack_require__(17285); - const zx = __webpack_require__.n(Ux)(); - var Wx = __webpack_require__(35344); - const Kx = __webpack_require__.n(Wx)(); - var Hx = __webpack_require__(17533); - const Jx = __webpack_require__.n(Hx)(); - var Gx = __webpack_require__(73402); - const Yx = __webpack_require__.n(Gx)(); - var Xx = __webpack_require__(26571); - const Zx = __webpack_require__.n(Xx)(), - after_load = () => { - (Bx.registerLanguage('json', Vx), - Bx.registerLanguage('js', qx), - Bx.registerLanguage('xml', zx), - Bx.registerLanguage('yaml', Jx), - Bx.registerLanguage('http', Yx), - Bx.registerLanguage('bash', Kx), - Bx.registerLanguage('powershell', Zx), - Bx.registerLanguage('javascript', qx)); - }, - Qx = { - hljs: { - display: 'block', - overflowX: 'auto', - padding: '0.5em', - background: '#333', - color: 'white' - }, - 'hljs-name': { fontWeight: 'bold' }, - 'hljs-strong': { fontWeight: 'bold' }, - 'hljs-code': { fontStyle: 'italic', color: '#888' }, - 'hljs-emphasis': { fontStyle: 'italic' }, - 'hljs-tag': { color: '#62c8f3' }, - 'hljs-variable': { color: '#ade5fc' }, - 'hljs-template-variable': { color: '#ade5fc' }, - 'hljs-selector-id': { color: '#ade5fc' }, - 'hljs-selector-class': { color: '#ade5fc' }, - 'hljs-string': { color: '#a2fca2' }, - 'hljs-bullet': { color: '#d36363' }, - 'hljs-type': { color: '#ffa' }, - 'hljs-title': { color: '#ffa' }, - 'hljs-section': { color: '#ffa' }, - 'hljs-attribute': { color: '#ffa' }, - 'hljs-quote': { color: '#ffa' }, - 'hljs-built_in': { color: '#ffa' }, - 'hljs-builtin-name': { color: '#ffa' }, - 'hljs-number': { color: '#d36363' }, - 'hljs-symbol': { color: '#d36363' }, - 'hljs-keyword': { color: '#fcc28c' }, - 'hljs-selector-tag': { color: '#fcc28c' }, - 'hljs-literal': { color: '#fcc28c' }, - 'hljs-comment': { color: '#888' }, - 'hljs-deletion': { color: '#333', backgroundColor: '#fc9b9b' }, - 'hljs-regexp': { color: '#c6b4f0' }, - 'hljs-link': { color: '#c6b4f0' }, - 'hljs-meta': { color: '#fc9b9b' }, - 'hljs-addition': { backgroundColor: '#a2fca2', color: '#333' } - }, - tk = { - agate: Qx, - arta: { - hljs: { - display: 'block', - overflowX: 'auto', - padding: '0.5em', - background: '#222', - color: '#aaa' - }, - 'hljs-subst': { color: '#aaa' }, - 'hljs-section': { color: '#fff', fontWeight: 'bold' }, - 'hljs-comment': { color: '#444' }, - 'hljs-quote': { color: '#444' }, - 'hljs-meta': { color: '#444' }, - 'hljs-string': { color: '#ffcc33' }, - 'hljs-symbol': { color: '#ffcc33' }, - 'hljs-bullet': { color: '#ffcc33' }, - 'hljs-regexp': { color: '#ffcc33' }, - 'hljs-number': { color: '#00cc66' }, - 'hljs-addition': { color: '#00cc66' }, - 'hljs-built_in': { color: '#32aaee' }, - 'hljs-builtin-name': { color: '#32aaee' }, - 'hljs-literal': { color: '#32aaee' }, - 'hljs-type': { color: '#32aaee' }, - 'hljs-template-variable': { color: '#32aaee' }, - 'hljs-attribute': { color: '#32aaee' }, - 'hljs-link': { color: '#32aaee' }, - 'hljs-keyword': { color: '#6644aa' }, - 'hljs-selector-tag': { color: '#6644aa' }, - 'hljs-name': { color: '#6644aa' }, - 'hljs-selector-id': { color: '#6644aa' }, - 'hljs-selector-class': { color: '#6644aa' }, - 'hljs-title': { color: '#bb1166' }, - 'hljs-variable': { color: '#bb1166' }, - 'hljs-deletion': { color: '#bb1166' }, - 'hljs-template-tag': { color: '#bb1166' }, - 'hljs-doctag': { fontWeight: 'bold' }, - 'hljs-strong': { fontWeight: 'bold' }, - 'hljs-emphasis': { fontStyle: 'italic' } - }, - monokai: { - hljs: { - display: 'block', - overflowX: 'auto', - padding: '0.5em', - background: '#272822', - color: '#ddd' - }, - 'hljs-tag': { color: '#f92672' }, - 'hljs-keyword': { color: '#f92672', fontWeight: 'bold' }, - 'hljs-selector-tag': { color: '#f92672', fontWeight: 'bold' }, - 'hljs-literal': { color: '#f92672', fontWeight: 'bold' }, - 'hljs-strong': { color: '#f92672' }, - 'hljs-name': { color: '#f92672' }, - 'hljs-code': { color: '#66d9ef' }, - 'hljs-class .hljs-title': { color: 'white' }, - 'hljs-attribute': { color: '#bf79db' }, - 'hljs-symbol': { color: '#bf79db' }, - 'hljs-regexp': { color: '#bf79db' }, - 'hljs-link': { color: '#bf79db' }, - 'hljs-string': { color: '#a6e22e' }, - 'hljs-bullet': { color: '#a6e22e' }, - 'hljs-subst': { color: '#a6e22e' }, - 'hljs-title': { color: '#a6e22e', fontWeight: 'bold' }, - 'hljs-section': { color: '#a6e22e', fontWeight: 'bold' }, - 'hljs-emphasis': { color: '#a6e22e' }, - 'hljs-type': { color: '#a6e22e', fontWeight: 'bold' }, - 'hljs-built_in': { color: '#a6e22e' }, - 'hljs-builtin-name': { color: '#a6e22e' }, - 'hljs-selector-attr': { color: '#a6e22e' }, - 'hljs-selector-pseudo': { color: '#a6e22e' }, - 'hljs-addition': { color: '#a6e22e' }, - 'hljs-variable': { color: '#a6e22e' }, - 'hljs-template-tag': { color: '#a6e22e' }, - 'hljs-template-variable': { color: '#a6e22e' }, - 'hljs-comment': { color: '#75715e' }, - 'hljs-quote': { color: '#75715e' }, - 'hljs-deletion': { color: '#75715e' }, - 'hljs-meta': { color: '#75715e' }, - 'hljs-doctag': { fontWeight: 'bold' }, - 'hljs-selector-id': { fontWeight: 'bold' } - }, - nord: { - hljs: { - display: 'block', - overflowX: 'auto', - padding: '0.5em', - background: '#2E3440', - color: '#D8DEE9' - }, - 'hljs-subst': { color: '#D8DEE9' }, - 'hljs-selector-tag': { color: '#81A1C1' }, - 'hljs-selector-id': { color: '#8FBCBB', fontWeight: 'bold' }, - 'hljs-selector-class': { color: '#8FBCBB' }, - 'hljs-selector-attr': { color: '#8FBCBB' }, - 'hljs-selector-pseudo': { color: '#88C0D0' }, - 'hljs-addition': { backgroundColor: 'rgba(163, 190, 140, 0.5)' }, - 'hljs-deletion': { backgroundColor: 'rgba(191, 97, 106, 0.5)' }, - 'hljs-built_in': { color: '#8FBCBB' }, - 'hljs-type': { color: '#8FBCBB' }, - 'hljs-class': { color: '#8FBCBB' }, - 'hljs-function': { color: '#88C0D0' }, - 'hljs-function > .hljs-title': { color: '#88C0D0' }, - 'hljs-keyword': { color: '#81A1C1' }, - 'hljs-literal': { color: '#81A1C1' }, - 'hljs-symbol': { color: '#81A1C1' }, - 'hljs-number': { color: '#B48EAD' }, - 'hljs-regexp': { color: '#EBCB8B' }, - 'hljs-string': { color: '#A3BE8C' }, - 'hljs-title': { color: '#8FBCBB' }, - 'hljs-params': { color: '#D8DEE9' }, - 'hljs-bullet': { color: '#81A1C1' }, - 'hljs-code': { color: '#8FBCBB' }, - 'hljs-emphasis': { fontStyle: 'italic' }, - 'hljs-formula': { color: '#8FBCBB' }, - 'hljs-strong': { fontWeight: 'bold' }, - 'hljs-link:hover': { textDecoration: 'underline' }, - 'hljs-quote': { color: '#4C566A' }, - 'hljs-comment': { color: '#4C566A' }, - 'hljs-doctag': { color: '#8FBCBB' }, - 'hljs-meta': { color: '#5E81AC' }, - 'hljs-meta-keyword': { color: '#5E81AC' }, - 'hljs-meta-string': { color: '#A3BE8C' }, - 'hljs-attr': { color: '#8FBCBB' }, - 'hljs-attribute': { color: '#D8DEE9' }, - 'hljs-builtin-name': { color: '#81A1C1' }, - 'hljs-name': { color: '#81A1C1' }, - 'hljs-section': { color: '#88C0D0' }, - 'hljs-tag': { color: '#81A1C1' }, - 'hljs-variable': { color: '#D8DEE9' }, - 'hljs-template-variable': { color: '#D8DEE9' }, - 'hljs-template-tag': { color: '#5E81AC' }, - 'abnf .hljs-attribute': { color: '#88C0D0' }, - 'abnf .hljs-symbol': { color: '#EBCB8B' }, - 'apache .hljs-attribute': { color: '#88C0D0' }, - 'apache .hljs-section': { color: '#81A1C1' }, - 'arduino .hljs-built_in': { color: '#88C0D0' }, - 'aspectj .hljs-meta': { color: '#D08770' }, - 'aspectj > .hljs-title': { color: '#88C0D0' }, - 'bnf .hljs-attribute': { color: '#8FBCBB' }, - 'clojure .hljs-name': { color: '#88C0D0' }, - 'clojure .hljs-symbol': { color: '#EBCB8B' }, - 'coq .hljs-built_in': { color: '#88C0D0' }, - 'cpp .hljs-meta-string': { color: '#8FBCBB' }, - 'css .hljs-built_in': { color: '#88C0D0' }, - 'css .hljs-keyword': { color: '#D08770' }, - 'diff .hljs-meta': { color: '#8FBCBB' }, - 'ebnf .hljs-attribute': { color: '#8FBCBB' }, - 'glsl .hljs-built_in': { color: '#88C0D0' }, - 'groovy .hljs-meta:not(:first-child)': { color: '#D08770' }, - 'haxe .hljs-meta': { color: '#D08770' }, - 'java .hljs-meta': { color: '#D08770' }, - 'ldif .hljs-attribute': { color: '#8FBCBB' }, - 'lisp .hljs-name': { color: '#88C0D0' }, - 'lua .hljs-built_in': { color: '#88C0D0' }, - 'moonscript .hljs-built_in': { color: '#88C0D0' }, - 'nginx .hljs-attribute': { color: '#88C0D0' }, - 'nginx .hljs-section': { color: '#5E81AC' }, - 'pf .hljs-built_in': { color: '#88C0D0' }, - 'processing .hljs-built_in': { color: '#88C0D0' }, - 'scss .hljs-keyword': { color: '#81A1C1' }, - 'stylus .hljs-keyword': { color: '#81A1C1' }, - 'swift .hljs-meta': { color: '#D08770' }, - 'vim .hljs-built_in': { color: '#88C0D0', fontStyle: 'italic' }, - 'yaml .hljs-meta': { color: '#D08770' } - }, - obsidian: { - hljs: { - display: 'block', - overflowX: 'auto', - padding: '0.5em', - background: '#282b2e', - color: '#e0e2e4' - }, - 'hljs-keyword': { color: '#93c763', fontWeight: 'bold' }, - 'hljs-selector-tag': { color: '#93c763', fontWeight: 'bold' }, - 'hljs-literal': { color: '#93c763', fontWeight: 'bold' }, - 'hljs-selector-id': { color: '#93c763' }, - 'hljs-number': { color: '#ffcd22' }, - 'hljs-attribute': { color: '#668bb0' }, - 'hljs-code': { color: 'white' }, - 'hljs-class .hljs-title': { color: 'white' }, - 'hljs-section': { color: 'white', fontWeight: 'bold' }, - 'hljs-regexp': { color: '#d39745' }, - 'hljs-link': { color: '#d39745' }, - 'hljs-meta': { color: '#557182' }, - 'hljs-tag': { color: '#8cbbad' }, - 'hljs-name': { color: '#8cbbad', fontWeight: 'bold' }, - 'hljs-bullet': { color: '#8cbbad' }, - 'hljs-subst': { color: '#8cbbad' }, - 'hljs-emphasis': { color: '#8cbbad' }, - 'hljs-type': { color: '#8cbbad', fontWeight: 'bold' }, - 'hljs-built_in': { color: '#8cbbad' }, - 'hljs-selector-attr': { color: '#8cbbad' }, - 'hljs-selector-pseudo': { color: '#8cbbad' }, - 'hljs-addition': { color: '#8cbbad' }, - 'hljs-variable': { color: '#8cbbad' }, - 'hljs-template-tag': { color: '#8cbbad' }, - 'hljs-template-variable': { color: '#8cbbad' }, - 'hljs-string': { color: '#ec7600' }, - 'hljs-symbol': { color: '#ec7600' }, - 'hljs-comment': { color: '#818e96' }, - 'hljs-quote': { color: '#818e96' }, - 'hljs-deletion': { color: '#818e96' }, - 'hljs-selector-class': { color: '#A082BD' }, - 'hljs-doctag': { fontWeight: 'bold' }, - 'hljs-title': { fontWeight: 'bold' }, - 'hljs-strong': { fontWeight: 'bold' } - }, - 'tomorrow-night': { - 'hljs-comment': { color: '#969896' }, - 'hljs-quote': { color: '#969896' }, - 'hljs-variable': { color: '#cc6666' }, - 'hljs-template-variable': { color: '#cc6666' }, - 'hljs-tag': { color: '#cc6666' }, - 'hljs-name': { color: '#cc6666' }, - 'hljs-selector-id': { color: '#cc6666' }, - 'hljs-selector-class': { color: '#cc6666' }, - 'hljs-regexp': { color: '#cc6666' }, - 'hljs-deletion': { color: '#cc6666' }, - 'hljs-number': { color: '#de935f' }, - 'hljs-built_in': { color: '#de935f' }, - 'hljs-builtin-name': { color: '#de935f' }, - 'hljs-literal': { color: '#de935f' }, - 'hljs-type': { color: '#de935f' }, - 'hljs-params': { color: '#de935f' }, - 'hljs-meta': { color: '#de935f' }, - 'hljs-link': { color: '#de935f' }, - 'hljs-attribute': { color: '#f0c674' }, - 'hljs-string': { color: '#b5bd68' }, - 'hljs-symbol': { color: '#b5bd68' }, - 'hljs-bullet': { color: '#b5bd68' }, - 'hljs-addition': { color: '#b5bd68' }, - 'hljs-title': { color: '#81a2be' }, - 'hljs-section': { color: '#81a2be' }, - 'hljs-keyword': { color: '#b294bb' }, - 'hljs-selector-tag': { color: '#b294bb' }, - hljs: { - display: 'block', - overflowX: 'auto', - background: '#1d1f21', - color: '#c5c8c6', - padding: '0.5em' - }, - 'hljs-emphasis': { fontStyle: 'italic' }, - 'hljs-strong': { fontWeight: 'bold' } - }, - idea: { - hljs: { - display: 'block', - overflowX: 'auto', - padding: '0.5em', - color: '#000', - background: '#fff' - }, - 'hljs-subst': { fontWeight: 'normal', color: '#000' }, - 'hljs-title': { fontWeight: 'normal', color: '#000' }, - 'hljs-comment': { color: '#808080', fontStyle: 'italic' }, - 'hljs-quote': { color: '#808080', fontStyle: 'italic' }, - 'hljs-meta': { color: '#808000' }, - 'hljs-tag': { background: '#efefef' }, - 'hljs-section': { fontWeight: 'bold', color: '#000080' }, - 'hljs-name': { fontWeight: 'bold', color: '#000080' }, - 'hljs-literal': { fontWeight: 'bold', color: '#000080' }, - 'hljs-keyword': { fontWeight: 'bold', color: '#000080' }, - 'hljs-selector-tag': { fontWeight: 'bold', color: '#000080' }, - 'hljs-type': { fontWeight: 'bold', color: '#000080' }, - 'hljs-selector-id': { fontWeight: 'bold', color: '#000080' }, - 'hljs-selector-class': { fontWeight: 'bold', color: '#000080' }, - 'hljs-attribute': { fontWeight: 'bold', color: '#0000ff' }, - 'hljs-number': { fontWeight: 'normal', color: '#0000ff' }, - 'hljs-regexp': { fontWeight: 'normal', color: '#0000ff' }, - 'hljs-link': { fontWeight: 'normal', color: '#0000ff' }, - 'hljs-string': { color: '#008000', fontWeight: 'bold' }, - 'hljs-symbol': { color: '#000', background: '#d0eded', fontStyle: 'italic' }, - 'hljs-bullet': { color: '#000', background: '#d0eded', fontStyle: 'italic' }, - 'hljs-formula': { color: '#000', background: '#d0eded', fontStyle: 'italic' }, - 'hljs-doctag': { textDecoration: 'underline' }, - 'hljs-variable': { color: '#660e7a' }, - 'hljs-template-variable': { color: '#660e7a' }, - 'hljs-addition': { background: '#baeeba' }, - 'hljs-deletion': { background: '#ffc8bd' }, - 'hljs-emphasis': { fontStyle: 'italic' }, - 'hljs-strong': { fontWeight: 'bold' } - } - }, - rk = Qx, - components_SyntaxHighlighter = ({ - language: s, - className: o = '', - getConfigs: i, - syntaxHighlighting: u = {}, - children: _ = '' - }) => { - const w = i().syntaxHighlight.theme, - { styles: x, defaultStyle: C } = u, - j = x?.[w] ?? C; - return Pe.createElement(Bx, { language: s, className: o, style: j }, _); - }; - var nk = __webpack_require__(5419), - sk = __webpack_require__.n(nk); - const components_HighlightCode = ({ - fileName: s = 'response.txt', - className: o, - downloadable: i, - getComponent: u, - canCopy: _, - language: w, - children: x - }) => { - const C = (0, Pe.useRef)(null), - j = u('SyntaxHighlighter', !0), - handlePreventYScrollingBeyondElement = (s) => { - const { target: o, deltaY: i } = s, - { scrollHeight: u, offsetHeight: _, scrollTop: w } = o; - u > _ && ((0 === w && i < 0) || (_ + w >= u && i > 0)) && s.preventDefault(); - }; - return ( - (0, Pe.useEffect)(() => { - const s = Array.from(C.current.childNodes).filter( - (s) => !!s.nodeType && s.classList.contains('microlight') - ); - return ( - s.forEach((s) => - s.addEventListener('mousewheel', handlePreventYScrollingBeyondElement, { - passive: !1 - }) - ), - () => { - s.forEach((s) => - s.removeEventListener('mousewheel', handlePreventYScrollingBeyondElement) - ); - } - ); - }, [x, o, w]), - Pe.createElement( - 'div', - { className: 'highlight-code', ref: C }, - _ && - Pe.createElement( - 'div', - { className: 'copy-to-clipboard' }, - Pe.createElement( - Jn.CopyToClipboard, - { text: x }, - Pe.createElement('button', null) - ) - ), - i - ? Pe.createElement( - 'button', - { - className: 'download-contents', - onClick: () => { - sk()(x, s); - } - }, - 'Download' - ) - : null, - Pe.createElement( - j, - { - language: w, - className: Hn()(o, 'microlight'), - renderPlainText: ({ children: s, PlainTextViewer: i }) => - Pe.createElement(i, { className: o }, s) - }, - x - ) - ) - ); - }, - components_PlainTextViewer = ({ className: s = '', children: o }) => - Pe.createElement('pre', { className: Hn()('microlight', s) }, o), - wrap_components_SyntaxHighlighter = - (s, o) => - ({ renderPlainText: i, children: u, ..._ }) => { - const w = o.getConfigs().syntaxHighlight.activated, - x = o.getComponent('PlainTextViewer'); - return w || 'function' != typeof i - ? w - ? Pe.createElement(s, _, u) - : Pe.createElement(x, null, u) - : i({ children: u, PlainTextViewer: x }); - }, - SyntaxHighlightingPlugin1 = () => ({ - afterLoad: after_load, - rootInjects: { syntaxHighlighting: { styles: tk, defaultStyle: rk } }, - components: { - SyntaxHighlighter: components_SyntaxHighlighter, - HighlightCode: components_HighlightCode, - PlainTextViewer: components_PlainTextViewer - } - }), - SyntaxHighlightingPlugin2 = () => ({ - wrapComponents: { SyntaxHighlighter: wrap_components_SyntaxHighlighter } - }), - syntax_highlighting = () => [SyntaxHighlightingPlugin1, SyntaxHighlightingPlugin2], - versions_after_load = () => { - const { - GIT_DIRTY: s, - GIT_COMMIT: o, - PACKAGE_VERSION: i, - BUILD_TIME: u - } = { - PACKAGE_VERSION: '5.18.2', - GIT_COMMIT: 'g1dd1f7cc', - GIT_DIRTY: !0, - BUILD_TIME: 'Thu, 07 Nov 2024 14:01:17 GMT' - }; - ((at.versions = at.versions || {}), - (at.versions.swaggerUI = { - version: i, - gitRevision: o, - gitDirty: s, - buildTimestamp: u - })); - }, - versions = () => ({ afterLoad: versions_after_load }); - var ok = __webpack_require__(47248), - lk = __webpack_require__.n(ok); - const uk = console.error, - withErrorBoundary = (s) => (o) => { - const { getComponent: i, fn: u } = s(), - _ = i('ErrorBoundary'), - w = u.getDisplayName(o); - class WithErrorBoundary extends Pe.Component { - render() { - return Pe.createElement( - _, - { targetName: w, getComponent: i, fn: u }, - Pe.createElement(o, Rn()({}, this.props, this.context)) - ); - } - } - var x; - return ( - (WithErrorBoundary.displayName = `WithErrorBoundary(${w})`), - (x = o).prototype && - x.prototype.isReactComponent && - (WithErrorBoundary.prototype.mapStateToProps = o.prototype.mapStateToProps), - WithErrorBoundary - ); - }, - fallback = ({ name: s }) => - Pe.createElement( - 'div', - { className: 'fallback' }, - '😱 ', - Pe.createElement( - 'i', - null, - 'Could not render ', - 't' === s ? 'this component' : s, - ', see the console.' - ) - ); - class ErrorBoundary extends Pe.Component { - static defaultProps = { - targetName: 'this component', - getComponent: () => fallback, - fn: { componentDidCatch: uk }, - children: null - }; - static getDerivedStateFromError(s) { - return { hasError: !0, error: s }; - } - constructor(...s) { - (super(...s), (this.state = { hasError: !1, error: null })); - } - componentDidCatch(s, o) { - this.props.fn.componentDidCatch(s, o); - } - render() { - const { getComponent: s, targetName: o, children: i } = this.props; - if (this.state.hasError) { - const i = s('Fallback'); - return Pe.createElement(i, { name: o }); - } - return i; - } - } - const pk = ErrorBoundary, - safe_render = - ({ componentList: s = [], fullOverride: o = !1 } = {}) => - ({ getSystem: i }) => { - const u = o - ? s - : [ - 'App', - 'BaseLayout', - 'VersionPragmaFilter', - 'InfoContainer', - 'ServersContainer', - 'SchemesContainer', - 'AuthorizeBtnContainer', - 'FilterContainer', - 'Operations', - 'OperationContainer', - 'parameters', - 'responses', - 'OperationServers', - 'Models', - 'ModelWrapper', - ...s - ], - _ = lk()( - u, - Array(u.length).fill((s, { fn: o }) => o.withErrorBoundary(s)) - ); - return { - fn: { componentDidCatch: uk, withErrorBoundary: withErrorBoundary(i) }, - components: { ErrorBoundary: pk, Fallback: fallback }, - wrapComponents: _ - }; - }; - class App extends Pe.Component { - getLayout() { - const { getComponent: s, layoutSelectors: o } = this.props, - i = o.current(), - u = s(i, !0); - return u || (() => Pe.createElement('h1', null, ' No layout defined for "', i, '" ')); - } - render() { - const s = this.getLayout(); - return Pe.createElement(s, null); - } - } - const fk = App; - class AuthorizationPopup extends Pe.Component { - close = () => { - let { authActions: s } = this.props; - s.showDefinitions(!1); - }; - render() { - let { - authSelectors: s, - authActions: o, - getComponent: i, - errSelectors: u, - specSelectors: _, - fn: { AST: w = {} } - } = this.props, - x = s.shownDefinitions(); - const C = i('auths'), - j = i('CloseIcon'); - return Pe.createElement( - 'div', - { className: 'dialog-ux' }, - Pe.createElement('div', { className: 'backdrop-ux' }), - Pe.createElement( - 'div', - { className: 'modal-ux' }, - Pe.createElement( - 'div', - { className: 'modal-dialog-ux' }, - Pe.createElement( - 'div', - { className: 'modal-ux-inner' }, - Pe.createElement( - 'div', - { className: 'modal-ux-header' }, - Pe.createElement('h3', null, 'Available authorizations'), - Pe.createElement( - 'button', - { type: 'button', className: 'close-modal', onClick: this.close }, - Pe.createElement(j, null) - ) - ), - Pe.createElement( - 'div', - { className: 'modal-ux-content' }, - x.valueSeq().map((x, j) => - Pe.createElement(C, { - key: j, - AST: w, - definitions: x, - getComponent: i, - errSelectors: u, - authSelectors: s, - authActions: o, - specSelectors: _ - }) - ) - ) - ) - ) - ) - ); - } - } - class AuthorizeBtn extends Pe.Component { - render() { - let { isAuthorized: s, showPopup: o, onClick: i, getComponent: u } = this.props; - const _ = u('authorizationPopup', !0), - w = u('LockAuthIcon', !0), - x = u('UnlockAuthIcon', !0); - return Pe.createElement( - 'div', - { className: 'auth-wrapper' }, - Pe.createElement( - 'button', - { className: s ? 'btn authorize locked' : 'btn authorize unlocked', onClick: i }, - Pe.createElement('span', null, 'Authorize'), - s ? Pe.createElement(w, null) : Pe.createElement(x, null) - ), - o && Pe.createElement(_, null) - ); - } - } - class AuthorizeBtnContainer extends Pe.Component { - render() { - const { - authActions: s, - authSelectors: o, - specSelectors: i, - getComponent: u - } = this.props, - _ = i.securityDefinitions(), - w = o.definitionsToAuthorize(), - x = u('authorizeBtn'); - return _ - ? Pe.createElement(x, { - onClick: () => s.showDefinitions(w), - isAuthorized: !!o.authorized().size, - showPopup: !!o.shownDefinitions(), - getComponent: u - }) - : null; - } - } - class AuthorizeOperationBtn extends Pe.Component { - onClick = (s) => { - s.stopPropagation(); - let { onClick: o } = this.props; - o && o(); - }; - render() { - let { isAuthorized: s, getComponent: o } = this.props; - const i = o('LockAuthOperationIcon', !0), - u = o('UnlockAuthOperationIcon', !0); - return Pe.createElement( - 'button', - { - className: 'authorization__btn', - 'aria-label': s ? 'authorization button locked' : 'authorization button unlocked', - onClick: this.onClick - }, - s - ? Pe.createElement(i, { className: 'locked' }) - : Pe.createElement(u, { className: 'unlocked' }) - ); - } - } - class Auths extends Pe.Component { - constructor(s, o) { - (super(s, o), (this.state = {})); - } - onAuthChange = (s) => { - let { name: o } = s; - this.setState({ [o]: s }); - }; - submitAuth = (s) => { - s.preventDefault(); - let { authActions: o } = this.props; - o.authorizeWithPersistOption(this.state); - }; - logoutClick = (s) => { - s.preventDefault(); - let { authActions: o, definitions: i } = this.props, - u = i.map((s, o) => o).toArray(); - (this.setState(u.reduce((s, o) => ((s[o] = ''), s), {})), o.logoutWithPersistOption(u)); - }; - close = (s) => { - s.preventDefault(); - let { authActions: o } = this.props; - o.showDefinitions(!1); - }; - render() { - let { definitions: s, getComponent: o, authSelectors: i, errSelectors: u } = this.props; - const _ = o('AuthItem'), - w = o('oauth2', !0), - x = o('Button'); - let C = i.authorized(), - j = s.filter((s, o) => !!C.get(o)), - L = s.filter((s) => 'oauth2' !== s.get('type')), - B = s.filter((s) => 'oauth2' === s.get('type')); - return Pe.createElement( - 'div', - { className: 'auth-container' }, - !!L.size && - Pe.createElement( - 'form', - { onSubmit: this.submitAuth }, - L.map((s, i) => - Pe.createElement(_, { - key: i, - schema: s, - name: i, - getComponent: o, - onAuthChange: this.onAuthChange, - authorized: C, - errSelectors: u - }) - ).toArray(), - Pe.createElement( - 'div', - { className: 'auth-btn-wrapper' }, - L.size === j.size - ? Pe.createElement( - x, - { - className: 'btn modal-btn auth', - onClick: this.logoutClick, - 'aria-label': 'Remove authorization' - }, - 'Logout' - ) - : Pe.createElement( - x, - { - type: 'submit', - className: 'btn modal-btn auth authorize', - 'aria-label': 'Apply credentials' - }, - 'Authorize' - ), - Pe.createElement( - x, - { className: 'btn modal-btn auth btn-done', onClick: this.close }, - 'Close' - ) - ) - ), - B && B.size - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'div', - { className: 'scope-def' }, - Pe.createElement( - 'p', - null, - 'Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.' - ), - Pe.createElement( - 'p', - null, - 'API requires the following scopes. Select which ones you want to grant to Swagger UI.' - ) - ), - s - .filter((s) => 'oauth2' === s.get('type')) - .map((s, o) => - Pe.createElement( - 'div', - { key: o }, - Pe.createElement(w, { authorized: C, schema: s, name: o }) - ) - ) - .toArray() - ) - : null - ); - } - } - class auth_item_Auths extends Pe.Component { - render() { - let { - schema: s, - name: o, - getComponent: i, - onAuthChange: u, - authorized: _, - errSelectors: w - } = this.props; - const x = i('apiKeyAuth'), - C = i('basicAuth'); - let j; - const L = s.get('type'); - switch (L) { - case 'apiKey': - j = Pe.createElement(x, { - key: o, - schema: s, - name: o, - errSelectors: w, - authorized: _, - getComponent: i, - onChange: u - }); - break; - case 'basic': - j = Pe.createElement(C, { - key: o, - schema: s, - name: o, - errSelectors: w, - authorized: _, - getComponent: i, - onChange: u - }); - break; - default: - j = Pe.createElement('div', { key: o }, 'Unknown security definition type ', L); - } - return Pe.createElement('div', { key: `${o}-jump` }, j); - } - } - class AuthError extends Pe.Component { - render() { - let { error: s } = this.props, - o = s.get('level'), - i = s.get('message'), - u = s.get('source'); - return Pe.createElement( - 'div', - { className: 'errors' }, - Pe.createElement('b', null, u, ' ', o), - Pe.createElement('span', null, i) - ); - } - } - class ApiKeyAuth extends Pe.Component { - constructor(s, o) { - super(s, o); - let { name: i, schema: u } = this.props, - _ = this.getValue(); - this.state = { name: i, schema: u, value: _ }; - } - getValue() { - let { name: s, authorized: o } = this.props; - return o && o.getIn([s, 'value']); - } - onChange = (s) => { - let { onChange: o } = this.props, - i = s.target.value, - u = Object.assign({}, this.state, { value: i }); - (this.setState(u), o(u)); - }; - render() { - let { schema: s, getComponent: o, errSelectors: i, name: u } = this.props; - const _ = o('Input'), - w = o('Row'), - x = o('Col'), - C = o('authError'), - j = o('Markdown', !0), - L = o('JumpToPath', !0); - let B = this.getValue(), - $ = i.allErrors().filter((s) => s.get('authId') === u); - return Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - Pe.createElement('code', null, u || s.get('name')), - ' (apiKey)', - Pe.createElement(L, { path: ['securityDefinitions', u] }) - ), - B && Pe.createElement('h6', null, 'Authorized'), - Pe.createElement(w, null, Pe.createElement(j, { source: s.get('description') })), - Pe.createElement( - w, - null, - Pe.createElement('p', null, 'Name: ', Pe.createElement('code', null, s.get('name'))) - ), - Pe.createElement( - w, - null, - Pe.createElement('p', null, 'In: ', Pe.createElement('code', null, s.get('in'))) - ), - Pe.createElement( - w, - null, - Pe.createElement('label', { htmlFor: 'api_key_value' }, 'Value:'), - B - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - x, - null, - Pe.createElement(_, { - id: 'api_key_value', - type: 'text', - onChange: this.onChange, - autoFocus: !0 - }) - ) - ), - $.valueSeq().map((s, o) => Pe.createElement(C, { error: s, key: o })) - ); - } - } - class BasicAuth extends Pe.Component { - constructor(s, o) { - super(s, o); - let { schema: i, name: u } = this.props, - _ = this.getValue().username; - this.state = { name: u, schema: i, value: _ ? { username: _ } : {} }; - } - getValue() { - let { authorized: s, name: o } = this.props; - return (s && s.getIn([o, 'value'])) || {}; - } - onChange = (s) => { - let { onChange: o } = this.props, - { value: i, name: u } = s.target, - _ = this.state.value; - ((_[u] = i), this.setState({ value: _ }), o(this.state)); - }; - render() { - let { schema: s, getComponent: o, name: i, errSelectors: u } = this.props; - const _ = o('Input'), - w = o('Row'), - x = o('Col'), - C = o('authError'), - j = o('JumpToPath', !0), - L = o('Markdown', !0); - let B = this.getValue().username, - $ = u.allErrors().filter((s) => s.get('authId') === i); - return Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - 'Basic authorization', - Pe.createElement(j, { path: ['securityDefinitions', i] }) - ), - B && Pe.createElement('h6', null, 'Authorized'), - Pe.createElement(w, null, Pe.createElement(L, { source: s.get('description') })), - Pe.createElement( - w, - null, - Pe.createElement('label', { htmlFor: 'auth_username' }, 'Username:'), - B - ? Pe.createElement('code', null, ' ', B, ' ') - : Pe.createElement( - x, - null, - Pe.createElement(_, { - id: 'auth_username', - type: 'text', - required: 'required', - name: 'username', - onChange: this.onChange, - autoFocus: !0 - }) - ) - ), - Pe.createElement( - w, - null, - Pe.createElement('label', { htmlFor: 'auth_password' }, 'Password:'), - B - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - x, - null, - Pe.createElement(_, { - id: 'auth_password', - autoComplete: 'new-password', - name: 'password', - type: 'password', - onChange: this.onChange - }) - ) - ), - $.valueSeq().map((s, o) => Pe.createElement(C, { error: s, key: o })) - ); - } - } - function example_Example(s) { - const { example: o, showValue: i, getComponent: u } = s, - _ = u('Markdown', !0), - w = u('HighlightCode', !0); - return o - ? Pe.createElement( - 'div', - { className: 'example' }, - o.get('description') - ? Pe.createElement( - 'section', - { className: 'example__section' }, - Pe.createElement( - 'div', - { className: 'example__section-header' }, - 'Example Description' - ), - Pe.createElement( - 'p', - null, - Pe.createElement(_, { source: o.get('description') }) - ) - ) - : null, - i && o.has('value') - ? Pe.createElement( - 'section', - { className: 'example__section' }, - Pe.createElement( - 'div', - { className: 'example__section-header' }, - 'Example Value' - ), - Pe.createElement(w, null, stringify(o.get('value'))) - ) - : null - ) - : null; - } - class ExamplesSelect extends Pe.PureComponent { - static defaultProps = { - examples: $e().Map({}), - onSelect: (...s) => - console.log('DEBUG: ExamplesSelect was not given an onSelect callback', ...s), - currentExampleKey: null, - showLabels: !0 - }; - _onSelect = (s, { isSyntheticChange: o = !1 } = {}) => { - 'function' == typeof this.props.onSelect && - this.props.onSelect(s, { isSyntheticChange: o }); - }; - _onDomSelect = (s) => { - if ('function' == typeof this.props.onSelect) { - const o = s.target.selectedOptions[0].getAttribute('value'); - this._onSelect(o, { isSyntheticChange: !1 }); - } - }; - getCurrentExample = () => { - const { examples: s, currentExampleKey: o } = this.props, - i = s.get(o), - u = s.keySeq().first(), - _ = s.get(u); - return i || _ || Map({}); - }; - componentDidMount() { - const { onSelect: s, examples: o } = this.props; - if ('function' == typeof s) { - const s = o.first(), - i = o.keyOf(s); - this._onSelect(i, { isSyntheticChange: !0 }); - } - } - UNSAFE_componentWillReceiveProps(s) { - const { currentExampleKey: o, examples: i } = s; - if (i !== this.props.examples && !i.has(o)) { - const s = i.first(), - o = i.keyOf(s); - this._onSelect(o, { isSyntheticChange: !0 }); - } - } - render() { - const { - examples: s, - currentExampleKey: o, - isValueModified: i, - isModifiedValueAvailable: u, - showLabels: _ - } = this.props; - return Pe.createElement( - 'div', - { className: 'examples-select' }, - _ - ? Pe.createElement( - 'span', - { className: 'examples-select__section-label' }, - 'Examples: ' - ) - : null, - Pe.createElement( - 'select', - { - className: 'examples-select-element', - onChange: this._onDomSelect, - value: u && i ? '__MODIFIED__VALUE__' : o || '' - }, - u - ? Pe.createElement('option', { value: '__MODIFIED__VALUE__' }, '[Modified value]') - : null, - s - .map((s, o) => - Pe.createElement('option', { key: o, value: o }, s.get('summary') || o) - ) - .valueSeq() - ) - ); - } - } - const stringifyUnlessList = (s) => (qe.List.isList(s) ? s : stringify(s)); - class ExamplesSelectValueRetainer extends Pe.PureComponent { - static defaultProps = { - userHasEditedBody: !1, - examples: (0, qe.Map)({}), - currentNamespace: '__DEFAULT__NAMESPACE__', - setRetainRequestBodyValueFlag: () => {}, - onSelect: (...s) => - console.log('ExamplesSelectValueRetainer: no `onSelect` function was provided', ...s), - updateValue: (...s) => - console.log( - 'ExamplesSelectValueRetainer: no `updateValue` function was provided', - ...s - ) - }; - constructor(s) { - super(s); - const o = this._getCurrentExampleValue(); - this.state = { - [s.currentNamespace]: (0, qe.Map)({ - lastUserEditedValue: this.props.currentUserInputValue, - lastDownstreamValue: o, - isModifiedValueSelected: - this.props.userHasEditedBody || this.props.currentUserInputValue !== o - }) - }; - } - componentWillUnmount() { - this.props.setRetainRequestBodyValueFlag(!1); - } - _getStateForCurrentNamespace = () => { - const { currentNamespace: s } = this.props; - return (this.state[s] || (0, qe.Map)()).toObject(); - }; - _setStateForCurrentNamespace = (s) => { - const { currentNamespace: o } = this.props; - return this._setStateForNamespace(o, s); - }; - _setStateForNamespace = (s, o) => { - const i = (this.state[s] || (0, qe.Map)()).mergeDeep(o); - return this.setState({ [s]: i }); - }; - _isCurrentUserInputSameAsExampleValue = () => { - const { currentUserInputValue: s } = this.props; - return this._getCurrentExampleValue() === s; - }; - _getValueForExample = (s, o) => { - const { examples: i } = o || this.props; - return stringifyUnlessList((i || (0, qe.Map)({})).getIn([s, 'value'])); - }; - _getCurrentExampleValue = (s) => { - const { currentKey: o } = s || this.props; - return this._getValueForExample(o, s || this.props); - }; - _onExamplesSelect = (s, { isSyntheticChange: o } = {}, ...i) => { - const { - onSelect: u, - updateValue: _, - currentUserInputValue: w, - userHasEditedBody: x - } = this.props, - { lastUserEditedValue: C } = this._getStateForCurrentNamespace(), - j = this._getValueForExample(s); - if ('__MODIFIED__VALUE__' === s) - return ( - _(stringifyUnlessList(C)), - this._setStateForCurrentNamespace({ isModifiedValueSelected: !0 }) - ); - ('function' == typeof u && u(s, { isSyntheticChange: o }, ...i), - this._setStateForCurrentNamespace({ - lastDownstreamValue: j, - isModifiedValueSelected: (o && x) || (!!w && w !== j) - }), - o || ('function' == typeof _ && _(stringifyUnlessList(j)))); - }; - UNSAFE_componentWillReceiveProps(s) { - const { currentUserInputValue: o, examples: i, onSelect: u, userHasEditedBody: _ } = s, - { lastUserEditedValue: w, lastDownstreamValue: x } = - this._getStateForCurrentNamespace(), - C = this._getValueForExample(s.currentKey, s), - j = i.filter((s) => s.get('value') === o || stringify(s.get('value')) === o); - if (j.size) { - let o; - ((o = j.has(s.currentKey) ? s.currentKey : j.keySeq().first()), - u(o, { isSyntheticChange: !0 })); - } else - o !== this.props.currentUserInputValue && - o !== w && - o !== x && - (this.props.setRetainRequestBodyValueFlag(!0), - this._setStateForNamespace(s.currentNamespace, { - lastUserEditedValue: s.currentUserInputValue, - isModifiedValueSelected: _ || o !== C - })); - } - render() { - const { - currentUserInputValue: s, - examples: o, - currentKey: i, - getComponent: u, - userHasEditedBody: _ - } = this.props, - { - lastDownstreamValue: w, - lastUserEditedValue: x, - isModifiedValueSelected: C - } = this._getStateForCurrentNamespace(), - j = u('ExamplesSelect'); - return Pe.createElement(j, { - examples: o, - currentExampleKey: i, - onSelect: this._onExamplesSelect, - isModifiedValueAvailable: !!x && x !== w, - isValueModified: (void 0 !== s && C && s !== this._getCurrentExampleValue()) || _ - }); - } - } - function oauth2_authorize_authorize({ - auth: s, - authActions: o, - errActions: i, - configs: u, - authConfigs: _ = {}, - currentServer: w - }) { - let { schema: x, scopes: C, name: j, clientId: L } = s, - B = x.get('flow'), - $ = []; - switch (B) { - case 'password': - return void o.authorizePassword(s); - case 'application': - case 'clientCredentials': - case 'client_credentials': - return void o.authorizeApplication(s); - case 'accessCode': - case 'authorizationCode': - case 'authorization_code': - $.push('response_type=code'); - break; - case 'implicit': - $.push('response_type=token'); - } - 'string' == typeof L && $.push('client_id=' + encodeURIComponent(L)); - let V = u.oauth2RedirectUrl; - if (void 0 === V) - return void i.newAuthErr({ - authId: j, - source: 'validation', - level: 'error', - message: - 'oauth2RedirectUrl configuration is not passed. Oauth2 authorization cannot be performed.' - }); - $.push('redirect_uri=' + encodeURIComponent(V)); - let U = []; - if ( - (Array.isArray(C) ? (U = C) : $e().List.isList(C) && (U = C.toArray()), U.length > 0) - ) { - let s = _.scopeSeparator || ' '; - $.push('scope=' + encodeURIComponent(U.join(s))); - } - let z = utils_btoa(new Date()); - if ( - ($.push('state=' + encodeURIComponent(z)), - void 0 !== _.realm && $.push('realm=' + encodeURIComponent(_.realm)), - ('authorizationCode' === B || 'authorization_code' === B || 'accessCode' === B) && - _.usePkceWithAuthorizationCodeGrant) - ) { - const o = (function generateCodeVerifier() { - return b64toB64UrlEncoded(St()(32).toString('base64')); - })(), - i = (function createCodeChallenge(s) { - return b64toB64UrlEncoded(kt()('sha256').update(s).digest('base64')); - })(o); - ($.push('code_challenge=' + i), - $.push('code_challenge_method=S256'), - (s.codeVerifier = o)); - } - let { additionalQueryStringParams: Y } = _; - for (let s in Y) void 0 !== Y[s] && $.push([s, Y[s]].map(encodeURIComponent).join('=')); - const Z = x.get('authorizationUrl'); - let ee; - ee = w ? Mt()(sanitizeUrl(Z), w, !0).toString() : sanitizeUrl(Z); - let ie, - ae = [ee, $.join('&')].join(-1 === Z.indexOf('?') ? '?' : '&'); - ((ie = - 'implicit' === B - ? o.preAuthorizeImplicit - : _.useBasicAuthenticationWithAccessCodeGrant - ? o.authorizeAccessCodeWithBasicAuthentication - : o.authorizeAccessCodeWithFormParams), - o.authPopup(ae, { - auth: s, - state: z, - redirectUrl: V, - callback: ie, - errCb: i.newAuthErr - })); - } - class Oauth2 extends Pe.Component { - constructor(s, o) { - super(s, o); - let { name: i, schema: u, authorized: _, authSelectors: w } = this.props, - x = _ && _.get(i), - C = w.getConfigs() || {}, - j = (x && x.get('username')) || '', - L = (x && x.get('clientId')) || C.clientId || '', - B = (x && x.get('clientSecret')) || C.clientSecret || '', - $ = (x && x.get('passwordType')) || 'basic', - V = (x && x.get('scopes')) || C.scopes || []; - ('string' == typeof V && (V = V.split(C.scopeSeparator || ' ')), - (this.state = { - appName: C.appName, - name: i, - schema: u, - scopes: V, - clientId: L, - clientSecret: B, - username: j, - password: '', - passwordType: $ - })); - } - close = (s) => { - s.preventDefault(); - let { authActions: o } = this.props; - o.showDefinitions(!1); - }; - authorize = () => { - let { - authActions: s, - errActions: o, - getConfigs: i, - authSelectors: u, - oas3Selectors: _ - } = this.props, - w = i(), - x = u.getConfigs(); - (o.clear({ authId: name, type: 'auth', source: 'auth' }), - oauth2_authorize_authorize({ - auth: this.state, - currentServer: _.serverEffectiveValue(_.selectedServer()), - authActions: s, - errActions: o, - configs: w, - authConfigs: x - })); - }; - onScopeChange = (s) => { - let { target: o } = s, - { checked: i } = o, - u = o.dataset.value; - if (i && -1 === this.state.scopes.indexOf(u)) { - let s = this.state.scopes.concat([u]); - this.setState({ scopes: s }); - } else - !i && - this.state.scopes.indexOf(u) > -1 && - this.setState({ scopes: this.state.scopes.filter((s) => s !== u) }); - }; - onInputChange = (s) => { - let { - target: { - dataset: { name: o }, - value: i - } - } = s, - u = { [o]: i }; - this.setState(u); - }; - selectScopes = (s) => { - s.target.dataset.all - ? this.setState({ - scopes: Array.from( - ( - this.props.schema.get('allowedScopes') || this.props.schema.get('scopes') - ).keys() - ) - }) - : this.setState({ scopes: [] }); - }; - logout = (s) => { - s.preventDefault(); - let { authActions: o, errActions: i, name: u } = this.props; - (i.clear({ authId: u, type: 'auth', source: 'auth' }), o.logoutWithPersistOption([u])); - }; - render() { - let { - schema: s, - getComponent: o, - authSelectors: i, - errSelectors: u, - name: _, - specSelectors: w - } = this.props; - const x = o('Input'), - C = o('Row'), - j = o('Col'), - L = o('Button'), - B = o('authError'), - $ = o('JumpToPath', !0), - V = o('Markdown', !0), - U = o('InitializedInput'), - { isOAS3: z } = w; - let Y = z() ? s.get('openIdConnectUrl') : null; - const Z = 'implicit', - ee = 'password', - ie = z() ? (Y ? 'authorization_code' : 'authorizationCode') : 'accessCode', - ae = z() ? (Y ? 'client_credentials' : 'clientCredentials') : 'application'; - let le = !!(i.getConfigs() || {}).usePkceWithAuthorizationCodeGrant, - ce = s.get('flow'), - pe = ce === ie && le ? ce + ' with PKCE' : ce, - de = s.get('allowedScopes') || s.get('scopes'), - fe = !!i.authorized().get(_), - ye = u.allErrors().filter((s) => s.get('authId') === _), - be = !ye.filter((s) => 'validation' === s.get('source')).size, - _e = s.get('description'); - return Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - _, - ' (OAuth2, ', - pe, - ') ', - Pe.createElement($, { path: ['securityDefinitions', _] }) - ), - this.state.appName - ? Pe.createElement('h5', null, 'Application: ', this.state.appName, ' ') - : null, - _e && Pe.createElement(V, { source: s.get('description') }), - fe && Pe.createElement('h6', null, 'Authorized'), - Y && - Pe.createElement( - 'p', - null, - 'OpenID Connect URL: ', - Pe.createElement('code', null, Y) - ), - (ce === Z || ce === ie) && - Pe.createElement( - 'p', - null, - 'Authorization URL: ', - Pe.createElement('code', null, s.get('authorizationUrl')) - ), - (ce === ee || ce === ie || ce === ae) && - Pe.createElement( - 'p', - null, - 'Token URL:', - Pe.createElement('code', null, ' ', s.get('tokenUrl')) - ), - Pe.createElement( - 'p', - { className: 'flow' }, - 'Flow: ', - Pe.createElement('code', null, pe) - ), - ce !== ee - ? null - : Pe.createElement( - C, - null, - Pe.createElement( - C, - null, - Pe.createElement('label', { htmlFor: 'oauth_username' }, 'username:'), - fe - ? Pe.createElement('code', null, ' ', this.state.username, ' ') - : Pe.createElement( - j, - { tablet: 10, desktop: 10 }, - Pe.createElement('input', { - id: 'oauth_username', - type: 'text', - 'data-name': 'username', - onChange: this.onInputChange, - autoFocus: !0 - }) - ) - ), - Pe.createElement( - C, - null, - Pe.createElement('label', { htmlFor: 'oauth_password' }, 'password:'), - fe - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - j, - { tablet: 10, desktop: 10 }, - Pe.createElement('input', { - id: 'oauth_password', - type: 'password', - 'data-name': 'password', - onChange: this.onInputChange - }) - ) - ), - Pe.createElement( - C, - null, - Pe.createElement( - 'label', - { htmlFor: 'password_type' }, - 'Client credentials location:' - ), - fe - ? Pe.createElement('code', null, ' ', this.state.passwordType, ' ') - : Pe.createElement( - j, - { tablet: 10, desktop: 10 }, - Pe.createElement( - 'select', - { - id: 'password_type', - 'data-name': 'passwordType', - onChange: this.onInputChange - }, - Pe.createElement( - 'option', - { value: 'basic' }, - 'Authorization header' - ), - Pe.createElement('option', { value: 'request-body' }, 'Request body') - ) - ) - ) - ), - (ce === ae || ce === Z || ce === ie || ce === ee) && - (!fe || (fe && this.state.clientId)) && - Pe.createElement( - C, - null, - Pe.createElement('label', { htmlFor: `client_id_${ce}` }, 'client_id:'), - fe - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - j, - { tablet: 10, desktop: 10 }, - Pe.createElement(U, { - id: `client_id_${ce}`, - type: 'text', - required: ce === ee, - initialValue: this.state.clientId, - 'data-name': 'clientId', - onChange: this.onInputChange - }) - ) - ), - (ce === ae || ce === ie || ce === ee) && - Pe.createElement( - C, - null, - Pe.createElement('label', { htmlFor: `client_secret_${ce}` }, 'client_secret:'), - fe - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - j, - { tablet: 10, desktop: 10 }, - Pe.createElement(U, { - id: `client_secret_${ce}`, - initialValue: this.state.clientSecret, - type: 'password', - 'data-name': 'clientSecret', - onChange: this.onInputChange - }) - ) - ), - !fe && de && de.size - ? Pe.createElement( - 'div', - { className: 'scopes' }, - Pe.createElement( - 'h2', - null, - 'Scopes:', - Pe.createElement( - 'a', - { onClick: this.selectScopes, 'data-all': !0 }, - 'select all' - ), - Pe.createElement('a', { onClick: this.selectScopes }, 'select none') - ), - de - .map((s, o) => - Pe.createElement( - C, - { key: o }, - Pe.createElement( - 'div', - { className: 'checkbox' }, - Pe.createElement(x, { - 'data-value': o, - id: `${o}-${ce}-checkbox-${this.state.name}`, - disabled: fe, - checked: this.state.scopes.includes(o), - type: 'checkbox', - onChange: this.onScopeChange - }), - Pe.createElement( - 'label', - { htmlFor: `${o}-${ce}-checkbox-${this.state.name}` }, - Pe.createElement('span', { className: 'item' }), - Pe.createElement( - 'div', - { className: 'text' }, - Pe.createElement('p', { className: 'name' }, o), - Pe.createElement('p', { className: 'description' }, s) - ) - ) - ) - ) - ) - .toArray() - ) - : null, - ye.valueSeq().map((s, o) => Pe.createElement(B, { error: s, key: o })), - Pe.createElement( - 'div', - { className: 'auth-btn-wrapper' }, - be && - (fe - ? Pe.createElement( - L, - { - className: 'btn modal-btn auth authorize', - onClick: this.logout, - 'aria-label': 'Remove authorization' - }, - 'Logout' - ) - : Pe.createElement( - L, - { - className: 'btn modal-btn auth authorize', - onClick: this.authorize, - 'aria-label': 'Apply given OAuth2 credentials' - }, - 'Authorize' - )), - Pe.createElement( - L, - { className: 'btn modal-btn auth btn-done', onClick: this.close }, - 'Close' - ) - ) - ); - } - } - class Clear extends Pe.Component { - onClick = () => { - let { specActions: s, path: o, method: i } = this.props; - (s.clearResponse(o, i), s.clearRequest(o, i)); - }; - render() { - return Pe.createElement( - 'button', - { className: 'btn btn-clear opblock-control__btn', onClick: this.onClick }, - 'Clear' - ); - } - } - const live_response_Headers = ({ headers: s }) => - Pe.createElement( - 'div', - null, - Pe.createElement('h5', null, 'Response headers'), - Pe.createElement('pre', { className: 'microlight' }, s) - ), - Duration = ({ duration: s }) => - Pe.createElement( - 'div', - null, - Pe.createElement('h5', null, 'Request duration'), - Pe.createElement('pre', { className: 'microlight' }, s, ' ms') - ); - class LiveResponse extends Pe.Component { - shouldComponentUpdate(s) { - return ( - this.props.response !== s.response || - this.props.path !== s.path || - this.props.method !== s.method || - this.props.displayRequestDuration !== s.displayRequestDuration - ); - } - render() { - const { - response: s, - getComponent: o, - getConfigs: i, - displayRequestDuration: u, - specSelectors: _, - path: w, - method: x - } = this.props, - { showMutatedRequest: C, requestSnippetsEnabled: j } = i(), - L = C ? _.mutatedRequestFor(w, x) : _.requestFor(w, x), - B = s.get('status'), - $ = L.get('url'), - V = s.get('headers').toJS(), - U = s.get('notDocumented'), - z = s.get('error'), - Y = s.get('text'), - Z = s.get('duration'), - ee = Object.keys(V), - ie = V['content-type'] || V['Content-Type'], - ae = o('responseBody'), - le = ee.map((s) => { - var o = Array.isArray(V[s]) ? V[s].join() : V[s]; - return Pe.createElement( - 'span', - { className: 'headerline', key: s }, - ' ', - s, - ': ', - o, - ' ' - ); - }), - ce = 0 !== le.length, - pe = o('Markdown', !0), - de = o('RequestSnippets', !0), - fe = o('curl', !0); - return Pe.createElement( - 'div', - null, - L && j ? Pe.createElement(de, { request: L }) : Pe.createElement(fe, { request: L }), - $ && - Pe.createElement( - 'div', - null, - Pe.createElement( - 'div', - { className: 'request-url' }, - Pe.createElement('h4', null, 'Request URL'), - Pe.createElement('pre', { className: 'microlight' }, $) - ) - ), - Pe.createElement('h4', null, 'Server response'), - Pe.createElement( - 'table', - { className: 'responses-table live-responses-table' }, - Pe.createElement( - 'thead', - null, - Pe.createElement( - 'tr', - { className: 'responses-header' }, - Pe.createElement('td', { className: 'col_header response-col_status' }, 'Code'), - Pe.createElement( - 'td', - { className: 'col_header response-col_description' }, - 'Details' - ) - ) - ), - Pe.createElement( - 'tbody', - null, - Pe.createElement( - 'tr', - { className: 'response' }, - Pe.createElement( - 'td', - { className: 'response-col_status' }, - B, - U - ? Pe.createElement( - 'div', - { className: 'response-undocumented' }, - Pe.createElement('i', null, ' Undocumented ') - ) - : null - ), - Pe.createElement( - 'td', - { className: 'response-col_description' }, - z - ? Pe.createElement(pe, { - source: `${'' !== s.get('name') ? `${s.get('name')}: ` : ''}${s.get('message')}` - }) - : null, - Y - ? Pe.createElement(ae, { - content: Y, - contentType: ie, - url: $, - headers: V, - getConfigs: i, - getComponent: o - }) - : null, - ce ? Pe.createElement(live_response_Headers, { headers: le }) : null, - u && Z ? Pe.createElement(Duration, { duration: Z }) : null - ) - ) - ) - ) - ); - } - } - class OnlineValidatorBadge extends Pe.Component { - constructor(s, o) { - super(s, o); - let { getConfigs: i } = s, - { validatorUrl: u } = i(); - this.state = { - url: this.getDefinitionUrl(), - validatorUrl: void 0 === u ? 'https://validator.swagger.io/validator' : u - }; - } - getDefinitionUrl = () => { - let { specSelectors: s } = this.props; - return new (Mt())(s.url(), at.location).toString(); - }; - UNSAFE_componentWillReceiveProps(s) { - let { getConfigs: o } = s, - { validatorUrl: i } = o(); - this.setState({ - url: this.getDefinitionUrl(), - validatorUrl: void 0 === i ? 'https://validator.swagger.io/validator' : i - }); - } - render() { - let { getConfigs: s } = this.props, - { spec: o } = s(), - i = sanitizeUrl(this.state.validatorUrl); - return 'object' == typeof o && Object.keys(o).length - ? null - : this.state.url && - requiresValidationURL(this.state.validatorUrl) && - requiresValidationURL(this.state.url) - ? Pe.createElement( - 'span', - { className: 'float-right' }, - Pe.createElement( - 'a', - { - target: '_blank', - rel: 'noopener noreferrer', - href: `${i}/debug?url=${encodeURIComponent(this.state.url)}` - }, - Pe.createElement(ValidatorImage, { - src: `${i}?url=${encodeURIComponent(this.state.url)}`, - alt: 'Online validator badge' - }) - ) - ) - : null; - } - } - class ValidatorImage extends Pe.Component { - constructor(s) { - (super(s), (this.state = { loaded: !1, error: !1 })); - } - componentDidMount() { - const s = new Image(); - ((s.onload = () => { - this.setState({ loaded: !0 }); - }), - (s.onerror = () => { - this.setState({ error: !0 }); - }), - (s.src = this.props.src)); - } - UNSAFE_componentWillReceiveProps(s) { - if (s.src !== this.props.src) { - const o = new Image(); - ((o.onload = () => { - this.setState({ loaded: !0 }); - }), - (o.onerror = () => { - this.setState({ error: !0 }); - }), - (o.src = s.src)); - } - } - render() { - return this.state.error - ? Pe.createElement('img', { alt: 'Error' }) - : this.state.loaded - ? Pe.createElement('img', { src: this.props.src, alt: this.props.alt }) - : null; - } - } - class Operations extends Pe.Component { - render() { - let { specSelectors: s } = this.props; - const o = s.taggedOperations(); - return 0 === o.size - ? Pe.createElement('h3', null, ' No operations defined in spec!') - : Pe.createElement( - 'div', - null, - o.map(this.renderOperationTag).toArray(), - o.size < 1 - ? Pe.createElement('h3', null, ' No operations defined in spec! ') - : null - ); - } - renderOperationTag = (s, o) => { - const { - specSelectors: i, - getComponent: u, - oas3Selectors: _, - layoutSelectors: w, - layoutActions: x, - getConfigs: C - } = this.props, - j = i.validOperationMethods(), - L = u('OperationContainer', !0), - B = u('OperationTag'), - $ = s.get('operations'); - return Pe.createElement( - B, - { - key: 'operation-' + o, - tagObj: s, - tag: o, - oas3Selectors: _, - layoutSelectors: w, - layoutActions: x, - getConfigs: C, - getComponent: u, - specUrl: i.url() - }, - Pe.createElement( - 'div', - { className: 'operation-tag-content' }, - $.map((s) => { - const i = s.get('path'), - u = s.get('method'), - _ = $e().List(['paths', i, u]); - return -1 === j.indexOf(u) - ? null - : Pe.createElement(L, { - key: `${i}-${u}`, - specPath: _, - op: s, - path: i, - method: u, - tag: o - }); - }).toArray() - ) - ); - }; - } - function isAbsoluteUrl(s) { - return s.match(/^(?:[a-z]+:)?\/\//i); - } - function buildBaseUrl(s, o) { - return s - ? isAbsoluteUrl(s) - ? (function addProtocol(s) { - return s.match(/^\/\//i) ? `${window.location.protocol}${s}` : s; - })(s) - : new URL(s, o).href - : o; - } - function safeBuildUrl(s, o, { selectedServer: i = '' } = {}) { - try { - return (function buildUrl(s, o, { selectedServer: i = '' } = {}) { - if (!s) return; - if (isAbsoluteUrl(s)) return s; - const u = buildBaseUrl(i, o); - return isAbsoluteUrl(u) ? new URL(s, u).href : new URL(s, window.location.href).href; - })(s, o, { selectedServer: i }); - } catch { - return; - } - } - class OperationTag extends Pe.Component { - static defaultProps = { tagObj: $e().fromJS({}), tag: '' }; - render() { - const { - tagObj: s, - tag: o, - children: i, - oas3Selectors: u, - layoutSelectors: _, - layoutActions: w, - getConfigs: x, - getComponent: C, - specUrl: j - } = this.props; - let { docExpansion: L, deepLinking: B } = x(); - const $ = C('Collapse'), - V = C('Markdown', !0), - U = C('DeepLink'), - z = C('Link'), - Y = C('ArrowUpIcon'), - Z = C('ArrowDownIcon'); - let ee, - ie = s.getIn(['tagDetails', 'description'], null), - ae = s.getIn(['tagDetails', 'externalDocs', 'description']), - le = s.getIn(['tagDetails', 'externalDocs', 'url']); - ee = - isFunc(u) && isFunc(u.selectedServer) - ? safeBuildUrl(le, j, { selectedServer: u.selectedServer() }) - : le; - let ce = ['operations-tag', o], - pe = _.isShown(ce, 'full' === L || 'list' === L); - return Pe.createElement( - 'div', - { className: pe ? 'opblock-tag-section is-open' : 'opblock-tag-section' }, - Pe.createElement( - 'h3', - { - onClick: () => w.show(ce, !pe), - className: ie ? 'opblock-tag' : 'opblock-tag no-desc', - id: ce.map((s) => escapeDeepLinkPath(s)).join('-'), - 'data-tag': o, - 'data-is-open': pe - }, - Pe.createElement(U, { - enabled: B, - isShown: pe, - path: createDeepLinkPath(o), - text: o - }), - ie - ? Pe.createElement('small', null, Pe.createElement(V, { source: ie })) - : Pe.createElement('small', null), - ee - ? Pe.createElement( - 'div', - { className: 'info__externaldocs' }, - Pe.createElement( - 'small', - null, - Pe.createElement( - z, - { - href: sanitizeUrl(ee), - onClick: (s) => s.stopPropagation(), - target: '_blank' - }, - ae || ee - ) - ) - ) - : null, - Pe.createElement( - 'button', - { - 'aria-expanded': pe, - className: 'expand-operation', - title: pe ? 'Collapse operation' : 'Expand operation', - onClick: () => w.show(ce, !pe) - }, - pe - ? Pe.createElement(Y, { className: 'arrow' }) - : Pe.createElement(Z, { className: 'arrow' }) - ) - ), - Pe.createElement($, { isOpened: pe }, i) - ); - } - } - class operation_Operation extends Pe.PureComponent { - static defaultProps = { - operation: null, - response: null, - request: null, - specPath: (0, qe.List)(), - summary: '' - }; - render() { - let { - specPath: s, - response: o, - request: i, - toggleShown: u, - onTryoutClick: _, - onResetClick: w, - onCancelClick: x, - onExecute: C, - fn: j, - getComponent: L, - getConfigs: B, - specActions: $, - specSelectors: V, - authActions: U, - authSelectors: z, - oas3Actions: Y, - oas3Selectors: Z - } = this.props, - ee = this.props.operation, - { - deprecated: ie, - isShown: ae, - path: le, - method: ce, - op: pe, - tag: de, - operationId: fe, - allowTryItOut: ye, - displayRequestDuration: be, - tryItOutEnabled: _e, - executeInProgress: we - } = ee.toJS(), - { description: Se, externalDocs: xe, schemes: Te } = pe; - const Re = xe - ? safeBuildUrl(xe.url, V.url(), { selectedServer: Z.selectedServer() }) - : ''; - let qe = ee.getIn(['op']), - ze = qe.get('responses'), - We = (function getList(s, o) { - if (!$e().Iterable.isIterable(s)) return $e().List(); - let i = s.getIn(Array.isArray(o) ? o : [o]); - return $e().List.isList(i) ? i : $e().List(); - })(qe, ['parameters']), - He = V.operationScheme(le, ce), - Ye = ['operations', de, fe], - Xe = getExtensions(qe); - const Qe = L('responses'), - et = L('parameters'), - tt = L('execute'), - rt = L('clear'), - nt = L('Collapse'), - st = L('Markdown', !0), - ot = L('schemes'), - it = L('OperationServers'), - at = L('OperationExt'), - lt = L('OperationSummary'), - ct = L('Link'), - { showExtensions: ut } = B(); - if (ze && o && o.size > 0) { - let s = !ze.get(String(o.get('status'))) && !ze.get('default'); - o = o.set('notDocumented', s); - } - let pt = [le, ce]; - const ht = V.validationErrors([le, ce]); - return Pe.createElement( - 'div', - { - className: ie - ? 'opblock opblock-deprecated' - : ae - ? `opblock opblock-${ce} is-open` - : `opblock opblock-${ce}`, - id: escapeDeepLinkPath(Ye.join('-')) - }, - Pe.createElement(lt, { - operationProps: ee, - isShown: ae, - toggleShown: u, - getComponent: L, - authActions: U, - authSelectors: z, - specPath: s - }), - Pe.createElement( - nt, - { isOpened: ae }, - Pe.createElement( - 'div', - { className: 'opblock-body' }, - (qe && qe.size) || null === qe - ? null - : Pe.createElement(rolling_load, { - height: '32px', - width: '32px', - className: 'opblock-loading-animation' - }), - ie && - Pe.createElement( - 'h4', - { className: 'opblock-title_normal' }, - ' Warning: Deprecated' - ), - Se && - Pe.createElement( - 'div', - { className: 'opblock-description-wrapper' }, - Pe.createElement( - 'div', - { className: 'opblock-description' }, - Pe.createElement(st, { source: Se }) - ) - ), - Re - ? Pe.createElement( - 'div', - { className: 'opblock-external-docs-wrapper' }, - Pe.createElement( - 'h4', - { className: 'opblock-title_normal' }, - 'Find more details' - ), - Pe.createElement( - 'div', - { className: 'opblock-external-docs' }, - xe.description && - Pe.createElement( - 'span', - { className: 'opblock-external-docs__description' }, - Pe.createElement(st, { source: xe.description }) - ), - Pe.createElement( - ct, - { - target: '_blank', - className: 'opblock-external-docs__link', - href: sanitizeUrl(Re) - }, - Re - ) - ) - ) - : null, - qe && qe.size - ? Pe.createElement(et, { - parameters: We, - specPath: s.push('parameters'), - operation: qe, - onChangeKey: pt, - onTryoutClick: _, - onResetClick: w, - onCancelClick: x, - tryItOutEnabled: _e, - allowTryItOut: ye, - fn: j, - getComponent: L, - specActions: $, - specSelectors: V, - pathMethod: [le, ce], - getConfigs: B, - oas3Actions: Y, - oas3Selectors: Z - }) - : null, - _e - ? Pe.createElement(it, { - getComponent: L, - path: le, - method: ce, - operationServers: qe.get('servers'), - pathServers: V.paths().getIn([le, 'servers']), - getSelectedServer: Z.selectedServer, - setSelectedServer: Y.setSelectedServer, - setServerVariableValue: Y.setServerVariableValue, - getServerVariable: Z.serverVariableValue, - getEffectiveServerValue: Z.serverEffectiveValue - }) - : null, - _e && ye && Te && Te.size - ? Pe.createElement( - 'div', - { className: 'opblock-schemes' }, - Pe.createElement(ot, { - schemes: Te, - path: le, - method: ce, - specActions: $, - currentScheme: He - }) - ) - : null, - !_e || !ye || ht.length <= 0 - ? null - : Pe.createElement( - 'div', - { className: 'validation-errors errors-wrapper' }, - 'Please correct the following validation errors and try again.', - Pe.createElement( - 'ul', - null, - ht.map((s, o) => Pe.createElement('li', { key: o }, ' ', s, ' ')) - ) - ), - Pe.createElement( - 'div', - { className: _e && o && ye ? 'btn-group' : 'execute-wrapper' }, - _e && ye - ? Pe.createElement(tt, { - operation: qe, - specActions: $, - specSelectors: V, - oas3Selectors: Z, - oas3Actions: Y, - path: le, - method: ce, - onExecute: C, - disabled: we - }) - : null, - _e && o && ye - ? Pe.createElement(rt, { specActions: $, path: le, method: ce }) - : null - ), - we - ? Pe.createElement( - 'div', - { className: 'loading-container' }, - Pe.createElement('div', { className: 'loading' }) - ) - : null, - ze - ? Pe.createElement(Qe, { - responses: ze, - request: i, - tryItOutResponse: o, - getComponent: L, - getConfigs: B, - specSelectors: V, - oas3Actions: Y, - oas3Selectors: Z, - specActions: $, - produces: V.producesOptionsFor([le, ce]), - producesValue: V.currentProducesFor([le, ce]), - specPath: s.push('responses'), - path: le, - method: ce, - displayRequestDuration: be, - fn: j - }) - : null, - ut && Xe.size ? Pe.createElement(at, { extensions: Xe, getComponent: L }) : null - ) - ) - ); - } - } - class OperationContainer extends Pe.PureComponent { - constructor(s, o) { - super(s, o); - const { tryItOutEnabled: i } = s.getConfigs(); - this.state = { tryItOutEnabled: i, executeInProgress: !1 }; - } - static defaultProps = { - showSummary: !0, - response: null, - allowTryItOut: !0, - displayOperationId: !1, - displayRequestDuration: !1 - }; - mapStateToProps(s, o) { - const { op: i, layoutSelectors: u, getConfigs: _ } = o, - { - docExpansion: w, - deepLinking: x, - displayOperationId: C, - displayRequestDuration: j, - supportedSubmitMethods: L - } = _(), - B = u.showSummary(), - $ = - i.getIn(['operation', '__originalOperationId']) || - i.getIn(['operation', 'operationId']) || - opId(i.get('operation'), o.path, o.method) || - i.get('id'), - V = ['operations', o.tag, $], - U = - L.indexOf(o.method) >= 0 && - (void 0 === o.allowTryItOut - ? o.specSelectors.allowTryItOutFor(o.path, o.method) - : o.allowTryItOut), - z = i.getIn(['operation', 'security']) || o.specSelectors.security(); - return { - operationId: $, - isDeepLinkingEnabled: x, - showSummary: B, - displayOperationId: C, - displayRequestDuration: j, - allowTryItOut: U, - security: z, - isAuthorized: o.authSelectors.isAuthorized(z), - isShown: u.isShown(V, 'full' === w), - jumpToKey: `paths.${o.path}.${o.method}`, - response: o.specSelectors.responseFor(o.path, o.method), - request: o.specSelectors.requestFor(o.path, o.method) - }; - } - componentDidMount() { - const { isShown: s } = this.props, - o = this.getResolvedSubtree(); - s && void 0 === o && this.requestResolvedSubtree(); - } - UNSAFE_componentWillReceiveProps(s) { - const { response: o, isShown: i } = s, - u = this.getResolvedSubtree(); - (o !== this.props.response && this.setState({ executeInProgress: !1 }), - i && void 0 === u && this.requestResolvedSubtree()); - } - toggleShown = () => { - let { layoutActions: s, tag: o, operationId: i, isShown: u } = this.props; - const _ = this.getResolvedSubtree(); - (u || void 0 !== _ || this.requestResolvedSubtree(), s.show(['operations', o, i], !u)); - }; - onCancelClick = () => { - this.setState({ tryItOutEnabled: !this.state.tryItOutEnabled }); - }; - onTryoutClick = () => { - this.setState({ tryItOutEnabled: !this.state.tryItOutEnabled }); - }; - onResetClick = (s) => { - const o = this.props.oas3Selectors.selectDefaultRequestBodyValue(...s); - this.props.oas3Actions.setRequestBodyValue({ value: o, pathMethod: s }); - }; - onExecute = () => { - this.setState({ executeInProgress: !0 }); - }; - getResolvedSubtree = () => { - const { specSelectors: s, path: o, method: i, specPath: u } = this.props; - return u ? s.specResolvedSubtree(u.toJS()) : s.specResolvedSubtree(['paths', o, i]); - }; - requestResolvedSubtree = () => { - const { specActions: s, path: o, method: i, specPath: u } = this.props; - return u - ? s.requestResolvedSubtree(u.toJS()) - : s.requestResolvedSubtree(['paths', o, i]); - }; - render() { - let { - op: s, - tag: o, - path: i, - method: u, - security: _, - isAuthorized: w, - operationId: x, - showSummary: C, - isShown: j, - jumpToKey: L, - allowTryItOut: B, - response: $, - request: V, - displayOperationId: U, - displayRequestDuration: z, - isDeepLinkingEnabled: Y, - specPath: Z, - specSelectors: ee, - specActions: ie, - getComponent: ae, - getConfigs: le, - layoutSelectors: ce, - layoutActions: pe, - authActions: de, - authSelectors: fe, - oas3Actions: ye, - oas3Selectors: be, - fn: _e - } = this.props; - const we = ae('operation'), - Se = this.getResolvedSubtree() || (0, qe.Map)(), - xe = (0, qe.fromJS)({ - op: Se, - tag: o, - path: i, - summary: s.getIn(['operation', 'summary']) || '', - deprecated: Se.get('deprecated') || s.getIn(['operation', 'deprecated']) || !1, - method: u, - security: _, - isAuthorized: w, - operationId: x, - originalOperationId: Se.getIn(['operation', '__originalOperationId']), - showSummary: C, - isShown: j, - jumpToKey: L, - allowTryItOut: B, - request: V, - displayOperationId: U, - displayRequestDuration: z, - isDeepLinkingEnabled: Y, - executeInProgress: this.state.executeInProgress, - tryItOutEnabled: this.state.tryItOutEnabled - }); - return Pe.createElement(we, { - operation: xe, - response: $, - request: V, - isShown: j, - toggleShown: this.toggleShown, - onTryoutClick: this.onTryoutClick, - onResetClick: this.onResetClick, - onCancelClick: this.onCancelClick, - onExecute: this.onExecute, - specPath: Z, - specActions: ie, - specSelectors: ee, - oas3Actions: ye, - oas3Selectors: be, - layoutActions: pe, - layoutSelectors: ce, - authActions: de, - authSelectors: fe, - getComponent: ae, - getConfigs: le, - fn: _e - }); - } - } - var mk = __webpack_require__(13222), - yk = __webpack_require__.n(mk); - class OperationSummary extends Pe.PureComponent { - static defaultProps = { operationProps: null, specPath: (0, qe.List)(), summary: '' }; - render() { - let { - isShown: s, - toggleShown: o, - getComponent: i, - authActions: u, - authSelectors: _, - operationProps: w, - specPath: x - } = this.props, - { - summary: C, - isAuthorized: j, - method: L, - op: B, - showSummary: $, - path: V, - operationId: U, - originalOperationId: z, - displayOperationId: Y - } = w.toJS(), - { summary: Z } = B, - ee = w.get('security'); - const ie = i('authorizeOperationBtn', !0), - ae = i('OperationSummaryMethod'), - le = i('OperationSummaryPath'), - ce = i('JumpToPath', !0), - pe = i('CopyToClipboardBtn', !0), - de = i('ArrowUpIcon'), - fe = i('ArrowDownIcon'), - ye = ee && !!ee.count(), - be = ye && 1 === ee.size && ee.first().isEmpty(), - _e = !ye || be; - return Pe.createElement( - 'div', - { className: `opblock-summary opblock-summary-${L}` }, - Pe.createElement( - 'button', - { 'aria-expanded': s, className: 'opblock-summary-control', onClick: o }, - Pe.createElement(ae, { method: L }), - Pe.createElement( - 'div', - { className: 'opblock-summary-path-description-wrapper' }, - Pe.createElement(le, { getComponent: i, operationProps: w, specPath: x }), - $ - ? Pe.createElement( - 'div', - { className: 'opblock-summary-description' }, - yk()(Z || C) - ) - : null - ), - Y && (z || U) - ? Pe.createElement('span', { className: 'opblock-summary-operation-id' }, z || U) - : null - ), - Pe.createElement(pe, { textToCopy: `${x.get(1)}` }), - _e - ? null - : Pe.createElement(ie, { - isAuthorized: j, - onClick: () => { - const s = _.definitionsForRequirements(ee); - u.showDefinitions(s); - } - }), - Pe.createElement(ce, { path: x }), - Pe.createElement( - 'button', - { - 'aria-label': `${L} ${V.replace(/\//g, '​/')}`, - className: 'opblock-control-arrow', - 'aria-expanded': s, - tabIndex: '-1', - onClick: o - }, - s - ? Pe.createElement(de, { className: 'arrow' }) - : Pe.createElement(fe, { className: 'arrow' }) - ) - ); - } - } - class OperationSummaryMethod extends Pe.PureComponent { - static defaultProps = { operationProps: null }; - render() { - let { method: s } = this.props; - return Pe.createElement( - 'span', - { className: 'opblock-summary-method' }, - s.toUpperCase() - ); - } - } - class OperationSummaryPath extends Pe.PureComponent { - render() { - let { getComponent: s, operationProps: o } = this.props, - { - deprecated: i, - isShown: u, - path: _, - tag: w, - operationId: x, - isDeepLinkingEnabled: C - } = o.toJS(); - const j = _.split(/(?=\/)/g); - for (let s = 1; s < j.length; s += 2) - j.splice(s, 0, Pe.createElement('wbr', { key: s })); - const L = s('DeepLink'); - return Pe.createElement( - 'span', - { - className: i ? 'opblock-summary-path__deprecated' : 'opblock-summary-path', - 'data-path': _ - }, - Pe.createElement(L, { - enabled: C, - isShown: u, - path: createDeepLinkPath(`${w}/${x}`), - text: j - }) - ); - } - } - const operation_extensions = ({ extensions: s, getComponent: o }) => { - let i = o('OperationExtRow'); - return Pe.createElement( - 'div', - { className: 'opblock-section' }, - Pe.createElement( - 'div', - { className: 'opblock-section-header' }, - Pe.createElement('h4', null, 'Extensions') - ), - Pe.createElement( - 'div', - { className: 'table-container' }, - Pe.createElement( - 'table', - null, - Pe.createElement( - 'thead', - null, - Pe.createElement( - 'tr', - null, - Pe.createElement('td', { className: 'col_header' }, 'Field'), - Pe.createElement('td', { className: 'col_header' }, 'Value') - ) - ), - Pe.createElement( - 'tbody', - null, - s - .entrySeq() - .map(([s, o]) => Pe.createElement(i, { key: `${s}-${o}`, xKey: s, xVal: o })) - ) - ) - ) - ); - }, - operation_extension_row = ({ xKey: s, xVal: o }) => { - const i = o ? (o.toJS ? o.toJS() : o) : null; - return Pe.createElement( - 'tr', - null, - Pe.createElement('td', null, s), - Pe.createElement('td', null, JSON.stringify(i)) - ); - }; - function createHtmlReadyId(s, o = '_') { - return s.replace(/[^\w-]/g, o); - } - class responses_Responses extends Pe.Component { - static defaultProps = { - tryItOutResponse: null, - produces: (0, qe.fromJS)(['application/json']), - displayRequestDuration: !1 - }; - onChangeProducesWrapper = (s) => - this.props.specActions.changeProducesValue([this.props.path, this.props.method], s); - onResponseContentTypeChange = ({ controlsAcceptHeader: s, value: o }) => { - const { oas3Actions: i, path: u, method: _ } = this.props; - s && i.setResponseContentType({ value: o, path: u, method: _ }); - }; - render() { - let { - responses: s, - tryItOutResponse: o, - getComponent: i, - getConfigs: u, - specSelectors: _, - fn: w, - producesValue: x, - displayRequestDuration: C, - specPath: j, - path: L, - method: B, - oas3Selectors: $, - oas3Actions: V - } = this.props, - U = (function defaultStatusCode(s) { - let o = s.keySeq(); - return o.contains(At) - ? At - : o - .filter((s) => '2' === (s + '')[0]) - .sort() - .first(); - })(s); - const z = i('contentType'), - Y = i('liveResponse'), - Z = i('response'); - let ee = - this.props.produces && this.props.produces.size - ? this.props.produces - : responses_Responses.defaultProps.produces; - const ie = _.isOAS3() - ? (function getAcceptControllingResponse(s) { - if (!$e().OrderedMap.isOrderedMap(s)) return null; - if (!s.size) return null; - const o = s.find( - (s, o) => - o.startsWith('2') && Object.keys(s.get('content') || {}).length > 0 - ), - i = s.get('default') || $e().OrderedMap(), - u = (i.get('content') || $e().OrderedMap()).keySeq().toJS().length ? i : null; - return o || u; - })(s) - : null, - ae = createHtmlReadyId(`${B}${L}_responses`), - le = `${ae}_select`; - return Pe.createElement( - 'div', - { className: 'responses-wrapper' }, - Pe.createElement( - 'div', - { className: 'opblock-section-header' }, - Pe.createElement('h4', null, 'Responses'), - _.isOAS3() - ? null - : Pe.createElement( - 'label', - { htmlFor: le }, - Pe.createElement('span', null, 'Response content type'), - Pe.createElement(z, { - value: x, - ariaControls: ae, - ariaLabel: 'Response content type', - className: 'execute-content-type', - contentTypes: ee, - controlId: le, - onChange: this.onChangeProducesWrapper - }) - ) - ), - Pe.createElement( - 'div', - { className: 'responses-inner' }, - o - ? Pe.createElement( - 'div', - null, - Pe.createElement(Y, { - response: o, - getComponent: i, - getConfigs: u, - specSelectors: _, - path: this.props.path, - method: this.props.method, - displayRequestDuration: C - }), - Pe.createElement('h4', null, 'Responses') - ) - : null, - Pe.createElement( - 'table', - { 'aria-live': 'polite', className: 'responses-table', id: ae, role: 'region' }, - Pe.createElement( - 'thead', - null, - Pe.createElement( - 'tr', - { className: 'responses-header' }, - Pe.createElement( - 'td', - { className: 'col_header response-col_status' }, - 'Code' - ), - Pe.createElement( - 'td', - { className: 'col_header response-col_description' }, - 'Description' - ), - _.isOAS3() - ? Pe.createElement( - 'td', - { className: 'col col_header response-col_links' }, - 'Links' - ) - : null - ) - ), - Pe.createElement( - 'tbody', - null, - s - .entrySeq() - .map(([s, C]) => { - let z = o && o.get('status') == s ? 'response_current' : ''; - return Pe.createElement(Z, { - key: s, - path: L, - method: B, - specPath: j.push(s), - isDefault: U === s, - fn: w, - className: z, - code: s, - response: C, - specSelectors: _, - controlsAcceptHeader: C === ie, - onContentTypeChange: this.onResponseContentTypeChange, - contentType: x, - getConfigs: u, - activeExamplesKey: $.activeExamplesMember(L, B, 'responses', s), - oas3Actions: V, - getComponent: i - }); - }) - .toArray() - ) - ) - ) - ); - } - } - function getKnownSyntaxHighlighterLanguage(s) { - const o = (function canJsonParse(s) { - try { - return !!JSON.parse(s); - } catch (s) { - return null; - } - })(s); - return o ? 'json' : null; - } - class response_Response extends Pe.Component { - constructor(s, o) { - (super(s, o), (this.state = { responseContentType: '' })); - } - static defaultProps = { response: (0, qe.fromJS)({}), onContentTypeChange: () => {} }; - _onContentTypeChange = (s) => { - const { onContentTypeChange: o, controlsAcceptHeader: i } = this.props; - (this.setState({ responseContentType: s }), o({ value: s, controlsAcceptHeader: i })); - }; - getTargetExamplesKey = () => { - const { response: s, contentType: o, activeExamplesKey: i } = this.props, - u = this.state.responseContentType || o, - _ = s - .getIn(['content', u], (0, qe.Map)({})) - .get('examples', null) - .keySeq() - .first(); - return i || _; - }; - render() { - let { - path: s, - method: o, - code: i, - response: u, - className: _, - specPath: w, - fn: x, - getComponent: C, - getConfigs: j, - specSelectors: L, - contentType: B, - controlsAcceptHeader: $, - oas3Actions: V - } = this.props, - { inferSchema: U, getSampleSchema: z } = x, - Y = L.isOAS3(); - const { showExtensions: Z } = j(); - let ee = Z ? getExtensions(u) : null, - ie = u.get('headers'), - ae = u.get('links'); - const le = C('ResponseExtension'), - ce = C('headers'), - pe = C('HighlightCode', !0), - de = C('modelExample'), - fe = C('Markdown', !0), - ye = C('operationLink'), - be = C('contentType'), - _e = C('ExamplesSelect'), - we = C('Example'); - var Se, xe; - const Te = this.state.responseContentType || B, - Re = u.getIn(['content', Te], (0, qe.Map)({})), - $e = Re.get('examples', null); - if (Y) { - const s = Re.get('schema'); - ((Se = s ? U(s.toJS()) : null), - (xe = s ? (0, qe.List)(['content', this.state.responseContentType, 'schema']) : w)); - } else ((Se = u.get('schema')), (xe = u.has('schema') ? w.push('schema') : w)); - let ze, - We, - He = !1, - Ye = { includeReadOnly: !0 }; - if (Y) - if (((We = Re.get('schema')?.toJS()), qe.Map.isMap($e) && !$e.isEmpty())) { - const s = this.getTargetExamplesKey(), - getMediaTypeExample = (s) => s.get('value'); - ((ze = getMediaTypeExample($e.get(s, (0, qe.Map)({})))), - void 0 === ze && (ze = getMediaTypeExample($e.values().next().value)), - (He = !0)); - } else void 0 !== Re.get('example') && ((ze = Re.get('example')), (He = !0)); - else { - ((We = Se), (Ye = { ...Ye, includeWriteOnly: !0 })); - const s = u.getIn(['examples', Te]); - s && ((ze = s), (He = !0)); - } - const Xe = ((s, o) => { - if (null == s) return null; - const i = getKnownSyntaxHighlighterLanguage(s) ? 'json' : null; - return Pe.createElement( - 'div', - null, - Pe.createElement(o, { className: 'example', language: i }, stringify(s)) - ); - })(z(We, Te, Ye, He ? ze : void 0), pe); - return Pe.createElement( - 'tr', - { className: 'response ' + (_ || ''), 'data-code': i }, - Pe.createElement('td', { className: 'response-col_status' }, i), - Pe.createElement( - 'td', - { className: 'response-col_description' }, - Pe.createElement( - 'div', - { className: 'response-col_description__inner' }, - Pe.createElement(fe, { source: u.get('description') }) - ), - Z && ee.size - ? ee - .entrySeq() - .map(([s, o]) => Pe.createElement(le, { key: `${s}-${o}`, xKey: s, xVal: o })) - : null, - Y && u.get('content') - ? Pe.createElement( - 'section', - { className: 'response-controls' }, - Pe.createElement( - 'div', - { - className: Hn()('response-control-media-type', { - 'response-control-media-type--accept-controller': $ - }) - }, - Pe.createElement( - 'small', - { className: 'response-control-media-type__title' }, - 'Media type' - ), - Pe.createElement(be, { - value: this.state.responseContentType, - contentTypes: u.get('content') - ? u.get('content').keySeq() - : (0, qe.Seq)(), - onChange: this._onContentTypeChange, - ariaLabel: 'Media Type' - }), - $ - ? Pe.createElement( - 'small', - { className: 'response-control-media-type__accept-message' }, - 'Controls ', - Pe.createElement('code', null, 'Accept'), - ' header.' - ) - : null - ), - qe.Map.isMap($e) && !$e.isEmpty() - ? Pe.createElement( - 'div', - { className: 'response-control-examples' }, - Pe.createElement( - 'small', - { className: 'response-control-examples__title' }, - 'Examples' - ), - Pe.createElement(_e, { - examples: $e, - currentExampleKey: this.getTargetExamplesKey(), - onSelect: (u) => - V.setActiveExamplesMember({ - name: u, - pathMethod: [s, o], - contextType: 'responses', - contextName: i - }), - showLabels: !1 - }) - ) - : null - ) - : null, - Xe || Se - ? Pe.createElement(de, { - specPath: xe, - getComponent: C, - getConfigs: j, - specSelectors: L, - schema: fromJSOrdered(Se), - example: Xe, - includeReadOnly: !0 - }) - : null, - Y && $e - ? Pe.createElement(we, { - example: $e.get(this.getTargetExamplesKey(), (0, qe.Map)({})), - getComponent: C, - getConfigs: j, - omitValue: !0 - }) - : null, - ie ? Pe.createElement(ce, { headers: ie, getComponent: C }) : null - ), - Y - ? Pe.createElement( - 'td', - { className: 'response-col_links' }, - ae - ? ae - .toSeq() - .entrySeq() - .map(([s, o]) => - Pe.createElement(ye, { key: s, name: s, link: o, getComponent: C }) - ) - : Pe.createElement('i', null, 'No links') - ) - : null - ); - } - } - const response_extension = ({ xKey: s, xVal: o }) => - Pe.createElement('div', { className: 'response__extension' }, s, ': ', String(o)); - var vk = __webpack_require__(26657), - _k = __webpack_require__.n(vk), - wk = __webpack_require__(80218), - xk = __webpack_require__.n(wk); - class ResponseBody extends Pe.PureComponent { - state = { parsedContent: null }; - updateParsedContent = (s) => { - const { content: o } = this.props; - if (s !== o) - if (o && o instanceof Blob) { - var i = new FileReader(); - ((i.onload = () => { - this.setState({ parsedContent: i.result }); - }), - i.readAsText(o)); - } else this.setState({ parsedContent: o.toString() }); - }; - componentDidMount() { - this.updateParsedContent(null); - } - componentDidUpdate(s) { - this.updateParsedContent(s.content); - } - render() { - let { - content: s, - contentType: o, - url: i, - headers: u = {}, - getComponent: _ - } = this.props; - const { parsedContent: w } = this.state, - x = _('HighlightCode', !0), - C = 'response_' + new Date().getTime(); - let j, L; - if ( - ((i = i || ''), - (/^application\/octet-stream/i.test(o) || - (u['Content-Disposition'] && /attachment/i.test(u['Content-Disposition'])) || - (u['content-disposition'] && /attachment/i.test(u['content-disposition'])) || - (u['Content-Description'] && /File Transfer/i.test(u['Content-Description'])) || - (u['content-description'] && /File Transfer/i.test(u['content-description']))) && - (s.size > 0 || s.length > 0)) - ) - if ('Blob' in window) { - let _ = o || 'text/html', - w = s instanceof Blob ? s : new Blob([s], { type: _ }), - x = window.URL.createObjectURL(w), - C = [_, i.substr(i.lastIndexOf('/') + 1), x].join(':'), - j = u['content-disposition'] || u['Content-Disposition']; - if (void 0 !== j) { - let s = (function extractFileNameFromContentDispositionHeader(s) { - let o; - if ( - ([ - /filename\*=[^']+'\w*'"([^"]+)";?/i, - /filename\*=[^']+'\w*'([^;]+);?/i, - /filename="([^;]*);?"/i, - /filename=([^;]*);?/i - ].some((i) => ((o = i.exec(s)), null !== o)), - null !== o && o.length > 1) - ) - try { - return decodeURIComponent(o[1]); - } catch (s) { - console.error(s); - } - return null; - })(j); - null !== s && (C = s); - } - L = - at.navigator && at.navigator.msSaveOrOpenBlob - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'a', - { href: x, onClick: () => at.navigator.msSaveOrOpenBlob(w, C) }, - 'Download file' - ) - ) - : Pe.createElement( - 'div', - null, - Pe.createElement('a', { href: x, download: C }, 'Download file') - ); - } else - L = Pe.createElement( - 'pre', - { className: 'microlight' }, - 'Download headers detected but your browser does not support downloading binary via XHR (Blob).' - ); - else if (/json/i.test(o)) { - let o = null; - getKnownSyntaxHighlighterLanguage(s) && (o = 'json'); - try { - j = JSON.stringify(JSON.parse(s), null, ' '); - } catch (o) { - j = "can't parse JSON. Raw result:\n\n" + s; - } - L = Pe.createElement( - x, - { language: o, downloadable: !0, fileName: `${C}.json`, canCopy: !0 }, - j - ); - } else - /xml/i.test(o) - ? ((j = _k()(s, { textNodesOnSameLine: !0, indentor: ' ' })), - (L = Pe.createElement( - x, - { downloadable: !0, fileName: `${C}.xml`, canCopy: !0 }, - j - ))) - : (L = - 'text/html' === xk()(o) || /text\/plain/.test(o) - ? Pe.createElement( - x, - { downloadable: !0, fileName: `${C}.html`, canCopy: !0 }, - s - ) - : 'text/csv' === xk()(o) || /text\/csv/.test(o) - ? Pe.createElement( - x, - { downloadable: !0, fileName: `${C}.csv`, canCopy: !0 }, - s - ) - : /^image\//i.test(o) - ? o.includes('svg') - ? Pe.createElement('div', null, ' ', s, ' ') - : Pe.createElement('img', { src: window.URL.createObjectURL(s) }) - : /^audio\//i.test(o) - ? Pe.createElement( - 'pre', - { className: 'microlight' }, - Pe.createElement( - 'audio', - { controls: !0, key: i }, - Pe.createElement('source', { src: i, type: o }) - ) - ) - : 'string' == typeof s - ? Pe.createElement( - x, - { downloadable: !0, fileName: `${C}.txt`, canCopy: !0 }, - s - ) - : s.size > 0 - ? w - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'p', - { className: 'i' }, - 'Unrecognized response type; displaying content as text.' - ), - Pe.createElement( - x, - { downloadable: !0, fileName: `${C}.txt`, canCopy: !0 }, - w - ) - ) - : Pe.createElement( - 'p', - { className: 'i' }, - 'Unrecognized response type; unable to display.' - ) - : null); - return L - ? Pe.createElement('div', null, Pe.createElement('h5', null, 'Response body'), L) - : null; - } - } - class Parameters extends Pe.Component { - constructor(s) { - (super(s), (this.state = { callbackVisible: !1, parametersVisible: !0 })); - } - static defaultProps = { - onTryoutClick: Function.prototype, - onCancelClick: Function.prototype, - tryItOutEnabled: !1, - allowTryItOut: !0, - onChangeKey: [], - specPath: [] - }; - onChange = (s, o, i) => { - let { - specActions: { changeParamByIdentity: u }, - onChangeKey: _ - } = this.props; - u(_, s, o, i); - }; - onChangeConsumesWrapper = (s) => { - let { - specActions: { changeConsumesValue: o }, - onChangeKey: i - } = this.props; - o(i, s); - }; - toggleTab = (s) => - 'parameters' === s - ? this.setState({ parametersVisible: !0, callbackVisible: !1 }) - : 'callbacks' === s - ? this.setState({ callbackVisible: !0, parametersVisible: !1 }) - : void 0; - onChangeMediaType = ({ value: s, pathMethod: o }) => { - let { specActions: i, oas3Selectors: u, oas3Actions: _ } = this.props; - const w = u.hasUserEditedBody(...o), - x = u.shouldRetainRequestBodyValue(...o); - (_.setRequestContentType({ value: s, pathMethod: o }), - _.initRequestBodyValidateError({ pathMethod: o }), - w || - (x || _.setRequestBodyValue({ value: void 0, pathMethod: o }), - i.clearResponse(...o), - i.clearRequest(...o), - i.clearValidateParams(o))); - }; - render() { - let { - onTryoutClick: s, - onResetClick: o, - parameters: i, - allowTryItOut: u, - tryItOutEnabled: _, - specPath: w, - fn: x, - getComponent: C, - getConfigs: j, - specSelectors: L, - specActions: B, - pathMethod: $, - oas3Actions: V, - oas3Selectors: U, - operation: z - } = this.props; - const Y = C('parameterRow'), - Z = C('TryItOutButton'), - ee = C('contentType'), - ie = C('Callbacks', !0), - ae = C('RequestBody', !0), - le = _ && u, - ce = L.isOAS3(), - pe = `${createHtmlReadyId(`${$[1]}${$[0]}_requests`)}_select`, - de = z.get('requestBody'), - fe = Object.values( - i.reduce((s, o) => { - const i = o.get('in'); - return ((s[i] ??= []), s[i].push(o), s); - }, {}) - ).reduce((s, o) => s.concat(o), []); - return Pe.createElement( - 'div', - { className: 'opblock-section' }, - Pe.createElement( - 'div', - { className: 'opblock-section-header' }, - ce - ? Pe.createElement( - 'div', - { className: 'tab-header' }, - Pe.createElement( - 'div', - { - onClick: () => this.toggleTab('parameters'), - className: `tab-item ${this.state.parametersVisible && 'active'}` - }, - Pe.createElement( - 'h4', - { className: 'opblock-title' }, - Pe.createElement('span', null, 'Parameters') - ) - ), - z.get('callbacks') - ? Pe.createElement( - 'div', - { - onClick: () => this.toggleTab('callbacks'), - className: `tab-item ${this.state.callbackVisible && 'active'}` - }, - Pe.createElement( - 'h4', - { className: 'opblock-title' }, - Pe.createElement('span', null, 'Callbacks') - ) - ) - : null - ) - : Pe.createElement( - 'div', - { className: 'tab-header' }, - Pe.createElement('h4', { className: 'opblock-title' }, 'Parameters') - ), - u - ? Pe.createElement(Z, { - isOAS3: L.isOAS3(), - hasUserEditedBody: U.hasUserEditedBody(...$), - enabled: _, - onCancelClick: this.props.onCancelClick, - onTryoutClick: s, - onResetClick: () => o($) - }) - : null - ), - this.state.parametersVisible - ? Pe.createElement( - 'div', - { className: 'parameters-container' }, - fe.length - ? Pe.createElement( - 'div', - { className: 'table-container' }, - Pe.createElement( - 'table', - { className: 'parameters' }, - Pe.createElement( - 'thead', - null, - Pe.createElement( - 'tr', - null, - Pe.createElement( - 'th', - { className: 'col_header parameters-col_name' }, - 'Name' - ), - Pe.createElement( - 'th', - { className: 'col_header parameters-col_description' }, - 'Description' - ) - ) - ), - Pe.createElement( - 'tbody', - null, - fe.map((s, o) => - Pe.createElement(Y, { - fn: x, - specPath: w.push(o.toString()), - getComponent: C, - getConfigs: j, - rawParam: s, - param: L.parameterWithMetaByIdentity($, s), - key: `${s.get('in')}.${s.get('name')}`, - onChange: this.onChange, - onChangeConsumes: this.onChangeConsumesWrapper, - specSelectors: L, - specActions: B, - oas3Actions: V, - oas3Selectors: U, - pathMethod: $, - isExecute: le - }) - ) - ) - ) - ) - : Pe.createElement( - 'div', - { className: 'opblock-description-wrapper' }, - Pe.createElement('p', null, 'No parameters') - ) - ) - : null, - this.state.callbackVisible - ? Pe.createElement( - 'div', - { className: 'callbacks-container opblock-description-wrapper' }, - Pe.createElement(ie, { - callbacks: (0, qe.Map)(z.get('callbacks')), - specPath: w.slice(0, -1).push('callbacks') - }) - ) - : null, - ce && - de && - this.state.parametersVisible && - Pe.createElement( - 'div', - { className: 'opblock-section opblock-section-request-body' }, - Pe.createElement( - 'div', - { className: 'opblock-section-header' }, - Pe.createElement( - 'h4', - { - className: `opblock-title parameter__name ${de.get('required') && 'required'}` - }, - 'Request body' - ), - Pe.createElement( - 'label', - { id: pe }, - Pe.createElement(ee, { - value: U.requestContentType(...$), - contentTypes: de.get('content', (0, qe.List)()).keySeq(), - onChange: (s) => { - this.onChangeMediaType({ value: s, pathMethod: $ }); - }, - className: 'body-param-content-type', - ariaLabel: 'Request content type', - controlId: pe - }) - ) - ), - Pe.createElement( - 'div', - { className: 'opblock-description-wrapper' }, - Pe.createElement(ae, { - setRetainRequestBodyValueFlag: (s) => - V.setRetainRequestBodyValueFlag({ value: s, pathMethod: $ }), - userHasEditedBody: U.hasUserEditedBody(...$), - specPath: w.slice(0, -1).push('requestBody'), - requestBody: de, - requestBodyValue: U.requestBodyValue(...$), - requestBodyInclusionSetting: U.requestBodyInclusionSetting(...$), - requestBodyErrors: U.requestBodyErrors(...$), - isExecute: le, - getConfigs: j, - activeExamplesKey: U.activeExamplesMember(...$, 'requestBody', 'requestBody'), - updateActiveExamplesKey: (s) => { - this.props.oas3Actions.setActiveExamplesMember({ - name: s, - pathMethod: this.props.pathMethod, - contextType: 'requestBody', - contextName: 'requestBody' - }); - }, - onChange: (s, o) => { - if (o) { - const i = U.requestBodyValue(...$), - u = qe.Map.isMap(i) ? i : (0, qe.Map)(); - return V.setRequestBodyValue({ pathMethod: $, value: u.setIn(o, s) }); - } - V.setRequestBodyValue({ value: s, pathMethod: $ }); - }, - onChangeIncludeEmpty: (s, o) => { - V.setRequestBodyInclusion({ pathMethod: $, value: o, name: s }); - }, - contentType: U.requestContentType(...$) - }) - ) - ) - ); - } - } - const parameter_extension = ({ xKey: s, xVal: o }) => - Pe.createElement('div', { className: 'parameter__extension' }, s, ': ', String(o)), - Ak = { onChange: () => {}, isIncludedOptions: {} }; - class ParameterIncludeEmpty extends Pe.Component { - static defaultProps = Ak; - componentDidMount() { - const { isIncludedOptions: s, onChange: o } = this.props, - { shouldDispatchInit: i, defaultValue: u } = s; - i && o(u); - } - onCheckboxChange = (s) => { - const { onChange: o } = this.props; - o(s.target.checked); - }; - render() { - let { isIncluded: s, isDisabled: o } = this.props; - return Pe.createElement( - 'div', - null, - Pe.createElement( - 'label', - { - htmlFor: 'include_empty_value', - className: Hn()('parameter__empty_value_toggle', { disabled: o }) - }, - Pe.createElement('input', { - id: 'include_empty_value', - type: 'checkbox', - disabled: o, - checked: !o && s, - onChange: this.onCheckboxChange - }), - 'Send empty value' - ) - ); - } - } - class ParameterRow extends Pe.Component { - constructor(s, o) { - (super(s, o), this.setDefaultValue()); - } - UNSAFE_componentWillReceiveProps(s) { - let o, - { specSelectors: i, pathMethod: u, rawParam: _ } = s, - w = i.isOAS3(), - x = i.parameterWithMetaByIdentity(u, _) || new qe.Map(); - if (((x = x.isEmpty() ? _ : x), w)) { - let { schema: s } = getParameterSchema(x, { isOAS3: w }); - o = s ? s.get('enum') : void 0; - } else o = x ? x.get('enum') : void 0; - let C, - j = x ? x.get('value') : void 0; - (void 0 !== j ? (C = j) : _.get('required') && o && o.size && (C = o.first()), - void 0 !== C && - C !== j && - this.onChangeWrapper( - (function numberToString(s) { - return 'number' == typeof s ? s.toString() : s; - })(C) - ), - this.setDefaultValue()); - } - onChangeWrapper = (s, o = !1) => { - let i, - { onChange: u, rawParam: _ } = this.props; - return ((i = '' === s || (s && 0 === s.size) ? null : s), u(_, i, o)); - }; - _onExampleSelect = (s) => { - this.props.oas3Actions.setActiveExamplesMember({ - name: s, - pathMethod: this.props.pathMethod, - contextType: 'parameters', - contextName: this.getParamKey() - }); - }; - onChangeIncludeEmpty = (s) => { - let { specActions: o, param: i, pathMethod: u } = this.props; - const _ = i.get('name'), - w = i.get('in'); - return o.updateEmptyParamInclusion(u, _, w, s); - }; - setDefaultValue = () => { - let { - specSelectors: s, - pathMethod: o, - rawParam: i, - oas3Selectors: u, - fn: _ - } = this.props; - const w = s.parameterWithMetaByIdentity(o, i) || (0, qe.Map)(); - let { schema: x } = getParameterSchema(w, { isOAS3: s.isOAS3() }); - const C = w - .get('content', (0, qe.Map)()) - .keySeq() - .first(), - j = x ? _.getSampleSchema(x.toJS(), C, { includeWriteOnly: !0 }) : null; - if (w && void 0 === w.get('value') && 'body' !== w.get('in')) { - let i; - if (s.isSwagger2()) - i = - void 0 !== w.get('x-example') - ? w.get('x-example') - : void 0 !== w.getIn(['schema', 'example']) - ? w.getIn(['schema', 'example']) - : x && x.getIn(['default']); - else if (s.isOAS3()) { - x = this.composeJsonSchema(x); - const s = u.activeExamplesMember(...o, 'parameters', this.getParamKey()); - i = - void 0 !== w.getIn(['examples', s, 'value']) - ? w.getIn(['examples', s, 'value']) - : void 0 !== w.getIn(['content', C, 'example']) - ? w.getIn(['content', C, 'example']) - : void 0 !== w.get('example') - ? w.get('example') - : void 0 !== (x && x.get('example')) - ? x && x.get('example') - : void 0 !== (x && x.get('default')) - ? x && x.get('default') - : w.get('default'); - } - (void 0 === i || qe.List.isList(i) || (i = stringify(i)), - void 0 !== i - ? this.onChangeWrapper(i) - : x && - 'object' === x.get('type') && - j && - !w.get('examples') && - this.onChangeWrapper(qe.List.isList(j) ? j : stringify(j))); - } - }; - getParamKey() { - const { param: s } = this.props; - return s ? `${s.get('name')}-${s.get('in')}` : null; - } - composeJsonSchema(s) { - const { fn: o } = this.props, - i = s.get('oneOf')?.get(0)?.toJS(), - u = s.get('anyOf')?.get(0)?.toJS(); - return (0, qe.fromJS)(o.mergeJsonSchema(s.toJS(), i ?? u ?? {})); - } - render() { - let { - param: s, - rawParam: o, - getComponent: i, - getConfigs: u, - isExecute: _, - fn: w, - onChangeConsumes: x, - specSelectors: C, - pathMethod: j, - specPath: L, - oas3Selectors: B - } = this.props, - $ = C.isOAS3(); - const { showExtensions: V, showCommonExtensions: U } = u(); - if ((s || (s = o), !o)) return null; - const z = i('JsonSchemaForm'), - Y = i('ParamBody'); - let Z = s.get('in'), - ee = - 'body' !== Z - ? null - : Pe.createElement(Y, { - getComponent: i, - getConfigs: u, - fn: w, - param: s, - consumes: C.consumesOptionsFor(j), - consumesValue: C.contentTypeValues(j).get('requestContentType'), - onChange: this.onChangeWrapper, - onChangeConsumes: x, - isExecute: _, - specSelectors: C, - pathMethod: j - }); - const ie = i('modelExample'), - ae = i('Markdown', !0), - le = i('ParameterExt'), - ce = i('ParameterIncludeEmpty'), - pe = i('ExamplesSelectValueRetainer'), - de = i('Example'); - let { schema: fe } = getParameterSchema(s, { isOAS3: $ }), - ye = C.parameterWithMetaByIdentity(j, o) || (0, qe.Map)(); - $ && (fe = this.composeJsonSchema(fe)); - let be, - _e, - we, - Se, - xe = fe ? fe.get('format') : null, - Te = fe ? fe.get('type') : null, - Re = fe ? fe.getIn(['items', 'type']) : null, - $e = 'formData' === Z, - ze = 'FormData' in at, - We = s.get('required'), - He = ye ? ye.get('value') : '', - Ye = U ? getCommonExtensions(fe) : null, - Xe = V ? getExtensions(s) : null, - Qe = !1; - return ( - void 0 !== s && fe && (be = fe.get('items')), - void 0 !== be - ? ((_e = be.get('enum')), (we = be.get('default'))) - : fe && (_e = fe.get('enum')), - _e && _e.size && _e.size > 0 && (Qe = !0), - void 0 !== s && - (fe && (we = fe.get('default')), - void 0 === we && (we = s.get('default')), - (Se = s.get('example')), - void 0 === Se && (Se = s.get('x-example'))), - Pe.createElement( - 'tr', - { 'data-param-name': s.get('name'), 'data-param-in': s.get('in') }, - Pe.createElement( - 'td', - { className: 'parameters-col_name' }, - Pe.createElement( - 'div', - { className: We ? 'parameter__name required' : 'parameter__name' }, - s.get('name'), - We ? Pe.createElement('span', null, ' *') : null - ), - Pe.createElement( - 'div', - { className: 'parameter__type' }, - Te, - Re && `[${Re}]`, - xe && Pe.createElement('span', { className: 'prop-format' }, '($', xe, ')') - ), - Pe.createElement( - 'div', - { className: 'parameter__deprecated' }, - $ && s.get('deprecated') ? 'deprecated' : null - ), - Pe.createElement('div', { className: 'parameter__in' }, '(', s.get('in'), ')') - ), - Pe.createElement( - 'td', - { className: 'parameters-col_description' }, - s.get('description') - ? Pe.createElement(ae, { source: s.get('description') }) - : null, - (!ee && _) || !Qe - ? null - : Pe.createElement(ae, { - className: 'parameter__enum', - source: - 'Available values : ' + - _e - .map(function (s) { - return s; - }) - .toArray() - .map(String) - .join(', ') - }), - (!ee && _) || void 0 === we - ? null - : Pe.createElement(ae, { - className: 'parameter__default', - source: 'Default value : ' + we - }), - (!ee && _) || void 0 === Se - ? null - : Pe.createElement(ae, { source: 'Example : ' + Se }), - $e && - !ze && - Pe.createElement('div', null, 'Error: your browser does not support FormData'), - $ && s.get('examples') - ? Pe.createElement( - 'section', - { className: 'parameter-controls' }, - Pe.createElement(pe, { - examples: s.get('examples'), - onSelect: this._onExampleSelect, - updateValue: this.onChangeWrapper, - getComponent: i, - defaultToFirstExample: !0, - currentKey: B.activeExamplesMember( - ...j, - 'parameters', - this.getParamKey() - ), - currentUserInputValue: He - }) - ) - : null, - ee - ? null - : Pe.createElement(z, { - fn: w, - getComponent: i, - value: He, - required: We, - disabled: !_, - description: s.get('name'), - onChange: this.onChangeWrapper, - errors: ye.get('errors'), - schema: fe - }), - ee && fe - ? Pe.createElement(ie, { - getComponent: i, - specPath: L.push('schema'), - getConfigs: u, - isExecute: _, - specSelectors: C, - schema: fe, - example: ee, - includeWriteOnly: !0 - }) - : null, - !ee && _ && s.get('allowEmptyValue') - ? Pe.createElement(ce, { - onChange: this.onChangeIncludeEmpty, - isIncluded: C.parameterInclusionSettingFor(j, s.get('name'), s.get('in')), - isDisabled: !isEmptyValue(He) - }) - : null, - $ && s.get('examples') - ? Pe.createElement(de, { - example: s.getIn([ - 'examples', - B.activeExamplesMember(...j, 'parameters', this.getParamKey()) - ]), - getComponent: i, - getConfigs: u - }) - : null, - U && Ye.size - ? Ye.entrySeq().map(([s, o]) => - Pe.createElement(le, { key: `${s}-${o}`, xKey: s, xVal: o }) - ) - : null, - V && Xe.size - ? Xe.entrySeq().map(([s, o]) => - Pe.createElement(le, { key: `${s}-${o}`, xKey: s, xVal: o }) - ) - : null - ) - ) - ); - } - } - class Execute extends Pe.Component { - handleValidateParameters = () => { - let { specSelectors: s, specActions: o, path: i, method: u } = this.props; - return (o.validateParams([i, u]), s.validateBeforeExecute([i, u])); - }; - handleValidateRequestBody = () => { - let { - path: s, - method: o, - specSelectors: i, - oas3Selectors: u, - oas3Actions: _ - } = this.props, - w = { missingBodyValue: !1, missingRequiredKeys: [] }; - _.clearRequestBodyValidateError({ path: s, method: o }); - let x = i.getOAS3RequiredRequestBodyContentType([s, o]), - C = u.requestBodyValue(s, o), - j = u.validateBeforeExecute([s, o]), - L = u.requestContentType(s, o); - if (!j) - return ( - (w.missingBodyValue = !0), - _.setRequestBodyValidateError({ path: s, method: o, validationErrors: w }), - !1 - ); - if (!x) return !0; - let B = u.validateShallowRequired({ - oas3RequiredRequestBodyContentType: x, - oas3RequestContentType: L, - oas3RequestBodyValue: C - }); - return ( - !B || - B.length < 1 || - (B.forEach((s) => { - w.missingRequiredKeys.push(s); - }), - _.setRequestBodyValidateError({ path: s, method: o, validationErrors: w }), - !1) - ); - }; - handleValidationResultPass = () => { - let { specActions: s, operation: o, path: i, method: u } = this.props; - (this.props.onExecute && this.props.onExecute(), - s.execute({ operation: o, path: i, method: u })); - }; - handleValidationResultFail = () => { - let { specActions: s, path: o, method: i } = this.props; - (s.clearValidateParams([o, i]), - setTimeout(() => { - s.validateParams([o, i]); - }, 40)); - }; - handleValidationResult = (s) => { - s ? this.handleValidationResultPass() : this.handleValidationResultFail(); - }; - onClick = () => { - let s = this.handleValidateParameters(), - o = this.handleValidateRequestBody(), - i = s && o; - this.handleValidationResult(i); - }; - onChangeProducesWrapper = (s) => - this.props.specActions.changeProducesValue([this.props.path, this.props.method], s); - render() { - const { disabled: s } = this.props; - return Pe.createElement( - 'button', - { className: 'btn execute opblock-control__btn', onClick: this.onClick, disabled: s }, - 'Execute' - ); - } - } - class headers_Headers extends Pe.Component { - render() { - let { headers: s, getComponent: o } = this.props; - const i = o('Property'), - u = o('Markdown', !0); - return s && s.size - ? Pe.createElement( - 'div', - { className: 'headers-wrapper' }, - Pe.createElement('h4', { className: 'headers__title' }, 'Headers:'), - Pe.createElement( - 'table', - { className: 'headers' }, - Pe.createElement( - 'thead', - null, - Pe.createElement( - 'tr', - { className: 'header-row' }, - Pe.createElement('th', { className: 'header-col' }, 'Name'), - Pe.createElement('th', { className: 'header-col' }, 'Description'), - Pe.createElement('th', { className: 'header-col' }, 'Type') - ) - ), - Pe.createElement( - 'tbody', - null, - s - .entrySeq() - .map(([s, o]) => { - if (!$e().Map.isMap(o)) return null; - const _ = o.get('description'), - w = o.getIn(['schema']) - ? o.getIn(['schema', 'type']) - : o.getIn(['type']), - x = o.getIn(['schema', 'example']); - return Pe.createElement( - 'tr', - { key: s }, - Pe.createElement('td', { className: 'header-col' }, s), - Pe.createElement( - 'td', - { className: 'header-col' }, - _ ? Pe.createElement(u, { source: _ }) : null - ), - Pe.createElement( - 'td', - { className: 'header-col' }, - w, - ' ', - x - ? Pe.createElement(i, { - propKey: 'Example', - propVal: x, - propClass: 'header-example' - }) - : null - ) - ); - }) - .toArray() - ) - ) - ) - : null; - } - } - class Errors extends Pe.Component { - render() { - let { - editorActions: s, - errSelectors: o, - layoutSelectors: i, - layoutActions: u, - getComponent: _ - } = this.props; - const w = _('Collapse'); - if (s && s.jumpToLine) var x = s.jumpToLine; - let C = o - .allErrors() - .filter((s) => 'thrown' === s.get('type') || 'error' === s.get('level')); - if (!C || C.count() < 1) return null; - let j = i.isShown(['errorPane'], !0), - L = C.sortBy((s) => s.get('line')); - return Pe.createElement( - 'pre', - { className: 'errors-wrapper' }, - Pe.createElement( - 'hgroup', - { className: 'error' }, - Pe.createElement('h4', { className: 'errors__title' }, 'Errors'), - Pe.createElement( - 'button', - { className: 'btn errors__clear-btn', onClick: () => u.show(['errorPane'], !j) }, - j ? 'Hide' : 'Show' - ) - ), - Pe.createElement( - w, - { isOpened: j, animated: !0 }, - Pe.createElement( - 'div', - { className: 'errors' }, - L.map((s, o) => { - let i = s.get('type'); - return 'thrown' === i || 'auth' === i - ? Pe.createElement(ThrownErrorItem, { - key: o, - error: s.get('error') || s, - jumpToLine: x - }) - : 'spec' === i - ? Pe.createElement(SpecErrorItem, { key: o, error: s, jumpToLine: x }) - : void 0; - }) - ) - ) - ); - } - } - const ThrownErrorItem = ({ error: s, jumpToLine: o }) => { - if (!s) return null; - let i = s.get('line'); - return Pe.createElement( - 'div', - { className: 'error-wrapper' }, - s - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - s.get('source') && s.get('level') - ? toTitleCase(s.get('source')) + ' ' + s.get('level') - : '', - s.get('path') ? Pe.createElement('small', null, ' at ', s.get('path')) : null - ), - Pe.createElement('span', { className: 'message thrown' }, s.get('message')), - Pe.createElement( - 'div', - { className: 'error-line' }, - i && o - ? Pe.createElement('a', { onClick: o.bind(null, i) }, 'Jump to line ', i) - : null - ) - ) - : null - ); - }, - SpecErrorItem = ({ error: s, jumpToLine: o = null }) => { - let i = null; - return ( - s.get('path') - ? (i = qe.List.isList(s.get('path')) - ? Pe.createElement('small', null, 'at ', s.get('path').join('.')) - : Pe.createElement('small', null, 'at ', s.get('path'))) - : s.get('line') && - !o && - (i = Pe.createElement('small', null, 'on line ', s.get('line'))), - Pe.createElement( - 'div', - { className: 'error-wrapper' }, - s - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - toTitleCase(s.get('source')) + ' ' + s.get('level'), - ' ', - i - ), - Pe.createElement('span', { className: 'message' }, s.get('message')), - Pe.createElement( - 'div', - { className: 'error-line' }, - o - ? Pe.createElement( - 'a', - { onClick: o.bind(null, s.get('line')) }, - 'Jump to line ', - s.get('line') - ) - : null - ) - ) - : null - ) - ); - }; - function toTitleCase(s) { - return (s || '') - .split(' ') - .map((s) => s[0].toUpperCase() + s.slice(1)) - .join(' '); - } - const content_type_noop = () => {}; - class ContentType extends Pe.Component { - static defaultProps = { - onChange: content_type_noop, - value: null, - contentTypes: (0, qe.fromJS)(['application/json']) - }; - componentDidMount() { - this.props.contentTypes && this.props.onChange(this.props.contentTypes.first()); - } - UNSAFE_componentWillReceiveProps(s) { - s.contentTypes && - s.contentTypes.size && - (s.contentTypes.includes(s.value) || s.onChange(s.contentTypes.first())); - } - onChangeWrapper = (s) => this.props.onChange(s.target.value); - render() { - let { - ariaControls: s, - ariaLabel: o, - className: i, - contentTypes: u, - controlId: _, - value: w - } = this.props; - return u && u.size - ? Pe.createElement( - 'div', - { className: 'content-type-wrapper ' + (i || '') }, - Pe.createElement( - 'select', - { - 'aria-controls': s, - 'aria-label': o, - className: 'content-type', - id: _, - onChange: this.onChangeWrapper, - value: w || '' - }, - u.map((s) => Pe.createElement('option', { key: s, value: s }, s)).toArray() - ) - ) - : null; - } - } - function xclass(...s) { - return s - .filter((s) => !!s) - .join(' ') - .trim(); - } - class Container extends Pe.Component { - render() { - let { fullscreen: s, full: o, ...i } = this.props; - if (s) return Pe.createElement('section', i); - let u = 'swagger-container' + (o ? '-full' : ''); - return Pe.createElement('section', Rn()({}, i, { className: xclass(i.className, u) })); - } - } - const Bk = { mobile: '', tablet: '-tablet', desktop: '-desktop', large: '-hd' }; - class Col extends Pe.Component { - render() { - const { - hide: s, - keepContents: o, - mobile: i, - tablet: u, - desktop: _, - large: w, - ...x - } = this.props; - if (s && !o) return Pe.createElement('span', null); - let C = []; - for (let s in Bk) { - if (!Object.prototype.hasOwnProperty.call(Bk, s)) continue; - let o = Bk[s]; - if (s in this.props) { - let i = this.props[s]; - if (i < 1) { - C.push('none' + o); - continue; - } - (C.push('block' + o), C.push('col-' + i + o)); - } - } - s && C.push('hidden'); - let j = xclass(x.className, ...C); - return Pe.createElement('section', Rn()({}, x, { className: j })); - } - } - class Row extends Pe.Component { - render() { - return Pe.createElement( - 'div', - Rn()({}, this.props, { className: xclass(this.props.className, 'wrapper') }) - ); - } - } - class Button extends Pe.Component { - static defaultProps = { className: '' }; - render() { - return Pe.createElement( - 'button', - Rn()({}, this.props, { className: xclass(this.props.className, 'button') }) - ); - } - } - const TextArea = (s) => Pe.createElement('textarea', s), - Input = (s) => Pe.createElement('input', s); - class Select extends Pe.Component { - static defaultProps = { multiple: !1, allowEmptyValue: !0 }; - constructor(s, o) { - let i; - (super(s, o), - (i = s.value ? s.value : s.multiple ? [''] : ''), - (this.state = { value: i })); - } - onChange = (s) => { - let o, - { onChange: i, multiple: u } = this.props, - _ = [].slice.call(s.target.options); - ((o = u - ? _.filter(function (s) { - return s.selected; - }).map(function (s) { - return s.value; - }) - : s.target.value), - this.setState({ value: o }), - i && i(o)); - }; - UNSAFE_componentWillReceiveProps(s) { - s.value !== this.props.value && this.setState({ value: s.value }); - } - render() { - let { allowedValues: s, multiple: o, allowEmptyValue: i, disabled: u } = this.props, - _ = this.state.value?.toJS?.() || this.state.value; - return Pe.createElement( - 'select', - { - className: this.props.className, - multiple: o, - value: _, - onChange: this.onChange, - disabled: u - }, - i ? Pe.createElement('option', { value: '' }, '--') : null, - s.map(function (s, o) { - return Pe.createElement('option', { key: o, value: String(s) }, String(s)); - }) - ); - } - } - class layout_utils_Link extends Pe.Component { - render() { - return Pe.createElement( - 'a', - Rn()({}, this.props, { - rel: 'noopener noreferrer', - className: xclass(this.props.className, 'link') - }) - ); - } - } - const NoMargin = ({ children: s }) => - Pe.createElement('div', { className: 'no-margin' }, ' ', s, ' '); - class Collapse extends Pe.Component { - static defaultProps = { isOpened: !1, animated: !1 }; - renderNotAnimated() { - return this.props.isOpened - ? Pe.createElement(NoMargin, null, this.props.children) - : Pe.createElement('noscript', null); - } - render() { - let { animated: s, isOpened: o, children: i } = this.props; - return s - ? ((i = o ? i : null), Pe.createElement(NoMargin, null, i)) - : this.renderNotAnimated(); - } - } - class Overview extends Pe.Component { - constructor(...s) { - (super(...s), (this.setTagShown = this._setTagShown.bind(this))); - } - _setTagShown(s, o) { - this.props.layoutActions.show(s, o); - } - showOp(s, o) { - let { layoutActions: i } = this.props; - i.show(s, o); - } - render() { - let { - specSelectors: s, - layoutSelectors: o, - layoutActions: i, - getComponent: u - } = this.props, - _ = s.taggedOperations(); - const w = u('Collapse'); - return Pe.createElement( - 'div', - null, - Pe.createElement('h4', { className: 'overview-title' }, 'Overview'), - _.map((s, u) => { - let _ = s.get('operations'), - x = ['overview-tags', u], - C = o.isShown(x, !0); - return Pe.createElement( - 'div', - { key: 'overview-' + u }, - Pe.createElement( - 'h4', - { onClick: () => i.show(x, !C), className: 'link overview-tag' }, - ' ', - C ? '-' : '+', - u - ), - Pe.createElement( - w, - { isOpened: C, animated: !0 }, - _.map((s) => { - let { path: u, method: _, id: w } = s.toObject(), - x = 'operations', - C = w, - j = o.isShown([x, C]); - return Pe.createElement(OperationLink, { - key: w, - path: u, - method: _, - id: u + '-' + _, - shown: j, - showOpId: C, - showOpIdPrefix: x, - href: `#operation-${C}`, - onClick: i.show - }); - }).toArray() - ) - ); - }).toArray(), - _.size < 1 && Pe.createElement('h3', null, ' No operations defined in spec! ') - ); - } - } - class OperationLink extends Pe.Component { - constructor(s) { - (super(s), (this.onClick = this._onClick.bind(this))); - } - _onClick() { - let { showOpId: s, showOpIdPrefix: o, onClick: i, shown: u } = this.props; - i([o, s], !u); - } - render() { - let { id: s, method: o, shown: i, href: u } = this.props; - return Pe.createElement( - layout_utils_Link, - { - href: u, - onClick: this.onClick, - className: 'block opblock-link ' + (i ? 'shown' : '') - }, - Pe.createElement( - 'div', - null, - Pe.createElement('small', { className: `bold-label-${o}` }, o.toUpperCase()), - Pe.createElement('span', { className: 'bold-label' }, s) - ) - ); - } - } - class InitializedInput extends Pe.Component { - componentDidMount() { - this.props.initialValue && (this.inputRef.value = this.props.initialValue); - } - render() { - const { value: s, defaultValue: o, initialValue: i, ...u } = this.props; - return Pe.createElement('input', Rn()({}, u, { ref: (s) => (this.inputRef = s) })); - } - } - class InfoBasePath extends Pe.Component { - render() { - const { host: s, basePath: o } = this.props; - return Pe.createElement('pre', { className: 'base-url' }, '[ Base URL: ', s, o, ' ]'); - } - } - class InfoUrl extends Pe.PureComponent { - render() { - const { url: s, getComponent: o } = this.props, - i = o('Link'); - return Pe.createElement( - i, - { target: '_blank', href: sanitizeUrl(s) }, - Pe.createElement('span', { className: 'url' }, ' ', s) - ); - } - } - class info_Info extends Pe.Component { - render() { - const { - info: s, - url: o, - host: i, - basePath: u, - getComponent: _, - externalDocs: w, - selectedServer: x, - url: C - } = this.props, - j = s.get('version'), - L = s.get('description'), - B = s.get('title'), - $ = safeBuildUrl(s.get('termsOfService'), C, { selectedServer: x }), - V = s.get('contact'), - U = s.get('license'), - z = safeBuildUrl(w && w.get('url'), C, { selectedServer: x }), - Y = w && w.get('description'), - Z = _('Markdown', !0), - ee = _('Link'), - ie = _('VersionStamp'), - ae = _('OpenAPIVersion'), - le = _('InfoUrl'), - ce = _('InfoBasePath'), - pe = _('License'), - de = _('Contact'); - return Pe.createElement( - 'div', - { className: 'info' }, - Pe.createElement( - 'hgroup', - { className: 'main' }, - Pe.createElement( - 'h2', - { className: 'title' }, - B, - Pe.createElement( - 'span', - null, - j && Pe.createElement(ie, { version: j }), - Pe.createElement(ae, { oasVersion: '2.0' }) - ) - ), - i || u ? Pe.createElement(ce, { host: i, basePath: u }) : null, - o && Pe.createElement(le, { getComponent: _, url: o }) - ), - Pe.createElement( - 'div', - { className: 'description' }, - Pe.createElement(Z, { source: L }) - ), - $ && - Pe.createElement( - 'div', - { className: 'info__tos' }, - Pe.createElement( - ee, - { target: '_blank', href: sanitizeUrl($) }, - 'Terms of service' - ) - ), - V?.size > 0 && - Pe.createElement(de, { getComponent: _, data: V, selectedServer: x, url: o }), - U?.size > 0 && - Pe.createElement(pe, { getComponent: _, license: U, selectedServer: x, url: o }), - z - ? Pe.createElement( - ee, - { className: 'info__extdocs', target: '_blank', href: sanitizeUrl(z) }, - Y || z - ) - : null - ); - } - } - const qk = info_Info; - class InfoContainer extends Pe.Component { - render() { - const { specSelectors: s, getComponent: o, oas3Selectors: i } = this.props, - u = s.info(), - _ = s.url(), - w = s.basePath(), - x = s.host(), - C = s.externalDocs(), - j = i.selectedServer(), - L = o('info'); - return Pe.createElement( - 'div', - null, - u && u.count() - ? Pe.createElement(L, { - info: u, - url: _, - host: x, - basePath: w, - externalDocs: C, - getComponent: o, - selectedServer: j - }) - : null - ); - } - } - class contact_Contact extends Pe.Component { - render() { - const { data: s, getComponent: o, selectedServer: i, url: u } = this.props, - _ = s.get('name', 'the developer'), - w = safeBuildUrl(s.get('url'), u, { selectedServer: i }), - x = s.get('email'), - C = o('Link'); - return Pe.createElement( - 'div', - { className: 'info__contact' }, - w && - Pe.createElement( - 'div', - null, - Pe.createElement(C, { href: sanitizeUrl(w), target: '_blank' }, _, ' - Website') - ), - x && - Pe.createElement( - C, - { href: sanitizeUrl(`mailto:${x}`) }, - w ? `Send email to ${_}` : `Contact ${_}` - ) - ); - } - } - const Vk = contact_Contact; - class license_License extends Pe.Component { - render() { - const { license: s, getComponent: o, selectedServer: i, url: u } = this.props, - _ = s.get('name', 'License'), - w = safeBuildUrl(s.get('url'), u, { selectedServer: i }), - x = o('Link'); - return Pe.createElement( - 'div', - { className: 'info__license' }, - w - ? Pe.createElement( - 'div', - { className: 'info__license__url' }, - Pe.createElement(x, { target: '_blank', href: sanitizeUrl(w) }, _) - ) - : Pe.createElement('span', null, _) - ); - } - } - const zk = license_License; - class JumpToPath extends Pe.Component { - render() { - return null; - } - } - class CopyToClipboardBtn extends Pe.Component { - render() { - let { getComponent: s } = this.props; - const o = s('CopyIcon'); - return Pe.createElement( - 'div', - { className: 'view-line-link copy-to-clipboard', title: 'Copy to clipboard' }, - Pe.createElement( - Jn.CopyToClipboard, - { text: this.props.textToCopy }, - Pe.createElement(o, null) - ) - ); - } - } - class Footer extends Pe.Component { - render() { - return Pe.createElement('div', { className: 'footer' }); - } - } - class FilterContainer extends Pe.Component { - onFilterChange = (s) => { - const { - target: { value: o } - } = s; - this.props.layoutActions.updateFilter(o); - }; - render() { - const { specSelectors: s, layoutSelectors: o, getComponent: i } = this.props, - u = i('Col'), - _ = 'loading' === s.loadingStatus(), - w = 'failed' === s.loadingStatus(), - x = o.currentFilter(), - C = ['operation-filter-input']; - return ( - w && C.push('failed'), - _ && C.push('loading'), - Pe.createElement( - 'div', - null, - !1 === x - ? null - : Pe.createElement( - 'div', - { className: 'filter-container' }, - Pe.createElement( - u, - { className: 'filter wrapper', mobile: 12 }, - Pe.createElement('input', { - className: C.join(' '), - placeholder: 'Filter by tag', - type: 'text', - onChange: this.onFilterChange, - value: 'string' == typeof x ? x : '', - disabled: _ - }) - ) - ) - ) - ); - } - } - const eC = Function.prototype; - class ParamBody extends Pe.PureComponent { - static defaultProp = { - consumes: (0, qe.fromJS)(['application/json']), - param: (0, qe.fromJS)({}), - onChange: eC, - onChangeConsumes: eC - }; - constructor(s, o) { - (super(s, o), (this.state = { isEditBox: !1, value: '' })); - } - componentDidMount() { - this.updateValues.call(this, this.props); - } - UNSAFE_componentWillReceiveProps(s) { - this.updateValues.call(this, s); - } - updateValues = (s) => { - let { param: o, isExecute: i, consumesValue: u = '' } = s, - _ = /xml/i.test(u), - w = /json/i.test(u), - x = _ ? o.get('value_xml') : o.get('value'); - if (void 0 !== x) { - let s = !x && w ? '{}' : x; - (this.setState({ value: s }), this.onChange(s, { isXml: _, isEditBox: i })); - } else - _ - ? this.onChange(this.sample('xml'), { isXml: _, isEditBox: i }) - : this.onChange(this.sample(), { isEditBox: i }); - }; - sample = (s) => { - let { param: o, fn: i } = this.props, - u = i.inferSchema(o.toJS()); - return i.getSampleSchema(u, s, { includeWriteOnly: !0 }); - }; - onChange = (s, { isEditBox: o, isXml: i }) => { - (this.setState({ value: s, isEditBox: o }), this._onChange(s, i)); - }; - _onChange = (s, o) => { - (this.props.onChange || eC)(s, o); - }; - handleOnChange = (s) => { - const { consumesValue: o } = this.props, - i = /xml/i.test(o), - u = s.target.value; - this.onChange(u, { isXml: i, isEditBox: this.state.isEditBox }); - }; - toggleIsEditBox = () => this.setState((s) => ({ isEditBox: !s.isEditBox })); - render() { - let { - onChangeConsumes: s, - param: o, - isExecute: i, - specSelectors: u, - pathMethod: _, - getComponent: w - } = this.props; - const x = w('Button'), - C = w('TextArea'), - j = w('HighlightCode', !0), - L = w('contentType'); - let B = (u ? u.parameterWithMetaByIdentity(_, o) : o).get('errors', (0, qe.List)()), - $ = u.contentTypeValues(_).get('requestContentType'), - V = - this.props.consumes && this.props.consumes.size - ? this.props.consumes - : ParamBody.defaultProp.consumes, - { value: U, isEditBox: z } = this.state, - Y = null; - getKnownSyntaxHighlighterLanguage(U) && (Y = 'json'); - const Z = `${createHtmlReadyId(`${_[1]}${_[0]}_parameters`)}_select`; - return Pe.createElement( - 'div', - { - className: 'body-param', - 'data-param-name': o.get('name'), - 'data-param-in': o.get('in') - }, - z && i - ? Pe.createElement(C, { - className: 'body-param__text' + (B.count() ? ' invalid' : ''), - value: U, - onChange: this.handleOnChange - }) - : U && Pe.createElement(j, { className: 'body-param__example', language: Y }, U), - Pe.createElement( - 'div', - { className: 'body-param-options' }, - i - ? Pe.createElement( - 'div', - { className: 'body-param-edit' }, - Pe.createElement( - x, - { - className: z - ? 'btn cancel body-param__example-edit' - : 'btn edit body-param__example-edit', - onClick: this.toggleIsEditBox - }, - z ? 'Cancel' : 'Edit' - ) - ) - : null, - Pe.createElement( - 'label', - { htmlFor: Z }, - Pe.createElement('span', null, 'Parameter content type'), - Pe.createElement(L, { - value: $, - contentTypes: V, - onChange: s, - className: 'body-param-content-type', - ariaLabel: 'Parameter content type', - controlId: Z - }) - ) - ) - ); - } - } - class Curl extends Pe.Component { - render() { - const { request: s, getComponent: o } = this.props, - i = requestSnippetGenerator_curl_bash(s), - u = o('SyntaxHighlighter', !0); - return Pe.createElement( - 'div', - { className: 'curl-command' }, - Pe.createElement('h4', null, 'Curl'), - Pe.createElement( - 'div', - { className: 'copy-to-clipboard' }, - Pe.createElement(Jn.CopyToClipboard, { text: i }, Pe.createElement('button', null)) - ), - Pe.createElement( - 'div', - null, - Pe.createElement( - u, - { - language: 'bash', - className: 'curl microlight', - renderPlainText: ({ children: s, PlainTextViewer: o }) => - Pe.createElement(o, { className: 'curl' }, s) - }, - i - ) - ) - ); - } - } - const property = ({ propKey: s, propVal: o, propClass: i }) => - Pe.createElement( - 'span', - { className: i }, - Pe.createElement('br', null), - s, - ': ', - String(o) - ); - class TryItOutButton extends Pe.Component { - static defaultProps = { - onTryoutClick: Function.prototype, - onCancelClick: Function.prototype, - onResetClick: Function.prototype, - enabled: !1, - hasUserEditedBody: !1, - isOAS3: !1 - }; - render() { - const { - onTryoutClick: s, - onCancelClick: o, - onResetClick: i, - enabled: u, - hasUserEditedBody: _, - isOAS3: w - } = this.props, - x = w && _; - return Pe.createElement( - 'div', - { className: x ? 'try-out btn-group' : 'try-out' }, - u - ? Pe.createElement( - 'button', - { className: 'btn try-out__btn cancel', onClick: o }, - 'Cancel' - ) - : Pe.createElement( - 'button', - { className: 'btn try-out__btn', onClick: s }, - 'Try it out ' - ), - x && - Pe.createElement( - 'button', - { className: 'btn try-out__btn reset', onClick: i }, - 'Reset' - ) - ); - } - } - class VersionPragmaFilter extends Pe.PureComponent { - static defaultProps = { alsoShow: null, children: null, bypass: !1 }; - render() { - const { bypass: s, isSwagger2: o, isOAS3: i, alsoShow: u } = this.props; - return s - ? Pe.createElement('div', null, this.props.children) - : o && i - ? Pe.createElement( - 'div', - { className: 'version-pragma' }, - u, - Pe.createElement( - 'div', - { className: 'version-pragma__message version-pragma__message--ambiguous' }, - Pe.createElement( - 'div', - null, - Pe.createElement('h3', null, 'Unable to render this definition'), - Pe.createElement( - 'p', - null, - Pe.createElement('code', null, 'swagger'), - ' and ', - Pe.createElement('code', null, 'openapi'), - ' fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.' - ), - Pe.createElement( - 'p', - null, - 'Supported version fields are ', - Pe.createElement('code', null, 'swagger: ', '"2.0"'), - ' and those that match ', - Pe.createElement('code', null, 'openapi: 3.0.n'), - ' (for example, ', - Pe.createElement('code', null, 'openapi: 3.0.0'), - ').' - ) - ) - ) - ) - : o || i - ? Pe.createElement('div', null, this.props.children) - : Pe.createElement( - 'div', - { className: 'version-pragma' }, - u, - Pe.createElement( - 'div', - { className: 'version-pragma__message version-pragma__message--missing' }, - Pe.createElement( - 'div', - null, - Pe.createElement('h3', null, 'Unable to render this definition'), - Pe.createElement( - 'p', - null, - 'The provided definition does not specify a valid version field.' - ), - Pe.createElement( - 'p', - null, - 'Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ', - Pe.createElement('code', null, 'swagger: ', '"2.0"'), - ' and those that match ', - Pe.createElement('code', null, 'openapi: 3.0.n'), - ' (for example, ', - Pe.createElement('code', null, 'openapi: 3.0.0'), - ').' - ) - ) - ) - ); - } - } - const version_stamp = ({ version: s }) => - Pe.createElement( - 'small', - null, - Pe.createElement('pre', { className: 'version' }, ' ', s, ' ') - ), - openapi_version = ({ oasVersion: s }) => - Pe.createElement( - 'small', - { className: 'version-stamp' }, - Pe.createElement('pre', { className: 'version' }, 'OAS ', s) - ), - deep_link = ({ enabled: s, path: o, text: i }) => - Pe.createElement( - 'a', - { - className: 'nostyle', - onClick: s ? (s) => s.preventDefault() : null, - href: s ? `#/${o}` : null - }, - Pe.createElement('span', null, i) - ), - svg_assets = () => - Pe.createElement( - 'div', - null, - Pe.createElement( - 'svg', - { - xmlns: 'http://www.w3.org/2000/svg', - xmlnsXlink: 'http://www.w3.org/1999/xlink', - className: 'svg-assets' - }, - Pe.createElement( - 'defs', - null, - Pe.createElement( - 'symbol', - { viewBox: '0 0 20 20', id: 'unlocked' }, - Pe.createElement('path', { - d: 'M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 20 20', id: 'locked' }, - Pe.createElement('path', { - d: 'M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 20 20', id: 'close' }, - Pe.createElement('path', { - d: 'M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 20 20', id: 'large-arrow' }, - Pe.createElement('path', { - d: 'M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 20 20', id: 'large-arrow-down' }, - Pe.createElement('path', { - d: 'M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 20 20', id: 'large-arrow-up' }, - Pe.createElement('path', { - d: 'M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 24 24', id: 'jump-to' }, - Pe.createElement('path', { - d: 'M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 24 24', id: 'expand' }, - Pe.createElement('path', { - d: 'M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z' - }) - ), - Pe.createElement( - 'symbol', - { viewBox: '0 0 15 16', id: 'copy' }, - Pe.createElement( - 'g', - { transform: 'translate(2, -1)' }, - Pe.createElement('path', { - fill: '#ffffff', - fillRule: 'evenodd', - d: 'M2 13h4v1H2v-1zm5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0-1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-.45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z' - }) - ) - ) - ) - ) - ); - var tC; - function decodeEntity(s) { - return ( - ((tC = tC || document.createElement('textarea')).innerHTML = '&' + s + ';'), - tC.value - ); - } - var rC = Object.prototype.hasOwnProperty; - function index_browser_has(s, o) { - return !!s && rC.call(s, o); - } - function index_browser_assign(s) { - return ( - [].slice.call(arguments, 1).forEach(function (o) { - if (o) { - if ('object' != typeof o) throw new TypeError(o + 'must be object'); - Object.keys(o).forEach(function (i) { - s[i] = o[i]; - }); - } - }), - s - ); - } - var nC = /\\([\\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; - function unescapeMd(s) { - return s.indexOf('\\') < 0 ? s : s.replace(nC, '$1'); - } - function isValidEntityCode(s) { - return ( - !(s >= 55296 && s <= 57343) && - !(s >= 64976 && s <= 65007) && - !!(65535 & ~s && 65534 != (65535 & s)) && - !(s >= 0 && s <= 8) && - 11 !== s && - !(s >= 14 && s <= 31) && - !(s >= 127 && s <= 159) && - !(s > 1114111) - ); - } - function fromCodePoint(s) { - if (s > 65535) { - var o = 55296 + ((s -= 65536) >> 10), - i = 56320 + (1023 & s); - return String.fromCharCode(o, i); - } - return String.fromCharCode(s); - } - var sC = /&([a-z#][a-z0-9]{1,31});/gi, - oC = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i; - function replaceEntityPattern(s, o) { - var i = 0, - u = decodeEntity(o); - return o !== u - ? u - : 35 === o.charCodeAt(0) && - oC.test(o) && - isValidEntityCode( - (i = - 'x' === o[1].toLowerCase() - ? parseInt(o.slice(2), 16) - : parseInt(o.slice(1), 10)) - ) - ? fromCodePoint(i) - : s; - } - function replaceEntities(s) { - return s.indexOf('&') < 0 ? s : s.replace(sC, replaceEntityPattern); - } - var iC = /[&<>"]/, - aC = /[&<>"]/g, - lC = { '&': '&', '<': '<', '>': '>', '"': '"' }; - function replaceUnsafeChar(s) { - return lC[s]; - } - function escapeHtml(s) { - return iC.test(s) ? s.replace(aC, replaceUnsafeChar) : s; - } - var cC = {}; - function nextToken(s, o) { - return ++o >= s.length - 2 - ? o - : 'paragraph_open' === s[o].type && - s[o].tight && - 'inline' === s[o + 1].type && - 0 === s[o + 1].content.length && - 'paragraph_close' === s[o + 2].type && - s[o + 2].tight - ? nextToken(s, o + 2) - : o; - } - ((cC.blockquote_open = function () { - return '
\n'; - }), - (cC.blockquote_close = function (s, o) { - return '
' + uC(s, o); - }), - (cC.code = function (s, o) { - return s[o].block - ? '
' + escapeHtml(s[o].content) + '
' + uC(s, o) - : '' + escapeHtml(s[o].content) + ''; - }), - (cC.fence = function (s, o, i, u, _) { - var w, - x, - C = s[o], - j = '', - L = i.langPrefix; - if (C.params) { - if ( - ((x = (w = C.params.split(/\s+/g)).join(' ')), - index_browser_has(_.rules.fence_custom, w[0])) - ) - return _.rules.fence_custom[w[0]](s, o, i, u, _); - j = ' class="' + L + escapeHtml(replaceEntities(unescapeMd(x))) + '"'; - } - return ( - '
' +
-							((i.highlight && i.highlight.apply(i.highlight, [C.content].concat(w))) ||
-								escapeHtml(C.content)) +
-							'
' + - uC(s, o) - ); - }), - (cC.fence_custom = {}), - (cC.heading_open = function (s, o) { - return ''; - }), - (cC.heading_close = function (s, o) { - return '\n'; - }), - (cC.hr = function (s, o, i) { - return (i.xhtmlOut ? '
' : '
') + uC(s, o); - }), - (cC.bullet_list_open = function () { - return '
    \n'; - }), - (cC.bullet_list_close = function (s, o) { - return '
' + uC(s, o); - }), - (cC.list_item_open = function () { - return '
  • '; - }), - (cC.list_item_close = function () { - return '
  • \n'; - }), - (cC.ordered_list_open = function (s, o) { - var i = s[o]; - return ' 1 ? ' start="' + i.order + '"' : '') + '>\n'; - }), - (cC.ordered_list_close = function (s, o) { - return '' + uC(s, o); - }), - (cC.paragraph_open = function (s, o) { - return s[o].tight ? '' : '

    '; - }), - (cC.paragraph_close = function (s, o) { - var i = !(s[o].tight && o && 'inline' === s[o - 1].type && !s[o - 1].content); - return (s[o].tight ? '' : '

    ') + (i ? uC(s, o) : ''); - }), - (cC.link_open = function (s, o, i) { - var u = s[o].title ? ' title="' + escapeHtml(replaceEntities(s[o].title)) + '"' : '', - _ = i.linkTarget ? ' target="' + i.linkTarget + '"' : ''; - return ''; - }), - (cC.link_close = function () { - return ''; - }), - (cC.image = function (s, o, i) { - var u = ' src="' + escapeHtml(s[o].src) + '"', - _ = s[o].title ? ' title="' + escapeHtml(replaceEntities(s[o].title)) + '"' : ''; - return ( - '' - ); - }), - (cC.table_open = function () { - return '\n'; - }), - (cC.table_close = function () { - return '
    \n'; - }), - (cC.thead_open = function () { - return '\n'; - }), - (cC.thead_close = function () { - return '\n'; - }), - (cC.tbody_open = function () { - return '\n'; - }), - (cC.tbody_close = function () { - return '\n'; - }), - (cC.tr_open = function () { - return ''; - }), - (cC.tr_close = function () { - return '\n'; - }), - (cC.th_open = function (s, o) { - var i = s[o]; - return ''; - }), - (cC.th_close = function () { - return ''; - }), - (cC.td_open = function (s, o) { - var i = s[o]; - return ''; - }), - (cC.td_close = function () { - return ''; - }), - (cC.strong_open = function () { - return ''; - }), - (cC.strong_close = function () { - return ''; - }), - (cC.em_open = function () { - return ''; - }), - (cC.em_close = function () { - return ''; - }), - (cC.del_open = function () { - return ''; - }), - (cC.del_close = function () { - return ''; - }), - (cC.ins_open = function () { - return ''; - }), - (cC.ins_close = function () { - return ''; - }), - (cC.mark_open = function () { - return ''; - }), - (cC.mark_close = function () { - return ''; - }), - (cC.sub = function (s, o) { - return '' + escapeHtml(s[o].content) + ''; - }), - (cC.sup = function (s, o) { - return '' + escapeHtml(s[o].content) + ''; - }), - (cC.hardbreak = function (s, o, i) { - return i.xhtmlOut ? '
    \n' : '
    \n'; - }), - (cC.softbreak = function (s, o, i) { - return i.breaks ? (i.xhtmlOut ? '
    \n' : '
    \n') : '\n'; - }), - (cC.text = function (s, o) { - return escapeHtml(s[o].content); - }), - (cC.htmlblock = function (s, o) { - return s[o].content; - }), - (cC.htmltag = function (s, o) { - return s[o].content; - }), - (cC.abbr_open = function (s, o) { - return ''; - }), - (cC.abbr_close = function () { - return ''; - }), - (cC.footnote_ref = function (s, o) { - var i = Number(s[o].id + 1).toString(), - u = 'fnref' + i; - return ( - s[o].subId > 0 && (u += ':' + s[o].subId), - '[' + - i + - ']' - ); - }), - (cC.footnote_block_open = function (s, o, i) { - return ( - (i.xhtmlOut ? '
    \n' : '
    \n') + - '
    \n
      \n' - ); - }), - (cC.footnote_block_close = function () { - return '
    \n
    \n'; - }), - (cC.footnote_open = function (s, o) { - return '
  • '; - }), - (cC.footnote_close = function () { - return '
  • \n'; - }), - (cC.footnote_anchor = function (s, o) { - var i = 'fnref' + Number(s[o].id + 1).toString(); - return ( - s[o].subId > 0 && (i += ':' + s[o].subId), - ' ↩' - ); - }), - (cC.dl_open = function () { - return '
    \n'; - }), - (cC.dt_open = function () { - return '
    '; - }), - (cC.dd_open = function () { - return '
    '; - }), - (cC.dl_close = function () { - return '
    \n'; - }), - (cC.dt_close = function () { - return '\n'; - }), - (cC.dd_close = function () { - return '\n'; - })); - var uC = (cC.getBreak = function getBreak(s, o) { - return (o = nextToken(s, o)) < s.length && 'list_item_close' === s[o].type ? '' : '\n'; - }); - function Renderer() { - ((this.rules = index_browser_assign({}, cC)), (this.getBreak = cC.getBreak)); - } - function Ruler() { - ((this.__rules__ = []), (this.__cache__ = null)); - } - function StateInline(s, o, i, u, _) { - ((this.src = s), - (this.env = u), - (this.options = i), - (this.parser = o), - (this.tokens = _), - (this.pos = 0), - (this.posMax = this.src.length), - (this.level = 0), - (this.pending = ''), - (this.pendingLevel = 0), - (this.cache = []), - (this.isInLabel = !1), - (this.linkLevel = 0), - (this.linkContent = ''), - (this.labelUnmatchedScopes = 0)); - } - function parseLinkLabel(s, o) { - var i, - u, - _, - w = -1, - x = s.posMax, - C = s.pos, - j = s.isInLabel; - if (s.isInLabel) return -1; - if (s.labelUnmatchedScopes) return (s.labelUnmatchedScopes--, -1); - for (s.pos = o + 1, s.isInLabel = !0, i = 1; s.pos < x; ) { - if (91 === (_ = s.src.charCodeAt(s.pos))) i++; - else if (93 === _ && 0 === --i) { - u = !0; - break; - } - s.parser.skipToken(s); - } - return ( - u ? ((w = s.pos), (s.labelUnmatchedScopes = 0)) : (s.labelUnmatchedScopes = i - 1), - (s.pos = C), - (s.isInLabel = j), - w - ); - } - function parseAbbr(s, o, i, u) { - var _, w, x, C, j, L; - if (42 !== s.charCodeAt(0)) return -1; - if (91 !== s.charCodeAt(1)) return -1; - if (-1 === s.indexOf(']:')) return -1; - if ( - (w = parseLinkLabel((_ = new StateInline(s, o, i, u, [])), 1)) < 0 || - 58 !== s.charCodeAt(w + 1) - ) - return -1; - for (C = _.posMax, x = w + 2; x < C && 10 !== _.src.charCodeAt(x); x++); - return ( - (j = s.slice(2, w)), - 0 === (L = s.slice(w + 2, x).trim()).length - ? -1 - : (u.abbreviations || (u.abbreviations = {}), - void 0 === u.abbreviations[':' + j] && (u.abbreviations[':' + j] = L), - x) - ); - } - function normalizeLink(s) { - var o = replaceEntities(s); - try { - o = decodeURI(o); - } catch (s) {} - return encodeURI(o); - } - function parseLinkDestination(s, o) { - var i, - u, - _, - w = o, - x = s.posMax; - if (60 === s.src.charCodeAt(o)) { - for (o++; o < x; ) { - if (10 === (i = s.src.charCodeAt(o))) return !1; - if (62 === i) - return ( - (_ = normalizeLink(unescapeMd(s.src.slice(w + 1, o)))), - !!s.parser.validateLink(_) && ((s.pos = o + 1), (s.linkContent = _), !0) - ); - 92 === i && o + 1 < x ? (o += 2) : o++; - } - return !1; - } - for (u = 0; o < x && 32 !== (i = s.src.charCodeAt(o)) && !(i < 32 || 127 === i); ) - if (92 === i && o + 1 < x) o += 2; - else { - if (40 === i && ++u > 1) break; - if (41 === i && --u < 0) break; - o++; - } - return ( - w !== o && - ((_ = unescapeMd(s.src.slice(w, o))), - !!s.parser.validateLink(_) && ((s.linkContent = _), (s.pos = o), !0)) - ); - } - function parseLinkTitle(s, o) { - var i, - u = o, - _ = s.posMax, - w = s.src.charCodeAt(o); - if (34 !== w && 39 !== w && 40 !== w) return !1; - for (o++, 40 === w && (w = 41); o < _; ) { - if ((i = s.src.charCodeAt(o)) === w) - return ((s.pos = o + 1), (s.linkContent = unescapeMd(s.src.slice(u + 1, o))), !0); - 92 === i && o + 1 < _ ? (o += 2) : o++; - } - return !1; - } - function normalizeReference(s) { - return s.trim().replace(/\s+/g, ' ').toUpperCase(); - } - function parseReference(s, o, i, u) { - var _, w, x, C, j, L, B, $, V; - if (91 !== s.charCodeAt(0)) return -1; - if (-1 === s.indexOf(']:')) return -1; - if ( - (w = parseLinkLabel((_ = new StateInline(s, o, i, u, [])), 0)) < 0 || - 58 !== s.charCodeAt(w + 1) - ) - return -1; - for ( - C = _.posMax, x = w + 2; - x < C && (32 === (j = _.src.charCodeAt(x)) || 10 === j); - x++ - ); - if (!parseLinkDestination(_, x)) return -1; - for ( - B = _.linkContent, L = x = _.pos, x += 1; - x < C && (32 === (j = _.src.charCodeAt(x)) || 10 === j); - x++ - ); - for ( - x < C && L !== x && parseLinkTitle(_, x) - ? (($ = _.linkContent), (x = _.pos)) - : (($ = ''), (x = L)); - x < C && 32 === _.src.charCodeAt(x); - ) - x++; - return x < C && 10 !== _.src.charCodeAt(x) - ? -1 - : ((V = normalizeReference(s.slice(1, w))), - void 0 === u.references[V] && (u.references[V] = { title: $, href: B }), - x); - } - ((Renderer.prototype.renderInline = function (s, o, i) { - for (var u = this.rules, _ = s.length, w = 0, x = ''; _--; ) - x += u[s[w].type](s, w++, o, i, this); - return x; - }), - (Renderer.prototype.render = function (s, o, i) { - for (var u = this.rules, _ = s.length, w = -1, x = ''; ++w < _; ) - 'inline' === s[w].type - ? (x += this.renderInline(s[w].children, o, i)) - : (x += u[s[w].type](s, w, o, i, this)); - return x; - }), - (Ruler.prototype.__find__ = function (s) { - for (var o = this.__rules__.length, i = -1; o--; ) - if (this.__rules__[++i].name === s) return i; - return -1; - }), - (Ruler.prototype.__compile__ = function () { - var s = this, - o = ['']; - (s.__rules__.forEach(function (s) { - s.enabled && - s.alt.forEach(function (s) { - o.indexOf(s) < 0 && o.push(s); - }); - }), - (s.__cache__ = {}), - o.forEach(function (o) { - ((s.__cache__[o] = []), - s.__rules__.forEach(function (i) { - i.enabled && ((o && i.alt.indexOf(o) < 0) || s.__cache__[o].push(i.fn)); - })); - })); - }), - (Ruler.prototype.at = function (s, o, i) { - var u = this.__find__(s), - _ = i || {}; - if (-1 === u) throw new Error('Parser rule not found: ' + s); - ((this.__rules__[u].fn = o), - (this.__rules__[u].alt = _.alt || []), - (this.__cache__ = null)); - }), - (Ruler.prototype.before = function (s, o, i, u) { - var _ = this.__find__(s), - w = u || {}; - if (-1 === _) throw new Error('Parser rule not found: ' + s); - (this.__rules__.splice(_, 0, { name: o, enabled: !0, fn: i, alt: w.alt || [] }), - (this.__cache__ = null)); - }), - (Ruler.prototype.after = function (s, o, i, u) { - var _ = this.__find__(s), - w = u || {}; - if (-1 === _) throw new Error('Parser rule not found: ' + s); - (this.__rules__.splice(_ + 1, 0, { name: o, enabled: !0, fn: i, alt: w.alt || [] }), - (this.__cache__ = null)); - }), - (Ruler.prototype.push = function (s, o, i) { - var u = i || {}; - (this.__rules__.push({ name: s, enabled: !0, fn: o, alt: u.alt || [] }), - (this.__cache__ = null)); - }), - (Ruler.prototype.enable = function (s, o) { - ((s = Array.isArray(s) ? s : [s]), - o && - this.__rules__.forEach(function (s) { - s.enabled = !1; - }), - s.forEach(function (s) { - var o = this.__find__(s); - if (o < 0) throw new Error('Rules manager: invalid rule name ' + s); - this.__rules__[o].enabled = !0; - }, this), - (this.__cache__ = null)); - }), - (Ruler.prototype.disable = function (s) { - ((s = Array.isArray(s) ? s : [s]).forEach(function (s) { - var o = this.__find__(s); - if (o < 0) throw new Error('Rules manager: invalid rule name ' + s); - this.__rules__[o].enabled = !1; - }, this), - (this.__cache__ = null)); - }), - (Ruler.prototype.getRules = function (s) { - return (null === this.__cache__ && this.__compile__(), this.__cache__[s] || []); - }), - (StateInline.prototype.pushPending = function () { - (this.tokens.push({ type: 'text', content: this.pending, level: this.pendingLevel }), - (this.pending = '')); - }), - (StateInline.prototype.push = function (s) { - (this.pending && this.pushPending(), - this.tokens.push(s), - (this.pendingLevel = this.level)); - }), - (StateInline.prototype.cacheSet = function (s, o) { - for (var i = this.cache.length; i <= s; i++) this.cache.push(0); - this.cache[s] = o; - }), - (StateInline.prototype.cacheGet = function (s) { - return s < this.cache.length ? this.cache[s] : 0; - })); - var pC = ' \n()[]\'".,!?-'; - function regEscape(s) { - return s.replace(/([-()\[\]{}+?*.$\^|,:#= s.length) && !yC.test(s[o]); - } - function replaceAt(s, o, i) { - return s.substr(0, o) + i + s.substr(o + 1); - } - var vC = [ - [ - 'block', - function block(s) { - s.inlineMode - ? s.tokens.push({ - type: 'inline', - content: s.src.replace(/\n/g, ' ').trim(), - level: 0, - lines: [0, 1], - children: [] - }) - : s.block.parse(s.src, s.options, s.env, s.tokens); - } - ], - [ - 'abbr', - function abbr(s) { - var o, - i, - u, - _, - w = s.tokens; - if (!s.inlineMode) - for (o = 1, i = w.length - 1; o < i; o++) - if ( - 'paragraph_open' === w[o - 1].type && - 'inline' === w[o].type && - 'paragraph_close' === w[o + 1].type - ) { - for ( - u = w[o].content; - u.length && !((_ = parseAbbr(u, s.inline, s.options, s.env)) < 0); - ) - u = u.slice(_).trim(); - ((w[o].content = u), - u.length || ((w[o - 1].tight = !0), (w[o + 1].tight = !0))); - } - } - ], - [ - 'references', - function references(s) { - var o, - i, - u, - _, - w = s.tokens; - if (((s.env.references = s.env.references || {}), !s.inlineMode)) - for (o = 1, i = w.length - 1; o < i; o++) - if ( - 'inline' === w[o].type && - 'paragraph_open' === w[o - 1].type && - 'paragraph_close' === w[o + 1].type - ) { - for ( - u = w[o].content; - u.length && !((_ = parseReference(u, s.inline, s.options, s.env)) < 0); - ) - u = u.slice(_).trim(); - ((w[o].content = u), - u.length || ((w[o - 1].tight = !0), (w[o + 1].tight = !0))); - } - } - ], - [ - 'inline', - function inline(s) { - var o, - i, - u, - _ = s.tokens; - for (i = 0, u = _.length; i < u; i++) - 'inline' === (o = _[i]).type && - s.inline.parse(o.content, s.options, s.env, o.children); - } - ], - [ - 'footnote_tail', - function footnote_block(s) { - var o, - i, - u, - _, - w, - x, - C, - j, - L, - B = 0, - $ = !1, - V = {}; - if ( - s.env.footnotes && - ((s.tokens = s.tokens.filter(function (s) { - return 'footnote_reference_open' === s.type - ? (($ = !0), (j = []), (L = s.label), !1) - : 'footnote_reference_close' === s.type - ? (($ = !1), (V[':' + L] = j), !1) - : ($ && j.push(s), !$); - })), - s.env.footnotes.list) - ) { - for ( - x = s.env.footnotes.list, - s.tokens.push({ type: 'footnote_block_open', level: B++ }), - o = 0, - i = x.length; - o < i; - o++ - ) { - for ( - s.tokens.push({ type: 'footnote_open', id: o, level: B++ }), - x[o].tokens - ? ((C = []).push({ type: 'paragraph_open', tight: !1, level: B++ }), - C.push({ type: 'inline', content: '', level: B, children: x[o].tokens }), - C.push({ type: 'paragraph_close', tight: !1, level: --B })) - : x[o].label && (C = V[':' + x[o].label]), - s.tokens = s.tokens.concat(C), - w = - 'paragraph_close' === s.tokens[s.tokens.length - 1].type - ? s.tokens.pop() - : null, - _ = x[o].count > 0 ? x[o].count : 1, - u = 0; - u < _; - u++ - ) - s.tokens.push({ type: 'footnote_anchor', id: o, subId: u, level: B }); - (w && s.tokens.push(w), s.tokens.push({ type: 'footnote_close', level: --B })); - } - s.tokens.push({ type: 'footnote_block_close', level: --B }); - } - } - ], - [ - 'abbr2', - function abbr2(s) { - var o, - i, - u, - _, - w, - x, - C, - j, - L, - B, - $, - V, - U = s.tokens; - if (s.env.abbreviations) - for ( - s.env.abbrRegExp || - ((V = - '(^|[' + - pC.split('').map(regEscape).join('') + - '])(' + - Object.keys(s.env.abbreviations) - .map(function (s) { - return s.substr(1); - }) - .sort(function (s, o) { - return o.length - s.length; - }) - .map(regEscape) - .join('|') + - ')($|[' + - pC.split('').map(regEscape).join('') + - '])'), - (s.env.abbrRegExp = new RegExp(V, 'g'))), - B = s.env.abbrRegExp, - i = 0, - u = U.length; - i < u; - i++ - ) - if ('inline' === U[i].type) - for (o = (_ = U[i].children).length - 1; o >= 0; o--) - if ('text' === (w = _[o]).type) { - for ( - j = 0, x = w.content, B.lastIndex = 0, L = w.level, C = []; - ($ = B.exec(x)); - ) - (B.lastIndex > j && - C.push({ - type: 'text', - content: x.slice(j, $.index + $[1].length), - level: L - }), - C.push({ - type: 'abbr_open', - title: s.env.abbreviations[':' + $[2]], - level: L++ - }), - C.push({ type: 'text', content: $[2], level: L }), - C.push({ type: 'abbr_close', level: --L }), - (j = B.lastIndex - $[3].length)); - C.length && - (j < x.length && C.push({ type: 'text', content: x.slice(j), level: L }), - (U[i].children = _ = [].concat(_.slice(0, o), C, _.slice(o + 1)))); - } - } - ], - [ - 'replacements', - function index_browser_replace(s) { - var o, i, u, _, w; - if (s.options.typographer) - for (w = s.tokens.length - 1; w >= 0; w--) - if ('inline' === s.tokens[w].type) - for (o = (_ = s.tokens[w].children).length - 1; o >= 0; o--) - 'text' === (i = _[o]).type && - ((u = replaceScopedAbbr((u = i.content))), - hC.test(u) && - (u = u - .replace(/\+-/g, '±') - .replace(/\.{2,}/g, '…') - .replace(/([?!])…/g, '$1..') - .replace(/([?!]){4,}/g, '$1$1$1') - .replace(/,{2,}/g, ',') - .replace(/(^|[^-])---([^-]|$)/gm, '$1—$2') - .replace(/(^|\s)--(\s|$)/gm, '$1–$2') - .replace(/(^|[^-\s])--([^-\s]|$)/gm, '$1–$2')), - (i.content = u)); - } - ], - [ - 'smartquotes', - function smartquotes(s) { - var o, i, u, _, w, x, C, j, L, B, $, V, U, z, Y, Z, ee; - if (s.options.typographer) - for (ee = [], Y = s.tokens.length - 1; Y >= 0; Y--) - if ('inline' === s.tokens[Y].type) - for (Z = s.tokens[Y].children, ee.length = 0, o = 0; o < Z.length; o++) - if ('text' === (i = Z[o]).type && !mC.test(i.text)) { - for (C = Z[o].level, U = ee.length - 1; U >= 0 && !(ee[U].level <= C); U--); - ((ee.length = U + 1), (w = 0), (x = (u = i.content).length)); - e: for (; w < x && ((gC.lastIndex = w), (_ = gC.exec(u))); ) - if ( - ((j = !isLetter(u, _.index - 1)), - (w = _.index + 1), - (z = "'" === _[0]), - (L = !isLetter(u, w)) || j) - ) { - if ((($ = !L), (V = !j))) - for ( - U = ee.length - 1; - U >= 0 && ((B = ee[U]), !(ee[U].level < C)); - U-- - ) - if (B.single === z && ee[U].level === C) { - ((B = ee[U]), - z - ? ((Z[B.token].content = replaceAt( - Z[B.token].content, - B.pos, - s.options.quotes[2] - )), - (i.content = replaceAt( - i.content, - _.index, - s.options.quotes[3] - ))) - : ((Z[B.token].content = replaceAt( - Z[B.token].content, - B.pos, - s.options.quotes[0] - )), - (i.content = replaceAt( - i.content, - _.index, - s.options.quotes[1] - ))), - (ee.length = U)); - continue e; - } - $ - ? ee.push({ token: o, pos: _.index, single: z, level: C }) - : V && z && (i.content = replaceAt(i.content, _.index, '’')); - } else z && (i.content = replaceAt(i.content, _.index, '’')); - } - } - ] - ]; - function Core() { - ((this.options = {}), (this.ruler = new Ruler())); - for (var s = 0; s < vC.length; s++) this.ruler.push(vC[s][0], vC[s][1]); - } - function StateBlock(s, o, i, u, _) { - var w, x, C, j, L, B, $; - for ( - this.src = s, - this.parser = o, - this.options = i, - this.env = u, - this.tokens = _, - this.bMarks = [], - this.eMarks = [], - this.tShift = [], - this.blkIndent = 0, - this.line = 0, - this.lineMax = 0, - this.tight = !1, - this.parentType = 'root', - this.ddIndent = -1, - this.level = 0, - this.result = '', - B = 0, - $ = !1, - C = j = B = 0, - L = (x = this.src).length; - j < L; - j++ - ) { - if (((w = x.charCodeAt(j)), !$)) { - if (32 === w) { - B++; - continue; - } - $ = !0; - } - (10 !== w && j !== L - 1) || - (10 !== w && j++, - this.bMarks.push(C), - this.eMarks.push(j), - this.tShift.push(B), - ($ = !1), - (B = 0), - (C = j + 1)); - } - (this.bMarks.push(x.length), - this.eMarks.push(x.length), - this.tShift.push(0), - (this.lineMax = this.bMarks.length - 1)); - } - function skipBulletListMarker(s, o) { - var i, u, _; - return (u = s.bMarks[o] + s.tShift[o]) >= (_ = s.eMarks[o]) || - (42 !== (i = s.src.charCodeAt(u++)) && 45 !== i && 43 !== i) || - (u < _ && 32 !== s.src.charCodeAt(u)) - ? -1 - : u; - } - function skipOrderedListMarker(s, o) { - var i, - u = s.bMarks[o] + s.tShift[o], - _ = s.eMarks[o]; - if (u + 1 >= _) return -1; - if ((i = s.src.charCodeAt(u++)) < 48 || i > 57) return -1; - for (;;) { - if (u >= _) return -1; - if (!((i = s.src.charCodeAt(u++)) >= 48 && i <= 57)) { - if (41 === i || 46 === i) break; - return -1; - } - } - return u < _ && 32 !== s.src.charCodeAt(u) ? -1 : u; - } - ((Core.prototype.process = function (s) { - var o, i, u; - for (o = 0, i = (u = this.ruler.getRules('')).length; o < i; o++) u[o](s); - }), - (StateBlock.prototype.isEmpty = function isEmpty(s) { - return this.bMarks[s] + this.tShift[s] >= this.eMarks[s]; - }), - (StateBlock.prototype.skipEmptyLines = function skipEmptyLines(s) { - for ( - var o = this.lineMax; - s < o && !(this.bMarks[s] + this.tShift[s] < this.eMarks[s]); - s++ - ); - return s; - }), - (StateBlock.prototype.skipSpaces = function skipSpaces(s) { - for (var o = this.src.length; s < o && 32 === this.src.charCodeAt(s); s++); - return s; - }), - (StateBlock.prototype.skipChars = function skipChars(s, o) { - for (var i = this.src.length; s < i && this.src.charCodeAt(s) === o; s++); - return s; - }), - (StateBlock.prototype.skipCharsBack = function skipCharsBack(s, o, i) { - if (s <= i) return s; - for (; s > i; ) if (o !== this.src.charCodeAt(--s)) return s + 1; - return s; - }), - (StateBlock.prototype.getLines = function getLines(s, o, i, u) { - var _, - w, - x, - C, - j, - L = s; - if (s >= o) return ''; - if (L + 1 === o) - return ( - (w = this.bMarks[L] + Math.min(this.tShift[L], i)), - (x = u ? this.eMarks[L] + 1 : this.eMarks[L]), - this.src.slice(w, x) - ); - for (C = new Array(o - s), _ = 0; L < o; L++, _++) - ((j = this.tShift[L]) > i && (j = i), - j < 0 && (j = 0), - (w = this.bMarks[L] + j), - (x = L + 1 < o || u ? this.eMarks[L] + 1 : this.eMarks[L]), - (C[_] = this.src.slice(w, x))); - return C.join(''); - })); - var bC = {}; - [ - 'article', - 'aside', - 'button', - 'blockquote', - 'body', - 'canvas', - 'caption', - 'col', - 'colgroup', - 'dd', - 'div', - 'dl', - 'dt', - 'embed', - 'fieldset', - 'figcaption', - 'figure', - 'footer', - 'form', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'header', - 'hgroup', - 'hr', - 'iframe', - 'li', - 'map', - 'object', - 'ol', - 'output', - 'p', - 'pre', - 'progress', - 'script', - 'section', - 'style', - 'table', - 'tbody', - 'td', - 'textarea', - 'tfoot', - 'th', - 'tr', - 'thead', - 'ul', - 'video' - ].forEach(function (s) { - bC[s] = !0; - }); - var _C = /^<([a-zA-Z]{1,15})[\s\/>]/, - EC = /^<\/([a-zA-Z]{1,15})[\s>]/; - function index_browser_getLine(s, o) { - var i = s.bMarks[o] + s.blkIndent, - u = s.eMarks[o]; - return s.src.substr(i, u - i); - } - function skipMarker(s, o) { - var i, - u, - _ = s.bMarks[o] + s.tShift[o], - w = s.eMarks[o]; - return _ >= w || - (126 !== (u = s.src.charCodeAt(_++)) && 58 !== u) || - _ === (i = s.skipSpaces(_)) || - i >= w - ? -1 - : i; - } - var wC = [ - [ - 'code', - function code(s, o, i) { - var u, _; - if (s.tShift[o] - s.blkIndent < 4) return !1; - for (_ = u = o + 1; u < i; ) - if (s.isEmpty(u)) u++; - else { - if (!(s.tShift[u] - s.blkIndent >= 4)) break; - _ = ++u; - } - return ( - (s.line = u), - s.tokens.push({ - type: 'code', - content: s.getLines(o, _, 4 + s.blkIndent, !0), - block: !0, - lines: [o, s.line], - level: s.level - }), - !0 - ); - } - ], - [ - 'fences', - function fences(s, o, i, u) { - var _, - w, - x, - C, - j, - L = !1, - B = s.bMarks[o] + s.tShift[o], - $ = s.eMarks[o]; - if (B + 3 > $) return !1; - if (126 !== (_ = s.src.charCodeAt(B)) && 96 !== _) return !1; - if (((j = B), (w = (B = s.skipChars(B, _)) - j) < 3)) return !1; - if ((x = s.src.slice(B, $).trim()).indexOf('`') >= 0) return !1; - if (u) return !0; - for ( - C = o; - !(++C >= i) && - !( - (B = j = s.bMarks[C] + s.tShift[C]) < ($ = s.eMarks[C]) && - s.tShift[C] < s.blkIndent - ); - ) - if ( - s.src.charCodeAt(B) === _ && - !( - s.tShift[C] - s.blkIndent >= 4 || - (B = s.skipChars(B, _)) - j < w || - (B = s.skipSpaces(B)) < $ - ) - ) { - L = !0; - break; - } - return ( - (w = s.tShift[o]), - (s.line = C + (L ? 1 : 0)), - s.tokens.push({ - type: 'fence', - params: x, - content: s.getLines(o + 1, C, w, !0), - lines: [o, s.line], - level: s.level - }), - !0 - ); - }, - ['paragraph', 'blockquote', 'list'] - ], - [ - 'blockquote', - function blockquote(s, o, i, u) { - var _, - w, - x, - C, - j, - L, - B, - $, - V, - U, - z, - Y = s.bMarks[o] + s.tShift[o], - Z = s.eMarks[o]; - if (Y > Z) return !1; - if (62 !== s.src.charCodeAt(Y++)) return !1; - if (s.level >= s.options.maxNesting) return !1; - if (u) return !0; - for ( - 32 === s.src.charCodeAt(Y) && Y++, - j = s.blkIndent, - s.blkIndent = 0, - C = [s.bMarks[o]], - s.bMarks[o] = Y, - w = (Y = Y < Z ? s.skipSpaces(Y) : Y) >= Z, - x = [s.tShift[o]], - s.tShift[o] = Y - s.bMarks[o], - $ = s.parser.ruler.getRules('blockquote'), - _ = o + 1; - _ < i && !((Y = s.bMarks[_] + s.tShift[_]) >= (Z = s.eMarks[_])); - _++ - ) - if (62 !== s.src.charCodeAt(Y++)) { - if (w) break; - for (z = !1, V = 0, U = $.length; V < U; V++) - if ($[V](s, _, i, !0)) { - z = !0; - break; - } - if (z) break; - (C.push(s.bMarks[_]), x.push(s.tShift[_]), (s.tShift[_] = -1337)); - } else - (32 === s.src.charCodeAt(Y) && Y++, - C.push(s.bMarks[_]), - (s.bMarks[_] = Y), - (w = (Y = Y < Z ? s.skipSpaces(Y) : Y) >= Z), - x.push(s.tShift[_]), - (s.tShift[_] = Y - s.bMarks[_])); - for ( - L = s.parentType, - s.parentType = 'blockquote', - s.tokens.push({ type: 'blockquote_open', lines: (B = [o, 0]), level: s.level++ }), - s.parser.tokenize(s, o, _), - s.tokens.push({ type: 'blockquote_close', level: --s.level }), - s.parentType = L, - B[1] = s.line, - V = 0; - V < x.length; - V++ - ) - ((s.bMarks[V + o] = C[V]), (s.tShift[V + o] = x[V])); - return ((s.blkIndent = j), !0); - }, - ['paragraph', 'blockquote', 'list'] - ], - [ - 'hr', - function hr(s, o, i, u) { - var _, - w, - x, - C = s.bMarks[o], - j = s.eMarks[o]; - if ((C += s.tShift[o]) > j) return !1; - if (42 !== (_ = s.src.charCodeAt(C++)) && 45 !== _ && 95 !== _) return !1; - for (w = 1; C < j; ) { - if ((x = s.src.charCodeAt(C++)) !== _ && 32 !== x) return !1; - x === _ && w++; - } - return ( - !(w < 3) && - (u || - ((s.line = o + 1), - s.tokens.push({ type: 'hr', lines: [o, s.line], level: s.level })), - !0) - ); - }, - ['paragraph', 'blockquote', 'list'] - ], - [ - 'list', - function index_browser_list(s, o, i, u) { - var _, - w, - x, - C, - j, - L, - B, - $, - V, - U, - z, - Y, - Z, - ee, - ie, - ae, - le, - ce, - pe, - de, - fe, - ye = !0; - if (($ = skipOrderedListMarker(s, o)) >= 0) Y = !0; - else { - if (!(($ = skipBulletListMarker(s, o)) >= 0)) return !1; - Y = !1; - } - if (s.level >= s.options.maxNesting) return !1; - if (((z = s.src.charCodeAt($ - 1)), u)) return !0; - for ( - ee = s.tokens.length, - Y - ? ((B = s.bMarks[o] + s.tShift[o]), - (U = Number(s.src.substr(B, $ - B - 1))), - s.tokens.push({ - type: 'ordered_list_open', - order: U, - lines: (ae = [o, 0]), - level: s.level++ - })) - : s.tokens.push({ - type: 'bullet_list_open', - lines: (ae = [o, 0]), - level: s.level++ - }), - _ = o, - ie = !1, - ce = s.parser.ruler.getRules('list'); - !( - !(_ < i) || - ((V = (Z = s.skipSpaces($)) >= s.eMarks[_] ? 1 : Z - $) > 4 && (V = 1), - V < 1 && (V = 1), - (w = $ - s.bMarks[_] + V), - s.tokens.push({ type: 'list_item_open', lines: (le = [o, 0]), level: s.level++ }), - (C = s.blkIndent), - (j = s.tight), - (x = s.tShift[o]), - (L = s.parentType), - (s.tShift[o] = Z - s.bMarks[o]), - (s.blkIndent = w), - (s.tight = !0), - (s.parentType = 'list'), - s.parser.tokenize(s, o, i, !0), - (s.tight && !ie) || (ye = !1), - (ie = s.line - o > 1 && s.isEmpty(s.line - 1)), - (s.blkIndent = C), - (s.tShift[o] = x), - (s.tight = j), - (s.parentType = L), - s.tokens.push({ type: 'list_item_close', level: --s.level }), - (_ = o = s.line), - (le[1] = _), - (Z = s.bMarks[o]), - _ >= i) || - s.isEmpty(_) || - s.tShift[_] < s.blkIndent - ); - ) { - for (fe = !1, pe = 0, de = ce.length; pe < de; pe++) - if (ce[pe](s, _, i, !0)) { - fe = !0; - break; - } - if (fe) break; - if (Y) { - if (($ = skipOrderedListMarker(s, _)) < 0) break; - } else if (($ = skipBulletListMarker(s, _)) < 0) break; - if (z !== s.src.charCodeAt($ - 1)) break; - } - return ( - s.tokens.push({ - type: Y ? 'ordered_list_close' : 'bullet_list_close', - level: --s.level - }), - (ae[1] = _), - (s.line = _), - ye && - (function markTightParagraphs(s, o) { - var i, - u, - _ = s.level + 2; - for (i = o + 2, u = s.tokens.length - 2; i < u; i++) - s.tokens[i].level === _ && - 'paragraph_open' === s.tokens[i].type && - ((s.tokens[i + 2].tight = !0), (s.tokens[i].tight = !0), (i += 2)); - })(s, ee), - !0 - ); - }, - ['paragraph', 'blockquote'] - ], - [ - 'footnote', - function footnote(s, o, i, u) { - var _, - w, - x, - C, - j, - L = s.bMarks[o] + s.tShift[o], - B = s.eMarks[o]; - if (L + 4 > B) return !1; - if (91 !== s.src.charCodeAt(L)) return !1; - if (94 !== s.src.charCodeAt(L + 1)) return !1; - if (s.level >= s.options.maxNesting) return !1; - for (C = L + 2; C < B; C++) { - if (32 === s.src.charCodeAt(C)) return !1; - if (93 === s.src.charCodeAt(C)) break; - } - return ( - C !== L + 2 && - !(C + 1 >= B || 58 !== s.src.charCodeAt(++C)) && - (u || - (C++, - s.env.footnotes || (s.env.footnotes = {}), - s.env.footnotes.refs || (s.env.footnotes.refs = {}), - (j = s.src.slice(L + 2, C - 2)), - (s.env.footnotes.refs[':' + j] = -1), - s.tokens.push({ type: 'footnote_reference_open', label: j, level: s.level++ }), - (_ = s.bMarks[o]), - (w = s.tShift[o]), - (x = s.parentType), - (s.tShift[o] = s.skipSpaces(C) - C), - (s.bMarks[o] = C), - (s.blkIndent += 4), - (s.parentType = 'footnote'), - s.tShift[o] < s.blkIndent && - ((s.tShift[o] += s.blkIndent), (s.bMarks[o] -= s.blkIndent)), - s.parser.tokenize(s, o, i, !0), - (s.parentType = x), - (s.blkIndent -= 4), - (s.tShift[o] = w), - (s.bMarks[o] = _), - s.tokens.push({ type: 'footnote_reference_close', level: --s.level })), - !0) - ); - }, - ['paragraph'] - ], - [ - 'heading', - function heading(s, o, i, u) { - var _, - w, - x, - C = s.bMarks[o] + s.tShift[o], - j = s.eMarks[o]; - if (C >= j) return !1; - if (35 !== (_ = s.src.charCodeAt(C)) || C >= j) return !1; - for (w = 1, _ = s.src.charCodeAt(++C); 35 === _ && C < j && w <= 6; ) - (w++, (_ = s.src.charCodeAt(++C))); - return ( - !(w > 6 || (C < j && 32 !== _)) && - (u || - ((j = s.skipCharsBack(j, 32, C)), - (x = s.skipCharsBack(j, 35, C)) > C && 32 === s.src.charCodeAt(x - 1) && (j = x), - (s.line = o + 1), - s.tokens.push({ - type: 'heading_open', - hLevel: w, - lines: [o, s.line], - level: s.level - }), - C < j && - s.tokens.push({ - type: 'inline', - content: s.src.slice(C, j).trim(), - level: s.level + 1, - lines: [o, s.line], - children: [] - }), - s.tokens.push({ type: 'heading_close', hLevel: w, level: s.level })), - !0) - ); - }, - ['paragraph', 'blockquote'] - ], - [ - 'lheading', - function lheading(s, o, i) { - var u, - _, - w, - x = o + 1; - return ( - !(x >= i) && - !(s.tShift[x] < s.blkIndent) && - !(s.tShift[x] - s.blkIndent > 3) && - !((_ = s.bMarks[x] + s.tShift[x]) >= (w = s.eMarks[x])) && - (45 === (u = s.src.charCodeAt(_)) || 61 === u) && - ((_ = s.skipChars(_, u)), - !((_ = s.skipSpaces(_)) < w) && - ((_ = s.bMarks[o] + s.tShift[o]), - (s.line = x + 1), - s.tokens.push({ - type: 'heading_open', - hLevel: 61 === u ? 1 : 2, - lines: [o, s.line], - level: s.level - }), - s.tokens.push({ - type: 'inline', - content: s.src.slice(_, s.eMarks[o]).trim(), - level: s.level + 1, - lines: [o, s.line - 1], - children: [] - }), - s.tokens.push({ - type: 'heading_close', - hLevel: 61 === u ? 1 : 2, - level: s.level - }), - !0)) - ); - } - ], - [ - 'htmlblock', - function htmlblock(s, o, i, u) { - var _, - w, - x, - C = s.bMarks[o], - j = s.eMarks[o], - L = s.tShift[o]; - if (((C += L), !s.options.html)) return !1; - if (L > 3 || C + 2 >= j) return !1; - if (60 !== s.src.charCodeAt(C)) return !1; - if (33 === (_ = s.src.charCodeAt(C + 1)) || 63 === _) { - if (u) return !0; - } else { - if ( - 47 !== _ && - !(function isLetter$1(s) { - var o = 32 | s; - return o >= 97 && o <= 122; - })(_) - ) - return !1; - if (47 === _) { - if (!(w = s.src.slice(C, j).match(EC))) return !1; - } else if (!(w = s.src.slice(C, j).match(_C))) return !1; - if (!0 !== bC[w[1].toLowerCase()]) return !1; - if (u) return !0; - } - for (x = o + 1; x < s.lineMax && !s.isEmpty(x); ) x++; - return ( - (s.line = x), - s.tokens.push({ - type: 'htmlblock', - level: s.level, - lines: [o, s.line], - content: s.getLines(o, x, 0, !0) - }), - !0 - ); - }, - ['paragraph', 'blockquote'] - ], - [ - 'table', - function table(s, o, i, u) { - var _, w, x, C, j, L, B, $, V, U, z; - if (o + 2 > i) return !1; - if (((j = o + 1), s.tShift[j] < s.blkIndent)) return !1; - if ((x = s.bMarks[j] + s.tShift[j]) >= s.eMarks[j]) return !1; - if (124 !== (_ = s.src.charCodeAt(x)) && 45 !== _ && 58 !== _) return !1; - if (((w = index_browser_getLine(s, o + 1)), !/^[-:| ]+$/.test(w))) return !1; - if ((L = w.split('|')) <= 2) return !1; - for ($ = [], C = 0; C < L.length; C++) { - if (!(V = L[C].trim())) { - if (0 === C || C === L.length - 1) continue; - return !1; - } - if (!/^:?-+:?$/.test(V)) return !1; - 58 === V.charCodeAt(V.length - 1) - ? $.push(58 === V.charCodeAt(0) ? 'center' : 'right') - : 58 === V.charCodeAt(0) - ? $.push('left') - : $.push(''); - } - if (-1 === (w = index_browser_getLine(s, o).trim()).indexOf('|')) return !1; - if (((L = w.replace(/^\||\|$/g, '').split('|')), $.length !== L.length)) return !1; - if (u) return !0; - for ( - s.tokens.push({ type: 'table_open', lines: (U = [o, 0]), level: s.level++ }), - s.tokens.push({ type: 'thead_open', lines: [o, o + 1], level: s.level++ }), - s.tokens.push({ type: 'tr_open', lines: [o, o + 1], level: s.level++ }), - C = 0; - C < L.length; - C++ - ) - (s.tokens.push({ - type: 'th_open', - align: $[C], - lines: [o, o + 1], - level: s.level++ - }), - s.tokens.push({ - type: 'inline', - content: L[C].trim(), - lines: [o, o + 1], - level: s.level, - children: [] - }), - s.tokens.push({ type: 'th_close', level: --s.level })); - for ( - s.tokens.push({ type: 'tr_close', level: --s.level }), - s.tokens.push({ type: 'thead_close', level: --s.level }), - s.tokens.push({ type: 'tbody_open', lines: (z = [o + 2, 0]), level: s.level++ }), - j = o + 2; - j < i && - !(s.tShift[j] < s.blkIndent) && - -1 !== (w = index_browser_getLine(s, j).trim()).indexOf('|'); - j++ - ) { - for ( - L = w.replace(/^\||\|$/g, '').split('|'), - s.tokens.push({ type: 'tr_open', level: s.level++ }), - C = 0; - C < L.length; - C++ - ) - (s.tokens.push({ type: 'td_open', align: $[C], level: s.level++ }), - (B = L[C].substring( - 124 === L[C].charCodeAt(0) ? 1 : 0, - 124 === L[C].charCodeAt(L[C].length - 1) ? L[C].length - 1 : L[C].length - ).trim()), - s.tokens.push({ type: 'inline', content: B, level: s.level, children: [] }), - s.tokens.push({ type: 'td_close', level: --s.level })); - s.tokens.push({ type: 'tr_close', level: --s.level }); - } - return ( - s.tokens.push({ type: 'tbody_close', level: --s.level }), - s.tokens.push({ type: 'table_close', level: --s.level }), - (U[1] = z[1] = j), - (s.line = j), - !0 - ); - }, - ['paragraph'] - ], - [ - 'deflist', - function deflist(s, o, i, u) { - var _, w, x, C, j, L, B, $, V, U, z, Y, Z, ee; - if (u) return !(s.ddIndent < 0) && skipMarker(s, o) >= 0; - if (((B = o + 1), s.isEmpty(B) && ++B > i)) return !1; - if (s.tShift[B] < s.blkIndent) return !1; - if ((_ = skipMarker(s, B)) < 0) return !1; - if (s.level >= s.options.maxNesting) return !1; - ((L = s.tokens.length), - s.tokens.push({ type: 'dl_open', lines: (j = [o, 0]), level: s.level++ }), - (x = o), - (w = B)); - e: for (;;) { - for ( - ee = !0, - Z = !1, - s.tokens.push({ type: 'dt_open', lines: [x, x], level: s.level++ }), - s.tokens.push({ - type: 'inline', - content: s.getLines(x, x + 1, s.blkIndent, !1).trim(), - level: s.level + 1, - lines: [x, x], - children: [] - }), - s.tokens.push({ type: 'dt_close', level: --s.level }); - ; - ) { - if ( - (s.tokens.push({ type: 'dd_open', lines: (C = [B, 0]), level: s.level++ }), - (Y = s.tight), - (V = s.ddIndent), - ($ = s.blkIndent), - (z = s.tShift[w]), - (U = s.parentType), - (s.blkIndent = s.ddIndent = s.tShift[w] + 2), - (s.tShift[w] = _ - s.bMarks[w]), - (s.tight = !0), - (s.parentType = 'deflist'), - s.parser.tokenize(s, w, i, !0), - (s.tight && !Z) || (ee = !1), - (Z = s.line - w > 1 && s.isEmpty(s.line - 1)), - (s.tShift[w] = z), - (s.tight = Y), - (s.parentType = U), - (s.blkIndent = $), - (s.ddIndent = V), - s.tokens.push({ type: 'dd_close', level: --s.level }), - (C[1] = B = s.line), - B >= i) - ) - break e; - if (s.tShift[B] < s.blkIndent) break e; - if ((_ = skipMarker(s, B)) < 0) break; - w = B; - } - if (B >= i) break; - if (((x = B), s.isEmpty(x))) break; - if (s.tShift[x] < s.blkIndent) break; - if ((w = x + 1) >= i) break; - if ((s.isEmpty(w) && w++, w >= i)) break; - if (s.tShift[w] < s.blkIndent) break; - if ((_ = skipMarker(s, w)) < 0) break; - } - return ( - s.tokens.push({ type: 'dl_close', level: --s.level }), - (j[1] = B), - (s.line = B), - ee && - (function markTightParagraphs$1(s, o) { - var i, - u, - _ = s.level + 2; - for (i = o + 2, u = s.tokens.length - 2; i < u; i++) - s.tokens[i].level === _ && - 'paragraph_open' === s.tokens[i].type && - ((s.tokens[i + 2].tight = !0), (s.tokens[i].tight = !0), (i += 2)); - })(s, L), - !0 - ); - }, - ['paragraph'] - ], - [ - 'paragraph', - function paragraph(s, o) { - var i, - u, - _, - w, - x, - C, - j = o + 1; - if (j < (i = s.lineMax) && !s.isEmpty(j)) - for (C = s.parser.ruler.getRules('paragraph'); j < i && !s.isEmpty(j); j++) - if (!(s.tShift[j] - s.blkIndent > 3)) { - for (_ = !1, w = 0, x = C.length; w < x; w++) - if (C[w](s, j, i, !0)) { - _ = !0; - break; - } - if (_) break; - } - return ( - (u = s.getLines(o, j, s.blkIndent, !1).trim()), - (s.line = j), - u.length && - (s.tokens.push({ - type: 'paragraph_open', - tight: !1, - lines: [o, s.line], - level: s.level - }), - s.tokens.push({ - type: 'inline', - content: u, - level: s.level + 1, - lines: [o, s.line], - children: [] - }), - s.tokens.push({ type: 'paragraph_close', tight: !1, level: s.level })), - !0 - ); - } - ] - ]; - function ParserBlock() { - this.ruler = new Ruler(); - for (var s = 0; s < wC.length; s++) - this.ruler.push(wC[s][0], wC[s][1], { alt: (wC[s][2] || []).slice() }); - } - ParserBlock.prototype.tokenize = function (s, o, i) { - for ( - var u, _ = this.ruler.getRules(''), w = _.length, x = o, C = !1; - x < i && - ((s.line = x = s.skipEmptyLines(x)), !(x >= i)) && - !(s.tShift[x] < s.blkIndent); - ) { - for (u = 0; u < w && !_[u](s, x, i, !1); u++); - if ( - ((s.tight = !C), s.isEmpty(s.line - 1) && (C = !0), (x = s.line) < i && s.isEmpty(x)) - ) { - if (((C = !0), ++x < i && 'list' === s.parentType && s.isEmpty(x))) break; - s.line = x; - } - } - }; - var SC = /[\n\t]/g, - xC = /\r[\n\u0085]|[\u2424\u2028\u0085]/g, - kC = /\u00a0/g; - function isTerminatorChar(s) { - switch (s) { - case 10: - case 92: - case 96: - case 42: - case 95: - case 94: - case 91: - case 93: - case 33: - case 38: - case 60: - case 62: - case 123: - case 125: - case 36: - case 37: - case 64: - case 126: - case 43: - case 61: - case 58: - return !0; - default: - return !1; - } - } - ParserBlock.prototype.parse = function (s, o, i, u) { - var _, - w = 0, - x = 0; - if (!s) return []; - ((s = (s = s.replace(kC, ' ')).replace(xC, '\n')).indexOf('\t') >= 0 && - (s = s.replace(SC, function (o, i) { - var u; - return 10 === s.charCodeAt(i) - ? ((w = i + 1), (x = 0), o) - : ((u = ' '.slice((i - w - x) % 4)), (x = i - w + 1), u); - })), - (_ = new StateBlock(s, this, o, i, u)), - this.tokenize(_, _.line, _.lineMax)); - }; - for (var CC = [], OC = 0; OC < 256; OC++) CC.push(0); - function isAlphaNum(s) { - return (s >= 48 && s <= 57) || (s >= 65 && s <= 90) || (s >= 97 && s <= 122); - } - function scanDelims(s, o) { - var i, - u, - _, - w = o, - x = !0, - C = !0, - j = s.posMax, - L = s.src.charCodeAt(o); - for (i = o > 0 ? s.src.charCodeAt(o - 1) : -1; w < j && s.src.charCodeAt(w) === L; ) w++; - return ( - w >= j && (x = !1), - (_ = w - o) >= 4 - ? (x = C = !1) - : ((32 !== (u = w < j ? s.src.charCodeAt(w) : -1) && 10 !== u) || (x = !1), - (32 !== i && 10 !== i) || (C = !1), - 95 === L && (isAlphaNum(i) && (x = !1), isAlphaNum(u) && (C = !1))), - { can_open: x, can_close: C, delims: _ } - ); - } - '\\!"#$%&\'()*+,./:;<=>?@[]^_`{|}~-'.split('').forEach(function (s) { - CC[s.charCodeAt(0)] = 1; - }); - var AC = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; - var jC = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; - var IC = [ - 'coap', - 'doi', - 'javascript', - 'aaa', - 'aaas', - 'about', - 'acap', - 'cap', - 'cid', - 'crid', - 'data', - 'dav', - 'dict', - 'dns', - 'file', - 'ftp', - 'geo', - 'go', - 'gopher', - 'h323', - 'http', - 'https', - 'iax', - 'icap', - 'im', - 'imap', - 'info', - 'ipp', - 'iris', - 'iris.beep', - 'iris.xpc', - 'iris.xpcs', - 'iris.lwz', - 'ldap', - 'mailto', - 'mid', - 'msrp', - 'msrps', - 'mtqp', - 'mupdate', - 'news', - 'nfs', - 'ni', - 'nih', - 'nntp', - 'opaquelocktoken', - 'pop', - 'pres', - 'rtsp', - 'service', - 'session', - 'shttp', - 'sieve', - 'sip', - 'sips', - 'sms', - 'snmp', - 'soap.beep', - 'soap.beeps', - 'tag', - 'tel', - 'telnet', - 'tftp', - 'thismessage', - 'tn3270', - 'tip', - 'tv', - 'urn', - 'vemmi', - 'ws', - 'wss', - 'xcon', - 'xcon-userid', - 'xmlrpc.beep', - 'xmlrpc.beeps', - 'xmpp', - 'z39.50r', - 'z39.50s', - 'adiumxtra', - 'afp', - 'afs', - 'aim', - 'apt', - 'attachment', - 'aw', - 'beshare', - 'bitcoin', - 'bolo', - 'callto', - 'chrome', - 'chrome-extension', - 'com-eventbrite-attendee', - 'content', - 'cvs', - 'dlna-playsingle', - 'dlna-playcontainer', - 'dtn', - 'dvb', - 'ed2k', - 'facetime', - 'feed', - 'finger', - 'fish', - 'gg', - 'git', - 'gizmoproject', - 'gtalk', - 'hcp', - 'icon', - 'ipn', - 'irc', - 'irc6', - 'ircs', - 'itms', - 'jar', - 'jms', - 'keyparc', - 'lastfm', - 'ldaps', - 'magnet', - 'maps', - 'market', - 'message', - 'mms', - 'ms-help', - 'msnim', - 'mumble', - 'mvn', - 'notes', - 'oid', - 'palm', - 'paparazzi', - 'platform', - 'proxy', - 'psyc', - 'query', - 'res', - 'resource', - 'rmi', - 'rsync', - 'rtmp', - 'secondlife', - 'sftp', - 'sgn', - 'skype', - 'smb', - 'soldat', - 'spotify', - 'ssh', - 'steam', - 'svn', - 'teamspeak', - 'things', - 'udp', - 'unreal', - 'ut2004', - 'ventrilo', - 'view-source', - 'webcal', - 'wtai', - 'wyciwyg', - 'xfire', - 'xri', - 'ymsgr' - ], - PC = - /^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/, - MC = /^<([a-zA-Z.\-]{1,25}):([^<>\x00-\x20]*)>/; - function replace$1(s, o) { - return ( - (s = s.source), - (o = o || ''), - function self(i, u) { - return i ? ((u = u.source || u), (s = s.replace(i, u)), self) : new RegExp(s, o); - } - ); - } - var TC = replace$1(/(?:unquoted|single_quoted|double_quoted)/)( - 'unquoted', - /[^"'=<>`\x00-\x20]+/ - )('single_quoted', /'[^']*'/)('double_quoted', /"[^"]*"/)(), - NC = replace$1(/(?:\s+attr_name(?:\s*=\s*attr_value)?)/)( - 'attr_name', - /[a-zA-Z_:][a-zA-Z0-9:._-]*/ - )('attr_value', TC)(), - RC = replace$1(/<[A-Za-z][A-Za-z0-9]*attribute*\s*\/?>/)('attribute', NC)(), - DC = replace$1(/^(?:open_tag|close_tag|comment|processing|declaration|cdata)/)( - 'open_tag', - RC - )('close_tag', /<\/[A-Za-z][A-Za-z0-9]*\s*>/)( - 'comment', - /|/ - )('processing', /<[?].*?[?]>/)('declaration', /]*>/)( - 'cdata', - // - )(); - var LC = /^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i, - BC = /^&([a-z][a-z0-9]{1,31});/i; - var FC = [ - [ - 'text', - function index_browser_text(s, o) { - for (var i = s.pos; i < s.posMax && !isTerminatorChar(s.src.charCodeAt(i)); ) i++; - return i !== s.pos && (o || (s.pending += s.src.slice(s.pos, i)), (s.pos = i), !0); - } - ], - [ - 'newline', - function newline(s, o) { - var i, - u, - _ = s.pos; - if (10 !== s.src.charCodeAt(_)) return !1; - if (((i = s.pending.length - 1), (u = s.posMax), !o)) - if (i >= 0 && 32 === s.pending.charCodeAt(i)) - if (i >= 1 && 32 === s.pending.charCodeAt(i - 1)) { - for (var w = i - 2; w >= 0; w--) - if (32 !== s.pending.charCodeAt(w)) { - s.pending = s.pending.substring(0, w + 1); - break; - } - s.push({ type: 'hardbreak', level: s.level }); - } else - ((s.pending = s.pending.slice(0, -1)), - s.push({ type: 'softbreak', level: s.level })); - else s.push({ type: 'softbreak', level: s.level }); - for (_++; _ < u && 32 === s.src.charCodeAt(_); ) _++; - return ((s.pos = _), !0); - } - ], - [ - 'escape', - function index_browser_escape(s, o) { - var i, - u = s.pos, - _ = s.posMax; - if (92 !== s.src.charCodeAt(u)) return !1; - if (++u < _) { - if ((i = s.src.charCodeAt(u)) < 256 && 0 !== CC[i]) - return (o || (s.pending += s.src[u]), (s.pos += 2), !0); - if (10 === i) { - for ( - o || s.push({ type: 'hardbreak', level: s.level }), u++; - u < _ && 32 === s.src.charCodeAt(u); - ) - u++; - return ((s.pos = u), !0); - } - } - return (o || (s.pending += '\\'), s.pos++, !0); - } - ], - [ - 'backticks', - function backticks(s, o) { - var i, - u, - _, - w, - x, - C = s.pos; - if (96 !== s.src.charCodeAt(C)) return !1; - for (i = C, C++, u = s.posMax; C < u && 96 === s.src.charCodeAt(C); ) C++; - for (_ = s.src.slice(i, C), w = x = C; -1 !== (w = s.src.indexOf('`', x)); ) { - for (x = w + 1; x < u && 96 === s.src.charCodeAt(x); ) x++; - if (x - w === _.length) - return ( - o || - s.push({ - type: 'code', - content: s.src - .slice(C, w) - .replace(/[ \n]+/g, ' ') - .trim(), - block: !1, - level: s.level - }), - (s.pos = x), - !0 - ); - } - return (o || (s.pending += _), (s.pos += _.length), !0); - } - ], - [ - 'del', - function del(s, o) { - var i, - u, - _, - w, - x, - C = s.posMax, - j = s.pos; - if (126 !== s.src.charCodeAt(j)) return !1; - if (o) return !1; - if (j + 4 >= C) return !1; - if (126 !== s.src.charCodeAt(j + 1)) return !1; - if (s.level >= s.options.maxNesting) return !1; - if ( - ((w = j > 0 ? s.src.charCodeAt(j - 1) : -1), - (x = s.src.charCodeAt(j + 2)), - 126 === w) - ) - return !1; - if (126 === x) return !1; - if (32 === x || 10 === x) return !1; - for (u = j + 2; u < C && 126 === s.src.charCodeAt(u); ) u++; - if (u > j + 3) return ((s.pos += u - j), o || (s.pending += s.src.slice(j, u)), !0); - for (s.pos = j + 2, _ = 1; s.pos + 1 < C; ) { - if ( - 126 === s.src.charCodeAt(s.pos) && - 126 === s.src.charCodeAt(s.pos + 1) && - ((w = s.src.charCodeAt(s.pos - 1)), - 126 !== (x = s.pos + 2 < C ? s.src.charCodeAt(s.pos + 2) : -1) && - 126 !== w && - (32 !== w && 10 !== w ? _-- : 32 !== x && 10 !== x && _++, _ <= 0)) - ) { - i = !0; - break; - } - s.parser.skipToken(s); - } - return i - ? ((s.posMax = s.pos), - (s.pos = j + 2), - o || - (s.push({ type: 'del_open', level: s.level++ }), - s.parser.tokenize(s), - s.push({ type: 'del_close', level: --s.level })), - (s.pos = s.posMax + 2), - (s.posMax = C), - !0) - : ((s.pos = j), !1); - } - ], - [ - 'ins', - function ins(s, o) { - var i, - u, - _, - w, - x, - C = s.posMax, - j = s.pos; - if (43 !== s.src.charCodeAt(j)) return !1; - if (o) return !1; - if (j + 4 >= C) return !1; - if (43 !== s.src.charCodeAt(j + 1)) return !1; - if (s.level >= s.options.maxNesting) return !1; - if ( - ((w = j > 0 ? s.src.charCodeAt(j - 1) : -1), - (x = s.src.charCodeAt(j + 2)), - 43 === w) - ) - return !1; - if (43 === x) return !1; - if (32 === x || 10 === x) return !1; - for (u = j + 2; u < C && 43 === s.src.charCodeAt(u); ) u++; - if (u !== j + 2) return ((s.pos += u - j), o || (s.pending += s.src.slice(j, u)), !0); - for (s.pos = j + 2, _ = 1; s.pos + 1 < C; ) { - if ( - 43 === s.src.charCodeAt(s.pos) && - 43 === s.src.charCodeAt(s.pos + 1) && - ((w = s.src.charCodeAt(s.pos - 1)), - 43 !== (x = s.pos + 2 < C ? s.src.charCodeAt(s.pos + 2) : -1) && - 43 !== w && - (32 !== w && 10 !== w ? _-- : 32 !== x && 10 !== x && _++, _ <= 0)) - ) { - i = !0; - break; - } - s.parser.skipToken(s); - } - return i - ? ((s.posMax = s.pos), - (s.pos = j + 2), - o || - (s.push({ type: 'ins_open', level: s.level++ }), - s.parser.tokenize(s), - s.push({ type: 'ins_close', level: --s.level })), - (s.pos = s.posMax + 2), - (s.posMax = C), - !0) - : ((s.pos = j), !1); - } - ], - [ - 'mark', - function mark(s, o) { - var i, - u, - _, - w, - x, - C = s.posMax, - j = s.pos; - if (61 !== s.src.charCodeAt(j)) return !1; - if (o) return !1; - if (j + 4 >= C) return !1; - if (61 !== s.src.charCodeAt(j + 1)) return !1; - if (s.level >= s.options.maxNesting) return !1; - if ( - ((w = j > 0 ? s.src.charCodeAt(j - 1) : -1), - (x = s.src.charCodeAt(j + 2)), - 61 === w) - ) - return !1; - if (61 === x) return !1; - if (32 === x || 10 === x) return !1; - for (u = j + 2; u < C && 61 === s.src.charCodeAt(u); ) u++; - if (u !== j + 2) return ((s.pos += u - j), o || (s.pending += s.src.slice(j, u)), !0); - for (s.pos = j + 2, _ = 1; s.pos + 1 < C; ) { - if ( - 61 === s.src.charCodeAt(s.pos) && - 61 === s.src.charCodeAt(s.pos + 1) && - ((w = s.src.charCodeAt(s.pos - 1)), - 61 !== (x = s.pos + 2 < C ? s.src.charCodeAt(s.pos + 2) : -1) && - 61 !== w && - (32 !== w && 10 !== w ? _-- : 32 !== x && 10 !== x && _++, _ <= 0)) - ) { - i = !0; - break; - } - s.parser.skipToken(s); - } - return i - ? ((s.posMax = s.pos), - (s.pos = j + 2), - o || - (s.push({ type: 'mark_open', level: s.level++ }), - s.parser.tokenize(s), - s.push({ type: 'mark_close', level: --s.level })), - (s.pos = s.posMax + 2), - (s.posMax = C), - !0) - : ((s.pos = j), !1); - } - ], - [ - 'emphasis', - function emphasis(s, o) { - var i, - u, - _, - w, - x, - C, - j, - L = s.posMax, - B = s.pos, - $ = s.src.charCodeAt(B); - if (95 !== $ && 42 !== $) return !1; - if (o) return !1; - if (((i = (j = scanDelims(s, B)).delims), !j.can_open)) - return ((s.pos += i), o || (s.pending += s.src.slice(B, s.pos)), !0); - if (s.level >= s.options.maxNesting) return !1; - for (s.pos = B + i, C = [i]; s.pos < L; ) - if (s.src.charCodeAt(s.pos) !== $) s.parser.skipToken(s); - else { - if (((u = (j = scanDelims(s, s.pos)).delims), j.can_close)) { - for (w = C.pop(), x = u; w !== x; ) { - if (x < w) { - C.push(w - x); - break; - } - if (((x -= w), 0 === C.length)) break; - ((s.pos += w), (w = C.pop())); - } - if (0 === C.length) { - ((i = w), (_ = !0)); - break; - } - s.pos += u; - continue; - } - (j.can_open && C.push(u), (s.pos += u)); - } - return _ - ? ((s.posMax = s.pos), - (s.pos = B + i), - o || - ((2 !== i && 3 !== i) || s.push({ type: 'strong_open', level: s.level++ }), - (1 !== i && 3 !== i) || s.push({ type: 'em_open', level: s.level++ }), - s.parser.tokenize(s), - (1 !== i && 3 !== i) || s.push({ type: 'em_close', level: --s.level }), - (2 !== i && 3 !== i) || s.push({ type: 'strong_close', level: --s.level })), - (s.pos = s.posMax + i), - (s.posMax = L), - !0) - : ((s.pos = B), !1); - } - ], - [ - 'sub', - function sub(s, o) { - var i, - u, - _ = s.posMax, - w = s.pos; - if (126 !== s.src.charCodeAt(w)) return !1; - if (o) return !1; - if (w + 2 >= _) return !1; - if (s.level >= s.options.maxNesting) return !1; - for (s.pos = w + 1; s.pos < _; ) { - if (126 === s.src.charCodeAt(s.pos)) { - i = !0; - break; - } - s.parser.skipToken(s); - } - return i && w + 1 !== s.pos - ? (u = s.src.slice(w + 1, s.pos)).match(/(^|[^\\])(\\\\)*\s/) - ? ((s.pos = w), !1) - : ((s.posMax = s.pos), - (s.pos = w + 1), - o || s.push({ type: 'sub', level: s.level, content: u.replace(AC, '$1') }), - (s.pos = s.posMax + 1), - (s.posMax = _), - !0) - : ((s.pos = w), !1); - } - ], - [ - 'sup', - function sup(s, o) { - var i, - u, - _ = s.posMax, - w = s.pos; - if (94 !== s.src.charCodeAt(w)) return !1; - if (o) return !1; - if (w + 2 >= _) return !1; - if (s.level >= s.options.maxNesting) return !1; - for (s.pos = w + 1; s.pos < _; ) { - if (94 === s.src.charCodeAt(s.pos)) { - i = !0; - break; - } - s.parser.skipToken(s); - } - return i && w + 1 !== s.pos - ? (u = s.src.slice(w + 1, s.pos)).match(/(^|[^\\])(\\\\)*\s/) - ? ((s.pos = w), !1) - : ((s.posMax = s.pos), - (s.pos = w + 1), - o || s.push({ type: 'sup', level: s.level, content: u.replace(jC, '$1') }), - (s.pos = s.posMax + 1), - (s.posMax = _), - !0) - : ((s.pos = w), !1); - } - ], - [ - 'links', - function links(s, o) { - var i, - u, - _, - w, - x, - C, - j, - L, - B = !1, - $ = s.pos, - V = s.posMax, - U = s.pos, - z = s.src.charCodeAt(U); - if ((33 === z && ((B = !0), (z = s.src.charCodeAt(++U))), 91 !== z)) return !1; - if (s.level >= s.options.maxNesting) return !1; - if (((i = U + 1), (u = parseLinkLabel(s, U)) < 0)) return !1; - if ((C = u + 1) < V && 40 === s.src.charCodeAt(C)) { - for (C++; C < V && (32 === (L = s.src.charCodeAt(C)) || 10 === L); C++); - if (C >= V) return !1; - for ( - U = C, - parseLinkDestination(s, C) ? ((w = s.linkContent), (C = s.pos)) : (w = ''), - U = C; - C < V && (32 === (L = s.src.charCodeAt(C)) || 10 === L); - C++ - ); - if (C < V && U !== C && parseLinkTitle(s, C)) - for ( - x = s.linkContent, C = s.pos; - C < V && (32 === (L = s.src.charCodeAt(C)) || 10 === L); - C++ - ); - else x = ''; - if (C >= V || 41 !== s.src.charCodeAt(C)) return ((s.pos = $), !1); - C++; - } else { - if (s.linkLevel > 0) return !1; - for (; C < V && (32 === (L = s.src.charCodeAt(C)) || 10 === L); C++); - if ( - (C < V && - 91 === s.src.charCodeAt(C) && - ((U = C + 1), - (C = parseLinkLabel(s, C)) >= 0 ? (_ = s.src.slice(U, C++)) : (C = U - 1)), - _ || (void 0 === _ && (C = u + 1), (_ = s.src.slice(i, u))), - !(j = s.env.references[normalizeReference(_)])) - ) - return ((s.pos = $), !1); - ((w = j.href), (x = j.title)); - } - return ( - o || - ((s.pos = i), - (s.posMax = u), - B - ? s.push({ - type: 'image', - src: w, - title: x, - alt: s.src.substr(i, u - i), - level: s.level - }) - : (s.push({ type: 'link_open', href: w, title: x, level: s.level++ }), - s.linkLevel++, - s.parser.tokenize(s), - s.linkLevel--, - s.push({ type: 'link_close', level: --s.level }))), - (s.pos = C), - (s.posMax = V), - !0 - ); - } - ], - [ - 'footnote_inline', - function footnote_inline(s, o) { - var i, - u, - _, - w, - x = s.posMax, - C = s.pos; - return ( - !(C + 2 >= x) && - 94 === s.src.charCodeAt(C) && - 91 === s.src.charCodeAt(C + 1) && - !(s.level >= s.options.maxNesting) && - ((i = C + 2), - !((u = parseLinkLabel(s, C + 1)) < 0) && - (o || - (s.env.footnotes || (s.env.footnotes = {}), - s.env.footnotes.list || (s.env.footnotes.list = []), - (_ = s.env.footnotes.list.length), - (s.pos = i), - (s.posMax = u), - s.push({ type: 'footnote_ref', id: _, level: s.level }), - s.linkLevel++, - (w = s.tokens.length), - s.parser.tokenize(s), - (s.env.footnotes.list[_] = { tokens: s.tokens.splice(w) }), - s.linkLevel--), - (s.pos = u + 1), - (s.posMax = x), - !0)) - ); - } - ], - [ - 'footnote_ref', - function footnote_ref(s, o) { - var i, - u, - _, - w, - x = s.posMax, - C = s.pos; - if (C + 3 > x) return !1; - if (!s.env.footnotes || !s.env.footnotes.refs) return !1; - if (91 !== s.src.charCodeAt(C)) return !1; - if (94 !== s.src.charCodeAt(C + 1)) return !1; - if (s.level >= s.options.maxNesting) return !1; - for (u = C + 2; u < x; u++) { - if (32 === s.src.charCodeAt(u)) return !1; - if (10 === s.src.charCodeAt(u)) return !1; - if (93 === s.src.charCodeAt(u)) break; - } - return ( - u !== C + 2 && - !(u >= x) && - (u++, - (i = s.src.slice(C + 2, u - 1)), - void 0 !== s.env.footnotes.refs[':' + i] && - (o || - (s.env.footnotes.list || (s.env.footnotes.list = []), - s.env.footnotes.refs[':' + i] < 0 - ? ((_ = s.env.footnotes.list.length), - (s.env.footnotes.list[_] = { label: i, count: 0 }), - (s.env.footnotes.refs[':' + i] = _)) - : (_ = s.env.footnotes.refs[':' + i]), - (w = s.env.footnotes.list[_].count), - s.env.footnotes.list[_].count++, - s.push({ type: 'footnote_ref', id: _, subId: w, level: s.level })), - (s.pos = u), - (s.posMax = x), - !0)) - ); - } - ], - [ - 'autolink', - function autolink(s, o) { - var i, - u, - _, - w, - x, - C = s.pos; - return ( - 60 === s.src.charCodeAt(C) && - !((i = s.src.slice(C)).indexOf('>') < 0) && - ((u = i.match(MC)) - ? !(IC.indexOf(u[1].toLowerCase()) < 0) && - ((x = normalizeLink((w = u[0].slice(1, -1)))), - !!s.parser.validateLink(w) && - (o || - (s.push({ type: 'link_open', href: x, level: s.level }), - s.push({ type: 'text', content: w, level: s.level + 1 }), - s.push({ type: 'link_close', level: s.level })), - (s.pos += u[0].length), - !0)) - : !!(_ = i.match(PC)) && - ((x = normalizeLink('mailto:' + (w = _[0].slice(1, -1)))), - !!s.parser.validateLink(x) && - (o || - (s.push({ type: 'link_open', href: x, level: s.level }), - s.push({ type: 'text', content: w, level: s.level + 1 }), - s.push({ type: 'link_close', level: s.level })), - (s.pos += _[0].length), - !0))) - ); - } - ], - [ - 'htmltag', - function htmltag(s, o) { - var i, - u, - _, - w = s.pos; - return ( - !!s.options.html && - ((_ = s.posMax), - !(60 !== s.src.charCodeAt(w) || w + 2 >= _) && - !( - 33 !== (i = s.src.charCodeAt(w + 1)) && - 63 !== i && - 47 !== i && - !(function isLetter$2(s) { - var o = 32 | s; - return o >= 97 && o <= 122; - })(i) - ) && - !!(u = s.src.slice(w).match(DC)) && - (o || - s.push({ - type: 'htmltag', - content: s.src.slice(w, w + u[0].length), - level: s.level - }), - (s.pos += u[0].length), - !0)) - ); - } - ], - [ - 'entity', - function entity(s, o) { - var i, - u, - _ = s.pos, - w = s.posMax; - if (38 !== s.src.charCodeAt(_)) return !1; - if (_ + 1 < w) - if (35 === s.src.charCodeAt(_ + 1)) { - if ((u = s.src.slice(_).match(LC))) - return ( - o || - ((i = - 'x' === u[1][0].toLowerCase() - ? parseInt(u[1].slice(1), 16) - : parseInt(u[1], 10)), - (s.pending += isValidEntityCode(i) - ? fromCodePoint(i) - : fromCodePoint(65533))), - (s.pos += u[0].length), - !0 - ); - } else if ((u = s.src.slice(_).match(BC))) { - var x = decodeEntity(u[1]); - if (u[1] !== x) return (o || (s.pending += x), (s.pos += u[0].length), !0); - } - return (o || (s.pending += '&'), s.pos++, !0); - } - ] - ]; - function ParserInline() { - this.ruler = new Ruler(); - for (var s = 0; s < FC.length; s++) this.ruler.push(FC[s][0], FC[s][1]); - this.validateLink = validateLink; - } - function validateLink(s) { - var o = s.trim().toLowerCase(); - return ( - -1 === (o = replaceEntities(o)).indexOf(':') || - -1 === ['vbscript', 'javascript', 'file', 'data'].indexOf(o.split(':')[0]) - ); - } - ((ParserInline.prototype.skipToken = function (s) { - var o, - i, - u = this.ruler.getRules(''), - _ = u.length, - w = s.pos; - if ((i = s.cacheGet(w)) > 0) s.pos = i; - else { - for (o = 0; o < _; o++) if (u[o](s, !0)) return void s.cacheSet(w, s.pos); - (s.pos++, s.cacheSet(w, s.pos)); - } - }), - (ParserInline.prototype.tokenize = function (s) { - for (var o, i, u = this.ruler.getRules(''), _ = u.length, w = s.posMax; s.pos < w; ) { - for (i = 0; i < _ && !(o = u[i](s, !1)); i++); - if (o) { - if (s.pos >= w) break; - } else s.pending += s.src[s.pos++]; - } - s.pending && s.pushPending(); - }), - (ParserInline.prototype.parse = function (s, o, i, u) { - var _ = new StateInline(s, this, o, i, u); - this.tokenize(_); - })); - var qC = { - default: { - options: { - html: !1, - xhtmlOut: !1, - breaks: !1, - langPrefix: 'language-', - linkTarget: '', - typographer: !1, - quotes: '“”‘’', - highlight: null, - maxNesting: 20 - }, - components: { - core: { - rules: [ - 'block', - 'inline', - 'references', - 'replacements', - 'smartquotes', - 'references', - 'abbr2', - 'footnote_tail' - ] - }, - block: { - rules: [ - 'blockquote', - 'code', - 'fences', - 'footnote', - 'heading', - 'hr', - 'htmlblock', - 'lheading', - 'list', - 'paragraph', - 'table' - ] - }, - inline: { - rules: [ - 'autolink', - 'backticks', - 'del', - 'emphasis', - 'entity', - 'escape', - 'footnote_ref', - 'htmltag', - 'links', - 'newline', - 'text' - ] - } - } - }, - full: { - options: { - html: !1, - xhtmlOut: !1, - breaks: !1, - langPrefix: 'language-', - linkTarget: '', - typographer: !1, - quotes: '“”‘’', - highlight: null, - maxNesting: 20 - }, - components: { core: {}, block: {}, inline: {} } - }, - commonmark: { - options: { - html: !0, - xhtmlOut: !0, - breaks: !1, - langPrefix: 'language-', - linkTarget: '', - typographer: !1, - quotes: '“”‘’', - highlight: null, - maxNesting: 20 - }, - components: { - core: { rules: ['block', 'inline', 'references', 'abbr2'] }, - block: { - rules: [ - 'blockquote', - 'code', - 'fences', - 'heading', - 'hr', - 'htmlblock', - 'lheading', - 'list', - 'paragraph' - ] - }, - inline: { - rules: [ - 'autolink', - 'backticks', - 'emphasis', - 'entity', - 'escape', - 'htmltag', - 'links', - 'newline', - 'text' - ] - } - } - } - }; - function StateCore(s, o, i) { - ((this.src = o), - (this.env = i), - (this.options = s.options), - (this.tokens = []), - (this.inlineMode = !1), - (this.inline = s.inline), - (this.block = s.block), - (this.renderer = s.renderer), - (this.typographer = s.typographer)); - } - function Remarkable(s, o) { - ('string' != typeof s && ((o = s), (s = 'default')), - o && - null != o.linkify && - console.warn( - "linkify option is removed. Use linkify plugin instead:\n\nimport Remarkable from 'remarkable';\nimport linkify from 'remarkable/linkify';\nnew Remarkable().use(linkify)\n" - ), - (this.inline = new ParserInline()), - (this.block = new ParserBlock()), - (this.core = new Core()), - (this.renderer = new Renderer()), - (this.ruler = new Ruler()), - (this.options = {}), - this.configure(qC[s]), - this.set(o || {})); - } - ((Remarkable.prototype.set = function (s) { - index_browser_assign(this.options, s); - }), - (Remarkable.prototype.configure = function (s) { - var o = this; - if (!s) throw new Error('Wrong `remarkable` preset, check name/content'); - (s.options && o.set(s.options), - s.components && - Object.keys(s.components).forEach(function (i) { - s.components[i].rules && o[i].ruler.enable(s.components[i].rules, !0); - })); - }), - (Remarkable.prototype.use = function (s, o) { - return (s(this, o), this); - }), - (Remarkable.prototype.parse = function (s, o) { - var i = new StateCore(this, s, o); - return (this.core.process(i), i.tokens); - }), - (Remarkable.prototype.render = function (s, o) { - return ((o = o || {}), this.renderer.render(this.parse(s, o), this.options, o)); - }), - (Remarkable.prototype.parseInline = function (s, o) { - var i = new StateCore(this, s, o); - return ((i.inlineMode = !0), this.core.process(i), i.tokens); - }), - (Remarkable.prototype.renderInline = function (s, o) { - return ((o = o || {}), this.renderer.render(this.parseInline(s, o), this.options, o)); - })); - function indexOf(s, o) { - if (Array.prototype.indexOf) return s.indexOf(o); - for (var i = 0, u = s.length; i < u; i++) if (s[i] === o) return i; - return -1; - } - function utils_remove(s, o) { - for (var i = s.length - 1; i >= 0; i--) !0 === o(s[i]) && s.splice(i, 1); - } - function throwUnhandledCaseError(s) { - throw new Error("Unhandled case for value: '".concat(s, "'")); - } - var $C = (function () { - function HtmlTag(s) { - (void 0 === s && (s = {}), - (this.tagName = ''), - (this.attrs = {}), - (this.innerHTML = ''), - (this.whitespaceRegex = /\s+/), - (this.tagName = s.tagName || ''), - (this.attrs = s.attrs || {}), - (this.innerHTML = s.innerHtml || s.innerHTML || '')); - } - return ( - (HtmlTag.prototype.setTagName = function (s) { - return ((this.tagName = s), this); - }), - (HtmlTag.prototype.getTagName = function () { - return this.tagName || ''; - }), - (HtmlTag.prototype.setAttr = function (s, o) { - return ((this.getAttrs()[s] = o), this); - }), - (HtmlTag.prototype.getAttr = function (s) { - return this.getAttrs()[s]; - }), - (HtmlTag.prototype.setAttrs = function (s) { - return (Object.assign(this.getAttrs(), s), this); - }), - (HtmlTag.prototype.getAttrs = function () { - return this.attrs || (this.attrs = {}); - }), - (HtmlTag.prototype.setClass = function (s) { - return this.setAttr('class', s); - }), - (HtmlTag.prototype.addClass = function (s) { - for ( - var o, - i = this.getClass(), - u = this.whitespaceRegex, - _ = i ? i.split(u) : [], - w = s.split(u); - (o = w.shift()); - ) - -1 === indexOf(_, o) && _.push(o); - return ((this.getAttrs().class = _.join(' ')), this); - }), - (HtmlTag.prototype.removeClass = function (s) { - for ( - var o, - i = this.getClass(), - u = this.whitespaceRegex, - _ = i ? i.split(u) : [], - w = s.split(u); - _.length && (o = w.shift()); - ) { - var x = indexOf(_, o); - -1 !== x && _.splice(x, 1); - } - return ((this.getAttrs().class = _.join(' ')), this); - }), - (HtmlTag.prototype.getClass = function () { - return this.getAttrs().class || ''; - }), - (HtmlTag.prototype.hasClass = function (s) { - return -1 !== (' ' + this.getClass() + ' ').indexOf(' ' + s + ' '); - }), - (HtmlTag.prototype.setInnerHTML = function (s) { - return ((this.innerHTML = s), this); - }), - (HtmlTag.prototype.setInnerHtml = function (s) { - return this.setInnerHTML(s); - }), - (HtmlTag.prototype.getInnerHTML = function () { - return this.innerHTML || ''; - }), - (HtmlTag.prototype.getInnerHtml = function () { - return this.getInnerHTML(); - }), - (HtmlTag.prototype.toAnchorString = function () { - var s = this.getTagName(), - o = this.buildAttrsStr(); - return ['<', s, (o = o ? ' ' + o : ''), '>', this.getInnerHtml(), ''].join( - '' - ); - }), - (HtmlTag.prototype.buildAttrsStr = function () { - if (!this.attrs) return ''; - var s = this.getAttrs(), - o = []; - for (var i in s) s.hasOwnProperty(i) && o.push(i + '="' + s[i] + '"'); - return o.join(' '); - }), - HtmlTag - ); - })(); - var VC = (function () { - function AnchorTagBuilder(s) { - (void 0 === s && (s = {}), - (this.newWindow = !1), - (this.truncate = {}), - (this.className = ''), - (this.newWindow = s.newWindow || !1), - (this.truncate = s.truncate || {}), - (this.className = s.className || '')); - } - return ( - (AnchorTagBuilder.prototype.build = function (s) { - return new $C({ - tagName: 'a', - attrs: this.createAttrs(s), - innerHtml: this.processAnchorText(s.getAnchorText()) - }); - }), - (AnchorTagBuilder.prototype.createAttrs = function (s) { - var o = { href: s.getAnchorHref() }, - i = this.createCssClass(s); - return ( - i && (o.class = i), - this.newWindow && ((o.target = '_blank'), (o.rel = 'noopener noreferrer')), - this.truncate && - this.truncate.length && - this.truncate.length < s.getAnchorText().length && - (o.title = s.getAnchorHref()), - o - ); - }), - (AnchorTagBuilder.prototype.createCssClass = function (s) { - var o = this.className; - if (o) { - for (var i = [o], u = s.getCssClassSuffixes(), _ = 0, w = u.length; _ < w; _++) - i.push(o + '-' + u[_]); - return i.join(' '); - } - return ''; - }), - (AnchorTagBuilder.prototype.processAnchorText = function (s) { - return (s = this.doTruncate(s)); - }), - (AnchorTagBuilder.prototype.doTruncate = function (s) { - var o = this.truncate; - if (!o || !o.length) return s; - var i = o.length, - u = o.location; - return 'smart' === u - ? (function truncateSmart(s, o, i) { - var u, _; - null == i - ? ((i = '…'), (_ = 3), (u = 8)) - : ((_ = i.length), (u = i.length)); - var buildUrl = function (s) { - var o = ''; - return ( - s.scheme && s.host && (o += s.scheme + '://'), - s.host && (o += s.host), - s.path && (o += '/' + s.path), - s.query && (o += '?' + s.query), - s.fragment && (o += '#' + s.fragment), - o - ); - }, - buildSegment = function (s, o) { - var u = o / 2, - _ = Math.ceil(u), - w = -1 * Math.floor(u), - x = ''; - return (w < 0 && (x = s.substr(w)), s.substr(0, _) + i + x); - }; - if (s.length <= o) return s; - var w = o - _, - x = (function (s) { - var o = {}, - i = s, - u = i.match(/^([a-z]+):\/\//i); - return ( - u && ((o.scheme = u[1]), (i = i.substr(u[0].length))), - (u = i.match(/^(.*?)(?=(\?|#|\/|$))/i)) && - ((o.host = u[1]), (i = i.substr(u[0].length))), - (u = i.match(/^\/(.*?)(?=(\?|#|$))/i)) && - ((o.path = u[1]), (i = i.substr(u[0].length))), - (u = i.match(/^\?(.*?)(?=(#|$))/i)) && - ((o.query = u[1]), (i = i.substr(u[0].length))), - (u = i.match(/^#(.*?)$/i)) && (o.fragment = u[1]), - o - ); - })(s); - if (x.query) { - var C = x.query.match(/^(.*?)(?=(\?|\#))(.*?)$/i); - C && ((x.query = x.query.substr(0, C[1].length)), (s = buildUrl(x))); - } - if (s.length <= o) return s; - if ( - (x.host && ((x.host = x.host.replace(/^www\./, '')), (s = buildUrl(x))), - s.length <= o) - ) - return s; - var j = ''; - if ((x.host && (j += x.host), j.length >= w)) - return x.host.length == o - ? (x.host.substr(0, o - _) + i).substr(0, w + u) - : buildSegment(j, w).substr(0, w + u); - var L = ''; - if ((x.path && (L += '/' + x.path), x.query && (L += '?' + x.query), L)) { - if ((j + L).length >= w) - return (j + L).length == o - ? (j + L).substr(0, o) - : (j + buildSegment(L, w - j.length)).substr(0, w + u); - j += L; - } - if (x.fragment) { - var B = '#' + x.fragment; - if ((j + B).length >= w) - return (j + B).length == o - ? (j + B).substr(0, o) - : (j + buildSegment(B, w - j.length)).substr(0, w + u); - j += B; - } - if (x.scheme && x.host) { - var $ = x.scheme + '://'; - if ((j + $).length < w) return ($ + j).substr(0, o); - } - if (j.length <= o) return j; - var V = ''; - return ( - w > 0 && (V = j.substr(-1 * Math.floor(w / 2))), - (j.substr(0, Math.ceil(w / 2)) + i + V).substr(0, w + u) - ); - })(s, i) - : 'middle' === u - ? (function truncateMiddle(s, o, i) { - if (s.length <= o) return s; - var u, _; - null == i - ? ((i = '…'), (u = 8), (_ = 3)) - : ((u = i.length), (_ = i.length)); - var w = o - _, - x = ''; - return ( - w > 0 && (x = s.substr(-1 * Math.floor(w / 2))), - (s.substr(0, Math.ceil(w / 2)) + i + x).substr(0, w + u) - ); - })(s, i) - : (function truncateEnd(s, o, i) { - return (function ellipsis(s, o, i) { - var u; - return ( - s.length > o && - (null == i ? ((i = '…'), (u = 3)) : (u = i.length), - (s = s.substring(0, o - u) + i)), - s - ); - })(s, o, i); - })(s, i); - }), - AnchorTagBuilder - ); - })(), - UC = (function () { - function Match(s) { - ((this.__jsduckDummyDocProp = null), - (this.matchedText = ''), - (this.offset = 0), - (this.tagBuilder = s.tagBuilder), - (this.matchedText = s.matchedText), - (this.offset = s.offset)); - } - return ( - (Match.prototype.getMatchedText = function () { - return this.matchedText; - }), - (Match.prototype.setOffset = function (s) { - this.offset = s; - }), - (Match.prototype.getOffset = function () { - return this.offset; - }), - (Match.prototype.getCssClassSuffixes = function () { - return [this.getType()]; - }), - (Match.prototype.buildTag = function () { - return this.tagBuilder.build(this); - }), - Match - ); - })(), - extendStatics = function (s, o) { - return ( - (extendStatics = - Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && - function (s, o) { - s.__proto__ = o; - }) || - function (s, o) { - for (var i in o) Object.prototype.hasOwnProperty.call(o, i) && (s[i] = o[i]); - }), - extendStatics(s, o) - ); - }; - function tslib_es6_extends(s, o) { - if ('function' != typeof o && null !== o) - throw new TypeError( - 'Class extends value ' + String(o) + ' is not a constructor or null' - ); - function __() { - this.constructor = s; - } - (extendStatics(s, o), - (s.prototype = - null === o ? Object.create(o) : ((__.prototype = o.prototype), new __()))); - } - var __assign = function () { - return ( - (__assign = - Object.assign || - function __assign(s) { - for (var o, i = 1, u = arguments.length; i < u; i++) - for (var _ in (o = arguments[i])) - Object.prototype.hasOwnProperty.call(o, _) && (s[_] = o[_]); - return s; - }), - __assign.apply(this, arguments) - ); - }; - Object.create; - Object.create; - 'function' == typeof SuppressedError && SuppressedError; - var zC, - WC = (function (s) { - function EmailMatch(o) { - var i = s.call(this, o) || this; - return ((i.email = ''), (i.email = o.email), i); - } - return ( - tslib_es6_extends(EmailMatch, s), - (EmailMatch.prototype.getType = function () { - return 'email'; - }), - (EmailMatch.prototype.getEmail = function () { - return this.email; - }), - (EmailMatch.prototype.getAnchorHref = function () { - return 'mailto:' + this.email; - }), - (EmailMatch.prototype.getAnchorText = function () { - return this.email; - }), - EmailMatch - ); - })(UC), - KC = (function (s) { - function HashtagMatch(o) { - var i = s.call(this, o) || this; - return ( - (i.serviceName = ''), - (i.hashtag = ''), - (i.serviceName = o.serviceName), - (i.hashtag = o.hashtag), - i - ); - } - return ( - tslib_es6_extends(HashtagMatch, s), - (HashtagMatch.prototype.getType = function () { - return 'hashtag'; - }), - (HashtagMatch.prototype.getServiceName = function () { - return this.serviceName; - }), - (HashtagMatch.prototype.getHashtag = function () { - return this.hashtag; - }), - (HashtagMatch.prototype.getAnchorHref = function () { - var s = this.serviceName, - o = this.hashtag; - switch (s) { - case 'twitter': - return 'https://twitter.com/hashtag/' + o; - case 'facebook': - return 'https://www.facebook.com/hashtag/' + o; - case 'instagram': - return 'https://instagram.com/explore/tags/' + o; - case 'tiktok': - return 'https://www.tiktok.com/tag/' + o; - default: - throw new Error('Unknown service name to point hashtag to: ' + s); - } - }), - (HashtagMatch.prototype.getAnchorText = function () { - return '#' + this.hashtag; - }), - HashtagMatch - ); - })(UC), - HC = (function (s) { - function MentionMatch(o) { - var i = s.call(this, o) || this; - return ( - (i.serviceName = 'twitter'), - (i.mention = ''), - (i.mention = o.mention), - (i.serviceName = o.serviceName), - i - ); - } - return ( - tslib_es6_extends(MentionMatch, s), - (MentionMatch.prototype.getType = function () { - return 'mention'; - }), - (MentionMatch.prototype.getMention = function () { - return this.mention; - }), - (MentionMatch.prototype.getServiceName = function () { - return this.serviceName; - }), - (MentionMatch.prototype.getAnchorHref = function () { - switch (this.serviceName) { - case 'twitter': - return 'https://twitter.com/' + this.mention; - case 'instagram': - return 'https://instagram.com/' + this.mention; - case 'soundcloud': - return 'https://soundcloud.com/' + this.mention; - case 'tiktok': - return 'https://www.tiktok.com/@' + this.mention; - default: - throw new Error( - 'Unknown service name to point mention to: ' + this.serviceName - ); - } - }), - (MentionMatch.prototype.getAnchorText = function () { - return '@' + this.mention; - }), - (MentionMatch.prototype.getCssClassSuffixes = function () { - var o = s.prototype.getCssClassSuffixes.call(this), - i = this.getServiceName(); - return (i && o.push(i), o); - }), - MentionMatch - ); - })(UC), - JC = (function (s) { - function PhoneMatch(o) { - var i = s.call(this, o) || this; - return ( - (i.number = ''), - (i.plusSign = !1), - (i.number = o.number), - (i.plusSign = o.plusSign), - i - ); - } - return ( - tslib_es6_extends(PhoneMatch, s), - (PhoneMatch.prototype.getType = function () { - return 'phone'; - }), - (PhoneMatch.prototype.getPhoneNumber = function () { - return this.number; - }), - (PhoneMatch.prototype.getNumber = function () { - return this.getPhoneNumber(); - }), - (PhoneMatch.prototype.getAnchorHref = function () { - return 'tel:' + (this.plusSign ? '+' : '') + this.number; - }), - (PhoneMatch.prototype.getAnchorText = function () { - return this.matchedText; - }), - PhoneMatch - ); - })(UC), - GC = (function (s) { - function UrlMatch(o) { - var i = s.call(this, o) || this; - return ( - (i.url = ''), - (i.urlMatchType = 'scheme'), - (i.protocolUrlMatch = !1), - (i.protocolRelativeMatch = !1), - (i.stripPrefix = { scheme: !0, www: !0 }), - (i.stripTrailingSlash = !0), - (i.decodePercentEncoding = !0), - (i.schemePrefixRegex = /^(https?:\/\/)?/i), - (i.wwwPrefixRegex = /^(https?:\/\/)?(www\.)?/i), - (i.protocolRelativeRegex = /^\/\//), - (i.protocolPrepended = !1), - (i.urlMatchType = o.urlMatchType), - (i.url = o.url), - (i.protocolUrlMatch = o.protocolUrlMatch), - (i.protocolRelativeMatch = o.protocolRelativeMatch), - (i.stripPrefix = o.stripPrefix), - (i.stripTrailingSlash = o.stripTrailingSlash), - (i.decodePercentEncoding = o.decodePercentEncoding), - i - ); - } - return ( - tslib_es6_extends(UrlMatch, s), - (UrlMatch.prototype.getType = function () { - return 'url'; - }), - (UrlMatch.prototype.getUrlMatchType = function () { - return this.urlMatchType; - }), - (UrlMatch.prototype.getUrl = function () { - var s = this.url; - return ( - this.protocolRelativeMatch || - this.protocolUrlMatch || - this.protocolPrepended || - ((s = this.url = 'http://' + s), (this.protocolPrepended = !0)), - s - ); - }), - (UrlMatch.prototype.getAnchorHref = function () { - return this.getUrl().replace(/&/g, '&'); - }), - (UrlMatch.prototype.getAnchorText = function () { - var s = this.getMatchedText(); - return ( - this.protocolRelativeMatch && (s = this.stripProtocolRelativePrefix(s)), - this.stripPrefix.scheme && (s = this.stripSchemePrefix(s)), - this.stripPrefix.www && (s = this.stripWwwPrefix(s)), - this.stripTrailingSlash && (s = this.removeTrailingSlash(s)), - this.decodePercentEncoding && (s = this.removePercentEncoding(s)), - s - ); - }), - (UrlMatch.prototype.stripSchemePrefix = function (s) { - return s.replace(this.schemePrefixRegex, ''); - }), - (UrlMatch.prototype.stripWwwPrefix = function (s) { - return s.replace(this.wwwPrefixRegex, '$1'); - }), - (UrlMatch.prototype.stripProtocolRelativePrefix = function (s) { - return s.replace(this.protocolRelativeRegex, ''); - }), - (UrlMatch.prototype.removeTrailingSlash = function (s) { - return ('/' === s.charAt(s.length - 1) && (s = s.slice(0, -1)), s); - }), - (UrlMatch.prototype.removePercentEncoding = function (s) { - var o = s - .replace(/%22/gi, '"') - .replace(/%26/gi, '&') - .replace(/%27/gi, ''') - .replace(/%3C/gi, '<') - .replace(/%3E/gi, '>'); - try { - return decodeURIComponent(o); - } catch (s) { - return o; - } - }), - UrlMatch - ); - })(UC), - YC = function YC(s) { - ((this.__jsduckDummyDocProp = null), (this.tagBuilder = s.tagBuilder)); - }, - XC = /[A-Za-z]/, - ZC = /[\d]/, - QC = /[\D]/, - eO = /\s/, - tO = /['"]/, - rO = /[\x00-\x1F\x7F]/, - nO = - /A-Za-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC/ - .source, - sO = - nO + - /\u2700-\u27bf\udde6-\uddff\ud800-\udbff\udc00-\udfff\ufe0e\ufe0f\u0300-\u036f\ufe20-\ufe23\u20d0-\u20f0\ud83c\udffb-\udfff\u200d\u3299\u3297\u303d\u3030\u24c2\ud83c\udd70-\udd71\udd7e-\udd7f\udd8e\udd91-\udd9a\udde6-\uddff\ude01-\ude02\ude1a\ude2f\ude32-\ude3a\ude50-\ude51\u203c\u2049\u25aa-\u25ab\u25b6\u25c0\u25fb-\u25fe\u00a9\u00ae\u2122\u2139\udc04\u2600-\u26FF\u2b05\u2b06\u2b07\u2b1b\u2b1c\u2b50\u2b55\u231a\u231b\u2328\u23cf\u23e9-\u23f3\u23f8-\u23fa\udccf\u2935\u2934\u2190-\u21ff/ - .source + - /\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D4-\u08E1\u08E3-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u1885\u1886\u18A9\u1920-\u192B\u1930-\u193B\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFB-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69E\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C5\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F/ - .source, - oO = - /0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19/ - .source, - iO = sO + oO, - aO = sO + oO, - lO = new RegExp('['.concat(aO, ']')), - cO = '(?:[' + oO + ']{1,3}\\.){3}[' + oO + ']{1,3}', - uO = '[' + aO + '](?:[' + aO + '\\-_]{0,61}[' + aO + '])?', - getDomainLabelStr = function (s) { - return '(?=(' + uO + '))\\' + s; - }, - getDomainNameStr = function (s) { - return ( - '(?:' + - getDomainLabelStr(s) + - '(?:\\.' + - getDomainLabelStr(s + 1) + - '){0,126}|' + - cO + - ')' - ); - }, - pO = (new RegExp('[' + aO + '.\\-]*[' + aO + '\\-]'), lO), - hO = - /(?:xn--vermgensberatung-pwb|xn--vermgensberater-ctb|xn--clchc0ea0b2g2a9gcd|xn--w4r85el8fhu5dnra|northwesternmutual|travelersinsurance|vermögensberatung|xn--5su34j936bgsg|xn--bck1b9a5dre4c|xn--mgbah1a3hjkrd|xn--mgbai9azgqp6j|xn--mgberp4a5d4ar|xn--xkc2dl3a5ee0h|vermögensberater|xn--fzys8d69uvgm|xn--mgba7c0bbn0a|xn--mgbcpq6gpa1a|xn--xkc2al3hye2a|americanexpress|kerryproperties|sandvikcoromant|xn--i1b6b1a6a2e|xn--kcrx77d1x4a|xn--lgbbat1ad8j|xn--mgba3a4f16a|xn--mgbaakc7dvf|xn--mgbc0a9azcg|xn--nqv7fs00ema|americanfamily|bananarepublic|cancerresearch|cookingchannel|kerrylogistics|weatherchannel|xn--54b7fta0cc|xn--6qq986b3xl|xn--80aqecdr1a|xn--b4w605ferd|xn--fiq228c5hs|xn--h2breg3eve|xn--jlq480n2rg|xn--jlq61u9w7b|xn--mgba3a3ejt|xn--mgbaam7a8h|xn--mgbayh7gpa|xn--mgbbh1a71e|xn--mgbca7dzdo|xn--mgbi4ecexp|xn--mgbx4cd0ab|xn--rvc1e0am3e|international|lifeinsurance|travelchannel|wolterskluwer|xn--cckwcxetd|xn--eckvdtc9d|xn--fpcrj9c3d|xn--fzc2c9e2c|xn--h2brj9c8c|xn--tiq49xqyj|xn--yfro4i67o|xn--ygbi2ammx|construction|lplfinancial|scholarships|versicherung|xn--3e0b707e|xn--45br5cyl|xn--4dbrk0ce|xn--80adxhks|xn--80asehdb|xn--8y0a063a|xn--gckr3f0f|xn--mgb9awbf|xn--mgbab2bd|xn--mgbgu82a|xn--mgbpl2fh|xn--mgbt3dhd|xn--mk1bu44c|xn--ngbc5azd|xn--ngbe9e0a|xn--ogbpf8fl|xn--qcka1pmc|accountants|barclaycard|blackfriday|blockbuster|bridgestone|calvinklein|contractors|creditunion|engineering|enterprises|foodnetwork|investments|kerryhotels|lamborghini|motorcycles|olayangroup|photography|playstation|productions|progressive|redumbrella|williamhill|xn--11b4c3d|xn--1ck2e1b|xn--1qqw23a|xn--2scrj9c|xn--3bst00m|xn--3ds443g|xn--3hcrj9c|xn--42c2d9a|xn--45brj9c|xn--55qw42g|xn--6frz82g|xn--80ao21a|xn--9krt00a|xn--cck2b3b|xn--czr694b|xn--d1acj3b|xn--efvy88h|xn--fct429k|xn--fjq720a|xn--flw351e|xn--g2xx48c|xn--gecrj9c|xn--gk3at1e|xn--h2brj9c|xn--hxt814e|xn--imr513n|xn--j6w193g|xn--jvr189m|xn--kprw13d|xn--kpry57d|xn--mgbbh1a|xn--mgbtx2b|xn--mix891f|xn--nyqy26a|xn--otu796d|xn--pgbs0dh|xn--q9jyb4c|xn--rhqv96g|xn--rovu88b|xn--s9brj9c|xn--ses554g|xn--t60b56a|xn--vuq861b|xn--w4rs40l|xn--xhq521b|xn--zfr164b|சிங்கப்பூர்|accountant|apartments|associates|basketball|bnpparibas|boehringer|capitalone|consulting|creditcard|cuisinella|eurovision|extraspace|foundation|healthcare|immobilien|industries|management|mitsubishi|nextdirect|properties|protection|prudential|realestate|republican|restaurant|schaeffler|tatamotors|technology|university|vlaanderen|volkswagen|xn--30rr7y|xn--3pxu8k|xn--45q11c|xn--4gbrim|xn--55qx5d|xn--5tzm5g|xn--80aswg|xn--90a3ac|xn--9dbq2a|xn--9et52u|xn--c2br7g|xn--cg4bki|xn--czrs0t|xn--czru2d|xn--fiq64b|xn--fiqs8s|xn--fiqz9s|xn--io0a7i|xn--kput3i|xn--mxtq1m|xn--o3cw4h|xn--pssy2u|xn--q7ce6a|xn--unup4y|xn--wgbh1c|xn--wgbl6a|xn--y9a3aq|accenture|alfaromeo|allfinanz|amsterdam|analytics|aquarelle|barcelona|bloomberg|christmas|community|directory|education|equipment|fairwinds|financial|firestone|fresenius|frontdoor|furniture|goldpoint|hisamitsu|homedepot|homegoods|homesense|institute|insurance|kuokgroup|lancaster|landrover|lifestyle|marketing|marshalls|melbourne|microsoft|panasonic|passagens|pramerica|richardli|shangrila|solutions|statebank|statefarm|stockholm|travelers|vacations|xn--90ais|xn--c1avg|xn--d1alf|xn--e1a4c|xn--fhbei|xn--j1aef|xn--j1amh|xn--l1acc|xn--ngbrx|xn--nqv7f|xn--p1acf|xn--qxa6a|xn--tckwe|xn--vhquv|yodobashi|موريتانيا|abudhabi|airforce|allstate|attorney|barclays|barefoot|bargains|baseball|boutique|bradesco|broadway|brussels|builders|business|capetown|catering|catholic|cipriani|cityeats|cleaning|clinique|clothing|commbank|computer|delivery|deloitte|democrat|diamonds|discount|discover|download|engineer|ericsson|etisalat|exchange|feedback|fidelity|firmdale|football|frontier|goodyear|grainger|graphics|guardian|hdfcbank|helsinki|holdings|hospital|infiniti|ipiranga|istanbul|jpmorgan|lighting|lundbeck|marriott|maserati|mckinsey|memorial|merckmsd|mortgage|observer|partners|pharmacy|pictures|plumbing|property|redstone|reliance|saarland|samsclub|security|services|shopping|showtime|softbank|software|stcgroup|supplies|training|vanguard|ventures|verisign|woodside|xn--90ae|xn--node|xn--p1ai|xn--qxam|yokohama|السعودية|abogado|academy|agakhan|alibaba|android|athleta|auction|audible|auspost|avianca|banamex|bauhaus|bentley|bestbuy|booking|brother|bugatti|capital|caravan|careers|channel|charity|chintai|citadel|clubmed|college|cologne|comcast|company|compare|contact|cooking|corsica|country|coupons|courses|cricket|cruises|dentist|digital|domains|exposed|express|farmers|fashion|ferrari|ferrero|finance|fishing|fitness|flights|florist|flowers|forsale|frogans|fujitsu|gallery|genting|godaddy|grocery|guitars|hamburg|hangout|hitachi|holiday|hosting|hoteles|hotmail|hyundai|ismaili|jewelry|juniper|kitchen|komatsu|lacaixa|lanxess|lasalle|latrobe|leclerc|limited|lincoln|markets|monster|netbank|netflix|network|neustar|okinawa|oldnavy|organic|origins|philips|pioneer|politie|realtor|recipes|rentals|reviews|rexroth|samsung|sandvik|schmidt|schwarz|science|shiksha|singles|staples|storage|support|surgery|systems|temasek|theater|theatre|tickets|tiffany|toshiba|trading|walmart|wanggou|watches|weather|website|wedding|whoswho|windows|winners|xfinity|yamaxun|youtube|zuerich|католик|اتصالات|البحرين|الجزائر|العليان|پاکستان|كاثوليك|இந்தியா|abarth|abbott|abbvie|africa|agency|airbus|airtel|alipay|alsace|alstom|amazon|anquan|aramco|author|bayern|beauty|berlin|bharti|bostik|boston|broker|camera|career|casino|center|chanel|chrome|church|circle|claims|clinic|coffee|comsec|condos|coupon|credit|cruise|dating|datsun|dealer|degree|dental|design|direct|doctor|dunlop|dupont|durban|emerck|energy|estate|events|expert|family|flickr|futbol|gallup|garden|george|giving|global|google|gratis|health|hermes|hiphop|hockey|hotels|hughes|imamat|insure|intuit|jaguar|joburg|juegos|kaufen|kinder|kindle|kosher|lancia|latino|lawyer|lefrak|living|locker|london|luxury|madrid|maison|makeup|market|mattel|mobile|monash|mormon|moscow|museum|mutual|nagoya|natura|nissan|nissay|norton|nowruz|office|olayan|online|oracle|orange|otsuka|pfizer|photos|physio|pictet|quebec|racing|realty|reisen|repair|report|review|rocher|rogers|ryukyu|safety|sakura|sanofi|school|schule|search|secure|select|shouji|soccer|social|stream|studio|supply|suzuki|swatch|sydney|taipei|taobao|target|tattoo|tennis|tienda|tjmaxx|tkmaxx|toyota|travel|unicom|viajes|viking|villas|virgin|vision|voting|voyage|vuelos|walter|webcam|xihuan|yachts|yandex|zappos|москва|онлайн|ابوظبي|ارامكو|الاردن|المغرب|امارات|فلسطين|مليسيا|भारतम्|இலங்கை|ファッション|actor|adult|aetna|amfam|amica|apple|archi|audio|autos|azure|baidu|beats|bible|bingo|black|boats|bosch|build|canon|cards|chase|cheap|cisco|citic|click|cloud|coach|codes|crown|cymru|dabur|dance|deals|delta|drive|dubai|earth|edeka|email|epson|faith|fedex|final|forex|forum|gallo|games|gifts|gives|glass|globo|gmail|green|gripe|group|gucci|guide|homes|honda|horse|house|hyatt|ikano|irish|jetzt|koeln|kyoto|lamer|lease|legal|lexus|lilly|linde|lipsy|loans|locus|lotte|lotto|macys|mango|media|miami|money|movie|music|nexus|nikon|ninja|nokia|nowtv|omega|osaka|paris|parts|party|phone|photo|pizza|place|poker|praxi|press|prime|promo|quest|radio|rehab|reise|ricoh|rocks|rodeo|rugby|salon|sener|seven|sharp|shell|shoes|skype|sling|smart|smile|solar|space|sport|stada|store|study|style|sucks|swiss|tatar|tires|tirol|tmall|today|tokyo|tools|toray|total|tours|trade|trust|tunes|tushu|ubank|vegas|video|vodka|volvo|wales|watch|weber|weibo|works|world|xerox|yahoo|ישראל|ایران|بازار|بھارت|سودان|سورية|همراه|भारोत|संगठन|বাংলা|భారత్|ഭാരതം|嘉里大酒店|aarp|able|adac|aero|akdn|ally|amex|arab|army|arpa|arte|asda|asia|audi|auto|baby|band|bank|bbva|beer|best|bike|bing|blog|blue|bofa|bond|book|buzz|cafe|call|camp|care|cars|casa|case|cash|cbre|cern|chat|citi|city|club|cool|coop|cyou|data|date|dclk|deal|dell|desi|diet|dish|docs|dvag|erni|fage|fail|fans|farm|fast|fiat|fido|film|fire|fish|flir|food|ford|free|fund|game|gbiz|gent|ggee|gift|gmbh|gold|golf|goog|guge|guru|hair|haus|hdfc|help|here|hgtv|host|hsbc|icbc|ieee|imdb|immo|info|itau|java|jeep|jobs|jprs|kddi|kids|kiwi|kpmg|kred|land|lego|lgbt|lidl|life|like|limo|link|live|loan|loft|love|ltda|luxe|maif|meet|meme|menu|mini|mint|mobi|moda|moto|name|navy|news|next|nico|nike|ollo|open|page|pars|pccw|pics|ping|pink|play|plus|pohl|porn|post|prod|prof|qpon|read|reit|rent|rest|rich|room|rsvp|ruhr|safe|sale|sarl|save|saxo|scot|seat|seek|sexy|shaw|shia|shop|show|silk|sina|site|skin|sncf|sohu|song|sony|spot|star|surf|talk|taxi|team|tech|teva|tiaa|tips|town|toys|tube|vana|visa|viva|vivo|vote|voto|wang|weir|wien|wiki|wine|work|xbox|yoga|zara|zero|zone|дети|сайт|بارت|بيتك|ڀارت|تونس|شبكة|عراق|عمان|موقع|भारत|ভারত|ভাৰত|ਭਾਰਤ|ભારત|ଭାରତ|ಭಾರತ|ලංකා|アマゾン|グーグル|クラウド|ポイント|组织机构|電訊盈科|香格里拉|aaa|abb|abc|aco|ads|aeg|afl|aig|anz|aol|app|art|aws|axa|bar|bbc|bbt|bcg|bcn|bet|bid|bio|biz|bms|bmw|bom|boo|bot|box|buy|bzh|cab|cal|cam|car|cat|cba|cbn|cbs|ceo|cfa|cfd|com|cpa|crs|dad|day|dds|dev|dhl|diy|dnp|dog|dot|dtv|dvr|eat|eco|edu|esq|eus|fan|fit|fly|foo|fox|frl|ftr|fun|fyi|gal|gap|gay|gdn|gea|gle|gmo|gmx|goo|gop|got|gov|hbo|hiv|hkt|hot|how|ibm|ice|icu|ifm|inc|ing|ink|int|ist|itv|jcb|jio|jll|jmp|jnj|jot|joy|kfh|kia|kim|kpn|krd|lat|law|lds|llc|llp|lol|lpl|ltd|man|map|mba|med|men|mil|mit|mlb|mls|mma|moe|moi|mom|mov|msd|mtn|mtr|nab|nba|nec|net|new|nfl|ngo|nhk|now|nra|nrw|ntt|nyc|obi|one|ong|onl|ooo|org|ott|ovh|pay|pet|phd|pid|pin|pnc|pro|pru|pub|pwc|red|ren|ril|rio|rip|run|rwe|sap|sas|sbi|sbs|sca|scb|ses|sew|sex|sfr|ski|sky|soy|spa|srl|stc|tab|tax|tci|tdk|tel|thd|tjx|top|trv|tui|tvs|ubs|uno|uol|ups|vet|vig|vin|vip|wed|win|wme|wow|wtc|wtf|xin|xxx|xyz|you|yun|zip|бел|ком|қаз|мкд|мон|орг|рус|срб|укр|հայ|קום|عرب|قطر|كوم|مصر|कॉम|नेट|คอม|ไทย|ລາວ|ストア|セール|みんな|中文网|亚马逊|天主教|我爱你|新加坡|淡马锡|诺基亚|飞利浦|ac|ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw|ελ|ευ|бг|ею|рф|გე|닷넷|닷컴|삼성|한국|コム|世界|中信|中国|中國|企业|佛山|信息|健康|八卦|公司|公益|台湾|台灣|商城|商店|商标|嘉里|在线|大拿|娱乐|家電|广东|微博|慈善|手机|招聘|政务|政府|新闻|时尚|書籍|机构|游戏|澳門|点看|移动|网址|网店|网站|网络|联通|谷歌|购物|通販|集团|食品|餐厅|香港)/, - dO = new RegExp('['.concat(aO, "!#$%&'*+/=?^_`{|}~-]")), - fO = new RegExp('^'.concat(hO.source, '$')), - mO = (function (s) { - function EmailMatcher() { - var o = (null !== s && s.apply(this, arguments)) || this; - return ((o.localPartCharRegex = dO), (o.strictTldRegex = fO), o); - } - return ( - tslib_es6_extends(EmailMatcher, s), - (EmailMatcher.prototype.parseMatches = function (s) { - for ( - var o = this.tagBuilder, - i = this.localPartCharRegex, - u = this.strictTldRegex, - _ = [], - w = s.length, - x = new gO(), - C = { m: 'a', a: 'i', i: 'l', l: 't', t: 'o', o: ':' }, - j = 0, - L = 0, - B = x; - j < w; - ) { - var $ = s.charAt(j); - switch (L) { - case 0: - stateNonEmailAddress($); - break; - case 1: - stateMailTo(s.charAt(j - 1), $); - break; - case 2: - stateLocalPart($); - break; - case 3: - stateLocalPartDot($); - break; - case 4: - stateAtSign($); - break; - case 5: - stateDomainChar($); - break; - case 6: - stateDomainHyphen($); - break; - case 7: - stateDomainDot($); - break; - default: - throwUnhandledCaseError(L); - } - j++; - } - return (captureMatchIfValidAndReset(), _); - function stateNonEmailAddress(s) { - 'm' === s ? beginEmailMatch(1) : i.test(s) && beginEmailMatch(); - } - function stateMailTo(s, o) { - ':' === s - ? i.test(o) - ? ((L = 2), (B = new gO(__assign(__assign({}, B), { hasMailtoPrefix: !0 })))) - : resetToNonEmailMatchState() - : C[s] === o || - (i.test(o) - ? (L = 2) - : '.' === o - ? (L = 3) - : '@' === o - ? (L = 4) - : resetToNonEmailMatchState()); - } - function stateLocalPart(s) { - '.' === s - ? (L = 3) - : '@' === s - ? (L = 4) - : i.test(s) || resetToNonEmailMatchState(); - } - function stateLocalPartDot(s) { - '.' === s || '@' === s - ? resetToNonEmailMatchState() - : i.test(s) - ? (L = 2) - : resetToNonEmailMatchState(); - } - function stateAtSign(s) { - pO.test(s) ? (L = 5) : resetToNonEmailMatchState(); - } - function stateDomainChar(s) { - '.' === s - ? (L = 7) - : '-' === s - ? (L = 6) - : pO.test(s) || captureMatchIfValidAndReset(); - } - function stateDomainHyphen(s) { - '-' === s || '.' === s - ? captureMatchIfValidAndReset() - : pO.test(s) - ? (L = 5) - : captureMatchIfValidAndReset(); - } - function stateDomainDot(s) { - '.' === s || '-' === s - ? captureMatchIfValidAndReset() - : pO.test(s) - ? ((L = 5), (B = new gO(__assign(__assign({}, B), { hasDomainDot: !0 })))) - : captureMatchIfValidAndReset(); - } - function beginEmailMatch(s) { - (void 0 === s && (s = 2), (L = s), (B = new gO({ idx: j }))); - } - function resetToNonEmailMatchState() { - ((L = 0), (B = x)); - } - function captureMatchIfValidAndReset() { - if (B.hasDomainDot) { - var i = s.slice(B.idx, j); - /[-.]$/.test(i) && (i = i.slice(0, -1)); - var w = B.hasMailtoPrefix ? i.slice(7) : i; - (function doesEmailHaveValidTld(s) { - var o = s.split('.').pop() || '', - i = o.toLowerCase(); - return u.test(i); - })(w) && - _.push(new WC({ tagBuilder: o, matchedText: i, offset: B.idx, email: w })); - } - resetToNonEmailMatchState(); - } - }), - EmailMatcher - ); - })(YC), - gO = function gO(s) { - (void 0 === s && (s = {}), - (this.idx = void 0 !== s.idx ? s.idx : -1), - (this.hasMailtoPrefix = !!s.hasMailtoPrefix), - (this.hasDomainDot = !!s.hasDomainDot)); - }, - yO = (function () { - function UrlMatchValidator() {} - return ( - (UrlMatchValidator.isValid = function (s, o) { - return !( - (o && !this.isValidUriScheme(o)) || - this.urlMatchDoesNotHaveProtocolOrDot(s, o) || - (this.urlMatchDoesNotHaveAtLeastOneWordChar(s, o) && !this.isValidIpAddress(s)) || - this.containsMultipleDots(s) - ); - }), - (UrlMatchValidator.isValidIpAddress = function (s) { - var o = new RegExp(this.hasFullProtocolRegex.source + this.ipRegex.source); - return null !== s.match(o); - }), - (UrlMatchValidator.containsMultipleDots = function (s) { - var o = s; - return ( - this.hasFullProtocolRegex.test(s) && (o = s.split('://')[1]), - o.split('/')[0].indexOf('..') > -1 - ); - }), - (UrlMatchValidator.isValidUriScheme = function (s) { - var o = s.match(this.uriSchemeRegex), - i = o && o[0].toLowerCase(); - return 'javascript:' !== i && 'vbscript:' !== i; - }), - (UrlMatchValidator.urlMatchDoesNotHaveProtocolOrDot = function (s, o) { - return !(!s || (o && this.hasFullProtocolRegex.test(o)) || -1 !== s.indexOf('.')); - }), - (UrlMatchValidator.urlMatchDoesNotHaveAtLeastOneWordChar = function (s, o) { - return ( - !(!s || !o) && - !this.hasFullProtocolRegex.test(o) && - !this.hasWordCharAfterProtocolRegex.test(s) - ); - }), - (UrlMatchValidator.hasFullProtocolRegex = /^[A-Za-z][-.+A-Za-z0-9]*:\/\//), - (UrlMatchValidator.uriSchemeRegex = /^[A-Za-z][-.+A-Za-z0-9]*:/), - (UrlMatchValidator.hasWordCharAfterProtocolRegex = new RegExp( - ':[^\\s]*?[' + nO + ']' - )), - (UrlMatchValidator.ipRegex = - /[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?(:[0-9]*)?\/?$/), - UrlMatchValidator - ); - })(), - vO = - ((zC = new RegExp( - '[/?#](?:[' + - aO + - "\\-+&@#/%=~_()|'$*\\[\\]{}?!:,.;^✓]*[" + - aO + - "\\-+&@#/%=~_()|'$*\\[\\]{}✓])?" - )), - new RegExp( - [ - '(?:', - '(', - /(?:[A-Za-z][-.+A-Za-z0-9]{0,63}:(?![A-Za-z][-.+A-Za-z0-9]{0,63}:\/\/)(?!\d+\/?)(?:\/\/)?)/ - .source, - getDomainNameStr(2), - ')', - '|', - '(', - '(//)?', - /(?:www\.)/.source, - getDomainNameStr(6), - ')', - '|', - '(', - '(//)?', - getDomainNameStr(10) + '\\.', - hO.source, - '(?![-' + iO + '])', - ')', - ')', - '(?::[0-9]+)?', - '(?:' + zC.source + ')?' - ].join(''), - 'gi' - )), - bO = new RegExp('[' + aO + ']'), - _O = (function (s) { - function UrlMatcher(o) { - var i = s.call(this, o) || this; - return ( - (i.stripPrefix = { scheme: !0, www: !0 }), - (i.stripTrailingSlash = !0), - (i.decodePercentEncoding = !0), - (i.matcherRegex = vO), - (i.wordCharRegExp = bO), - (i.stripPrefix = o.stripPrefix), - (i.stripTrailingSlash = o.stripTrailingSlash), - (i.decodePercentEncoding = o.decodePercentEncoding), - i - ); - } - return ( - tslib_es6_extends(UrlMatcher, s), - (UrlMatcher.prototype.parseMatches = function (s) { - for ( - var o, - i = this.matcherRegex, - u = this.stripPrefix, - _ = this.stripTrailingSlash, - w = this.decodePercentEncoding, - x = this.tagBuilder, - C = [], - _loop_1 = function () { - var i = o[0], - L = o[1], - B = o[4], - $ = o[5], - V = o[9], - U = o.index, - z = $ || V, - Y = s.charAt(U - 1); - if (!yO.isValid(i, L)) return 'continue'; - if (U > 0 && '@' === Y) return 'continue'; - if (U > 0 && z && j.wordCharRegExp.test(Y)) return 'continue'; - if ( - (/\?$/.test(i) && (i = i.substr(0, i.length - 1)), - j.matchHasUnbalancedClosingParen(i)) - ) - i = i.substr(0, i.length - 1); - else { - var Z = j.matchHasInvalidCharAfterTld(i, L); - Z > -1 && (i = i.substr(0, Z)); - } - var ee = ['http://', 'https://'].find(function (s) { - return !!L && -1 !== L.indexOf(s); - }); - if (ee) { - var ie = i.indexOf(ee); - ((i = i.substr(ie)), (L = L.substr(ie)), (U += ie)); - } - var ae = L ? 'scheme' : B ? 'www' : 'tld', - le = !!L; - C.push( - new GC({ - tagBuilder: x, - matchedText: i, - offset: U, - urlMatchType: ae, - url: i, - protocolUrlMatch: le, - protocolRelativeMatch: !!z, - stripPrefix: u, - stripTrailingSlash: _, - decodePercentEncoding: w - }) - ); - }, - j = this; - null !== (o = i.exec(s)); - ) - _loop_1(); - return C; - }), - (UrlMatcher.prototype.matchHasUnbalancedClosingParen = function (s) { - var o, - i = s.charAt(s.length - 1); - if (')' === i) o = '('; - else if (']' === i) o = '['; - else { - if ('}' !== i) return !1; - o = '{'; - } - for (var u = 0, _ = 0, w = s.length - 1; _ < w; _++) { - var x = s.charAt(_); - x === o ? u++ : x === i && (u = Math.max(u - 1, 0)); - } - return 0 === u; - }), - (UrlMatcher.prototype.matchHasInvalidCharAfterTld = function (s, o) { - if (!s) return -1; - var i = 0; - o && ((i = s.indexOf(':')), (s = s.slice(i))); - var u = new RegExp('^((.?//)?[-.' + aO + ']*[-' + aO + ']\\.[-' + aO + ']+)').exec( - s - ); - return null === u - ? -1 - : ((i += u[1].length), - (s = s.slice(u[1].length)), - /^[^-.A-Za-z0-9:\/?#]/.test(s) ? i : -1); - }), - UrlMatcher - ); - })(YC), - EO = new RegExp('[_'.concat(aO, ']')), - wO = (function (s) { - function HashtagMatcher(o) { - var i = s.call(this, o) || this; - return ((i.serviceName = 'twitter'), (i.serviceName = o.serviceName), i); - } - return ( - tslib_es6_extends(HashtagMatcher, s), - (HashtagMatcher.prototype.parseMatches = function (s) { - for ( - var o = this.tagBuilder, - i = this.serviceName, - u = [], - _ = s.length, - w = 0, - x = -1, - C = 0; - w < _; - ) { - var j = s.charAt(w); - switch (C) { - case 0: - stateNone(j); - break; - case 1: - stateNonHashtagWordChar(j); - break; - case 2: - stateHashtagHashChar(j); - break; - case 3: - stateHashtagTextChar(j); - break; - default: - throwUnhandledCaseError(C); - } - w++; - } - return (captureMatchIfValid(), u); - function stateNone(s) { - '#' === s ? ((C = 2), (x = w)) : lO.test(s) && (C = 1); - } - function stateNonHashtagWordChar(s) { - lO.test(s) || (C = 0); - } - function stateHashtagHashChar(s) { - C = EO.test(s) ? 3 : lO.test(s) ? 1 : 0; - } - function stateHashtagTextChar(s) { - EO.test(s) || (captureMatchIfValid(), (x = -1), (C = lO.test(s) ? 1 : 0)); - } - function captureMatchIfValid() { - if (x > -1 && w - x <= 140) { - var _ = s.slice(x, w), - C = new KC({ - tagBuilder: o, - matchedText: _, - offset: x, - serviceName: i, - hashtag: _.slice(1) - }); - u.push(C); - } - } - }), - HashtagMatcher - ); - })(YC), - SO = ['twitter', 'facebook', 'instagram', 'tiktok'], - xO = new RegExp( - '' - .concat( - /(?:(?:(?:(\+)?\d{1,3}[-\040.]?)?\(?\d{3}\)?[-\040.]?\d{3}[-\040.]?\d{4})|(?:(\+)(?:9[976]\d|8[987530]\d|6[987]\d|5[90]\d|42\d|3[875]\d|2[98654321]\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)[-\040.]?(?:\d[-\040.]?){6,12}\d+))([,;]+[0-9]+#?)*/ - .source, - '|' - ) - .concat( - /(0([1-9]{1}-?[1-9]\d{3}|[1-9]{2}-?\d{3}|[1-9]{2}\d{1}-?\d{2}|[1-9]{2}\d{2}-?\d{1})-?\d{4}|0[789]0-?\d{4}-?\d{4}|050-?\d{4}-?\d{4})/ - .source - ), - 'g' - ), - kO = (function (s) { - function PhoneMatcher() { - var o = (null !== s && s.apply(this, arguments)) || this; - return ((o.matcherRegex = xO), o); - } - return ( - tslib_es6_extends(PhoneMatcher, s), - (PhoneMatcher.prototype.parseMatches = function (s) { - for ( - var o, i = this.matcherRegex, u = this.tagBuilder, _ = []; - null !== (o = i.exec(s)); - ) { - var w = o[0], - x = w.replace(/[^0-9,;#]/g, ''), - C = !(!o[1] && !o[2]), - j = 0 == o.index ? '' : s.substr(o.index - 1, 1), - L = s.substr(o.index + w.length, 1), - B = !j.match(/\d/) && !L.match(/\d/); - this.testMatch(o[3]) && - this.testMatch(w) && - B && - _.push( - new JC({ - tagBuilder: u, - matchedText: w, - offset: o.index, - number: x, - plusSign: C - }) - ); - } - return _; - }), - (PhoneMatcher.prototype.testMatch = function (s) { - return QC.test(s); - }), - PhoneMatcher - ); - })(YC), - CO = new RegExp('@[_'.concat(aO, ']{1,50}(?![_').concat(aO, '])'), 'g'), - OO = new RegExp('@[_.'.concat(aO, ']{1,30}(?![_').concat(aO, '])'), 'g'), - AO = new RegExp('@[-_.'.concat(aO, ']{1,50}(?![-_').concat(aO, '])'), 'g'), - jO = new RegExp( - '@[_.'.concat(aO, ']{1,23}[_').concat(aO, '](?![_').concat(aO, '])'), - 'g' - ), - IO = new RegExp('[^' + aO + ']'), - PO = (function (s) { - function MentionMatcher(o) { - var i = s.call(this, o) || this; - return ( - (i.serviceName = 'twitter'), - (i.matcherRegexes = { twitter: CO, instagram: OO, soundcloud: AO, tiktok: jO }), - (i.nonWordCharRegex = IO), - (i.serviceName = o.serviceName), - i - ); - } - return ( - tslib_es6_extends(MentionMatcher, s), - (MentionMatcher.prototype.parseMatches = function (s) { - var o, - i = this.serviceName, - u = this.matcherRegexes[this.serviceName], - _ = this.nonWordCharRegex, - w = this.tagBuilder, - x = []; - if (!u) return x; - for (; null !== (o = u.exec(s)); ) { - var C = o.index, - j = s.charAt(C - 1); - if (0 === C || _.test(j)) { - var L = o[0].replace(/\.+$/g, ''), - B = L.slice(1); - x.push( - new HC({ - tagBuilder: w, - matchedText: L, - offset: C, - serviceName: i, - mention: B - }) - ); - } - } - return x; - }), - MentionMatcher - ); - })(YC); - function parseHtml(s, o) { - for ( - var i = o.onOpenTag, - u = o.onCloseTag, - _ = o.onText, - w = o.onComment, - x = o.onDoctype, - C = new MO(), - j = 0, - L = s.length, - B = 0, - $ = 0, - V = C; - j < L; - ) { - var U = s.charAt(j); - switch (B) { - case 0: - stateData(U); - break; - case 1: - stateTagOpen(U); - break; - case 2: - stateEndTagOpen(U); - break; - case 3: - stateTagName(U); - break; - case 4: - stateBeforeAttributeName(U); - break; - case 5: - stateAttributeName(U); - break; - case 6: - stateAfterAttributeName(U); - break; - case 7: - stateBeforeAttributeValue(U); - break; - case 8: - stateAttributeValueDoubleQuoted(U); - break; - case 9: - stateAttributeValueSingleQuoted(U); - break; - case 10: - stateAttributeValueUnquoted(U); - break; - case 11: - stateAfterAttributeValueQuoted(U); - break; - case 12: - stateSelfClosingStartTag(U); - break; - case 13: - stateMarkupDeclarationOpen(U); - break; - case 14: - stateCommentStart(U); - break; - case 15: - stateCommentStartDash(U); - break; - case 16: - stateComment(U); - break; - case 17: - stateCommentEndDash(U); - break; - case 18: - stateCommentEnd(U); - break; - case 19: - stateCommentEndBang(U); - break; - case 20: - stateDoctype(U); - break; - default: - throwUnhandledCaseError(B); - } - j++; - } - function stateData(s) { - '<' === s && startNewTag(); - } - function stateTagOpen(s) { - '!' === s - ? (B = 13) - : '/' === s - ? ((B = 2), (V = new MO(__assign(__assign({}, V), { isClosing: !0 })))) - : '<' === s - ? startNewTag() - : XC.test(s) - ? ((B = 3), (V = new MO(__assign(__assign({}, V), { isOpening: !0 })))) - : ((B = 0), (V = C)); - } - function stateTagName(s) { - eO.test(s) - ? ((V = new MO(__assign(__assign({}, V), { name: captureTagName() }))), (B = 4)) - : '<' === s - ? startNewTag() - : '/' === s - ? ((V = new MO(__assign(__assign({}, V), { name: captureTagName() }))), (B = 12)) - : '>' === s - ? ((V = new MO(__assign(__assign({}, V), { name: captureTagName() }))), - emitTagAndPreviousTextNode()) - : XC.test(s) || ZC.test(s) || ':' === s || resetToDataState(); - } - function stateEndTagOpen(s) { - '>' === s ? resetToDataState() : XC.test(s) ? (B = 3) : resetToDataState(); - } - function stateBeforeAttributeName(s) { - eO.test(s) || - ('/' === s - ? (B = 12) - : '>' === s - ? emitTagAndPreviousTextNode() - : '<' === s - ? startNewTag() - : '=' === s || tO.test(s) || rO.test(s) - ? resetToDataState() - : (B = 5)); - } - function stateAttributeName(s) { - eO.test(s) - ? (B = 6) - : '/' === s - ? (B = 12) - : '=' === s - ? (B = 7) - : '>' === s - ? emitTagAndPreviousTextNode() - : '<' === s - ? startNewTag() - : tO.test(s) && resetToDataState(); - } - function stateAfterAttributeName(s) { - eO.test(s) || - ('/' === s - ? (B = 12) - : '=' === s - ? (B = 7) - : '>' === s - ? emitTagAndPreviousTextNode() - : '<' === s - ? startNewTag() - : tO.test(s) - ? resetToDataState() - : (B = 5)); - } - function stateBeforeAttributeValue(s) { - eO.test(s) || - ('"' === s - ? (B = 8) - : "'" === s - ? (B = 9) - : /[>=`]/.test(s) - ? resetToDataState() - : '<' === s - ? startNewTag() - : (B = 10)); - } - function stateAttributeValueDoubleQuoted(s) { - '"' === s && (B = 11); - } - function stateAttributeValueSingleQuoted(s) { - "'" === s && (B = 11); - } - function stateAttributeValueUnquoted(s) { - eO.test(s) - ? (B = 4) - : '>' === s - ? emitTagAndPreviousTextNode() - : '<' === s && startNewTag(); - } - function stateAfterAttributeValueQuoted(s) { - eO.test(s) - ? (B = 4) - : '/' === s - ? (B = 12) - : '>' === s - ? emitTagAndPreviousTextNode() - : '<' === s - ? startNewTag() - : ((B = 4), - (function reconsumeCurrentCharacter() { - j--; - })()); - } - function stateSelfClosingStartTag(s) { - '>' === s - ? ((V = new MO(__assign(__assign({}, V), { isClosing: !0 }))), - emitTagAndPreviousTextNode()) - : (B = 4); - } - function stateMarkupDeclarationOpen(o) { - '--' === s.substr(j, 2) - ? ((j += 2), (V = new MO(__assign(__assign({}, V), { type: 'comment' }))), (B = 14)) - : 'DOCTYPE' === s.substr(j, 7).toUpperCase() - ? ((j += 7), (V = new MO(__assign(__assign({}, V), { type: 'doctype' }))), (B = 20)) - : resetToDataState(); - } - function stateCommentStart(s) { - '-' === s ? (B = 15) : '>' === s ? resetToDataState() : (B = 16); - } - function stateCommentStartDash(s) { - '-' === s ? (B = 18) : '>' === s ? resetToDataState() : (B = 16); - } - function stateComment(s) { - '-' === s && (B = 17); - } - function stateCommentEndDash(s) { - B = '-' === s ? 18 : 16; - } - function stateCommentEnd(s) { - '>' === s ? emitTagAndPreviousTextNode() : '!' === s ? (B = 19) : '-' === s || (B = 16); - } - function stateCommentEndBang(s) { - '-' === s ? (B = 17) : '>' === s ? emitTagAndPreviousTextNode() : (B = 16); - } - function stateDoctype(s) { - '>' === s ? emitTagAndPreviousTextNode() : '<' === s && startNewTag(); - } - function resetToDataState() { - ((B = 0), (V = C)); - } - function startNewTag() { - ((B = 1), (V = new MO({ idx: j }))); - } - function emitTagAndPreviousTextNode() { - var o = s.slice($, V.idx); - (o && _(o, $), - 'comment' === V.type - ? w(V.idx) - : 'doctype' === V.type - ? x(V.idx) - : (V.isOpening && i(V.name, V.idx), V.isClosing && u(V.name, V.idx)), - resetToDataState(), - ($ = j + 1)); - } - function captureTagName() { - var o = V.idx + (V.isClosing ? 2 : 1); - return s.slice(o, j).toLowerCase(); - } - $ < j && - (function emitText() { - var o = s.slice($, j); - (_(o, $), ($ = j + 1)); - })(); - } - var MO = function MO(s) { - (void 0 === s && (s = {}), - (this.idx = void 0 !== s.idx ? s.idx : -1), - (this.type = s.type || 'tag'), - (this.name = s.name || ''), - (this.isOpening = !!s.isOpening), - (this.isClosing = !!s.isClosing)); - }, - TO = (function () { - function Autolinker(s) { - (void 0 === s && (s = {}), - (this.version = Autolinker.version), - (this.urls = {}), - (this.email = !0), - (this.phone = !0), - (this.hashtag = !1), - (this.mention = !1), - (this.newWindow = !0), - (this.stripPrefix = { scheme: !0, www: !0 }), - (this.stripTrailingSlash = !0), - (this.decodePercentEncoding = !0), - (this.truncate = { length: 0, location: 'end' }), - (this.className = ''), - (this.replaceFn = null), - (this.context = void 0), - (this.sanitizeHtml = !1), - (this.matchers = null), - (this.tagBuilder = null), - (this.urls = this.normalizeUrlsCfg(s.urls)), - (this.email = 'boolean' == typeof s.email ? s.email : this.email), - (this.phone = 'boolean' == typeof s.phone ? s.phone : this.phone), - (this.hashtag = s.hashtag || this.hashtag), - (this.mention = s.mention || this.mention), - (this.newWindow = 'boolean' == typeof s.newWindow ? s.newWindow : this.newWindow), - (this.stripPrefix = this.normalizeStripPrefixCfg(s.stripPrefix)), - (this.stripTrailingSlash = - 'boolean' == typeof s.stripTrailingSlash - ? s.stripTrailingSlash - : this.stripTrailingSlash), - (this.decodePercentEncoding = - 'boolean' == typeof s.decodePercentEncoding - ? s.decodePercentEncoding - : this.decodePercentEncoding), - (this.sanitizeHtml = s.sanitizeHtml || !1)); - var o = this.mention; - if (!1 !== o && -1 === ['twitter', 'instagram', 'soundcloud', 'tiktok'].indexOf(o)) - throw new Error("invalid `mention` cfg '".concat(o, "' - see docs")); - var i = this.hashtag; - if (!1 !== i && -1 === SO.indexOf(i)) - throw new Error("invalid `hashtag` cfg '".concat(i, "' - see docs")); - ((this.truncate = this.normalizeTruncateCfg(s.truncate)), - (this.className = s.className || this.className), - (this.replaceFn = s.replaceFn || this.replaceFn), - (this.context = s.context || this)); - } - return ( - (Autolinker.link = function (s, o) { - return new Autolinker(o).link(s); - }), - (Autolinker.parse = function (s, o) { - return new Autolinker(o).parse(s); - }), - (Autolinker.prototype.normalizeUrlsCfg = function (s) { - return ( - null == s && (s = !0), - 'boolean' == typeof s - ? { schemeMatches: s, wwwMatches: s, tldMatches: s } - : { - schemeMatches: 'boolean' != typeof s.schemeMatches || s.schemeMatches, - wwwMatches: 'boolean' != typeof s.wwwMatches || s.wwwMatches, - tldMatches: 'boolean' != typeof s.tldMatches || s.tldMatches - } - ); - }), - (Autolinker.prototype.normalizeStripPrefixCfg = function (s) { - return ( - null == s && (s = !0), - 'boolean' == typeof s - ? { scheme: s, www: s } - : { - scheme: 'boolean' != typeof s.scheme || s.scheme, - www: 'boolean' != typeof s.www || s.www - } - ); - }), - (Autolinker.prototype.normalizeTruncateCfg = function (s) { - return 'number' == typeof s - ? { length: s, location: 'end' } - : (function defaults(s, o) { - for (var i in o) o.hasOwnProperty(i) && void 0 === s[i] && (s[i] = o[i]); - return s; - })(s || {}, { length: Number.POSITIVE_INFINITY, location: 'end' }); - }), - (Autolinker.prototype.parse = function (s) { - var o = this, - i = ['a', 'style', 'script'], - u = 0, - _ = []; - return ( - parseHtml(s, { - onOpenTag: function (s) { - i.indexOf(s) >= 0 && u++; - }, - onText: function (s, i) { - if (0 === u) { - var w = (function splitAndCapture(s, o) { - if (!o.global) - throw new Error("`splitRegex` must have the 'g' flag set"); - for (var i, u = [], _ = 0; (i = o.exec(s)); ) - (u.push(s.substring(_, i.index)), - u.push(i[0]), - (_ = i.index + i[0].length)); - return (u.push(s.substring(_)), u); - })(s, /( | |<|<|>|>|"|"|')/gi), - x = i; - w.forEach(function (s, i) { - if (i % 2 == 0) { - var u = o.parseText(s, x); - _.push.apply(_, u); - } - x += s.length; - }); - } - }, - onCloseTag: function (s) { - i.indexOf(s) >= 0 && (u = Math.max(u - 1, 0)); - }, - onComment: function (s) {}, - onDoctype: function (s) {} - }), - (_ = this.compactMatches(_)), - (_ = this.removeUnwantedMatches(_)) - ); - }), - (Autolinker.prototype.compactMatches = function (s) { - s.sort(function (s, o) { - return s.getOffset() - o.getOffset(); - }); - for (var o = 0; o < s.length - 1; ) { - var i = s[o], - u = i.getOffset(), - _ = i.getMatchedText().length, - w = u + _; - if (o + 1 < s.length) { - if (s[o + 1].getOffset() === u) { - var x = s[o + 1].getMatchedText().length > _ ? o : o + 1; - s.splice(x, 1); - continue; - } - if (s[o + 1].getOffset() < w) { - s.splice(o + 1, 1); - continue; - } - } - o++; - } - return s; - }), - (Autolinker.prototype.removeUnwantedMatches = function (s) { - return ( - this.hashtag || - utils_remove(s, function (s) { - return 'hashtag' === s.getType(); - }), - this.email || - utils_remove(s, function (s) { - return 'email' === s.getType(); - }), - this.phone || - utils_remove(s, function (s) { - return 'phone' === s.getType(); - }), - this.mention || - utils_remove(s, function (s) { - return 'mention' === s.getType(); - }), - this.urls.schemeMatches || - utils_remove(s, function (s) { - return 'url' === s.getType() && 'scheme' === s.getUrlMatchType(); - }), - this.urls.wwwMatches || - utils_remove(s, function (s) { - return 'url' === s.getType() && 'www' === s.getUrlMatchType(); - }), - this.urls.tldMatches || - utils_remove(s, function (s) { - return 'url' === s.getType() && 'tld' === s.getUrlMatchType(); - }), - s - ); - }), - (Autolinker.prototype.parseText = function (s, o) { - (void 0 === o && (o = 0), (o = o || 0)); - for (var i = this.getMatchers(), u = [], _ = 0, w = i.length; _ < w; _++) { - for (var x = i[_].parseMatches(s), C = 0, j = x.length; C < j; C++) - x[C].setOffset(o + x[C].getOffset()); - u.push.apply(u, x); - } - return u; - }), - (Autolinker.prototype.link = function (s) { - if (!s) return ''; - this.sanitizeHtml && (s = s.replace(//g, '>')); - for (var o = this.parse(s), i = [], u = 0, _ = 0, w = o.length; _ < w; _++) { - var x = o[_]; - (i.push(s.substring(u, x.getOffset())), - i.push(this.createMatchReturnVal(x)), - (u = x.getOffset() + x.getMatchedText().length)); - } - return (i.push(s.substring(u)), i.join('')); - }), - (Autolinker.prototype.createMatchReturnVal = function (s) { - var o; - return ( - this.replaceFn && (o = this.replaceFn.call(this.context, s)), - 'string' == typeof o - ? o - : !1 === o - ? s.getMatchedText() - : o instanceof $C - ? o.toAnchorString() - : s.buildTag().toAnchorString() - ); - }), - (Autolinker.prototype.getMatchers = function () { - if (this.matchers) return this.matchers; - var s = this.getTagBuilder(), - o = [ - new wO({ tagBuilder: s, serviceName: this.hashtag }), - new mO({ tagBuilder: s }), - new kO({ tagBuilder: s }), - new PO({ tagBuilder: s, serviceName: this.mention }), - new _O({ - tagBuilder: s, - stripPrefix: this.stripPrefix, - stripTrailingSlash: this.stripTrailingSlash, - decodePercentEncoding: this.decodePercentEncoding - }) - ]; - return (this.matchers = o); - }), - (Autolinker.prototype.getTagBuilder = function () { - var s = this.tagBuilder; - return ( - s || - (s = this.tagBuilder = - new VC({ - newWindow: this.newWindow, - truncate: this.truncate, - className: this.className - })), - s - ); - }), - (Autolinker.version = '3.16.2'), - (Autolinker.AnchorTagBuilder = VC), - (Autolinker.HtmlTag = $C), - (Autolinker.matcher = { - Email: mO, - Hashtag: wO, - Matcher: YC, - Mention: PO, - Phone: kO, - Url: _O - }), - (Autolinker.match = { - Email: WC, - Hashtag: KC, - Match: UC, - Mention: HC, - Phone: JC, - Url: GC - }), - Autolinker - ); - })(); - const NO = TO; - var RO = /www|@|\:\/\//; - function isLinkOpen(s) { - return /^\s]/i.test(s); - } - function isLinkClose(s) { - return /^<\/a\s*>/i.test(s); - } - function createLinkifier() { - var s = [], - o = new NO({ - stripPrefix: !1, - url: !0, - email: !0, - replaceFn: function (o) { - switch (o.getType()) { - case 'url': - s.push({ text: o.matchedText, url: o.getUrl() }); - break; - case 'email': - s.push({ - text: o.matchedText, - url: 'mailto:' + o.getEmail().replace(/^mailto:/i, '') - }); - } - return !1; - } - }); - return { links: s, autolinker: o }; - } - function parseTokens(s) { - var o, - i, - u, - _, - w, - x, - C, - j, - L, - B, - $, - V, - U, - z = s.tokens, - Y = null; - for (i = 0, u = z.length; i < u; i++) - if ('inline' === z[i].type) - for ($ = 0, o = (_ = z[i].children).length - 1; o >= 0; o--) - if ('link_close' !== (w = _[o]).type) { - if ( - ('htmltag' === w.type && - (isLinkOpen(w.content) && $ > 0 && $--, isLinkClose(w.content) && $++), - !($ > 0) && 'text' === w.type && RO.test(w.content)) - ) { - if ( - (Y || ((V = (Y = createLinkifier()).links), (U = Y.autolinker)), - (x = w.content), - (V.length = 0), - U.link(x), - !V.length) - ) - continue; - for (C = [], B = w.level, j = 0; j < V.length; j++) - s.inline.validateLink(V[j].url) && - ((L = x.indexOf(V[j].text)) && - C.push({ type: 'text', content: x.slice(0, L), level: B }), - C.push({ type: 'link_open', href: V[j].url, title: '', level: B++ }), - C.push({ type: 'text', content: V[j].text, level: B }), - C.push({ type: 'link_close', level: --B }), - (x = x.slice(L + V[j].text.length))); - (x.length && C.push({ type: 'text', content: x, level: B }), - (z[i].children = _ = [].concat(_.slice(0, o), C, _.slice(o + 1)))); - } - } else for (o--; _[o].level !== w.level && 'link_open' !== _[o].type; ) o--; - } - function linkify(s) { - s.core.ruler.push('linkify', parseTokens); - } - var DO = __webpack_require__(42838), - LO = __webpack_require__.n(DO); - LO().addHook && - LO().addHook('beforeSanitizeElements', function (s) { - return (s.href && s.setAttribute('rel', 'noopener noreferrer'), s); - }); - const BO = function Markdown({ - source: s, - className: o = '', - getConfigs: i = () => ({ useUnsafeMarkdown: !1 }) - }) { - if ('string' != typeof s) return null; - const u = new Remarkable({ - html: !0, - typographer: !0, - breaks: !0, - linkTarget: '_blank' - }).use(linkify); - u.core.ruler.disable(['replacements', 'smartquotes']); - const { useUnsafeMarkdown: _ } = i(), - w = u.render(s), - x = sanitizer(w, { useUnsafeMarkdown: _ }); - return s && w && x - ? Pe.createElement('div', { - className: Hn()(o, 'markdown'), - dangerouslySetInnerHTML: { __html: x } - }) - : null; - }; - function sanitizer(s, { useUnsafeMarkdown: o = !1 } = {}) { - const i = o, - u = o ? [] : ['style', 'class']; - return ( - o && - !sanitizer.hasWarnedAboutDeprecation && - (console.warn( - 'useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0.' - ), - (sanitizer.hasWarnedAboutDeprecation = !0)), - LO().sanitize(s, { - ADD_ATTR: ['target'], - FORBID_TAGS: ['style', 'form'], - ALLOW_DATA_ATTR: i, - FORBID_ATTR: u - }) - ); - } - sanitizer.hasWarnedAboutDeprecation = !1; - class BaseLayout extends Pe.Component { - render() { - const { errSelectors: s, specSelectors: o, getComponent: i } = this.props, - u = i('SvgAssets'), - _ = i('InfoContainer', !0), - w = i('VersionPragmaFilter'), - x = i('operations', !0), - C = i('Models', !0), - j = i('Webhooks', !0), - L = i('Row'), - B = i('Col'), - $ = i('errors', !0), - V = i('ServersContainer', !0), - U = i('SchemesContainer', !0), - z = i('AuthorizeBtnContainer', !0), - Y = i('FilterContainer', !0), - Z = o.isSwagger2(), - ee = o.isOAS3(), - ie = o.isOAS31(), - ae = !o.specStr(), - le = o.loadingStatus(); - let ce = null; - if ( - ('loading' === le && - (ce = Pe.createElement( - 'div', - { className: 'info' }, - Pe.createElement( - 'div', - { className: 'loading-container' }, - Pe.createElement('div', { className: 'loading' }) - ) - )), - 'failed' === le && - (ce = Pe.createElement( - 'div', - { className: 'info' }, - Pe.createElement( - 'div', - { className: 'loading-container' }, - Pe.createElement( - 'h4', - { className: 'title' }, - 'Failed to load API definition.' - ), - Pe.createElement($, null) - ) - )), - 'failedConfig' === le) - ) { - const o = s.lastError(), - i = o ? o.get('message') : ''; - ce = Pe.createElement( - 'div', - { className: 'info failed-config' }, - Pe.createElement( - 'div', - { className: 'loading-container' }, - Pe.createElement( - 'h4', - { className: 'title' }, - 'Failed to load remote configuration.' - ), - Pe.createElement('p', null, i) - ) - ); - } - if ( - (!ce && ae && (ce = Pe.createElement('h4', null, 'No API definition provided.')), ce) - ) - return Pe.createElement( - 'div', - { className: 'swagger-ui' }, - Pe.createElement('div', { className: 'loading-container' }, ce) - ); - const pe = o.servers(), - de = o.schemes(), - fe = pe && pe.size, - ye = de && de.size, - be = !!o.securityDefinitions(); - return Pe.createElement( - 'div', - { className: 'swagger-ui' }, - Pe.createElement(u, null), - Pe.createElement( - w, - { isSwagger2: Z, isOAS3: ee, alsoShow: Pe.createElement($, null) }, - Pe.createElement($, null), - Pe.createElement( - L, - { className: 'information-container' }, - Pe.createElement(B, { mobile: 12 }, Pe.createElement(_, null)) - ), - fe || ye || be - ? Pe.createElement( - 'div', - { className: 'scheme-container' }, - Pe.createElement( - B, - { className: 'schemes wrapper', mobile: 12 }, - fe || ye - ? Pe.createElement( - 'div', - { className: 'schemes-server-container' }, - fe ? Pe.createElement(V, null) : null, - ye ? Pe.createElement(U, null) : null - ) - : null, - be ? Pe.createElement(z, null) : null - ) - ) - : null, - Pe.createElement(Y, null), - Pe.createElement( - L, - null, - Pe.createElement(B, { mobile: 12, desktop: 12 }, Pe.createElement(x, null)) - ), - ie && - Pe.createElement( - L, - { className: 'webhooks-container' }, - Pe.createElement(B, { mobile: 12, desktop: 12 }, Pe.createElement(j, null)) - ), - Pe.createElement( - L, - null, - Pe.createElement(B, { mobile: 12, desktop: 12 }, Pe.createElement(C, null)) - ) - ) - ); - } - } - const core_components = () => ({ - components: { - App: fk, - authorizationPopup: AuthorizationPopup, - authorizeBtn: AuthorizeBtn, - AuthorizeBtnContainer, - authorizeOperationBtn: AuthorizeOperationBtn, - auths: Auths, - AuthItem: auth_item_Auths, - authError: AuthError, - oauth2: Oauth2, - apiKeyAuth: ApiKeyAuth, - basicAuth: BasicAuth, - clear: Clear, - liveResponse: LiveResponse, - InitializedInput, - info: qk, - InfoContainer, - InfoUrl, - InfoBasePath, - Contact: Vk, - License: zk, - JumpToPath, - CopyToClipboardBtn, - onlineValidatorBadge: OnlineValidatorBadge, - operations: Operations, - operation: operation_Operation, - OperationSummary, - OperationSummaryMethod, - OperationSummaryPath, - responses: responses_Responses, - response: response_Response, - ResponseExtension: response_extension, - responseBody: ResponseBody, - parameters: Parameters, - parameterRow: ParameterRow, - execute: Execute, - headers: headers_Headers, - errors: Errors, - contentType: ContentType, - overview: Overview, - footer: Footer, - FilterContainer, - ParamBody, - curl: Curl, - Property: property, - TryItOutButton, - Markdown: BO, - BaseLayout, - VersionPragmaFilter, - VersionStamp: version_stamp, - OperationExt: operation_extensions, - OperationExtRow: operation_extension_row, - ParameterExt: parameter_extension, - ParameterIncludeEmpty, - OperationTag, - OperationContainer, - OpenAPIVersion: openapi_version, - DeepLink: deep_link, - SvgAssets: svg_assets, - Example: example_Example, - ExamplesSelect, - ExamplesSelectValueRetainer - } - }), - form_components = () => ({ components: { ...ye } }), - base = () => [ - configsPlugin, - util, - logs, - view, - view_legacy, - plugins_spec, - err, - icons, - plugins_layout, - json_schema_5, - json_schema_5_samples, - core_components, - form_components, - swagger_client, - auth, - downloadUrlPlugin, - deep_linking, - filter, - on_complete, - plugins_request_snippets, - syntax_highlighting, - versions, - safe_render() - ], - FO = (0, qe.Map)(); - function onlyOAS3(s) { - return (o, i) => - (...u) => { - if (i.getSystem().specSelectors.isOAS3()) { - const o = s(...u); - return 'function' == typeof o ? o(i) : o; - } - return o(...u); - }; - } - const qO = onlyOAS3(Ss()(null)), - $O = onlyOAS3((s, o) => (s) => s.getSystem().specSelectors.findSchema(o)), - VO = onlyOAS3(() => (s) => { - const o = s.getSystem().specSelectors.specJson().getIn(['components', 'schemas']); - return qe.Map.isMap(o) ? o : FO; - }), - UO = onlyOAS3(() => (s) => s.getSystem().specSelectors.specJson().hasIn(['servers', 0])), - zO = onlyOAS3(Ut(Ms, (s) => s.getIn(['components', 'securitySchemes']) || null)), - wrap_selectors_validOperationMethods = - (s, o) => - (i, ...u) => - o.specSelectors.isOAS3() ? o.oas3Selectors.validOperationMethods() : s(...u), - WO = qO, - KO = qO, - HO = qO, - JO = qO, - GO = qO; - const YO = (function wrap_selectors_onlyOAS3(s) { - return (o, i) => - (...u) => { - if (i.getSystem().specSelectors.isOAS3()) { - let o = i - .getState() - .getIn(['spec', 'resolvedSubtrees', 'components', 'securitySchemes']); - return s(i, o, ...u); - } - return o(...u); - }; - })( - Ut( - (s) => s, - ({ specSelectors: s }) => s.securityDefinitions(), - (s, o) => { - let i = (0, qe.List)(); - return o - ? (o.entrySeq().forEach(([s, o]) => { - const u = o.get('type'); - if ( - ('oauth2' === u && - o - .get('flows') - .entrySeq() - .forEach(([u, _]) => { - let w = (0, qe.fromJS)({ - flow: u, - authorizationUrl: _.get('authorizationUrl'), - tokenUrl: _.get('tokenUrl'), - scopes: _.get('scopes'), - type: o.get('type'), - description: o.get('description') - }); - i = i.push(new qe.Map({ [s]: w.filter((s) => void 0 !== s) })); - }), - ('http' !== u && 'apiKey' !== u) || (i = i.push(new qe.Map({ [s]: o }))), - 'openIdConnect' === u && o.get('openIdConnectData')) - ) { - let u = o.get('openIdConnectData'); - ( - u.get('grant_types_supported') || ['authorization_code', 'implicit'] - ).forEach((_) => { - let w = - u.get('scopes_supported') && - u.get('scopes_supported').reduce((s, o) => s.set(o, ''), new qe.Map()), - x = (0, qe.fromJS)({ - flow: _, - authorizationUrl: u.get('authorization_endpoint'), - tokenUrl: u.get('token_endpoint'), - scopes: w, - type: 'oauth2', - openIdConnectUrl: o.get('openIdConnectUrl') - }); - i = i.push(new qe.Map({ [s]: x.filter((s) => void 0 !== s) })); - }); - } - }), - i) - : i; - } - ) - ); - function OAS3ComponentWrapFactory(s) { - return (o, i) => (u) => - 'function' == typeof i.specSelectors?.isOAS3 - ? i.specSelectors.isOAS3() - ? Pe.createElement(s, Rn()({}, u, i, { Ori: o })) - : Pe.createElement(o, u) - : (console.warn("OAS3 wrapper: couldn't get spec"), null); - } - const XO = (0, qe.Map)(), - selectors_isSwagger2 = () => (s) => - (function isSwagger2(s) { - const o = s.get('swagger'); - return 'string' == typeof o && '2.0' === o; - })(s.getSystem().specSelectors.specJson()), - selectors_isOAS30 = () => (s) => - (function isOAS30(s) { - const o = s.get('openapi'); - return 'string' == typeof o && /^3\.0\.([0123])(?:-rc[012])?$/.test(o); - })(s.getSystem().specSelectors.specJson()), - selectors_isOAS3 = () => (s) => s.getSystem().specSelectors.isOAS30(); - function selectors_onlyOAS3(s) { - return (o, ...i) => - (u) => { - if (u.specSelectors.isOAS3()) { - const _ = s(o, ...i); - return 'function' == typeof _ ? _(u) : _; - } - return null; - }; - } - const ZO = selectors_onlyOAS3(() => (s) => s.specSelectors.specJson().get('servers', XO)), - findSchema = (s, o) => { - const i = s.getIn(['resolvedSubtrees', 'components', 'schemas', o], null), - u = s.getIn(['json', 'components', 'schemas', o], null); - return i || u || null; - }, - QO = selectors_onlyOAS3((s, { callbacks: o, specPath: i }) => (s) => { - const u = s.specSelectors.validOperationMethods(); - return qe.Map.isMap(o) - ? o - .reduce( - (s, o, _) => { - if (!qe.Map.isMap(o)) return s; - const w = o.reduce( - (s, o, w) => { - if (!qe.Map.isMap(o)) return s; - const x = o - .entrySeq() - .filter(([s]) => u.includes(s)) - .map(([s, o]) => ({ - operation: (0, qe.Map)({ operation: o }), - method: s, - path: w, - callbackName: _, - specPath: i.concat([_, w, s]) - })); - return s.concat(x); - }, - (0, qe.List)() - ); - return s.concat(w); - }, - (0, qe.List)() - ) - .groupBy((s) => s.callbackName) - .map((s) => s.toArray()) - .toObject() - : {}; - }), - callbacks = ({ callbacks: s, specPath: o, specSelectors: i, getComponent: u }) => { - const _ = i.callbacksOperations({ callbacks: s, specPath: o }), - w = Object.keys(_), - x = u('OperationContainer', !0); - return 0 === w.length - ? Pe.createElement('span', null, 'No callbacks') - : Pe.createElement( - 'div', - null, - w.map((s) => - Pe.createElement( - 'div', - { key: `${s}` }, - Pe.createElement('h2', null, s), - _[s].map((o) => - Pe.createElement(x, { - key: `${s}-${o.path}-${o.method}`, - op: o.operation, - tag: 'callbacks', - method: o.method, - path: o.path, - specPath: o.specPath, - allowTryItOut: !1 - }) - ) - ) - ) - ); - }, - getDefaultRequestBodyValue = (s, o, i, u) => { - const _ = s.getIn(['content', o]) ?? (0, qe.OrderedMap)(), - w = _.get('schema', (0, qe.OrderedMap)()).toJS(), - x = void 0 !== _.get('examples'), - C = _.get('example'), - j = x ? _.getIn(['examples', i, 'value']) : C; - return stringify(u.getSampleSchema(w, o, { includeWriteOnly: !0 }, j)); - }, - components_request_body = ({ - userHasEditedBody: s, - requestBody: o, - requestBodyValue: i, - requestBodyInclusionSetting: u, - requestBodyErrors: _, - getComponent: w, - getConfigs: x, - specSelectors: C, - fn: j, - contentType: L, - isExecute: B, - specPath: $, - onChange: V, - onChangeIncludeEmpty: U, - activeExamplesKey: z, - updateActiveExamplesKey: Y, - setRetainRequestBodyValueFlag: Z - }) => { - const handleFile = (s) => { - V(s.target.files[0]); - }, - setIsIncludedOptions = (s) => { - let o = { key: s, shouldDispatchInit: !1, defaultValue: !0 }; - return ('no value' === u.get(s, 'no value') && (o.shouldDispatchInit = !0), o); - }, - ee = w('Markdown', !0), - ie = w('modelExample'), - ae = w('RequestBodyEditor'), - le = w('HighlightCode', !0), - ce = w('ExamplesSelectValueRetainer'), - pe = w('Example'), - de = w('ParameterIncludeEmpty'), - { showCommonExtensions: fe } = x(), - ye = o?.get('description') ?? null, - be = o?.get('content') ?? new qe.OrderedMap(); - L = L || be.keySeq().first() || ''; - const _e = be.get(L) ?? (0, qe.OrderedMap)(), - we = _e.get('schema', (0, qe.OrderedMap)()), - Se = _e.get('examples', null), - xe = Se?.map((s, i) => { - const u = s?.get('value', null); - return (u && (s = s.set('value', getDefaultRequestBodyValue(o, L, i, j), u)), s); - }); - if (((_ = qe.List.isList(_) ? _ : (0, qe.List)()), !_e.size)) return null; - const Te = 'object' === _e.getIn(['schema', 'type']), - Re = 'binary' === _e.getIn(['schema', 'format']), - $e = 'base64' === _e.getIn(['schema', 'format']); - if ( - 'application/octet-stream' === L || - 0 === L.indexOf('image/') || - 0 === L.indexOf('audio/') || - 0 === L.indexOf('video/') || - Re || - $e - ) { - const s = w('Input'); - return B - ? Pe.createElement(s, { type: 'file', onChange: handleFile }) - : Pe.createElement( - 'i', - null, - 'Example values are not available for ', - Pe.createElement('code', null, L), - ' media types.' - ); - } - if ( - Te && - ('application/x-www-form-urlencoded' === L || 0 === L.indexOf('multipart/')) && - we.get('properties', (0, qe.OrderedMap)()).size > 0 - ) { - const s = w('JsonSchemaForm'), - o = w('ParameterExt'), - x = we.get('properties', (0, qe.OrderedMap)()); - return ( - (i = qe.Map.isMap(i) ? i : (0, qe.OrderedMap)()), - Pe.createElement( - 'div', - { className: 'table-container' }, - ye && Pe.createElement(ee, { source: ye }), - Pe.createElement( - 'table', - null, - Pe.createElement( - 'tbody', - null, - qe.Map.isMap(x) && - x.entrySeq().map(([x, C]) => { - if (C.get('readOnly')) return; - const L = C.get('oneOf')?.get(0)?.toJS(), - $ = C.get('anyOf')?.get(0)?.toJS(); - C = (0, qe.fromJS)(j.mergeJsonSchema(C.toJS(), L ?? $ ?? {})); - let z = fe ? getCommonExtensions(C) : null; - const Y = we.get('required', (0, qe.List)()).includes(x), - Z = C.get('type'), - ie = C.get('format'), - ae = C.get('description'), - le = i.getIn([x, 'value']), - ce = i.getIn([x, 'errors']) || _, - pe = u.get(x) || !1; - let ye = j.getSampleSchema(C, !1, { includeWriteOnly: !0 }); - (!1 === ye && (ye = 'false'), - 0 === ye && (ye = '0'), - 'string' != typeof ye && 'object' === Z && (ye = stringify(ye)), - 'string' == typeof ye && 'array' === Z && (ye = JSON.parse(ye))); - const be = 'string' === Z && ('binary' === ie || 'base64' === ie); - return Pe.createElement( - 'tr', - { key: x, className: 'parameters', 'data-property-name': x }, - Pe.createElement( - 'td', - { className: 'parameters-col_name' }, - Pe.createElement( - 'div', - { className: Y ? 'parameter__name required' : 'parameter__name' }, - x, - Y ? Pe.createElement('span', null, ' *') : null - ), - Pe.createElement( - 'div', - { className: 'parameter__type' }, - Z, - ie && - Pe.createElement( - 'span', - { className: 'prop-format' }, - '($', - ie, - ')' - ), - fe && z.size - ? z - .entrySeq() - .map(([s, i]) => - Pe.createElement(o, { key: `${s}-${i}`, xKey: s, xVal: i }) - ) - : null - ), - Pe.createElement( - 'div', - { className: 'parameter__deprecated' }, - C.get('deprecated') ? 'deprecated' : null - ) - ), - Pe.createElement( - 'td', - { className: 'parameters-col_description' }, - Pe.createElement(ee, { source: ae }), - B - ? Pe.createElement( - 'div', - null, - Pe.createElement(s, { - fn: j, - dispatchInitialValue: !be, - schema: C, - description: x, - getComponent: w, - value: void 0 === le ? ye : le, - required: Y, - errors: ce, - onChange: (s) => { - V(s, [x]); - } - }), - Y - ? null - : Pe.createElement(de, { - onChange: (s) => U(x, s), - isIncluded: pe, - isIncludedOptions: setIsIncludedOptions(x), - isDisabled: Array.isArray(le) - ? 0 !== le.length - : !isEmptyValue(le) - }) - ) - : null - ) - ); - }) - ) - ) - ) - ); - } - const ze = getDefaultRequestBodyValue(o, L, z, j); - let We = null; - return ( - getKnownSyntaxHighlighterLanguage(ze) && (We = 'json'), - Pe.createElement( - 'div', - null, - ye && Pe.createElement(ee, { source: ye }), - xe - ? Pe.createElement(ce, { - userHasEditedBody: s, - examples: xe, - currentKey: z, - currentUserInputValue: i, - onSelect: (s) => { - Y(s); - }, - updateValue: V, - defaultToFirstExample: !0, - getComponent: w, - setRetainRequestBodyValueFlag: Z - }) - : null, - B - ? Pe.createElement( - 'div', - null, - Pe.createElement(ae, { - value: i, - errors: _, - defaultValue: ze, - onChange: V, - getComponent: w - }) - ) - : Pe.createElement(ie, { - getComponent: w, - getConfigs: x, - specSelectors: C, - expandDepth: 1, - isExecute: B, - schema: _e.get('schema'), - specPath: $.push('content', L), - example: Pe.createElement( - le, - { className: 'body-param__example', language: We }, - stringify(i) || ze - ), - includeWriteOnly: !0 - }), - xe - ? Pe.createElement(pe, { example: xe.get(z), getComponent: w, getConfigs: x }) - : null - ) - ); - }; - class operation_link_OperationLink extends Pe.Component { - render() { - const { link: s, name: o, getComponent: i } = this.props, - u = i('Markdown', !0); - let _ = s.get('operationId') || s.get('operationRef'), - w = s.get('parameters') && s.get('parameters').toJS(), - x = s.get('description'); - return Pe.createElement( - 'div', - { className: 'operation-link' }, - Pe.createElement( - 'div', - { className: 'description' }, - Pe.createElement('b', null, Pe.createElement('code', null, o)), - x ? Pe.createElement(u, { source: x }) : null - ), - Pe.createElement( - 'pre', - null, - 'Operation `', - _, - '`', - Pe.createElement('br', null), - Pe.createElement('br', null), - 'Parameters ', - (function padString(s, o) { - if ('string' != typeof o) return ''; - return o - .split('\n') - .map((o, i) => (i > 0 ? Array(s + 1).join(' ') + o : o)) - .join('\n'); - })(0, JSON.stringify(w, null, 2)) || '{}', - Pe.createElement('br', null) - ) - ); - } - } - const eA = operation_link_OperationLink, - components_servers = ({ - servers: s, - currentServer: o, - setSelectedServer: i, - setServerVariableValue: u, - getServerVariable: _, - getEffectiveServerValue: w - }) => { - const x = - (s.find((s) => s.get('url') === o) || (0, qe.OrderedMap)()).get('variables') || - (0, qe.OrderedMap)(), - C = 0 !== x.size; - ((0, Pe.useEffect)(() => { - o || i(s.first()?.get('url')); - }, []), - (0, Pe.useEffect)(() => { - const _ = s.find((s) => s.get('url') === o); - if (!_) return void i(s.first().get('url')); - (_.get('variables') || (0, qe.OrderedMap)()).map((s, i) => { - u({ server: o, key: i, val: s.get('default') || '' }); - }); - }, [o, s])); - const j = (0, Pe.useCallback)( - (s) => { - i(s.target.value); - }, - [i] - ), - L = (0, Pe.useCallback)( - (s) => { - const i = s.target.getAttribute('data-variable'), - _ = s.target.value; - u({ server: o, key: i, val: _ }); - }, - [u, o] - ); - return Pe.createElement( - 'div', - { className: 'servers' }, - Pe.createElement( - 'label', - { htmlFor: 'servers' }, - Pe.createElement( - 'select', - { onChange: j, value: o, id: 'servers' }, - s - .valueSeq() - .map((s) => - Pe.createElement( - 'option', - { value: s.get('url'), key: s.get('url') }, - s.get('url'), - s.get('description') && ` - ${s.get('description')}` - ) - ) - .toArray() - ) - ), - C && - Pe.createElement( - 'div', - null, - Pe.createElement( - 'div', - { className: 'computed-url' }, - 'Computed URL:', - Pe.createElement('code', null, w(o)) - ), - Pe.createElement('h4', null, 'Server variables'), - Pe.createElement( - 'table', - null, - Pe.createElement( - 'tbody', - null, - x.entrySeq().map(([s, i]) => - Pe.createElement( - 'tr', - { key: s }, - Pe.createElement('td', null, s), - Pe.createElement( - 'td', - null, - i.get('enum') - ? Pe.createElement( - 'select', - { 'data-variable': s, onChange: L }, - i - .get('enum') - .map((i) => - Pe.createElement( - 'option', - { selected: i === _(o, s), key: i, value: i }, - i - ) - ) - ) - : Pe.createElement('input', { - type: 'text', - value: _(o, s) || '', - onChange: L, - 'data-variable': s - }) - ) - ) - ) - ) - ) - ) - ); - }; - class ServersContainer extends Pe.Component { - render() { - const { - specSelectors: s, - oas3Selectors: o, - oas3Actions: i, - getComponent: u - } = this.props, - _ = s.servers(), - w = u('Servers'); - return _ && _.size - ? Pe.createElement( - 'div', - null, - Pe.createElement('span', { className: 'servers-title' }, 'Servers'), - Pe.createElement(w, { - servers: _, - currentServer: o.selectedServer(), - setSelectedServer: i.setSelectedServer, - setServerVariableValue: i.setServerVariableValue, - getServerVariable: o.serverVariableValue, - getEffectiveServerValue: o.serverEffectiveValue - }) - ) - : null; - } - } - const tA = Function.prototype; - class RequestBodyEditor extends Pe.PureComponent { - static defaultProps = { onChange: tA, userHasEditedBody: !1 }; - constructor(s, o) { - (super(s, o), - (this.state = { value: stringify(s.value) || s.defaultValue }), - s.onChange(s.value)); - } - applyDefaultValue = (s) => { - const { onChange: o, defaultValue: i } = s || this.props; - return (this.setState({ value: i }), o(i)); - }; - onChange = (s) => { - this.props.onChange(stringify(s)); - }; - onDomChange = (s) => { - const o = s.target.value; - this.setState({ value: o }, () => this.onChange(o)); - }; - UNSAFE_componentWillReceiveProps(s) { - (this.props.value !== s.value && - s.value !== this.state.value && - this.setState({ value: stringify(s.value) }), - !s.value && s.defaultValue && this.state.value && this.applyDefaultValue(s)); - } - render() { - let { getComponent: s, errors: o } = this.props, - { value: i } = this.state, - u = o.size > 0; - const _ = s('TextArea'); - return Pe.createElement( - 'div', - { className: 'body-param' }, - Pe.createElement(_, { - className: Hn()('body-param__text', { invalid: u }), - title: o.size ? o.join(', ') : '', - value: i, - onChange: this.onDomChange - }) - ); - } - } - class HttpAuth extends Pe.Component { - constructor(s, o) { - super(s, o); - let { name: i, schema: u } = this.props, - _ = this.getValue(); - this.state = { name: i, schema: u, value: _ }; - } - getValue() { - let { name: s, authorized: o } = this.props; - return o && o.getIn([s, 'value']); - } - onChange = (s) => { - let { onChange: o } = this.props, - { value: i, name: u } = s.target, - _ = Object.assign({}, this.state.value); - (u ? (_[u] = i) : (_ = i), this.setState({ value: _ }, () => o(this.state))); - }; - render() { - let { schema: s, getComponent: o, errSelectors: i, name: u } = this.props; - const _ = o('Input'), - w = o('Row'), - x = o('Col'), - C = o('authError'), - j = o('Markdown', !0), - L = o('JumpToPath', !0), - B = (s.get('scheme') || '').toLowerCase(); - let $ = this.getValue(), - V = i.allErrors().filter((s) => s.get('authId') === u); - if ('basic' === B) { - let o = $ ? $.get('username') : null; - return Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - Pe.createElement('code', null, u || s.get('name')), - '  (http, Basic)', - Pe.createElement(L, { path: ['securityDefinitions', u] }) - ), - o && Pe.createElement('h6', null, 'Authorized'), - Pe.createElement(w, null, Pe.createElement(j, { source: s.get('description') })), - Pe.createElement( - w, - null, - Pe.createElement('label', { htmlFor: 'auth-basic-username' }, 'Username:'), - o - ? Pe.createElement('code', null, ' ', o, ' ') - : Pe.createElement( - x, - null, - Pe.createElement(_, { - id: 'auth-basic-username', - type: 'text', - required: 'required', - name: 'username', - 'aria-label': 'auth-basic-username', - onChange: this.onChange, - autoFocus: !0 - }) - ) - ), - Pe.createElement( - w, - null, - Pe.createElement('label', { htmlFor: 'auth-basic-password' }, 'Password:'), - o - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - x, - null, - Pe.createElement(_, { - id: 'auth-basic-password', - autoComplete: 'new-password', - name: 'password', - type: 'password', - 'aria-label': 'auth-basic-password', - onChange: this.onChange - }) - ) - ), - V.valueSeq().map((s, o) => Pe.createElement(C, { error: s, key: o })) - ); - } - return 'bearer' === B - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - Pe.createElement('code', null, u || s.get('name')), - '  (http, Bearer)', - Pe.createElement(L, { path: ['securityDefinitions', u] }) - ), - $ && Pe.createElement('h6', null, 'Authorized'), - Pe.createElement(w, null, Pe.createElement(j, { source: s.get('description') })), - Pe.createElement( - w, - null, - Pe.createElement('label', { htmlFor: 'auth-bearer-value' }, 'Value:'), - $ - ? Pe.createElement('code', null, ' ****** ') - : Pe.createElement( - x, - null, - Pe.createElement(_, { - id: 'auth-bearer-value', - type: 'text', - 'aria-label': 'auth-bearer-value', - onChange: this.onChange, - autoFocus: !0 - }) - ) - ), - V.valueSeq().map((s, o) => Pe.createElement(C, { error: s, key: o })) - ) - : Pe.createElement( - 'div', - null, - Pe.createElement( - 'em', - null, - Pe.createElement('b', null, u), - ' HTTP authentication: unsupported scheme ', - `'${B}'` - ) - ); - } - } - class operation_servers_OperationServers extends Pe.Component { - setSelectedServer = (s) => { - const { path: o, method: i } = this.props; - return (this.forceUpdate(), this.props.setSelectedServer(s, `${o}:${i}`)); - }; - setServerVariableValue = (s) => { - const { path: o, method: i } = this.props; - return ( - this.forceUpdate(), - this.props.setServerVariableValue({ ...s, namespace: `${o}:${i}` }) - ); - }; - getSelectedServer = () => { - const { path: s, method: o } = this.props; - return this.props.getSelectedServer(`${s}:${o}`); - }; - getServerVariable = (s, o) => { - const { path: i, method: u } = this.props; - return this.props.getServerVariable({ namespace: `${i}:${u}`, server: s }, o); - }; - getEffectiveServerValue = (s) => { - const { path: o, method: i } = this.props; - return this.props.getEffectiveServerValue({ server: s, namespace: `${o}:${i}` }); - }; - render() { - const { operationServers: s, pathServers: o, getComponent: i } = this.props; - if (!s && !o) return null; - const u = i('Servers'), - _ = s || o, - w = s ? 'operation' : 'path'; - return Pe.createElement( - 'div', - { className: 'opblock-section operation-servers' }, - Pe.createElement( - 'div', - { className: 'opblock-section-header' }, - Pe.createElement( - 'div', - { className: 'tab-header' }, - Pe.createElement('h4', { className: 'opblock-title' }, 'Servers') - ) - ), - Pe.createElement( - 'div', - { className: 'opblock-description-wrapper' }, - Pe.createElement( - 'h4', - { className: 'message' }, - 'These ', - w, - '-level options override the global server options.' - ), - Pe.createElement(u, { - servers: _, - currentServer: this.getSelectedServer(), - setSelectedServer: this.setSelectedServer, - setServerVariableValue: this.setServerVariableValue, - getServerVariable: this.getServerVariable, - getEffectiveServerValue: this.getEffectiveServerValue - }) - ) - ); - } - } - const rA = { - Callbacks: callbacks, - HttpAuth, - RequestBody: components_request_body, - Servers: components_servers, - ServersContainer, - RequestBodyEditor, - OperationServers: operation_servers_OperationServers, - operationLink: eA - }, - nA = new Remarkable('commonmark'); - (nA.block.ruler.enable(['table']), nA.set({ linkTarget: '_blank' })); - const sA = OAS3ComponentWrapFactory( - ({ - source: s, - className: o = '', - getConfigs: i = () => ({ useUnsafeMarkdown: !1 }) - }) => { - if ('string' != typeof s) return null; - if (s) { - const { useUnsafeMarkdown: u } = i(), - _ = sanitizer(nA.render(s), { useUnsafeMarkdown: u }); - let w; - return ( - 'string' == typeof _ && (w = _.trim()), - Pe.createElement('div', { - dangerouslySetInnerHTML: { __html: w }, - className: Hn()(o, 'renderedMarkdown') - }) - ); - } - return null; - } - ), - oA = OAS3ComponentWrapFactory(({ Ori: s, ...o }) => { - const { - schema: i, - getComponent: u, - errSelectors: _, - authorized: w, - onAuthChange: x, - name: C - } = o, - j = u('HttpAuth'); - return 'http' === i.get('type') - ? Pe.createElement(j, { - key: C, - schema: i, - name: C, - errSelectors: _, - authorized: w, - getComponent: u, - onChange: x - }) - : Pe.createElement(s, o); - }), - iA = OAS3ComponentWrapFactory(OnlineValidatorBadge); - class ModelComponent extends Pe.Component { - render() { - let { getConfigs: s, schema: o, Ori: i } = this.props, - u = ['model-box'], - _ = null; - return ( - !0 === o.get('deprecated') && - (u.push('deprecated'), - (_ = Pe.createElement( - 'span', - { className: 'model-deprecated-warning' }, - 'Deprecated:' - ))), - Pe.createElement( - 'div', - { className: u.join(' ') }, - _, - Pe.createElement( - i, - Rn()({}, this.props, { - getConfigs: s, - depth: 1, - expandDepth: this.props.expandDepth || 0 - }) - ) - ) - ); - } - } - const aA = OAS3ComponentWrapFactory(ModelComponent), - lA = OAS3ComponentWrapFactory(({ Ori: s, ...o }) => { - const { schema: i, getComponent: u, errors: _, onChange: w } = o, - x = i && i.get ? i.get('format') : null, - C = i && i.get ? i.get('type') : null, - j = u('Input'); - return C && 'string' === C && x && ('binary' === x || 'base64' === x) - ? Pe.createElement(j, { - type: 'file', - className: _.length ? 'invalid' : '', - title: _.length ? _ : '', - onChange: (s) => { - w(s.target.files[0]); - }, - disabled: s.isDisabled - }) - : Pe.createElement(s, o); - }), - cA = { - Markdown: sA, - AuthItem: oA, - OpenAPIVersion: (function OAS30ComponentWrapFactory(s) { - return (o, i) => (u) => - 'function' == typeof i.specSelectors?.isOAS30 - ? i.specSelectors.isOAS30() - ? Pe.createElement(s, Rn()({}, u, i, { Ori: o })) - : Pe.createElement(o, u) - : (console.warn("OAS30 wrapper: couldn't get spec"), null); - })((s) => { - const { Ori: o } = s; - return Pe.createElement(o, { oasVersion: '3.0' }); - }), - JsonSchema_string: lA, - model: aA, - onlineValidatorBadge: iA - }, - uA = 'oas3_set_servers', - pA = 'oas3_set_request_body_value', - hA = 'oas3_set_request_body_retain_flag', - dA = 'oas3_set_request_body_inclusion', - fA = 'oas3_set_active_examples_member', - mA = 'oas3_set_request_content_type', - gA = 'oas3_set_response_content_type', - yA = 'oas3_set_server_variable_value', - vA = 'oas3_set_request_body_validate_error', - bA = 'oas3_clear_request_body_validate_error', - _A = 'oas3_clear_request_body_value'; - function setSelectedServer(s, o) { - return { type: uA, payload: { selectedServerUrl: s, namespace: o } }; - } - function setRequestBodyValue({ value: s, pathMethod: o }) { - return { type: pA, payload: { value: s, pathMethod: o } }; - } - const setRetainRequestBodyValueFlag = ({ value: s, pathMethod: o }) => ({ - type: hA, - payload: { value: s, pathMethod: o } - }); - function setRequestBodyInclusion({ value: s, pathMethod: o, name: i }) { - return { type: dA, payload: { value: s, pathMethod: o, name: i } }; - } - function setActiveExamplesMember({ - name: s, - pathMethod: o, - contextType: i, - contextName: u - }) { - return { type: fA, payload: { name: s, pathMethod: o, contextType: i, contextName: u } }; - } - function setRequestContentType({ value: s, pathMethod: o }) { - return { type: mA, payload: { value: s, pathMethod: o } }; - } - function setResponseContentType({ value: s, path: o, method: i }) { - return { type: gA, payload: { value: s, path: o, method: i } }; - } - function setServerVariableValue({ server: s, namespace: o, key: i, val: u }) { - return { type: yA, payload: { server: s, namespace: o, key: i, val: u } }; - } - const setRequestBodyValidateError = ({ path: s, method: o, validationErrors: i }) => ({ - type: vA, - payload: { path: s, method: o, validationErrors: i } - }), - clearRequestBodyValidateError = ({ path: s, method: o }) => ({ - type: bA, - payload: { path: s, method: o } - }), - initRequestBodyValidateError = ({ pathMethod: s }) => ({ - type: bA, - payload: { path: s[0], method: s[1] } - }), - clearRequestBodyValue = ({ pathMethod: s }) => ({ type: _A, payload: { pathMethod: s } }); - var EA = __webpack_require__(60680), - wA = __webpack_require__.n(EA); - const oas3_selectors_onlyOAS3 = - (s) => - (o, ...i) => - (u) => { - if (u.getSystem().specSelectors.isOAS3()) { - const _ = s(o, ...i); - return 'function' == typeof _ ? _(u) : _; - } - return null; - }; - const SA = oas3_selectors_onlyOAS3((s, o) => { - const i = o ? [o, 'selectedServer'] : ['selectedServer']; - return s.getIn(i) || ''; - }), - xA = oas3_selectors_onlyOAS3( - (s, o, i) => s.getIn(['requestData', o, i, 'bodyValue']) || null - ), - kA = oas3_selectors_onlyOAS3( - (s, o, i) => s.getIn(['requestData', o, i, 'retainBodyValue']) || !1 - ), - selectDefaultRequestBodyValue = (s, o, i) => (s) => { - const { oas3Selectors: u, specSelectors: _, fn: w } = s.getSystem(); - if (_.isOAS3()) { - const s = u.requestContentType(o, i); - if (s) - return getDefaultRequestBodyValue( - _.specResolvedSubtree(['paths', o, i, 'requestBody']), - s, - u.activeExamplesMember(o, i, 'requestBody', 'requestBody'), - w - ); - } - return null; - }, - CA = oas3_selectors_onlyOAS3((s, o, i) => (s) => { - const { oas3Selectors: u, specSelectors: _, fn: w } = s; - let x = !1; - const C = u.requestContentType(o, i); - let j = u.requestBodyValue(o, i); - const L = _.specResolvedSubtree(['paths', o, i, 'requestBody']); - if (!L) return !1; - if ( - (qe.Map.isMap(j) && - (j = stringify( - j.mapEntries((s) => (qe.Map.isMap(s[1]) ? [s[0], s[1].get('value')] : s)).toJS() - )), - qe.List.isList(j) && (j = stringify(j)), - C) - ) { - const s = getDefaultRequestBodyValue( - L, - C, - u.activeExamplesMember(o, i, 'requestBody', 'requestBody'), - w - ); - x = !!j && j !== s; - } - return x; - }), - OA = oas3_selectors_onlyOAS3( - (s, o, i) => s.getIn(['requestData', o, i, 'bodyInclusion']) || (0, qe.Map)() - ), - AA = oas3_selectors_onlyOAS3( - (s, o, i) => s.getIn(['requestData', o, i, 'errors']) || null - ), - jA = oas3_selectors_onlyOAS3( - (s, o, i, u, _) => s.getIn(['examples', o, i, u, _, 'activeExample']) || null - ), - IA = oas3_selectors_onlyOAS3( - (s, o, i) => s.getIn(['requestData', o, i, 'requestContentType']) || null - ), - PA = oas3_selectors_onlyOAS3( - (s, o, i) => s.getIn(['requestData', o, i, 'responseContentType']) || null - ), - MA = oas3_selectors_onlyOAS3((s, o, i) => { - let u; - if ('string' != typeof o) { - const { server: s, namespace: _ } = o; - u = _ ? [_, 'serverVariableValues', s, i] : ['serverVariableValues', s, i]; - } else { - u = ['serverVariableValues', o, i]; - } - return s.getIn(u) || null; - }), - TA = oas3_selectors_onlyOAS3((s, o) => { - let i; - if ('string' != typeof o) { - const { server: s, namespace: u } = o; - i = u ? [u, 'serverVariableValues', s] : ['serverVariableValues', s]; - } else { - i = ['serverVariableValues', o]; - } - return s.getIn(i) || (0, qe.OrderedMap)(); - }), - NA = oas3_selectors_onlyOAS3((s, o) => { - var i, u; - if ('string' != typeof o) { - const { server: _, namespace: w } = o; - ((u = _), - (i = w - ? s.getIn([w, 'serverVariableValues', u]) - : s.getIn(['serverVariableValues', u]))); - } else ((u = o), (i = s.getIn(['serverVariableValues', u]))); - i = i || (0, qe.OrderedMap)(); - let _ = u; - return ( - i.map((s, o) => { - _ = _.replace(new RegExp(`{${wA()(o)}}`, 'g'), s); - }), - _ - ); - }), - RA = (function validateRequestBodyIsRequired(s) { - return (...o) => - (i) => { - const u = i.getSystem().specSelectors.specJson(); - let _ = [...o][1] || []; - return !u.getIn(['paths', ..._, 'requestBody', 'required']) || s(...o); - }; - })((s, o) => - ((s, o) => ((o = o || []), !!s.getIn(['requestData', ...o, 'bodyValue'])))(s, o) - ), - validateShallowRequired = ( - s, - { - oas3RequiredRequestBodyContentType: o, - oas3RequestContentType: i, - oas3RequestBodyValue: u - } - ) => { - let _ = []; - if (!qe.Map.isMap(u)) return _; - let w = []; - return ( - Object.keys(o.requestContentType).forEach((s) => { - if (s === i) { - o.requestContentType[s].forEach((s) => { - w.indexOf(s) < 0 && w.push(s); - }); - } - }), - w.forEach((s) => { - u.getIn([s, 'value']) || _.push(s); - }), - _ - ); - }, - DA = Ss()(['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']), - LA = { - [uA]: (s, { payload: { selectedServerUrl: o, namespace: i } }) => { - const u = i ? [i, 'selectedServer'] : ['selectedServer']; - return s.setIn(u, o); - }, - [pA]: (s, { payload: { value: o, pathMethod: i } }) => { - let [u, _] = i; - if (!qe.Map.isMap(o)) return s.setIn(['requestData', u, _, 'bodyValue'], o); - let w, - x = s.getIn(['requestData', u, _, 'bodyValue']) || (0, qe.Map)(); - qe.Map.isMap(x) || (x = (0, qe.Map)()); - const [...C] = o.keys(); - return ( - C.forEach((s) => { - let i = o.getIn([s]); - (x.has(s) && qe.Map.isMap(i)) || (w = x.setIn([s, 'value'], i)); - }), - s.setIn(['requestData', u, _, 'bodyValue'], w) - ); - }, - [hA]: (s, { payload: { value: o, pathMethod: i } }) => { - let [u, _] = i; - return s.setIn(['requestData', u, _, 'retainBodyValue'], o); - }, - [dA]: (s, { payload: { value: o, pathMethod: i, name: u } }) => { - let [_, w] = i; - return s.setIn(['requestData', _, w, 'bodyInclusion', u], o); - }, - [fA]: (s, { payload: { name: o, pathMethod: i, contextType: u, contextName: _ } }) => { - let [w, x] = i; - return s.setIn(['examples', w, x, u, _, 'activeExample'], o); - }, - [mA]: (s, { payload: { value: o, pathMethod: i } }) => { - let [u, _] = i; - return s.setIn(['requestData', u, _, 'requestContentType'], o); - }, - [gA]: (s, { payload: { value: o, path: i, method: u } }) => - s.setIn(['requestData', i, u, 'responseContentType'], o), - [yA]: (s, { payload: { server: o, namespace: i, key: u, val: _ } }) => { - const w = i ? [i, 'serverVariableValues', o, u] : ['serverVariableValues', o, u]; - return s.setIn(w, _); - }, - [vA]: (s, { payload: { path: o, method: i, validationErrors: u } }) => { - let _ = []; - if ((_.push('Required field is not provided'), u.missingBodyValue)) - return s.setIn(['requestData', o, i, 'errors'], (0, qe.fromJS)(_)); - if (u.missingRequiredKeys && u.missingRequiredKeys.length > 0) { - const { missingRequiredKeys: w } = u; - return s.updateIn(['requestData', o, i, 'bodyValue'], (0, qe.fromJS)({}), (s) => - w.reduce((s, o) => s.setIn([o, 'errors'], (0, qe.fromJS)(_)), s) - ); - } - return (console.warn('unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR'), s); - }, - [bA]: (s, { payload: { path: o, method: i } }) => { - const u = s.getIn(['requestData', o, i, 'bodyValue']); - if (!qe.Map.isMap(u)) - return s.setIn(['requestData', o, i, 'errors'], (0, qe.fromJS)([])); - const [..._] = u.keys(); - return _ - ? s.updateIn(['requestData', o, i, 'bodyValue'], (0, qe.fromJS)({}), (s) => - _.reduce((s, o) => s.setIn([o, 'errors'], (0, qe.fromJS)([])), s) - ) - : s; - }, - [_A]: (s, { payload: { pathMethod: o } }) => { - let [i, u] = o; - const _ = s.getIn(['requestData', i, u, 'bodyValue']); - return _ - ? qe.Map.isMap(_) - ? s.setIn(['requestData', i, u, 'bodyValue'], (0, qe.Map)()) - : s.setIn(['requestData', i, u, 'bodyValue'], '') - : s; - } - }; - function oas3() { - return { - components: rA, - wrapComponents: cA, - statePlugins: { - spec: { wrapSelectors: be, selectors: we }, - auth: { wrapSelectors: _e }, - oas3: { actions: { ...Se }, reducers: LA, selectors: { ...xe } } - } - }; - } - const webhooks = ({ specSelectors: s, getComponent: o }) => { - const i = s.selectWebhooksOperations(), - u = Object.keys(i), - _ = o('OperationContainer', !0); - return 0 === u.length - ? null - : Pe.createElement( - 'div', - { className: 'webhooks' }, - Pe.createElement('h2', null, 'Webhooks'), - u.map((s) => - Pe.createElement( - 'div', - { key: `${s}-webhook` }, - i[s].map((o) => - Pe.createElement(_, { - key: `${s}-${o.method}-webhook`, - op: o.operation, - tag: 'webhooks', - method: o.method, - path: s, - specPath: (0, qe.List)(o.specPath), - allowTryItOut: !1 - }) - ) - ) - ) - ); - }, - oas31_components_license = ({ getComponent: s, specSelectors: o }) => { - const i = o.selectLicenseNameField(), - u = o.selectLicenseUrl(), - _ = s('Link'); - return Pe.createElement( - 'div', - { className: 'info__license' }, - u - ? Pe.createElement( - 'div', - { className: 'info__license__url' }, - Pe.createElement(_, { target: '_blank', href: sanitizeUrl(u) }, i) - ) - : Pe.createElement('span', null, i) - ); - }, - oas31_components_contact = ({ getComponent: s, specSelectors: o }) => { - const i = o.selectContactNameField(), - u = o.selectContactUrl(), - _ = o.selectContactEmailField(), - w = s('Link'); - return Pe.createElement( - 'div', - { className: 'info__contact' }, - u && - Pe.createElement( - 'div', - null, - Pe.createElement(w, { href: sanitizeUrl(u), target: '_blank' }, i, ' - Website') - ), - _ && - Pe.createElement( - w, - { href: sanitizeUrl(`mailto:${_}`) }, - u ? `Send email to ${i}` : `Contact ${i}` - ) - ); - }, - oas31_components_info = ({ getComponent: s, specSelectors: o }) => { - const i = o.version(), - u = o.url(), - _ = o.basePath(), - w = o.host(), - x = o.selectInfoSummaryField(), - C = o.selectInfoDescriptionField(), - j = o.selectInfoTitleField(), - L = o.selectInfoTermsOfServiceUrl(), - B = o.selectExternalDocsUrl(), - $ = o.selectExternalDocsDescriptionField(), - V = o.contact(), - U = o.license(), - z = s('Markdown', !0), - Y = s('Link'), - Z = s('VersionStamp'), - ee = s('OpenAPIVersion'), - ie = s('InfoUrl'), - ae = s('InfoBasePath'), - le = s('License', !0), - ce = s('Contact', !0), - pe = s('JsonSchemaDialect', !0); - return Pe.createElement( - 'div', - { className: 'info' }, - Pe.createElement( - 'hgroup', - { className: 'main' }, - Pe.createElement( - 'h2', - { className: 'title' }, - j, - Pe.createElement( - 'span', - null, - i && Pe.createElement(Z, { version: i }), - Pe.createElement(ee, { oasVersion: '3.1' }) - ) - ), - (w || _) && Pe.createElement(ae, { host: w, basePath: _ }), - u && Pe.createElement(ie, { getComponent: s, url: u }) - ), - x && Pe.createElement('p', { className: 'info__summary' }, x), - Pe.createElement( - 'div', - { className: 'info__description description' }, - Pe.createElement(z, { source: C }) - ), - L && - Pe.createElement( - 'div', - { className: 'info__tos' }, - Pe.createElement( - Y, - { target: '_blank', href: sanitizeUrl(L) }, - 'Terms of service' - ) - ), - V.size > 0 && Pe.createElement(ce, null), - U.size > 0 && Pe.createElement(le, null), - B && - Pe.createElement( - Y, - { className: 'info__extdocs', target: '_blank', href: sanitizeUrl(B) }, - $ || B - ), - Pe.createElement(pe, null) - ); - }, - json_schema_dialect = ({ getComponent: s, specSelectors: o }) => { - const i = o.selectJsonSchemaDialectField(), - u = o.selectJsonSchemaDialectDefault(), - _ = s('Link'); - return Pe.createElement( - Pe.Fragment, - null, - i && - i === u && - Pe.createElement( - 'p', - { className: 'info__jsonschemadialect' }, - 'JSON Schema dialect:', - ' ', - Pe.createElement(_, { target: '_blank', href: sanitizeUrl(i) }, i) - ), - i && - i !== u && - Pe.createElement( - 'div', - { className: 'error-wrapper' }, - Pe.createElement( - 'div', - { className: 'no-margin' }, - Pe.createElement( - 'div', - { className: 'errors' }, - Pe.createElement( - 'div', - { className: 'errors-wrapper' }, - Pe.createElement('h4', { className: 'center' }, 'Warning'), - Pe.createElement( - 'p', - { className: 'message' }, - Pe.createElement('strong', null, 'OpenAPI.jsonSchemaDialect'), - ' field contains a value different from the default value of', - ' ', - Pe.createElement(_, { target: '_blank', href: u }, u), - '. Values different from the default one are currently not supported. Please either omit the field or provide it with the default value.' - ) - ) - ) - ) - ) - ); - }, - version_pragma_filter = ({ - bypass: s, - isSwagger2: o, - isOAS3: i, - isOAS31: u, - alsoShow: _, - children: w - }) => - s - ? Pe.createElement('div', null, w) - : o && (i || u) - ? Pe.createElement( - 'div', - { className: 'version-pragma' }, - _, - Pe.createElement( - 'div', - { className: 'version-pragma__message version-pragma__message--ambiguous' }, - Pe.createElement( - 'div', - null, - Pe.createElement('h3', null, 'Unable to render this definition'), - Pe.createElement( - 'p', - null, - Pe.createElement('code', null, 'swagger'), - ' and ', - Pe.createElement('code', null, 'openapi'), - ' fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields.' - ), - Pe.createElement( - 'p', - null, - 'Supported version fields are ', - Pe.createElement('code', null, 'swagger: "2.0"'), - ' and those that match ', - Pe.createElement('code', null, 'openapi: 3.x.y'), - ' (for example,', - ' ', - Pe.createElement('code', null, 'openapi: 3.1.0'), - ').' - ) - ) - ) - ) - : o || i || u - ? Pe.createElement('div', null, w) - : Pe.createElement( - 'div', - { className: 'version-pragma' }, - _, - Pe.createElement( - 'div', - { className: 'version-pragma__message version-pragma__message--missing' }, - Pe.createElement( - 'div', - null, - Pe.createElement('h3', null, 'Unable to render this definition'), - Pe.createElement( - 'p', - null, - 'The provided definition does not specify a valid version field.' - ), - Pe.createElement( - 'p', - null, - 'Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ', - Pe.createElement('code', null, 'swagger: "2.0"'), - ' and those that match ', - Pe.createElement('code', null, 'openapi: 3.x.y'), - ' (for example,', - ' ', - Pe.createElement('code', null, 'openapi: 3.1.0'), - ').' - ) - ) - ) - ), - getModelName = (s) => - 'string' == typeof s && s.includes('#/components/schemas/') - ? ((s) => { - const o = s.replace(/~1/g, '/').replace(/~0/g, '~'); - try { - return decodeURIComponent(o); - } catch { - return o; - } - })(s.replace(/^.*#\/components\/schemas\//, '')) - : null, - BA = (0, Pe.forwardRef)(({ schema: s, getComponent: o, onToggle: i = () => {} }, u) => { - const _ = o('JSONSchema202012'), - w = getModelName(s.get('$$ref')), - x = (0, Pe.useCallback)( - (s, o) => { - i(w, o); - }, - [w, i] - ); - return Pe.createElement(_, { name: w, schema: s.toJS(), ref: u, onExpand: x }); - }), - FA = BA, - models = ({ - specActions: s, - specSelectors: o, - layoutSelectors: i, - layoutActions: u, - getComponent: _, - getConfigs: w, - fn: x - }) => { - const C = o.selectSchemas(), - j = Object.keys(C).length > 0, - L = ['components', 'schemas'], - { docExpansion: B, defaultModelsExpandDepth: $ } = w(), - V = $ > 0 && 'none' !== B, - U = i.isShown(L, V), - z = _('Collapse'), - Y = _('JSONSchema202012'), - Z = _('ArrowUpIcon'), - ee = _('ArrowDownIcon'), - { getTitle: ie } = x.jsonSchema202012.useFn(); - (0, Pe.useEffect)(() => { - const i = U && $ > 1, - u = null != o.specResolvedSubtree(L); - i && !u && s.requestResolvedSubtree(L); - }, [U, $]); - const ae = (0, Pe.useCallback)(() => { - u.show(L, !U); - }, [U]), - le = (0, Pe.useCallback)((s) => { - null !== s && u.readyToScroll(L, s); - }, []), - handleJSONSchema202012Ref = (s) => (o) => { - null !== o && u.readyToScroll([...L, s], o); - }, - handleJSONSchema202012Expand = (i) => (u, _) => { - if (_) { - const u = [...L, i]; - null != o.specResolvedSubtree(u) || s.requestResolvedSubtree([...L, i]); - } - }; - return !j || $ < 0 - ? null - : Pe.createElement( - 'section', - { className: Hn()('models', { 'is-open': U }), ref: le }, - Pe.createElement( - 'h4', - null, - Pe.createElement( - 'button', - { 'aria-expanded': U, className: 'models-control', onClick: ae }, - Pe.createElement('span', null, 'Schemas'), - U ? Pe.createElement(Z, null) : Pe.createElement(ee, null) - ) - ), - Pe.createElement( - z, - { isOpened: U }, - Object.entries(C).map(([s, o]) => { - const i = ie(o, { lookup: 'basic' }) || s; - return Pe.createElement(Y, { - key: s, - ref: handleJSONSchema202012Ref(s), - schema: o, - name: i, - onExpand: handleJSONSchema202012Expand(s) - }); - }) - ) - ); - }, - mutual_tls_auth = ({ schema: s, getComponent: o }) => { - const i = o('JumpToPath', !0); - return Pe.createElement( - 'div', - null, - Pe.createElement( - 'h4', - null, - s.get('name'), - ' (mutualTLS)', - ' ', - Pe.createElement(i, { path: ['securityDefinitions', s.get('name')] }) - ), - Pe.createElement( - 'p', - null, - 'Mutual TLS is required by this API/Operation. Certificates are managed via your Operating System and/or your browser.' - ), - Pe.createElement('p', null, s.get('description')) - ); - }; - class auths_Auths extends Pe.Component { - constructor(s, o) { - (super(s, o), (this.state = {})); - } - onAuthChange = (s) => { - let { name: o } = s; - this.setState({ [o]: s }); - }; - submitAuth = (s) => { - s.preventDefault(); - let { authActions: o } = this.props; - o.authorizeWithPersistOption(this.state); - }; - logoutClick = (s) => { - s.preventDefault(); - let { authActions: o, definitions: i } = this.props, - u = i.map((s, o) => o).toArray(); - (this.setState(u.reduce((s, o) => ((s[o] = ''), s), {})), o.logoutWithPersistOption(u)); - }; - close = (s) => { - s.preventDefault(); - let { authActions: o } = this.props; - o.showDefinitions(!1); - }; - render() { - let { definitions: s, getComponent: o, authSelectors: i, errSelectors: u } = this.props; - const _ = o('AuthItem'), - w = o('oauth2', !0), - x = o('Button'), - C = i.authorized(), - j = s.filter((s, o) => !!C.get(o)), - L = s.filter((s) => 'oauth2' !== s.get('type') && 'mutualTLS' !== s.get('type')), - B = s.filter((s) => 'oauth2' === s.get('type')), - $ = s.filter((s) => 'mutualTLS' === s.get('type')); - return Pe.createElement( - 'div', - { className: 'auth-container' }, - L.size > 0 && - Pe.createElement( - 'form', - { onSubmit: this.submitAuth }, - L.map((s, i) => - Pe.createElement(_, { - key: i, - schema: s, - name: i, - getComponent: o, - onAuthChange: this.onAuthChange, - authorized: C, - errSelectors: u - }) - ).toArray(), - Pe.createElement( - 'div', - { className: 'auth-btn-wrapper' }, - L.size === j.size - ? Pe.createElement( - x, - { - className: 'btn modal-btn auth', - onClick: this.logoutClick, - 'aria-label': 'Remove authorization' - }, - 'Logout' - ) - : Pe.createElement( - x, - { - type: 'submit', - className: 'btn modal-btn auth authorize', - 'aria-label': 'Apply credentials' - }, - 'Authorize' - ), - Pe.createElement( - x, - { className: 'btn modal-btn auth btn-done', onClick: this.close }, - 'Close' - ) - ) - ), - B.size > 0 - ? Pe.createElement( - 'div', - null, - Pe.createElement( - 'div', - { className: 'scope-def' }, - Pe.createElement( - 'p', - null, - 'Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.' - ), - Pe.createElement( - 'p', - null, - 'API requires the following scopes. Select which ones you want to grant to Swagger UI.' - ) - ), - s - .filter((s) => 'oauth2' === s.get('type')) - .map((s, o) => - Pe.createElement( - 'div', - { key: o }, - Pe.createElement(w, { authorized: C, schema: s, name: o }) - ) - ) - .toArray() - ) - : null, - $.size > 0 && - Pe.createElement( - 'div', - null, - $.map((s, i) => - Pe.createElement(_, { - key: i, - schema: s, - name: i, - getComponent: o, - onAuthChange: this.onAuthChange, - authorized: C, - errSelectors: u - }) - ).toArray() - ) - ); - } - } - const qA = auths_Auths, - isOAS31 = (s) => { - const o = s.get('openapi'); - return 'string' == typeof o && /^3\.1\.(?:[1-9]\d*|0)$/.test(o); - }, - fn_createOnlyOAS31Selector = - (s) => - (o, ...i) => - (u) => { - if (u.getSystem().specSelectors.isOAS31()) { - const _ = s(o, ...i); - return 'function' == typeof _ ? _(u) : _; - } - return null; - }, - createOnlyOAS31SelectorWrapper = - (s) => - (o, i) => - (u, ..._) => { - if (i.getSystem().specSelectors.isOAS31()) { - const w = s(u, ..._); - return 'function' == typeof w ? w(o, i) : w; - } - return o(..._); - }, - fn_createSystemSelector = - (s) => - (o, ...i) => - (u) => { - const _ = s(o, u, ...i); - return 'function' == typeof _ ? _(u) : _; - }, - createOnlyOAS31ComponentWrapper = (s) => (o, i) => (u) => - i.specSelectors.isOAS31() - ? Pe.createElement(s, Rn()({}, u, { originalComponent: o, getSystem: i.getSystem })) - : Pe.createElement(o, u), - $A = createOnlyOAS31ComponentWrapper(({ getSystem: s }) => { - const o = s().getComponent('OAS31License', !0); - return Pe.createElement(o, null); - }), - VA = createOnlyOAS31ComponentWrapper(({ getSystem: s }) => { - const o = s().getComponent('OAS31Contact', !0); - return Pe.createElement(o, null); - }), - UA = createOnlyOAS31ComponentWrapper(({ getSystem: s }) => { - const o = s().getComponent('OAS31Info', !0); - return Pe.createElement(o, null); - }), - zA = createOnlyOAS31ComponentWrapper(({ getSystem: s, ...o }) => { - const i = s(), - { getComponent: u, fn: _, getConfigs: w } = i, - x = w(), - C = u('OAS31Model'), - j = u('JSONSchema202012'), - L = u('JSONSchema202012Keyword$schema'), - B = u('JSONSchema202012Keyword$vocabulary'), - $ = u('JSONSchema202012Keyword$id'), - V = u('JSONSchema202012Keyword$anchor'), - U = u('JSONSchema202012Keyword$dynamicAnchor'), - z = u('JSONSchema202012Keyword$ref'), - Y = u('JSONSchema202012Keyword$dynamicRef'), - Z = u('JSONSchema202012Keyword$defs'), - ee = u('JSONSchema202012Keyword$comment'), - ie = u('JSONSchema202012KeywordAllOf'), - ae = u('JSONSchema202012KeywordAnyOf'), - le = u('JSONSchema202012KeywordOneOf'), - ce = u('JSONSchema202012KeywordNot'), - pe = u('JSONSchema202012KeywordIf'), - de = u('JSONSchema202012KeywordThen'), - fe = u('JSONSchema202012KeywordElse'), - ye = u('JSONSchema202012KeywordDependentSchemas'), - be = u('JSONSchema202012KeywordPrefixItems'), - _e = u('JSONSchema202012KeywordItems'), - we = u('JSONSchema202012KeywordContains'), - Se = u('JSONSchema202012KeywordProperties'), - xe = u('JSONSchema202012KeywordPatternProperties'), - Te = u('JSONSchema202012KeywordAdditionalProperties'), - Re = u('JSONSchema202012KeywordPropertyNames'), - qe = u('JSONSchema202012KeywordUnevaluatedItems'), - $e = u('JSONSchema202012KeywordUnevaluatedProperties'), - ze = u('JSONSchema202012KeywordType'), - We = u('JSONSchema202012KeywordEnum'), - He = u('JSONSchema202012KeywordConst'), - Ye = u('JSONSchema202012KeywordConstraint'), - Xe = u('JSONSchema202012KeywordDependentRequired'), - Qe = u('JSONSchema202012KeywordContentSchema'), - et = u('JSONSchema202012KeywordTitle'), - tt = u('JSONSchema202012KeywordDescription'), - rt = u('JSONSchema202012KeywordDefault'), - nt = u('JSONSchema202012KeywordDeprecated'), - st = u('JSONSchema202012KeywordReadOnly'), - ot = u('JSONSchema202012KeywordWriteOnly'), - it = u('JSONSchema202012Accordion'), - at = u('JSONSchema202012ExpandDeepButton'), - lt = u('JSONSchema202012ChevronRightIcon'), - ct = u('withJSONSchema202012Context')(C, { - config: { - default$schema: 'https://spec.openapis.org/oas/3.1/dialect/base', - defaultExpandedLevels: x.defaultModelExpandDepth, - includeReadOnly: Boolean(o.includeReadOnly), - includeWriteOnly: Boolean(o.includeWriteOnly) - }, - components: { - JSONSchema: j, - Keyword$schema: L, - Keyword$vocabulary: B, - Keyword$id: $, - Keyword$anchor: V, - Keyword$dynamicAnchor: U, - Keyword$ref: z, - Keyword$dynamicRef: Y, - Keyword$defs: Z, - Keyword$comment: ee, - KeywordAllOf: ie, - KeywordAnyOf: ae, - KeywordOneOf: le, - KeywordNot: ce, - KeywordIf: pe, - KeywordThen: de, - KeywordElse: fe, - KeywordDependentSchemas: ye, - KeywordPrefixItems: be, - KeywordItems: _e, - KeywordContains: we, - KeywordProperties: Se, - KeywordPatternProperties: xe, - KeywordAdditionalProperties: Te, - KeywordPropertyNames: Re, - KeywordUnevaluatedItems: qe, - KeywordUnevaluatedProperties: $e, - KeywordType: ze, - KeywordEnum: We, - KeywordConst: He, - KeywordConstraint: Ye, - KeywordDependentRequired: Xe, - KeywordContentSchema: Qe, - KeywordTitle: et, - KeywordDescription: tt, - KeywordDefault: rt, - KeywordDeprecated: nt, - KeywordReadOnly: st, - KeywordWriteOnly: ot, - Accordion: it, - ExpandDeepButton: at, - ChevronRightIcon: lt - }, - fn: { - upperFirst: _.upperFirst, - isExpandable: _.jsonSchema202012.isExpandable, - getProperties: _.jsonSchema202012.getProperties - } - }); - return Pe.createElement(ct, o); - }), - WA = zA, - KA = createOnlyOAS31ComponentWrapper(({ getSystem: s }) => { - const { getComponent: o, fn: i, getConfigs: u } = s(), - _ = u(); - if (KA.ModelsWithJSONSchemaContext) - return Pe.createElement(KA.ModelsWithJSONSchemaContext, null); - const w = o('OAS31Models', !0), - x = o('JSONSchema202012'), - C = o('JSONSchema202012Keyword$schema'), - j = o('JSONSchema202012Keyword$vocabulary'), - L = o('JSONSchema202012Keyword$id'), - B = o('JSONSchema202012Keyword$anchor'), - $ = o('JSONSchema202012Keyword$dynamicAnchor'), - V = o('JSONSchema202012Keyword$ref'), - U = o('JSONSchema202012Keyword$dynamicRef'), - z = o('JSONSchema202012Keyword$defs'), - Y = o('JSONSchema202012Keyword$comment'), - Z = o('JSONSchema202012KeywordAllOf'), - ee = o('JSONSchema202012KeywordAnyOf'), - ie = o('JSONSchema202012KeywordOneOf'), - ae = o('JSONSchema202012KeywordNot'), - le = o('JSONSchema202012KeywordIf'), - ce = o('JSONSchema202012KeywordThen'), - pe = o('JSONSchema202012KeywordElse'), - de = o('JSONSchema202012KeywordDependentSchemas'), - fe = o('JSONSchema202012KeywordPrefixItems'), - ye = o('JSONSchema202012KeywordItems'), - be = o('JSONSchema202012KeywordContains'), - _e = o('JSONSchema202012KeywordProperties'), - we = o('JSONSchema202012KeywordPatternProperties'), - Se = o('JSONSchema202012KeywordAdditionalProperties'), - xe = o('JSONSchema202012KeywordPropertyNames'), - Te = o('JSONSchema202012KeywordUnevaluatedItems'), - Re = o('JSONSchema202012KeywordUnevaluatedProperties'), - qe = o('JSONSchema202012KeywordType'), - $e = o('JSONSchema202012KeywordEnum'), - ze = o('JSONSchema202012KeywordConst'), - We = o('JSONSchema202012KeywordConstraint'), - He = o('JSONSchema202012KeywordDependentRequired'), - Ye = o('JSONSchema202012KeywordContentSchema'), - Xe = o('JSONSchema202012KeywordTitle'), - Qe = o('JSONSchema202012KeywordDescription'), - et = o('JSONSchema202012KeywordDefault'), - tt = o('JSONSchema202012KeywordDeprecated'), - rt = o('JSONSchema202012KeywordReadOnly'), - nt = o('JSONSchema202012KeywordWriteOnly'), - st = o('JSONSchema202012Accordion'), - ot = o('JSONSchema202012ExpandDeepButton'), - it = o('JSONSchema202012ChevronRightIcon'), - at = o('withJSONSchema202012Context'); - return ( - (KA.ModelsWithJSONSchemaContext = at(w, { - config: { - default$schema: 'https://spec.openapis.org/oas/3.1/dialect/base', - defaultExpandedLevels: _.defaultModelsExpandDepth - 1, - includeReadOnly: !0, - includeWriteOnly: !0 - }, - components: { - JSONSchema: x, - Keyword$schema: C, - Keyword$vocabulary: j, - Keyword$id: L, - Keyword$anchor: B, - Keyword$dynamicAnchor: $, - Keyword$ref: V, - Keyword$dynamicRef: U, - Keyword$defs: z, - Keyword$comment: Y, - KeywordAllOf: Z, - KeywordAnyOf: ee, - KeywordOneOf: ie, - KeywordNot: ae, - KeywordIf: le, - KeywordThen: ce, - KeywordElse: pe, - KeywordDependentSchemas: de, - KeywordPrefixItems: fe, - KeywordItems: ye, - KeywordContains: be, - KeywordProperties: _e, - KeywordPatternProperties: we, - KeywordAdditionalProperties: Se, - KeywordPropertyNames: xe, - KeywordUnevaluatedItems: Te, - KeywordUnevaluatedProperties: Re, - KeywordType: qe, - KeywordEnum: $e, - KeywordConst: ze, - KeywordConstraint: We, - KeywordDependentRequired: He, - KeywordContentSchema: Ye, - KeywordTitle: Xe, - KeywordDescription: Qe, - KeywordDefault: et, - KeywordDeprecated: tt, - KeywordReadOnly: rt, - KeywordWriteOnly: nt, - Accordion: st, - ExpandDeepButton: ot, - ChevronRightIcon: it - }, - fn: { - upperFirst: i.upperFirst, - isExpandable: i.jsonSchema202012.isExpandable, - getProperties: i.jsonSchema202012.getProperties - } - })), - Pe.createElement(KA.ModelsWithJSONSchemaContext, null) - ); - }); - KA.ModelsWithJSONSchemaContext = null; - const HA = KA, - wrap_components_version_pragma_filter = (s, o) => (s) => { - const i = o.specSelectors.isOAS31(), - u = o.getComponent('OAS31VersionPragmaFilter'); - return Pe.createElement(u, Rn()({ isOAS31: i }, s)); - }, - JA = createOnlyOAS31ComponentWrapper(({ originalComponent: s, ...o }) => { - const { getComponent: i, schema: u } = o, - _ = i('MutualTLSAuth', !0); - return 'mutualTLS' === u.get('type') - ? Pe.createElement(_, { schema: u }) - : Pe.createElement(s, o); - }), - GA = JA, - YA = createOnlyOAS31ComponentWrapper(({ getSystem: s, ...o }) => { - const i = s().getComponent('OAS31Auths', !0); - return Pe.createElement(i, o); - }), - XA = (0, qe.Map)(), - ZA = Ut((s, o) => o.specSelectors.specJson(), isOAS31), - selectors_webhooks = () => (s) => { - const o = s.specSelectors.specJson().get('webhooks'); - return qe.Map.isMap(o) ? o : XA; - }, - QA = Ut( - [ - (s, o) => o.specSelectors.webhooks(), - (s, o) => o.specSelectors.validOperationMethods(), - (s, o) => o.specSelectors.specResolvedSubtree(['webhooks']) - ], - (s, o) => - s - .reduce( - (s, i, u) => { - if (!qe.Map.isMap(i)) return s; - const _ = i - .entrySeq() - .filter(([s]) => o.includes(s)) - .map(([s, o]) => ({ - operation: (0, qe.Map)({ operation: o }), - method: s, - path: u, - specPath: ['webhooks', u, s] - })); - return s.concat(_); - }, - (0, qe.List)() - ) - .groupBy((s) => s.path) - .map((s) => s.toArray()) - .toObject() - ), - selectors_license = () => (s) => { - const o = s.specSelectors.info().get('license'); - return qe.Map.isMap(o) ? o : XA; - }, - selectLicenseNameField = () => (s) => s.specSelectors.license().get('name', 'License'), - selectLicenseUrlField = () => (s) => s.specSelectors.license().get('url'), - ej = Ut( - [ - (s, o) => o.specSelectors.url(), - (s, o) => o.oas3Selectors.selectedServer(), - (s, o) => o.specSelectors.selectLicenseUrlField() - ], - (s, o, i) => { - if (i) return safeBuildUrl(i, s, { selectedServer: o }); - } - ), - selectLicenseIdentifierField = () => (s) => s.specSelectors.license().get('identifier'), - selectors_contact = () => (s) => { - const o = s.specSelectors.info().get('contact'); - return qe.Map.isMap(o) ? o : XA; - }, - selectContactNameField = () => (s) => - s.specSelectors.contact().get('name', 'the developer'), - selectContactEmailField = () => (s) => s.specSelectors.contact().get('email'), - selectContactUrlField = () => (s) => s.specSelectors.contact().get('url'), - fj = Ut( - [ - (s, o) => o.specSelectors.url(), - (s, o) => o.oas3Selectors.selectedServer(), - (s, o) => o.specSelectors.selectContactUrlField() - ], - (s, o, i) => { - if (i) return safeBuildUrl(i, s, { selectedServer: o }); - } - ), - selectInfoTitleField = () => (s) => s.specSelectors.info().get('title'), - selectInfoSummaryField = () => (s) => s.specSelectors.info().get('summary'), - selectInfoDescriptionField = () => (s) => s.specSelectors.info().get('description'), - selectInfoTermsOfServiceField = () => (s) => s.specSelectors.info().get('termsOfService'), - mj = Ut( - [ - (s, o) => o.specSelectors.url(), - (s, o) => o.oas3Selectors.selectedServer(), - (s, o) => o.specSelectors.selectInfoTermsOfServiceField() - ], - (s, o, i) => { - if (i) return safeBuildUrl(i, s, { selectedServer: o }); - } - ), - selectExternalDocsDescriptionField = () => (s) => - s.specSelectors.externalDocs().get('description'), - selectExternalDocsUrlField = () => (s) => s.specSelectors.externalDocs().get('url'), - _j = Ut( - [ - (s, o) => o.specSelectors.url(), - (s, o) => o.oas3Selectors.selectedServer(), - (s, o) => o.specSelectors.selectExternalDocsUrlField() - ], - (s, o, i) => { - if (i) return safeBuildUrl(i, s, { selectedServer: o }); - } - ), - selectJsonSchemaDialectField = () => (s) => - s.specSelectors.specJson().get('jsonSchemaDialect'), - selectJsonSchemaDialectDefault = () => 'https://spec.openapis.org/oas/3.1/dialect/base', - Cj = Ut( - (s, o) => o.specSelectors.definitions(), - (s, o) => o.specSelectors.specResolvedSubtree(['components', 'schemas']), - (s, o) => - qe.Map.isMap(s) - ? qe.Map.isMap(o) - ? Object.entries(s.toJS()).reduce((s, [i, u]) => { - const _ = o.get(i); - return ((s[i] = _?.toJS() || u), s); - }, {}) - : s.toJS() - : {} - ), - wrap_selectors_isOAS3 = - (s, o) => - (i, ...u) => - o.specSelectors.isOAS31() || s(...u), - Aj = createOnlyOAS31SelectorWrapper(() => (s, o) => o.oas31Selectors.selectLicenseUrl()), - Nj = createOnlyOAS31SelectorWrapper(() => (s, o) => { - const i = o.specSelectors.securityDefinitions(); - let u = s(); - return i - ? (i.entrySeq().forEach(([s, o]) => { - 'mutualTLS' === o.get('type') && (u = u.push(new qe.Map({ [s]: o }))); - }), - u) - : u; - }), - Bj = Ut( - [ - (s, o) => o.specSelectors.url(), - (s, o) => o.oas3Selectors.selectedServer(), - (s, o) => o.specSelectors.selectLicenseUrlField(), - (s, o) => o.specSelectors.selectLicenseIdentifierField() - ], - (s, o, i, u) => - i - ? safeBuildUrl(i, s, { selectedServer: o }) - : u - ? `https://spdx.org/licenses/${u}.html` - : void 0 - ), - keywords_Example = ({ schema: s, getSystem: o }) => { - const { fn: i } = o(), - { hasKeyword: u, stringify: _ } = i.jsonSchema202012.useFn(); - return u(s, 'example') - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--example' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'Example' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const' - }, - _(s.example) - ) - ) - : null; - }, - keywords_Xml = ({ schema: s, getSystem: o }) => { - const i = s?.xml || {}, - { fn: u, getComponent: _ } = o(), - { useIsExpandedDeeply: w, useComponent: x } = u.jsonSchema202012, - C = w(), - j = !!(i.name || i.namespace || i.prefix), - [L, B] = (0, Pe.useState)(C), - [$, V] = (0, Pe.useState)(!1), - U = x('Accordion'), - z = x('ExpandDeepButton'), - Y = _('JSONSchema202012DeepExpansionContext')(), - Z = (0, Pe.useCallback)(() => { - B((s) => !s); - }, []), - ee = (0, Pe.useCallback)((s, o) => { - (B(o), V(o)); - }, []); - return 0 === Object.keys(i).length - ? null - : Pe.createElement( - Y.Provider, - { value: $ }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--xml' }, - j - ? Pe.createElement( - Pe.Fragment, - null, - Pe.createElement( - U, - { expanded: L, onChange: Z }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'XML' - ) - ), - Pe.createElement(z, { expanded: L, onClick: ee }) - ) - : Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'XML' - ), - !0 === i.attribute && - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--muted' - }, - 'attribute' - ), - !0 === i.wrapped && - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--muted' - }, - 'wrapped' - ), - Pe.createElement( - 'strong', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'object' - ), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !L - }) - }, - L && - Pe.createElement( - Pe.Fragment, - null, - i.name && - Pe.createElement( - 'li', - { className: 'json-schema-2020-12-property' }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword' - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'name' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - i.name - ) - ) - ), - i.namespace && - Pe.createElement( - 'li', - { className: 'json-schema-2020-12-property' }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'namespace' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - i.namespace - ) - ) - ), - i.prefix && - Pe.createElement( - 'li', - { className: 'json-schema-2020-12-property' }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'prefix' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - i.prefix - ) - ) - ) - ) - ) - ) - ); - }, - Discriminator_DiscriminatorMapping = ({ discriminator: s }) => { - const o = s?.mapping || {}; - return 0 === Object.keys(o).length - ? null - : Object.entries(o).map(([s, o]) => - Pe.createElement( - 'div', - { key: `${s}-${o}`, className: 'json-schema-2020-12-keyword' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - s - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - o - ) - ) - ); - }, - keywords_Discriminator_Discriminator = ({ schema: s, getSystem: o }) => { - const i = s?.discriminator || {}, - { fn: u, getComponent: _ } = o(), - { useIsExpandedDeeply: w, useComponent: x } = u.jsonSchema202012, - C = w(), - j = !!i.mapping, - [L, B] = (0, Pe.useState)(C), - [$, V] = (0, Pe.useState)(!1), - U = x('Accordion'), - z = x('ExpandDeepButton'), - Y = _('JSONSchema202012DeepExpansionContext')(), - Z = (0, Pe.useCallback)(() => { - B((s) => !s); - }, []), - ee = (0, Pe.useCallback)((s, o) => { - (B(o), V(o)); - }, []); - return 0 === Object.keys(i).length - ? null - : Pe.createElement( - Y.Provider, - { value: $ }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--discriminator' - }, - j - ? Pe.createElement( - Pe.Fragment, - null, - Pe.createElement( - U, - { expanded: L, onChange: Z }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'Discriminator' - ) - ), - Pe.createElement(z, { expanded: L, onClick: ee }) - ) - : Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'Discriminator' - ), - i.propertyName && - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--muted' - }, - i.propertyName - ), - Pe.createElement( - 'strong', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'object' - ), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !L - }) - }, - L && - Pe.createElement( - 'li', - { className: 'json-schema-2020-12-property' }, - Pe.createElement(Discriminator_DiscriminatorMapping, { discriminator: i }) - ) - ) - ) - ); - }, - keywords_ExternalDocs = ({ schema: s, getSystem: o }) => { - const i = s?.externalDocs || {}, - { fn: u, getComponent: _ } = o(), - { useIsExpandedDeeply: w, useComponent: x } = u.jsonSchema202012, - C = w(), - j = !(!i.description && !i.url), - [L, B] = (0, Pe.useState)(C), - [$, V] = (0, Pe.useState)(!1), - U = x('Accordion'), - z = x('ExpandDeepButton'), - Y = _('JSONSchema202012KeywordDescription'), - Z = _('Link'), - ee = _('JSONSchema202012DeepExpansionContext')(), - ie = (0, Pe.useCallback)(() => { - B((s) => !s); - }, []), - ae = (0, Pe.useCallback)((s, o) => { - (B(o), V(o)); - }, []); - return 0 === Object.keys(i).length - ? null - : Pe.createElement( - ee.Provider, - { value: $ }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--externalDocs' - }, - j - ? Pe.createElement( - Pe.Fragment, - null, - Pe.createElement( - U, - { expanded: L, onChange: ie }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'External documentation' - ) - ), - Pe.createElement(z, { expanded: L, onClick: ae }) - ) - : Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'External documentation' - ), - Pe.createElement( - 'strong', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'object' - ), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !L - }) - }, - L && - Pe.createElement( - Pe.Fragment, - null, - i.description && - Pe.createElement( - 'li', - { className: 'json-schema-2020-12-property' }, - Pe.createElement(Y, { schema: i, getSystem: o }) - ), - i.url && - Pe.createElement( - 'li', - { className: 'json-schema-2020-12-property' }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword' - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - 'url' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - Pe.createElement( - Z, - { target: '_blank', href: sanitizeUrl(i.url) }, - i.url - ) - ) - ) - ) - ) - ) - ) - ); - }, - keywords_Description = ({ schema: s, getSystem: o }) => { - if (!s?.description) return null; - const { getComponent: i } = o(), - u = i('Markdown'); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--description' }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary' - }, - Pe.createElement(u, { source: s.description }) - ) - ); - }, - $j = createOnlyOAS31ComponentWrapper(keywords_Description), - zj = createOnlyOAS31ComponentWrapper( - ({ schema: s, getSystem: o, originalComponent: i }) => { - const { getComponent: u } = o(), - _ = u('JSONSchema202012KeywordDiscriminator'), - w = u('JSONSchema202012KeywordXml'), - x = u('JSONSchema202012KeywordExample'), - C = u('JSONSchema202012KeywordExternalDocs'); - return Pe.createElement( - Pe.Fragment, - null, - Pe.createElement(i, { schema: s }), - Pe.createElement(_, { schema: s, getSystem: o }), - Pe.createElement(w, { schema: s, getSystem: o }), - Pe.createElement(C, { schema: s, getSystem: o }), - Pe.createElement(x, { schema: s, getSystem: o }) - ); - } - ), - Kj = zj, - keywords_Properties = ({ schema: s, getSystem: o }) => { - const { fn: i } = o(), - { useComponent: u } = i.jsonSchema202012, - { getDependentRequired: _, getProperties: w } = i.jsonSchema202012.useFn(), - x = i.jsonSchema202012.useConfig(), - C = Array.isArray(s?.required) ? s.required : [], - j = u('JSONSchema'), - L = w(s, x); - return 0 === Object.keys(L).length - ? null - : Pe.createElement( - 'div', - { - className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--properties' - }, - Pe.createElement( - 'ul', - null, - Object.entries(L).map(([o, i]) => { - const u = C.includes(o), - w = _(o, s); - return Pe.createElement( - 'li', - { - key: o, - className: Hn()('json-schema-2020-12-property', { - 'json-schema-2020-12-property--required': u - }) - }, - Pe.createElement(j, { name: o, schema: i, dependentRequired: w }) - ); - }) - ) - ); - }, - Jj = createOnlyOAS31ComponentWrapper(keywords_Properties), - getProperties = (s, { includeReadOnly: o, includeWriteOnly: i }) => { - if (!s?.properties) return {}; - const u = Object.entries(s.properties).filter( - ([, s]) => (!(!0 === s?.readOnly) || o) && (!(!0 === s?.writeOnly) || i) - ); - return Object.fromEntries(u); - }; - const Gj = function oas31_after_load_afterLoad({ fn: s, getSystem: o }) { - if (s.jsonSchema202012) { - const i = ((s, o) => { - const { fn: i } = o(); - if ('function' != typeof s) return null; - const { hasKeyword: u } = i.jsonSchema202012; - return (o) => - s(o) || u(o, 'example') || o?.xml || o?.discriminator || o?.externalDocs; - })(s.jsonSchema202012.isExpandable, o); - Object.assign(this.fn.jsonSchema202012, { isExpandable: i, getProperties }); - } - if ('function' == typeof s.sampleFromSchema && s.jsonSchema202012) { - const i = ((s, o) => { - const { fn: i, specSelectors: u } = o; - return Object.fromEntries( - Object.entries(s).map(([s, o]) => { - const _ = i[s]; - return [ - s, - (...s) => (u.isOAS31() ? o(...s) : 'function' == typeof _ ? _(...s) : void 0) - ]; - }) - ); - })( - { - sampleFromSchema: s.jsonSchema202012.sampleFromSchema, - sampleFromSchemaGeneric: s.jsonSchema202012.sampleFromSchemaGeneric, - createXMLExample: s.jsonSchema202012.createXMLExample, - memoizedSampleFromSchema: s.jsonSchema202012.memoizedSampleFromSchema, - memoizedCreateXMLExample: s.jsonSchema202012.memoizedCreateXMLExample, - getJsonSampleSchema: s.jsonSchema202012.getJsonSampleSchema, - getYamlSampleSchema: s.jsonSchema202012.getYamlSampleSchema, - getXmlSampleSchema: s.jsonSchema202012.getXmlSampleSchema, - getSampleSchema: s.jsonSchema202012.getSampleSchema, - mergeJsonSchema: s.jsonSchema202012.mergeJsonSchema - }, - o() - ); - Object.assign(this.fn, i); - } - }, - oas31 = ({ fn: s }) => { - const o = s.createSystemSelector || fn_createSystemSelector, - i = s.createOnlyOAS31Selector || fn_createOnlyOAS31Selector; - return { - afterLoad: Gj, - fn: { - isOAS31, - createSystemSelector: fn_createSystemSelector, - createOnlyOAS31Selector: fn_createOnlyOAS31Selector - }, - components: { - Webhooks: webhooks, - JsonSchemaDialect: json_schema_dialect, - MutualTLSAuth: mutual_tls_auth, - OAS31Info: oas31_components_info, - OAS31License: oas31_components_license, - OAS31Contact: oas31_components_contact, - OAS31VersionPragmaFilter: version_pragma_filter, - OAS31Model: FA, - OAS31Models: models, - OAS31Auths: qA, - JSONSchema202012KeywordExample: keywords_Example, - JSONSchema202012KeywordXml: keywords_Xml, - JSONSchema202012KeywordDiscriminator: keywords_Discriminator_Discriminator, - JSONSchema202012KeywordExternalDocs: keywords_ExternalDocs - }, - wrapComponents: { - InfoContainer: UA, - License: $A, - Contact: VA, - VersionPragmaFilter: wrap_components_version_pragma_filter, - Model: WA, - Models: HA, - AuthItem: GA, - auths: YA, - JSONSchema202012KeywordDescription: $j, - JSONSchema202012KeywordDefault: Kj, - JSONSchema202012KeywordProperties: Jj - }, - statePlugins: { - auth: { wrapSelectors: { definitionsToAuthorize: Nj } }, - spec: { - selectors: { - isOAS31: o(ZA), - license: selectors_license, - selectLicenseNameField, - selectLicenseUrlField, - selectLicenseIdentifierField: i(selectLicenseIdentifierField), - selectLicenseUrl: o(ej), - contact: selectors_contact, - selectContactNameField, - selectContactEmailField, - selectContactUrlField, - selectContactUrl: o(fj), - selectInfoTitleField, - selectInfoSummaryField: i(selectInfoSummaryField), - selectInfoDescriptionField, - selectInfoTermsOfServiceField, - selectInfoTermsOfServiceUrl: o(mj), - selectExternalDocsDescriptionField, - selectExternalDocsUrlField, - selectExternalDocsUrl: o(_j), - webhooks: i(selectors_webhooks), - selectWebhooksOperations: i(o(QA)), - selectJsonSchemaDialectField, - selectJsonSchemaDialectDefault, - selectSchemas: o(Cj) - }, - wrapSelectors: { isOAS3: wrap_selectors_isOAS3, selectLicenseUrl: Aj } - }, - oas31: { selectors: { selectLicenseUrl: i(o(Bj)) } } - } - }; - }, - Xj = ts().object, - eI = ts().bool, - tI = (ts().oneOfType([Xj, eI]), (0, Pe.createContext)(null)); - tI.displayName = 'JSONSchemaContext'; - const rI = (0, Pe.createContext)(0); - rI.displayName = 'JSONSchemaLevelContext'; - const nI = (0, Pe.createContext)(!1); - nI.displayName = 'JSONSchemaDeepExpansionContext'; - const sI = (0, Pe.createContext)(new Set()), - useConfig = () => { - const { config: s } = (0, Pe.useContext)(tI); - return s; - }, - useComponent = (s) => { - const { components: o } = (0, Pe.useContext)(tI); - return o[s] || null; - }, - useFn = (s = void 0) => { - const { fn: o } = (0, Pe.useContext)(tI); - return void 0 !== s ? o[s] : o; - }, - useLevel = () => { - const s = (0, Pe.useContext)(rI); - return [s, s + 1]; - }, - useIsExpanded = () => { - const [s] = useLevel(), - { defaultExpandedLevels: o } = useConfig(); - return o - s > 0; - }, - useIsExpandedDeeply = () => (0, Pe.useContext)(nI), - useRenderedSchemas = (s = void 0) => { - if (void 0 === s) return (0, Pe.useContext)(sI); - const o = (0, Pe.useContext)(sI); - return new Set([...o, s]); - }, - oI = (0, Pe.forwardRef)( - ({ schema: s, name: o = '', dependentRequired: i = [], onExpand: u = () => {} }, _) => { - const w = useFn(), - x = useIsExpanded(), - C = useIsExpandedDeeply(), - [j, L] = (0, Pe.useState)(x || C), - [B, $] = (0, Pe.useState)(C), - [V, U] = useLevel(), - z = (() => { - const [s] = useLevel(); - return s > 0; - })(), - Y = w.isExpandable(s) || i.length > 0, - Z = ((s) => useRenderedSchemas().has(s))(s), - ee = useRenderedSchemas(s), - ie = w.stringifyConstraints(s), - ae = useComponent('Accordion'), - le = useComponent('Keyword$schema'), - ce = useComponent('Keyword$vocabulary'), - pe = useComponent('Keyword$id'), - de = useComponent('Keyword$anchor'), - fe = useComponent('Keyword$dynamicAnchor'), - ye = useComponent('Keyword$ref'), - be = useComponent('Keyword$dynamicRef'), - _e = useComponent('Keyword$defs'), - we = useComponent('Keyword$comment'), - Se = useComponent('KeywordAllOf'), - xe = useComponent('KeywordAnyOf'), - Te = useComponent('KeywordOneOf'), - Re = useComponent('KeywordNot'), - qe = useComponent('KeywordIf'), - $e = useComponent('KeywordThen'), - ze = useComponent('KeywordElse'), - We = useComponent('KeywordDependentSchemas'), - He = useComponent('KeywordPrefixItems'), - Ye = useComponent('KeywordItems'), - Xe = useComponent('KeywordContains'), - Qe = useComponent('KeywordProperties'), - et = useComponent('KeywordPatternProperties'), - tt = useComponent('KeywordAdditionalProperties'), - rt = useComponent('KeywordPropertyNames'), - nt = useComponent('KeywordUnevaluatedItems'), - st = useComponent('KeywordUnevaluatedProperties'), - ot = useComponent('KeywordType'), - it = useComponent('KeywordEnum'), - at = useComponent('KeywordConst'), - lt = useComponent('KeywordConstraint'), - ct = useComponent('KeywordDependentRequired'), - ut = useComponent('KeywordContentSchema'), - pt = useComponent('KeywordTitle'), - ht = useComponent('KeywordDescription'), - dt = useComponent('KeywordDefault'), - mt = useComponent('KeywordDeprecated'), - gt = useComponent('KeywordReadOnly'), - yt = useComponent('KeywordWriteOnly'), - vt = useComponent('ExpandDeepButton'); - ((0, Pe.useEffect)(() => { - $(C); - }, [C]), - (0, Pe.useEffect)(() => { - $(B); - }, [B])); - const bt = (0, Pe.useCallback)( - (s, o) => { - (L(o), !o && $(!1), u(s, o, !1)); - }, - [u] - ), - _t = (0, Pe.useCallback)( - (s, o) => { - (L(o), $(o), u(s, o, !0)); - }, - [u] - ); - return Pe.createElement( - rI.Provider, - { value: U }, - Pe.createElement( - nI.Provider, - { value: B }, - Pe.createElement( - sI.Provider, - { value: ee }, - Pe.createElement( - 'article', - { - ref: _, - 'data-json-schema-level': V, - className: Hn()('json-schema-2020-12', { - 'json-schema-2020-12--embedded': z, - 'json-schema-2020-12--circular': Z - }) - }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-head' }, - Y && !Z - ? Pe.createElement( - Pe.Fragment, - null, - Pe.createElement( - ae, - { expanded: j, onChange: bt }, - Pe.createElement(pt, { title: o, schema: s }) - ), - Pe.createElement(vt, { expanded: j, onClick: _t }) - ) - : Pe.createElement(pt, { title: o, schema: s }), - Pe.createElement(mt, { schema: s }), - Pe.createElement(gt, { schema: s }), - Pe.createElement(yt, { schema: s }), - Pe.createElement(ot, { schema: s, isCircular: Z }), - ie.length > 0 && - ie.map((s) => - Pe.createElement(lt, { key: `${s.scope}-${s.value}`, constraint: s }) - ) - ), - Pe.createElement( - 'div', - { - className: Hn()('json-schema-2020-12-body', { - 'json-schema-2020-12-body--collapsed': !j - }) - }, - j && - Pe.createElement( - Pe.Fragment, - null, - Pe.createElement(ht, { schema: s }), - !Z && - Y && - Pe.createElement( - Pe.Fragment, - null, - Pe.createElement(Qe, { schema: s }), - Pe.createElement(et, { schema: s }), - Pe.createElement(tt, { schema: s }), - Pe.createElement(st, { schema: s }), - Pe.createElement(rt, { schema: s }), - Pe.createElement(Se, { schema: s }), - Pe.createElement(xe, { schema: s }), - Pe.createElement(Te, { schema: s }), - Pe.createElement(Re, { schema: s }), - Pe.createElement(qe, { schema: s }), - Pe.createElement($e, { schema: s }), - Pe.createElement(ze, { schema: s }), - Pe.createElement(We, { schema: s }), - Pe.createElement(He, { schema: s }), - Pe.createElement(Ye, { schema: s }), - Pe.createElement(nt, { schema: s }), - Pe.createElement(Xe, { schema: s }), - Pe.createElement(ut, { schema: s }) - ), - Pe.createElement(it, { schema: s }), - Pe.createElement(at, { schema: s }), - Pe.createElement(ct, { schema: s, dependentRequired: i }), - Pe.createElement(dt, { schema: s }), - Pe.createElement(le, { schema: s }), - Pe.createElement(ce, { schema: s }), - Pe.createElement(pe, { schema: s }), - Pe.createElement(de, { schema: s }), - Pe.createElement(fe, { schema: s }), - Pe.createElement(ye, { schema: s }), - !Z && Y && Pe.createElement(_e, { schema: s }), - Pe.createElement(be, { schema: s }), - Pe.createElement(we, { schema: s }) - ) - ) - ) - ) - ) - ); - } - ), - iI = oI, - keywords_$schema = ({ schema: s }) => - s?.$schema - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$schema' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$schema' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$schema - ) - ) - : null, - $vocabulary_$vocabulary = ({ schema: s }) => { - const o = useIsExpanded(), - i = useIsExpandedDeeply(), - [u, _] = (0, Pe.useState)(o || i), - w = useComponent('Accordion'), - x = (0, Pe.useCallback)(() => { - _((s) => !s); - }, []); - return s?.$vocabulary - ? 'object' != typeof s.$vocabulary - ? null - : Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$vocabulary' - }, - Pe.createElement( - w, - { expanded: u, onChange: x }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$vocabulary' - ) - ), - Pe.createElement( - 'strong', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'object' - ), - Pe.createElement( - 'ul', - null, - u && - Object.entries(s.$vocabulary).map(([s, o]) => - Pe.createElement( - 'li', - { - key: s, - className: Hn()('json-schema-2020-12-$vocabulary-uri', { - 'json-schema-2020-12-$vocabulary-uri--disabled': !o - }) - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s - ) - ) - ) - ) - ) - : null; - }, - keywords_$id = ({ schema: s }) => - s?.$id - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$id' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$id' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$id - ) - ) - : null, - keywords_$anchor = ({ schema: s }) => - s?.$anchor - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$anchor' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$anchor' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$anchor - ) - ) - : null, - keywords_$dynamicAnchor = ({ schema: s }) => - s?.$dynamicAnchor - ? Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicAnchor' - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$dynamicAnchor' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$dynamicAnchor - ) - ) - : null, - keywords_$ref = ({ schema: s }) => - s?.$ref - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$ref' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$ref' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$ref - ) - ) - : null, - keywords_$dynamicRef = ({ schema: s }) => - s?.$dynamicRef - ? Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$dynamicRef' - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$dynamicRef' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$dynamicRef - ) - ) - : null, - keywords_$defs = ({ schema: s }) => { - const o = s?.$defs || {}, - i = useIsExpanded(), - u = useIsExpandedDeeply(), - [_, w] = (0, Pe.useState)(i || u), - [x, C] = (0, Pe.useState)(!1), - j = useComponent('Accordion'), - L = useComponent('ExpandDeepButton'), - B = useComponent('JSONSchema'), - $ = (0, Pe.useCallback)(() => { - w((s) => !s); - }, []), - V = (0, Pe.useCallback)((s, o) => { - (w(o), C(o)); - }, []); - return 0 === Object.keys(o).length - ? null - : Pe.createElement( - nI.Provider, - { value: x }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$defs' }, - Pe.createElement( - j, - { expanded: _, onChange: $ }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$defs' - ) - ), - Pe.createElement(L, { expanded: _, onClick: V }), - Pe.createElement( - 'strong', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'object' - ), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !_ - }) - }, - _ && - Pe.createElement( - Pe.Fragment, - null, - Object.entries(o).map(([s, o]) => - Pe.createElement( - 'li', - { key: s, className: 'json-schema-2020-12-property' }, - Pe.createElement(B, { name: s, schema: o }) - ) - ) - ) - ) - ) - ); - }, - keywords_$comment = ({ schema: s }) => - s?.$comment - ? Pe.createElement( - 'div', - { - className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--$comment' - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--secondary' - }, - '$comment' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--secondary' - }, - s.$comment - ) - ) - : null, - keywords_AllOf = ({ schema: s }) => { - const o = s?.allOf || [], - i = useFn(), - u = useIsExpanded(), - _ = useIsExpandedDeeply(), - [w, x] = (0, Pe.useState)(u || _), - [C, j] = (0, Pe.useState)(!1), - L = useComponent('Accordion'), - B = useComponent('ExpandDeepButton'), - $ = useComponent('JSONSchema'), - V = useComponent('KeywordType'), - U = (0, Pe.useCallback)(() => { - x((s) => !s); - }, []), - z = (0, Pe.useCallback)((s, o) => { - (x(o), j(o)); - }, []); - return Array.isArray(o) && 0 !== o.length - ? Pe.createElement( - nI.Provider, - { value: C }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--allOf' }, - Pe.createElement( - L, - { expanded: w, onChange: U }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'All of' - ) - ), - Pe.createElement(B, { expanded: w, onClick: z }), - Pe.createElement(V, { schema: { allOf: o } }), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !w - }) - }, - w && - Pe.createElement( - Pe.Fragment, - null, - o.map((s, o) => - Pe.createElement( - 'li', - { key: `#${o}`, className: 'json-schema-2020-12-property' }, - Pe.createElement($, { name: `#${o} ${i.getTitle(s)}`, schema: s }) - ) - ) - ) - ) - ) - ) - : null; - }, - keywords_AnyOf = ({ schema: s }) => { - const o = s?.anyOf || [], - i = useFn(), - u = useIsExpanded(), - _ = useIsExpandedDeeply(), - [w, x] = (0, Pe.useState)(u || _), - [C, j] = (0, Pe.useState)(!1), - L = useComponent('Accordion'), - B = useComponent('ExpandDeepButton'), - $ = useComponent('JSONSchema'), - V = useComponent('KeywordType'), - U = (0, Pe.useCallback)(() => { - x((s) => !s); - }, []), - z = (0, Pe.useCallback)((s, o) => { - (x(o), j(o)); - }, []); - return Array.isArray(o) && 0 !== o.length - ? Pe.createElement( - nI.Provider, - { value: C }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--anyOf' }, - Pe.createElement( - L, - { expanded: w, onChange: U }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Any of' - ) - ), - Pe.createElement(B, { expanded: w, onClick: z }), - Pe.createElement(V, { schema: { anyOf: o } }), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !w - }) - }, - w && - Pe.createElement( - Pe.Fragment, - null, - o.map((s, o) => - Pe.createElement( - 'li', - { key: `#${o}`, className: 'json-schema-2020-12-property' }, - Pe.createElement($, { name: `#${o} ${i.getTitle(s)}`, schema: s }) - ) - ) - ) - ) - ) - ) - : null; - }, - keywords_OneOf = ({ schema: s }) => { - const o = s?.oneOf || [], - i = useFn(), - u = useIsExpanded(), - _ = useIsExpandedDeeply(), - [w, x] = (0, Pe.useState)(u || _), - [C, j] = (0, Pe.useState)(!1), - L = useComponent('Accordion'), - B = useComponent('ExpandDeepButton'), - $ = useComponent('JSONSchema'), - V = useComponent('KeywordType'), - U = (0, Pe.useCallback)(() => { - x((s) => !s); - }, []), - z = (0, Pe.useCallback)((s, o) => { - (x(o), j(o)); - }, []); - return Array.isArray(o) && 0 !== o.length - ? Pe.createElement( - nI.Provider, - { value: C }, - Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--oneOf' }, - Pe.createElement( - L, - { expanded: w, onChange: U }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'One of' - ) - ), - Pe.createElement(B, { expanded: w, onClick: z }), - Pe.createElement(V, { schema: { oneOf: o } }), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !w - }) - }, - w && - Pe.createElement( - Pe.Fragment, - null, - o.map((s, o) => - Pe.createElement( - 'li', - { key: `#${o}`, className: 'json-schema-2020-12-property' }, - Pe.createElement($, { name: `#${o} ${i.getTitle(s)}`, schema: s }) - ) - ) - ) - ) - ) - ) - : null; - }, - keywords_Not = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'not')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Not' - ); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--not' }, - Pe.createElement(i, { name: u, schema: s.not }) - ); - }, - keywords_If = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'if')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'If' - ); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--if' }, - Pe.createElement(i, { name: u, schema: s.if }) - ); - }, - keywords_Then = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'then')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Then' - ); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--then' }, - Pe.createElement(i, { name: u, schema: s.then }) - ); - }, - keywords_Else = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'else')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Else' - ); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--if' }, - Pe.createElement(i, { name: u, schema: s.else }) - ); - }, - keywords_DependentSchemas = ({ schema: s }) => { - const o = s?.dependentSchemas || [], - i = useIsExpanded(), - u = useIsExpandedDeeply(), - [_, w] = (0, Pe.useState)(i || u), - [x, C] = (0, Pe.useState)(!1), - j = useComponent('Accordion'), - L = useComponent('ExpandDeepButton'), - B = useComponent('JSONSchema'), - $ = (0, Pe.useCallback)(() => { - w((s) => !s); - }, []), - V = (0, Pe.useCallback)((s, o) => { - (w(o), C(o)); - }, []); - return 'object' != typeof o || 0 === Object.keys(o).length - ? null - : Pe.createElement( - nI.Provider, - { value: x }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentSchemas' - }, - Pe.createElement( - j, - { expanded: _, onChange: $ }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Dependent schemas' - ) - ), - Pe.createElement(L, { expanded: _, onClick: V }), - Pe.createElement( - 'strong', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'object' - ), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !_ - }) - }, - _ && - Pe.createElement( - Pe.Fragment, - null, - Object.entries(o).map(([s, o]) => - Pe.createElement( - 'li', - { key: s, className: 'json-schema-2020-12-property' }, - Pe.createElement(B, { name: s, schema: o }) - ) - ) - ) - ) - ) - ); - }, - keywords_PrefixItems = ({ schema: s }) => { - const o = s?.prefixItems || [], - i = useFn(), - u = useIsExpanded(), - _ = useIsExpandedDeeply(), - [w, x] = (0, Pe.useState)(u || _), - [C, j] = (0, Pe.useState)(!1), - L = useComponent('Accordion'), - B = useComponent('ExpandDeepButton'), - $ = useComponent('JSONSchema'), - V = useComponent('KeywordType'), - U = (0, Pe.useCallback)(() => { - x((s) => !s); - }, []), - z = (0, Pe.useCallback)((s, o) => { - (x(o), j(o)); - }, []); - return Array.isArray(o) && 0 !== o.length - ? Pe.createElement( - nI.Provider, - { value: C }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--prefixItems' - }, - Pe.createElement( - L, - { expanded: w, onChange: U }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Prefix items' - ) - ), - Pe.createElement(B, { expanded: w, onClick: z }), - Pe.createElement(V, { schema: { prefixItems: o } }), - Pe.createElement( - 'ul', - { - className: Hn()('json-schema-2020-12-keyword__children', { - 'json-schema-2020-12-keyword__children--collapsed': !w - }) - }, - w && - Pe.createElement( - Pe.Fragment, - null, - o.map((s, o) => - Pe.createElement( - 'li', - { key: `#${o}`, className: 'json-schema-2020-12-property' }, - Pe.createElement($, { name: `#${o} ${i.getTitle(s)}`, schema: s }) - ) - ) - ) - ) - ) - ) - : null; - }, - keywords_Items = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'items')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Items' - ); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--items' }, - Pe.createElement(i, { name: u, schema: s.items }) - ); - }, - keywords_Contains = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'contains')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Contains' - ); - return Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--contains' }, - Pe.createElement(i, { name: u, schema: s.contains }) - ); - }, - keywords_Properties_Properties = ({ schema: s }) => { - const o = useFn(), - i = s?.properties || {}, - u = Array.isArray(s?.required) ? s.required : [], - _ = useComponent('JSONSchema'); - return 0 === Object.keys(i).length - ? null - : Pe.createElement( - 'div', - { - className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--properties' - }, - Pe.createElement( - 'ul', - null, - Object.entries(i).map(([i, w]) => { - const x = u.includes(i), - C = o.getDependentRequired(i, s); - return Pe.createElement( - 'li', - { - key: i, - className: Hn()('json-schema-2020-12-property', { - 'json-schema-2020-12-property--required': x - }) - }, - Pe.createElement(_, { name: i, schema: w, dependentRequired: C }) - ); - }) - ) - ); - }, - PatternProperties_PatternProperties = ({ schema: s }) => { - const o = s?.patternProperties || {}, - i = useComponent('JSONSchema'); - return 0 === Object.keys(o).length - ? null - : Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--patternProperties' - }, - Pe.createElement( - 'ul', - null, - Object.entries(o).map(([s, o]) => - Pe.createElement( - 'li', - { key: s, className: 'json-schema-2020-12-property' }, - Pe.createElement(i, { name: s, schema: o }) - ) - ) - ) - ); - }, - keywords_AdditionalProperties = ({ schema: s }) => { - const o = useFn(), - { additionalProperties: i } = s, - u = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'additionalProperties')) return null; - const _ = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Additional properties' - ); - return Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--additionalProperties' - }, - !0 === i - ? Pe.createElement( - Pe.Fragment, - null, - _, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'allowed' - ) - ) - : !1 === i - ? Pe.createElement( - Pe.Fragment, - null, - _, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - 'forbidden' - ) - ) - : Pe.createElement(u, { name: _, schema: i }) - ); - }, - keywords_PropertyNames = ({ schema: s }) => { - const o = useFn(), - { propertyNames: i } = s, - u = useComponent('JSONSchema'), - _ = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Property names' - ); - return o.hasKeyword(s, 'propertyNames') - ? Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--propertyNames' - }, - Pe.createElement(u, { name: _, schema: i }) - ) - : null; - }, - keywords_UnevaluatedItems = ({ schema: s }) => { - const o = useFn(), - { unevaluatedItems: i } = s, - u = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'unevaluatedItems')) return null; - const _ = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Unevaluated items' - ); - return Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedItems' - }, - Pe.createElement(u, { name: _, schema: i }) - ); - }, - keywords_UnevaluatedProperties = ({ schema: s }) => { - const o = useFn(), - { unevaluatedProperties: i } = s, - u = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'unevaluatedProperties')) return null; - const _ = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Unevaluated properties' - ); - return Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--unevaluatedProperties' - }, - Pe.createElement(u, { name: _, schema: i }) - ); - }, - keywords_Type = ({ schema: s, isCircular: o = !1 }) => { - const i = useFn().getType(s), - u = o ? ' [circular]' : ''; - return Pe.createElement( - 'strong', - { - className: 'json-schema-2020-12__attribute json-schema-2020-12__attribute--primary' - }, - `${i}${u}` - ); - }, - Enum_Enum = ({ schema: s }) => { - const o = useFn(); - return Array.isArray(s?.enum) - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--enum' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Allowed values' - ), - Pe.createElement( - 'ul', - null, - s.enum.map((s) => { - const i = o.stringify(s); - return Pe.createElement( - 'li', - { key: i }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const' - }, - i - ) - ); - }) - ) - ) - : null; - }, - keywords_Const = ({ schema: s }) => { - const o = useFn(); - return o.hasKeyword(s, 'const') - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--const' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Const' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const' - }, - o.stringify(s.const) - ) - ) - : null; - }, - Constraint = ({ constraint: s }) => - Pe.createElement( - 'span', - { - className: `json-schema-2020-12__constraint json-schema-2020-12__constraint--${s.scope}` - }, - s.value - ), - aI = Pe.memo(Constraint), - DependentRequired_DependentRequired = ({ dependentRequired: s }) => - 0 === s.length - ? null - : Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--dependentRequired' - }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Required when defined' - ), - Pe.createElement( - 'ul', - null, - s.map((s) => - Pe.createElement( - 'li', - { key: s }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--warning' - }, - s - ) - ) - ) - ) - ), - keywords_ContentSchema = ({ schema: s }) => { - const o = useFn(), - i = useComponent('JSONSchema'); - if (!o.hasKeyword(s, 'contentSchema')) return null; - const u = Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Content schema' - ); - return Pe.createElement( - 'div', - { - className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--contentSchema' - }, - Pe.createElement(i, { name: u, schema: s.contentSchema }) - ); - }, - Title_Title = ({ title: s = '', schema: o }) => { - const i = useFn(), - u = s || i.getTitle(o); - return u - ? Pe.createElement('div', { className: 'json-schema-2020-12__title' }, u) - : null; - }, - keywords_Description_Description = ({ schema: s }) => - s?.description - ? Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-keyword json-schema-2020-12-keyword--description' - }, - Pe.createElement( - 'div', - { - className: - 'json-schema-2020-12-core-keyword__value json-schema-2020-12-core-keyword__value--secondary' - }, - s.description - ) - ) - : null, - keywords_Default = ({ schema: s }) => { - const o = useFn(); - return o.hasKeyword(s, 'default') - ? Pe.createElement( - 'div', - { className: 'json-schema-2020-12-keyword json-schema-2020-12-keyword--default' }, - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__name json-schema-2020-12-keyword__name--primary' - }, - 'Default' - ), - Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12-keyword__value json-schema-2020-12-keyword__value--const' - }, - o.stringify(s.default) - ) - ) - : null; - }, - keywords_Deprecated = ({ schema: s }) => - !0 !== s?.deprecated - ? null - : Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--warning' - }, - 'deprecated' - ), - keywords_ReadOnly = ({ schema: s }) => - !0 !== s?.readOnly - ? null - : Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--muted' - }, - 'read-only' - ), - keywords_WriteOnly = ({ schema: s }) => - !0 !== s?.writeOnly - ? null - : Pe.createElement( - 'span', - { - className: - 'json-schema-2020-12__attribute json-schema-2020-12__attribute--muted' - }, - 'write-only' - ), - Accordion_Accordion = ({ expanded: s = !1, children: o, onChange: i }) => { - const u = useComponent('ChevronRightIcon'), - _ = (0, Pe.useCallback)( - (o) => { - i(o, !s); - }, - [s, i] - ); - return Pe.createElement( - 'button', - { type: 'button', className: 'json-schema-2020-12-accordion', onClick: _ }, - Pe.createElement('div', { className: 'json-schema-2020-12-accordion__children' }, o), - Pe.createElement( - 'span', - { - className: Hn()('json-schema-2020-12-accordion__icon', { - 'json-schema-2020-12-accordion__icon--expanded': s, - 'json-schema-2020-12-accordion__icon--collapsed': !s - }) - }, - Pe.createElement(u, null) - ) - ); - }, - ExpandDeepButton_ExpandDeepButton = ({ expanded: s, onClick: o }) => { - const i = (0, Pe.useCallback)( - (i) => { - o(i, !s); - }, - [s, o] - ); - return Pe.createElement( - 'button', - { type: 'button', className: 'json-schema-2020-12-expand-deep-button', onClick: i }, - s ? 'Collapse all' : 'Expand all' - ); - }, - icons_ChevronRight = () => - Pe.createElement( - 'svg', - { - xmlns: 'http://www.w3.org/2000/svg', - width: '24', - height: '24', - viewBox: '0 0 24 24' - }, - Pe.createElement('path', { d: 'M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z' }) - ), - fn_upperFirst = (s) => - 'string' == typeof s ? `${s.charAt(0).toUpperCase()}${s.slice(1)}` : s, - getTitle = (s, { lookup: o = 'extended' } = {}) => { - const i = useFn(); - if (null != s?.title) return i.upperFirst(String(s.title)); - if ('extended' === o) { - if (null != s?.$anchor) return i.upperFirst(String(s.$anchor)); - if (null != s?.$id) return String(s.$id); - } - return ''; - }, - getType = (s, o = new WeakSet()) => { - const i = useFn(); - if (null == s) return 'any'; - if (i.isBooleanJSONSchema(s)) return s ? 'any' : 'never'; - if ('object' != typeof s) return 'any'; - if (o.has(s)) return 'any'; - o.add(s); - const { type: u, prefixItems: _, items: w } = s, - getArrayType = () => { - if (Array.isArray(_)) { - const s = _.map((s) => getType(s, o)), - i = w ? getType(w, o) : 'any'; - return `array<[${s.join(', ')}], ${i}>`; - } - if (w) { - return `array<${getType(w, o)}>`; - } - return 'array'; - }; - if (s.not && 'any' === getType(s.not)) return 'never'; - const handleCombiningKeywords = (i, u) => { - if (Array.isArray(s[i])) { - return `(${s[i].map((s) => getType(s, o)).join(u)})`; - } - return null; - }, - x = [ - Array.isArray(u) - ? u.map((s) => ('array' === s ? getArrayType() : s)).join(' | ') - : 'array' === u - ? getArrayType() - : [ - 'null', - 'boolean', - 'object', - 'array', - 'number', - 'integer', - 'string' - ].includes(u) - ? u - : (() => { - if ( - Object.hasOwn(s, 'prefixItems') || - Object.hasOwn(s, 'items') || - Object.hasOwn(s, 'contains') - ) - return getArrayType(); - if ( - Object.hasOwn(s, 'properties') || - Object.hasOwn(s, 'additionalProperties') || - Object.hasOwn(s, 'patternProperties') - ) - return 'object'; - if (['int32', 'int64'].includes(s.format)) return 'integer'; - if (['float', 'double'].includes(s.format)) return 'number'; - if ( - Object.hasOwn(s, 'minimum') || - Object.hasOwn(s, 'maximum') || - Object.hasOwn(s, 'exclusiveMinimum') || - Object.hasOwn(s, 'exclusiveMaximum') || - Object.hasOwn(s, 'multipleOf') - ) - return 'number | integer'; - if ( - Object.hasOwn(s, 'pattern') || - Object.hasOwn(s, 'format') || - Object.hasOwn(s, 'minLength') || - Object.hasOwn(s, 'maxLength') - ) - return 'string'; - if (void 0 !== s.const) { - if (null === s.const) return 'null'; - if ('boolean' == typeof s.const) return 'boolean'; - if ('number' == typeof s.const) - return Number.isInteger(s.const) ? 'integer' : 'number'; - if ('string' == typeof s.const) return 'string'; - if (Array.isArray(s.const)) return 'array'; - if ('object' == typeof s.const) return 'object'; - } - return null; - })(), - handleCombiningKeywords('oneOf', ' | '), - handleCombiningKeywords('anyOf', ' | '), - handleCombiningKeywords('allOf', ' & ') - ] - .filter(Boolean) - .join(' | '); - return (o.delete(s), x || 'any'); - }, - isBooleanJSONSchema = (s) => 'boolean' == typeof s, - hasKeyword = (s, o) => null !== s && 'object' == typeof s && Object.hasOwn(s, o), - isExpandable = (s) => { - const o = useFn(); - return ( - s?.$schema || - s?.$vocabulary || - s?.$id || - s?.$anchor || - s?.$dynamicAnchor || - s?.$ref || - s?.$dynamicRef || - s?.$defs || - s?.$comment || - s?.allOf || - s?.anyOf || - s?.oneOf || - o.hasKeyword(s, 'not') || - o.hasKeyword(s, 'if') || - o.hasKeyword(s, 'then') || - o.hasKeyword(s, 'else') || - s?.dependentSchemas || - s?.prefixItems || - o.hasKeyword(s, 'items') || - o.hasKeyword(s, 'contains') || - s?.properties || - s?.patternProperties || - o.hasKeyword(s, 'additionalProperties') || - o.hasKeyword(s, 'propertyNames') || - o.hasKeyword(s, 'unevaluatedItems') || - o.hasKeyword(s, 'unevaluatedProperties') || - s?.description || - s?.enum || - o.hasKeyword(s, 'const') || - o.hasKeyword(s, 'contentSchema') || - o.hasKeyword(s, 'default') - ); - }, - fn_stringify = (s) => - null === s || ['number', 'bigint', 'boolean'].includes(typeof s) - ? String(s) - : Array.isArray(s) - ? `[${s.map(fn_stringify).join(', ')}]` - : JSON.stringify(s), - stringifyConstraintRange = (s, o, i) => { - const u = 'number' == typeof o, - _ = 'number' == typeof i; - return u && _ - ? o === i - ? `${o} ${s}` - : `[${o}, ${i}] ${s}` - : u - ? `>= ${o} ${s}` - : _ - ? `<= ${i} ${s}` - : null; - }, - stringifyConstraints = (s) => { - const o = [], - i = ((s) => { - if ('number' != typeof s?.multipleOf) return null; - if (s.multipleOf <= 0) return null; - if (1 === s.multipleOf) return null; - const { multipleOf: o } = s; - if (Number.isInteger(o)) return `multiple of ${o}`; - const i = 10 ** o.toString().split('.')[1].length; - return `multiple of ${o * i}/${i}`; - })(s); - null !== i && o.push({ scope: 'number', value: i }); - const u = ((s) => { - const o = s?.minimum, - i = s?.maximum, - u = s?.exclusiveMinimum, - _ = s?.exclusiveMaximum, - w = 'number' == typeof o, - x = 'number' == typeof i, - C = 'number' == typeof u, - j = 'number' == typeof _, - L = C && (!w || o < u), - B = j && (!x || i > _); - if ((w || C) && (x || j)) - return `${L ? '(' : '['}${L ? u : o}, ${B ? _ : i}${B ? ')' : ']'}`; - if (w || C) return `${L ? '>' : '≥'} ${L ? u : o}`; - if (x || j) return `${B ? '<' : '≤'} ${B ? _ : i}`; - return null; - })(s); - (null !== u && o.push({ scope: 'number', value: u }), - s?.format && o.push({ scope: 'string', value: s.format })); - const _ = stringifyConstraintRange('characters', s?.minLength, s?.maxLength); - (null !== _ && o.push({ scope: 'string', value: _ }), - s?.pattern && o.push({ scope: 'string', value: `matches ${s?.pattern}` }), - s?.contentMediaType && - o.push({ scope: 'string', value: `media type: ${s.contentMediaType}` }), - s?.contentEncoding && - o.push({ scope: 'string', value: `encoding: ${s.contentEncoding}` })); - const w = stringifyConstraintRange( - s?.hasUniqueItems ? 'unique items' : 'items', - s?.minItems, - s?.maxItems - ); - null !== w && o.push({ scope: 'array', value: w }); - const x = stringifyConstraintRange('contained items', s?.minContains, s?.maxContains); - null !== x && o.push({ scope: 'array', value: x }); - const C = stringifyConstraintRange('properties', s?.minProperties, s?.maxProperties); - return (null !== C && o.push({ scope: 'object', value: C }), o); - }, - getDependentRequired = (s, o) => - o?.dependentRequired - ? Array.from( - Object.entries(o.dependentRequired).reduce( - (o, [i, u]) => (Array.isArray(u) && u.includes(s) ? (o.add(i), o) : o), - new Set() - ) - ) - : [], - withJSONSchemaContext = (s, o = {}) => { - const i = { - components: { - JSONSchema: iI, - Keyword$schema: keywords_$schema, - Keyword$vocabulary: $vocabulary_$vocabulary, - Keyword$id: keywords_$id, - Keyword$anchor: keywords_$anchor, - Keyword$dynamicAnchor: keywords_$dynamicAnchor, - Keyword$ref: keywords_$ref, - Keyword$dynamicRef: keywords_$dynamicRef, - Keyword$defs: keywords_$defs, - Keyword$comment: keywords_$comment, - KeywordAllOf: keywords_AllOf, - KeywordAnyOf: keywords_AnyOf, - KeywordOneOf: keywords_OneOf, - KeywordNot: keywords_Not, - KeywordIf: keywords_If, - KeywordThen: keywords_Then, - KeywordElse: keywords_Else, - KeywordDependentSchemas: keywords_DependentSchemas, - KeywordPrefixItems: keywords_PrefixItems, - KeywordItems: keywords_Items, - KeywordContains: keywords_Contains, - KeywordProperties: keywords_Properties_Properties, - KeywordPatternProperties: PatternProperties_PatternProperties, - KeywordAdditionalProperties: keywords_AdditionalProperties, - KeywordPropertyNames: keywords_PropertyNames, - KeywordUnevaluatedItems: keywords_UnevaluatedItems, - KeywordUnevaluatedProperties: keywords_UnevaluatedProperties, - KeywordType: keywords_Type, - KeywordEnum: Enum_Enum, - KeywordConst: keywords_Const, - KeywordConstraint: aI, - KeywordDependentRequired: DependentRequired_DependentRequired, - KeywordContentSchema: keywords_ContentSchema, - KeywordTitle: Title_Title, - KeywordDescription: keywords_Description_Description, - KeywordDefault: keywords_Default, - KeywordDeprecated: keywords_Deprecated, - KeywordReadOnly: keywords_ReadOnly, - KeywordWriteOnly: keywords_WriteOnly, - Accordion: Accordion_Accordion, - ExpandDeepButton: ExpandDeepButton_ExpandDeepButton, - ChevronRightIcon: icons_ChevronRight, - ...o.components - }, - config: { - default$schema: 'https://json-schema.org/draft/2020-12/schema', - defaultExpandedLevels: 0, - ...o.config - }, - fn: { - upperFirst: fn_upperFirst, - getTitle, - getType, - isBooleanJSONSchema, - hasKeyword, - isExpandable, - stringify: fn_stringify, - stringifyConstraints, - getDependentRequired, - ...o.fn - } - }, - HOC = (o) => Pe.createElement(tI.Provider, { value: i }, Pe.createElement(s, o)); - return ( - (HOC.contexts = { JSONSchemaContext: tI }), - (HOC.displayName = s.displayName), - HOC - ); - }, - json_schema_2020_12 = () => ({ - components: { - JSONSchema202012: iI, - JSONSchema202012Keyword$schema: keywords_$schema, - JSONSchema202012Keyword$vocabulary: $vocabulary_$vocabulary, - JSONSchema202012Keyword$id: keywords_$id, - JSONSchema202012Keyword$anchor: keywords_$anchor, - JSONSchema202012Keyword$dynamicAnchor: keywords_$dynamicAnchor, - JSONSchema202012Keyword$ref: keywords_$ref, - JSONSchema202012Keyword$dynamicRef: keywords_$dynamicRef, - JSONSchema202012Keyword$defs: keywords_$defs, - JSONSchema202012Keyword$comment: keywords_$comment, - JSONSchema202012KeywordAllOf: keywords_AllOf, - JSONSchema202012KeywordAnyOf: keywords_AnyOf, - JSONSchema202012KeywordOneOf: keywords_OneOf, - JSONSchema202012KeywordNot: keywords_Not, - JSONSchema202012KeywordIf: keywords_If, - JSONSchema202012KeywordThen: keywords_Then, - JSONSchema202012KeywordElse: keywords_Else, - JSONSchema202012KeywordDependentSchemas: keywords_DependentSchemas, - JSONSchema202012KeywordPrefixItems: keywords_PrefixItems, - JSONSchema202012KeywordItems: keywords_Items, - JSONSchema202012KeywordContains: keywords_Contains, - JSONSchema202012KeywordProperties: keywords_Properties_Properties, - JSONSchema202012KeywordPatternProperties: PatternProperties_PatternProperties, - JSONSchema202012KeywordAdditionalProperties: keywords_AdditionalProperties, - JSONSchema202012KeywordPropertyNames: keywords_PropertyNames, - JSONSchema202012KeywordUnevaluatedItems: keywords_UnevaluatedItems, - JSONSchema202012KeywordUnevaluatedProperties: keywords_UnevaluatedProperties, - JSONSchema202012KeywordType: keywords_Type, - JSONSchema202012KeywordEnum: Enum_Enum, - JSONSchema202012KeywordConst: keywords_Const, - JSONSchema202012KeywordConstraint: aI, - JSONSchema202012KeywordDependentRequired: DependentRequired_DependentRequired, - JSONSchema202012KeywordContentSchema: keywords_ContentSchema, - JSONSchema202012KeywordTitle: Title_Title, - JSONSchema202012KeywordDescription: keywords_Description_Description, - JSONSchema202012KeywordDefault: keywords_Default, - JSONSchema202012KeywordDeprecated: keywords_Deprecated, - JSONSchema202012KeywordReadOnly: keywords_ReadOnly, - JSONSchema202012KeywordWriteOnly: keywords_WriteOnly, - JSONSchema202012Accordion: Accordion_Accordion, - JSONSchema202012ExpandDeepButton: ExpandDeepButton_ExpandDeepButton, - JSONSchema202012ChevronRightIcon: icons_ChevronRight, - withJSONSchema202012Context: withJSONSchemaContext, - JSONSchema202012DeepExpansionContext: () => nI - }, - fn: { - upperFirst: fn_upperFirst, - jsonSchema202012: { - isExpandable, - hasKeyword, - useFn, - useConfig, - useComponent, - useIsExpandedDeeply - } - } - }); - var lI = __webpack_require__(11331), - cI = __webpack_require__.n(lI); - const array = (s, { sample: o }) => - ((s, o = {}) => { - const { minItems: i, maxItems: u, uniqueItems: _ } = o, - { contains: w, minContains: x, maxContains: C } = o; - let j = [...s]; - if (null != w && 'object' == typeof w) { - if (Number.isInteger(x) && x > 1) { - const s = j.at(0); - for (let o = 1; o < x; o += 1) j.unshift(s); - } - Number.isInteger(C); - } - if ( - (Number.isInteger(u) && u > 0 && (j = s.slice(0, u)), Number.isInteger(i) && i > 0) - ) - for (let s = 0; j.length < i; s += 1) j.push(j[s % j.length]); - return (!0 === _ && (j = Array.from(new Set(j))), j); - })(o, s), - object = () => { - throw new Error('Not implemented'); - }, - bytes = (s) => St()(s), - random_pick = (s) => s.at(0), - predicates_isBooleanJSONSchema = (s) => 'boolean' == typeof s, - isJSONSchemaObject = (s) => cI()(s), - isJSONSchema = (s) => predicates_isBooleanJSONSchema(s) || isJSONSchemaObject(s); - const uI = class Registry { - data = {}; - register(s, o) { - this.data[s] = o; - } - unregister(s) { - void 0 === s ? (this.data = {}) : delete this.data[s]; - } - get(s) { - return this.data[s]; - } - }, - int32 = () => (2 ** 30) >>> 0, - int64 = () => 2 ** 53 - 1, - generators_float = () => 0.1, - generators_double = () => 0.1, - email = () => 'user@example.com', - idn_email = () => '실례@example.com', - hostname = () => 'example.com', - idn_hostname = () => '실례.com', - ipv4 = () => '198.51.100.42', - ipv6 = () => '2001:0db8:5b96:0000:0000:426f:8e17:642a', - uri = () => 'https://example.com/', - uri_reference = () => 'path/index.html', - iri = () => 'https://실례.com/', - iri_reference = () => 'path/실례.html', - uuid = () => '3fa85f64-5717-4562-b3fc-2c963f66afa6', - uri_template = () => 'https://example.com/dictionary/{term:1}/{term}', - json_pointer = () => '/a/b/c', - relative_json_pointer = () => '1/0', - date_time = () => new Date().toISOString(), - date = () => new Date().toISOString().substring(0, 10), - time = () => new Date().toISOString().substring(11), - duration = () => 'P3D', - generators_password = () => '********', - regex = () => '^[a-z]+$'; - const pI = new (class FormatRegistry extends uI { - #t = { - int32, - int64, - float: generators_float, - double: generators_double, - email, - 'idn-email': idn_email, - hostname, - 'idn-hostname': idn_hostname, - ipv4, - ipv6, - uri, - 'uri-reference': uri_reference, - iri, - 'iri-reference': iri_reference, - uuid, - 'uri-template': uri_template, - 'json-pointer': json_pointer, - 'relative-json-pointer': relative_json_pointer, - 'date-time': date_time, - date, - time, - duration, - password: generators_password, - regex - }; - data = { ...this.#t }; - get defaults() { - return { ...this.#t }; - } - })(), - formatAPI = (s, o) => - 'function' == typeof o ? pI.register(s, o) : null === o ? pI.unregister(s) : pI.get(s); - formatAPI.getDefaults = () => pI.defaults; - const hI = formatAPI; - var dI = __webpack_require__(48287).Buffer; - const _7bit = (s) => dI.from(s).toString('ascii'); - var fI = __webpack_require__(48287).Buffer; - const _8bit = (s) => fI.from(s).toString('utf8'); - var mI = __webpack_require__(48287).Buffer; - const encoders_binary = (s) => mI.from(s).toString('binary'), - quoted_printable = (s) => { - let o = ''; - for (let i = 0; i < s.length; i++) { - const u = s.charCodeAt(i); - if (61 === u) o += '=3D'; - else if ((u >= 33 && u <= 60) || (u >= 62 && u <= 126) || 9 === u || 32 === u) - o += s.charAt(i); - else if (13 === u || 10 === u) o += '\r\n'; - else if (u > 126) { - const u = unescape(encodeURIComponent(s.charAt(i))); - for (let s = 0; s < u.length; s++) - o += '=' + ('0' + u.charCodeAt(s).toString(16)).slice(-2).toUpperCase(); - } else o += '=' + ('0' + u.toString(16)).slice(-2).toUpperCase(); - } - return o; - }; - var gI = __webpack_require__(48287).Buffer; - const base16 = (s) => gI.from(s).toString('hex'); - var yI = __webpack_require__(48287).Buffer; - const base32 = (s) => { - const o = yI.from(s).toString('utf8'), - i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; - let u = 0, - _ = '', - w = 0, - x = 0; - for (let s = 0; s < o.length; s++) - for (w = (w << 8) | o.charCodeAt(s), x += 8; x >= 5; ) - ((_ += i.charAt((w >>> (x - 5)) & 31)), (x -= 5)); - x > 0 && ((_ += i.charAt((w << (5 - x)) & 31)), (u = (8 - ((8 * o.length) % 5)) % 5)); - for (let s = 0; s < u; s++) _ += '='; - return _; - }; - var vI = __webpack_require__(48287).Buffer; - const base64 = (s) => vI.from(s).toString('base64'); - var bI = __webpack_require__(48287).Buffer; - const base64url = (s) => bI.from(s).toString('base64url'); - const _I = new (class EncoderRegistry extends uI { - #t = { - '7bit': _7bit, - '8bit': _8bit, - binary: encoders_binary, - 'quoted-printable': quoted_printable, - base16, - base32, - base64, - base64url - }; - data = { ...this.#t }; - get defaults() { - return { ...this.#t }; - } - })(), - encoderAPI = (s, o) => - 'function' == typeof o ? _I.register(s, o) : null === o ? _I.unregister(s) : _I.get(s); - encoderAPI.getDefaults = () => _I.defaults; - const EI = encoderAPI, - wI = { - 'text/plain': () => 'string', - 'text/css': () => '.selector { border: 1px solid red }', - 'text/csv': () => 'value1,value2,value3', - 'text/html': () => '

    content

    ', - 'text/calendar': () => 'BEGIN:VCALENDAR', - 'text/javascript': () => "console.dir('Hello world!');", - 'text/xml': () => 'John Doe', - 'text/*': () => 'string' - }, - SI = { 'image/*': () => bytes(25).toString('binary') }, - xI = { 'audio/*': () => bytes(25).toString('binary') }, - kI = { 'video/*': () => bytes(25).toString('binary') }, - CI = { - 'application/json': () => '{"key":"value"}', - 'application/ld+json': () => '{"name": "John Doe"}', - 'application/x-httpd-php': () => "Hello World!

    '; ?>", - 'application/rtf': () => String.raw`{\rtf1\adeflang1025\ansi\ansicpg1252\uc1`, - 'application/x-sh': () => 'echo "Hello World!"', - 'application/xhtml+xml': () => '

    content

    ', - 'application/*': () => bytes(25).toString('binary') - }; - const OI = new (class MediaTypeRegistry extends uI { - #t = { ...wI, ...SI, ...xI, ...kI, ...CI }; - data = { ...this.#t }; - get defaults() { - return { ...this.#t }; - } - })(), - mediaTypeAPI = (s, o) => { - if ('function' == typeof o) return OI.register(s, o); - if (null === o) return OI.unregister(s); - const i = s.split(';').at(0), - u = `${i.split('/').at(0)}/*`; - return OI.get(s) || OI.get(i) || OI.get(u); - }; - mediaTypeAPI.getDefaults = () => OI.defaults; - const AI = mediaTypeAPI, - applyStringConstraints = (s, o = {}) => { - const { maxLength: i, minLength: u } = o; - let _ = s; - if ( - (Number.isInteger(i) && i > 0 && (_ = _.slice(0, i)), Number.isInteger(u) && u > 0) - ) { - let s = 0; - for (; _.length < u; ) _ += _[s++ % _.length]; - } - return _; - }, - types_string = (s, { sample: o } = {}) => { - const { contentEncoding: i, contentMediaType: u, contentSchema: _ } = s, - { pattern: w, format: x } = s, - C = EI(i) || Mx(); - let j; - return ( - (j = - 'string' == typeof w - ? applyStringConstraints( - ((s) => { - try { - return new (us())(s).gen(); - } catch { - return 'string'; - } - })(w), - s - ) - : 'string' == typeof x - ? ((s) => { - const { format: o } = s, - i = hI(o); - return 'function' == typeof i ? i(s) : 'string'; - })(s) - : isJSONSchema(_) && 'string' == typeof u && void 0 !== o - ? Array.isArray(o) || 'object' == typeof o - ? JSON.stringify(o) - : applyStringConstraints(String(o), s) - : 'string' == typeof u - ? ((s) => { - const { contentMediaType: o } = s, - i = AI(o); - return 'function' == typeof i ? i(s) : 'string'; - })(s) - : applyStringConstraints('string', s)), - C(j) - ); - }, - applyNumberConstraints = (s, o = {}) => { - const { minimum: i, maximum: u, exclusiveMinimum: _, exclusiveMaximum: w } = o, - { multipleOf: x } = o, - C = Number.isInteger(s) ? 1 : Number.EPSILON; - let j = 'number' == typeof i ? i : null, - L = 'number' == typeof u ? u : null, - B = s; - if ( - ('number' == typeof _ && (j = null !== j ? Math.max(j, _ + C) : _ + C), - 'number' == typeof w && (L = null !== L ? Math.min(L, w - C) : w - C), - (B = (j > L && s) || j || L || B), - 'number' == typeof x && x > 0) - ) { - const s = B % x; - B = 0 === s ? B : B + x - s; - } - return B; - }, - types_number = (s) => { - const { format: o } = s; - let i; - return ( - (i = - 'string' == typeof o - ? ((s) => { - const { format: o } = s, - i = hI(o); - return 'function' == typeof i ? i(s) : 0; - })(s) - : 0), - applyNumberConstraints(i, s) - ); - }, - types_integer = (s) => { - const { format: o } = s; - let i; - return ( - (i = - 'string' == typeof o - ? ((s) => { - const { format: o } = s, - i = hI(o); - if ('function' == typeof i) return i(s); - switch (o) { - case 'int32': - return int32(); - case 'int64': - return int64(); - } - return 0; - })(s) - : 0), - applyNumberConstraints(i, s) - ); - }, - types_boolean = (s) => 'boolean' != typeof s.default || s.default, - jI = new Proxy( - { - array, - object, - string: types_string, - number: types_number, - integer: types_integer, - boolean: types_boolean, - null: () => null - }, - { - get: (s, o) => - 'string' == typeof o && Object.hasOwn(s, o) ? s[o] : () => `Unknown Type: ${o}` - } - ), - II = ['array', 'object', 'number', 'integer', 'string', 'boolean', 'null'], - hasExample = (s) => { - if (!isJSONSchemaObject(s)) return !1; - const { examples: o, example: i, default: u } = s; - return !!(Array.isArray(o) && o.length >= 1) || void 0 !== u || void 0 !== i; - }, - extractExample = (s) => { - if (!isJSONSchemaObject(s)) return null; - const { examples: o, example: i, default: u } = s; - return Array.isArray(o) && o.length >= 1 - ? o.at(0) - : void 0 !== u - ? u - : void 0 !== i - ? i - : void 0; - }, - PI = { - array: [ - 'items', - 'prefixItems', - 'contains', - 'maxContains', - 'minContains', - 'maxItems', - 'minItems', - 'uniqueItems', - 'unevaluatedItems' - ], - object: [ - 'properties', - 'additionalProperties', - 'patternProperties', - 'propertyNames', - 'minProperties', - 'maxProperties', - 'required', - 'dependentSchemas', - 'dependentRequired', - 'unevaluatedProperties' - ], - string: [ - 'pattern', - 'format', - 'minLength', - 'maxLength', - 'contentEncoding', - 'contentMediaType', - 'contentSchema' - ], - integer: ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf'] - }; - PI.number = PI.integer; - const MI = 'string', - inferTypeFromValue = (s) => - void 0 === s - ? null - : null === s - ? 'null' - : Array.isArray(s) - ? 'array' - : Number.isInteger(s) - ? 'integer' - : typeof s, - foldType = (s) => { - if (Array.isArray(s) && s.length >= 1) { - if (s.includes('array')) return 'array'; - if (s.includes('object')) return 'object'; - { - const o = random_pick(s); - if (II.includes(o)) return o; - } - } - return II.includes(s) ? s : null; - }, - inferType = (s, o = new WeakSet()) => { - if (!isJSONSchemaObject(s)) return MI; - if (o.has(s)) return MI; - o.add(s); - let { type: i, const: u } = s; - if (((i = foldType(i)), 'string' != typeof i)) { - const o = Object.keys(PI); - e: for (let u = 0; u < o.length; u += 1) { - const _ = o[u], - w = PI[_]; - for (let o = 0; o < w.length; o += 1) { - const u = w[o]; - if (Object.hasOwn(s, u)) { - i = _; - break e; - } - } - } - } - if ('string' != typeof i && void 0 !== u) { - const s = inferTypeFromValue(u); - i = 'string' == typeof s ? s : i; - } - if ('string' != typeof i) { - const combineTypes = (i) => { - if (Array.isArray(s[i])) { - const u = s[i].map((s) => inferType(s, o)); - return foldType(u); - } - return null; - }, - u = combineTypes('allOf'), - _ = combineTypes('anyOf'), - w = combineTypes('oneOf'), - x = s.not ? inferType(s.not, o) : null; - (u || _ || w || x) && (i = foldType([u, _, w, x].filter(Boolean))); - } - if ('string' != typeof i && hasExample(s)) { - const o = extractExample(s), - u = inferTypeFromValue(o); - i = 'string' == typeof u ? u : i; - } - return (o.delete(s), i || MI); - }, - type_getType = (s) => inferType(s), - typeCast = (s) => - predicates_isBooleanJSONSchema(s) - ? ((s) => (!1 === s ? { not: {} } : {}))(s) - : isJSONSchemaObject(s) - ? s - : {}, - merge_merge = (s, o, i = {}) => { - if (predicates_isBooleanJSONSchema(s) && !0 === s) return !0; - if (predicates_isBooleanJSONSchema(s) && !1 === s) return !1; - if (predicates_isBooleanJSONSchema(o) && !0 === o) return !0; - if (predicates_isBooleanJSONSchema(o) && !1 === o) return !1; - if (!isJSONSchema(s)) return o; - if (!isJSONSchema(o)) return s; - const u = { ...o, ...s }; - if (o.type && s.type && Array.isArray(o.type) && 'string' == typeof o.type) { - const i = normalizeArray(o.type).concat(s.type); - u.type = Array.from(new Set(i)); - } - if ( - (Array.isArray(o.required) && - Array.isArray(s.required) && - (u.required = [...new Set([...s.required, ...o.required])]), - o.properties && s.properties) - ) { - const _ = new Set([...Object.keys(o.properties), ...Object.keys(s.properties)]); - u.properties = {}; - for (const w of _) { - const _ = o.properties[w] || {}, - x = s.properties[w] || {}; - (_.readOnly && !i.includeReadOnly) || (_.writeOnly && !i.includeWriteOnly) - ? (u.required = (u.required || []).filter((s) => s !== w)) - : (u.properties[w] = merge_merge(x, _, i)); - } - } - return ( - isJSONSchema(o.items) && - isJSONSchema(s.items) && - (u.items = merge_merge(s.items, o.items, i)), - isJSONSchema(o.contains) && - isJSONSchema(s.contains) && - (u.contains = merge_merge(s.contains, o.contains, i)), - isJSONSchema(o.contentSchema) && - isJSONSchema(s.contentSchema) && - (u.contentSchema = merge_merge(s.contentSchema, o.contentSchema, i)), - u - ); - }, - TI = merge_merge, - main_sampleFromSchemaGeneric = (s, o = {}, i = void 0, u = !1) => { - if (null == s && void 0 === i) return; - ('function' == typeof s?.toJS && (s = s.toJS()), (s = typeCast(s))); - let _ = void 0 !== i || hasExample(s); - const w = !_ && Array.isArray(s.oneOf) && s.oneOf.length > 0, - x = !_ && Array.isArray(s.anyOf) && s.anyOf.length > 0; - if (!_ && (w || x)) { - const i = typeCast(random_pick(w ? s.oneOf : s.anyOf)); - (!(s = TI(s, i, o)).xml && i.xml && (s.xml = i.xml), - hasExample(s) && hasExample(i) && (_ = !0)); - } - const C = {}; - let { xml: j, properties: L, additionalProperties: B, items: $, contains: V } = s || {}, - U = type_getType(s), - { includeReadOnly: z, includeWriteOnly: Y } = o; - j = j || {}; - let Z, - { name: ee, prefix: ie, namespace: ae } = j, - le = {}; - if ( - (Object.hasOwn(s, 'type') || (s.type = U), - u && ((ee = ee || 'notagname'), (Z = (ie ? `${ie}:` : '') + ee), ae)) - ) { - C[ie ? `xmlns:${ie}` : 'xmlns'] = ae; - } - u && (le[Z] = []); - const ce = objectify(L); - let pe, - de = 0; - const hasExceededMaxProperties = () => - Number.isInteger(s.maxProperties) && s.maxProperties > 0 && de >= s.maxProperties, - canAddProperty = (o) => - !(Number.isInteger(s.maxProperties) && s.maxProperties > 0) || - (!hasExceededMaxProperties() && - (!((o) => - !Array.isArray(s.required) || - 0 === s.required.length || - !s.required.includes(o))(o) || - s.maxProperties - - de - - (() => { - if (!Array.isArray(s.required) || 0 === s.required.length) return 0; - let o = 0; - return ( - u - ? s.required.forEach((s) => (o += void 0 === le[s] ? 0 : 1)) - : s.required.forEach((s) => { - o += void 0 === le[Z]?.find((o) => void 0 !== o[s]) ? 0 : 1; - }), - s.required.length - o - ); - })() > - 0)); - if ( - ((pe = u - ? (i, _ = void 0) => { - if (s && ce[i]) { - if (((ce[i].xml = ce[i].xml || {}), ce[i].xml.attribute)) { - const s = Array.isArray(ce[i].enum) ? random_pick(ce[i].enum) : void 0; - if (hasExample(ce[i])) C[ce[i].xml.name || i] = extractExample(ce[i]); - else if (void 0 !== s) C[ce[i].xml.name || i] = s; - else { - const s = typeCast(ce[i]), - o = type_getType(s), - u = ce[i].xml.name || i; - C[u] = jI[o](s); - } - return; - } - ce[i].xml.name = ce[i].xml.name || i; - } else ce[i] || !1 === B || (ce[i] = { xml: { name: i } }); - let w = main_sampleFromSchemaGeneric(ce[i], o, _, u); - canAddProperty(i) && - (de++, Array.isArray(w) ? (le[Z] = le[Z].concat(w)) : le[Z].push(w)); - } - : (i, _) => { - if (canAddProperty(i)) { - if ( - cI()(s.discriminator?.mapping) && - s.discriminator.propertyName === i && - 'string' == typeof s.$$ref - ) { - for (const o in s.discriminator.mapping) - if (-1 !== s.$$ref.search(s.discriminator.mapping[o])) { - le[i] = o; - break; - } - } else le[i] = main_sampleFromSchemaGeneric(ce[i], o, _, u); - de++; - } - }), - _) - ) { - let _; - if (((_ = void 0 !== i ? i : extractExample(s)), !u)) { - if ('number' == typeof _ && 'string' === U) return `${_}`; - if ('string' != typeof _ || 'string' === U) return _; - try { - return JSON.parse(_); - } catch { - return _; - } - } - if ('array' === U) { - if (!Array.isArray(_)) { - if ('string' == typeof _) return _; - _ = [_]; - } - let i = []; - return ( - isJSONSchemaObject($) && - (($.xml = $.xml || j || {}), - ($.xml.name = $.xml.name || j.name), - (i = _.map((s) => main_sampleFromSchemaGeneric($, o, s, u)))), - isJSONSchemaObject(V) && - ((V.xml = V.xml || j || {}), - (V.xml.name = V.xml.name || j.name), - (i = [main_sampleFromSchemaGeneric(V, o, void 0, u), ...i])), - (i = jI.array(s, { sample: i })), - j.wrapped ? ((le[Z] = i), hs()(C) || le[Z].push({ _attr: C })) : (le = i), - le - ); - } - if ('object' === U) { - if ('string' == typeof _) return _; - for (const s in _) - Object.hasOwn(_, s) && - ((ce[s]?.readOnly && !z) || - (ce[s]?.writeOnly && !Y) || - (ce[s]?.xml?.attribute ? (C[ce[s].xml.name || s] = _[s]) : pe(s, _[s]))); - return (hs()(C) || le[Z].push({ _attr: C }), le); - } - return ((le[Z] = hs()(C) ? _ : [{ _attr: C }, _]), le); - } - if ('array' === U) { - let i = []; - if (isJSONSchemaObject(V)) - if ( - (u && ((V.xml = V.xml || s.xml || {}), (V.xml.name = V.xml.name || j.name)), - Array.isArray(V.anyOf)) - ) { - const { anyOf: s, ..._ } = $; - i.push( - ...V.anyOf.map((s) => main_sampleFromSchemaGeneric(TI(s, _, o), o, void 0, u)) - ); - } else if (Array.isArray(V.oneOf)) { - const { oneOf: s, ..._ } = $; - i.push( - ...V.oneOf.map((s) => main_sampleFromSchemaGeneric(TI(s, _, o), o, void 0, u)) - ); - } else { - if (!(!u || (u && j.wrapped))) - return main_sampleFromSchemaGeneric(V, o, void 0, u); - i.push(main_sampleFromSchemaGeneric(V, o, void 0, u)); - } - if (isJSONSchemaObject($)) - if ( - (u && (($.xml = $.xml || s.xml || {}), ($.xml.name = $.xml.name || j.name)), - Array.isArray($.anyOf)) - ) { - const { anyOf: s, ..._ } = $; - i.push( - ...$.anyOf.map((s) => main_sampleFromSchemaGeneric(TI(s, _, o), o, void 0, u)) - ); - } else if (Array.isArray($.oneOf)) { - const { oneOf: s, ..._ } = $; - i.push( - ...$.oneOf.map((s) => main_sampleFromSchemaGeneric(TI(s, _, o), o, void 0, u)) - ); - } else { - if (!(!u || (u && j.wrapped))) - return main_sampleFromSchemaGeneric($, o, void 0, u); - i.push(main_sampleFromSchemaGeneric($, o, void 0, u)); - } - return ( - (i = jI.array(s, { sample: i })), - u && j.wrapped ? ((le[Z] = i), hs()(C) || le[Z].push({ _attr: C }), le) : i - ); - } - if ('object' === U) { - for (let s in ce) - Object.hasOwn(ce, s) && - (ce[s]?.deprecated || - (ce[s]?.readOnly && !z) || - (ce[s]?.writeOnly && !Y) || - pe(s)); - if ((u && C && le[Z].push({ _attr: C }), hasExceededMaxProperties())) return le; - if (predicates_isBooleanJSONSchema(B) && B) - (u - ? le[Z].push({ additionalProp: 'Anything can be here' }) - : (le.additionalProp1 = {}), - de++); - else if (isJSONSchemaObject(B)) { - const i = B, - _ = main_sampleFromSchemaGeneric(i, o, void 0, u); - if (u && 'string' == typeof i?.xml?.name && 'notagname' !== i?.xml?.name) - le[Z].push(_); - else { - const o = - Number.isInteger(s.minProperties) && s.minProperties > 0 && de < s.minProperties - ? s.minProperties - de - : 3; - for (let s = 1; s <= o; s++) { - if (hasExceededMaxProperties()) return le; - if (u) { - const o = {}; - ((o['additionalProp' + s] = _.notagname), le[Z].push(o)); - } else le['additionalProp' + s] = _; - de++; - } - } - } - return le; - } - let fe; - if (void 0 !== s.const) fe = s.const; - else if (s && Array.isArray(s.enum)) fe = random_pick(normalizeArray(s.enum)); - else { - const i = isJSONSchemaObject(s.contentSchema) - ? main_sampleFromSchemaGeneric(s.contentSchema, o, void 0, u) - : void 0; - fe = jI[U](s, { sample: i }); - } - return u ? ((le[Z] = hs()(C) ? fe : [{ _attr: C }, fe]), le) : fe; - }, - main_createXMLExample = (s, o, i) => { - const u = main_sampleFromSchemaGeneric(s, o, i, !0); - if (u) return 'string' == typeof u ? u : ls()(u, { declaration: !0, indent: '\t' }); - }, - main_sampleFromSchema = (s, o, i) => main_sampleFromSchemaGeneric(s, o, i, !1), - main_resolver = (s, o, i) => [s, JSON.stringify(o), JSON.stringify(i)], - NI = utils_memoizeN(main_createXMLExample, main_resolver), - RI = utils_memoizeN(main_sampleFromSchema, main_resolver); - const DI = new (class OptionRegistry extends uI { - #t = {}; - data = { ...this.#t }; - get defaults() { - return { ...this.#t }; - } - })(), - api_optionAPI = (s, o) => (void 0 !== o && DI.register(s, o), DI.get(s)), - LI = [{ when: /json/, shouldStringifyTypes: ['string'] }], - BI = ['object'], - fn_get_json_sample_schema = (s) => (o, i, u, _) => { - const { fn: w } = s(), - x = w.jsonSchema202012.memoizedSampleFromSchema(o, i, _), - C = typeof x, - j = LI.reduce((s, o) => (o.when.test(u) ? [...s, ...o.shouldStringifyTypes] : s), BI); - return mt()(j, (s) => s === C) ? JSON.stringify(x, null, 2) : x; - }, - fn_get_yaml_sample_schema = (s) => (o, i, u, _) => { - const { fn: w } = s(), - x = w.jsonSchema202012.getJsonSampleSchema(o, i, u, _); - let C; - try { - ((C = mn.dump(mn.load(x), { lineWidth: -1 }, { schema: nn })), - '\n' === C[C.length - 1] && (C = C.slice(0, C.length - 1))); - } catch (s) { - return (console.error(s), 'error: could not generate yaml example'); - } - return C.replace(/\t/g, ' '); - }, - fn_get_xml_sample_schema = (s) => (o, i, u) => { - const { fn: _ } = s(); - if ((o && !o.xml && (o.xml = {}), o && !o.xml.name)) { - if (!o.$$ref && (o.type || o.items || o.properties || o.additionalProperties)) - return '\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e'; - if (o.$$ref) { - let s = o.$$ref.match(/\S*\/(\S+)$/); - o.xml.name = s[1]; - } - } - return _.jsonSchema202012.memoizedCreateXMLExample(o, i, u); - }, - fn_get_sample_schema = - (s) => - (o, i = '', u = {}, _ = void 0) => { - const { fn: w } = s(); - return ( - 'function' == typeof o?.toJS && (o = o.toJS()), - 'function' == typeof _?.toJS && (_ = _.toJS()), - /xml/.test(i) - ? w.jsonSchema202012.getXmlSampleSchema(o, u, _) - : /(yaml|yml)/.test(i) - ? w.jsonSchema202012.getYamlSampleSchema(o, u, i, _) - : w.jsonSchema202012.getJsonSampleSchema(o, u, i, _) - ); - }, - json_schema_2020_12_samples = ({ getSystem: s }) => { - const o = fn_get_json_sample_schema(s), - i = fn_get_yaml_sample_schema(s), - u = fn_get_xml_sample_schema(s), - _ = fn_get_sample_schema(s); - return { - fn: { - jsonSchema202012: { - sampleFromSchema: main_sampleFromSchema, - sampleFromSchemaGeneric: main_sampleFromSchemaGeneric, - sampleOptionAPI: api_optionAPI, - sampleEncoderAPI: EI, - sampleFormatAPI: hI, - sampleMediaTypeAPI: AI, - createXMLExample: main_createXMLExample, - memoizedSampleFromSchema: RI, - memoizedCreateXMLExample: NI, - getJsonSampleSchema: o, - getYamlSampleSchema: i, - getXmlSampleSchema: u, - getSampleSchema: _, - mergeJsonSchema: TI - } - } - }; - }; - function PresetApis() { - return [base, oas3, json_schema_2020_12, json_schema_2020_12_samples, oas31]; - } - const inline_plugin = (s) => () => ({ fn: s.fn, components: s.components }), - factorization_system = (s) => { - const o = We()( - { - layout: { layout: s.layout, filter: s.filter }, - spec: { spec: '', url: s.url }, - requestSnippets: s.requestSnippets - }, - s.initialState - ); - if (s.initialState) - for (const [i, u] of Object.entries(s.initialState)) void 0 === u && delete o[i]; - return { system: { configs: s.configs }, plugins: s.presets, state: o }; - }, - sources_query = () => (s) => { - const o = s.queryConfigEnabled - ? (() => { - const s = new URLSearchParams(at.location.search); - return Object.fromEntries(s); - })() - : {}; - return Object.entries(o).reduce( - (s, [o, i]) => ( - 'config' === o - ? (s.configUrl = i) - : 'urls.primaryName' === o - ? (s[o] = i) - : (s = ao()(s, o, i)), - s - ), - {} - ); - }, - sources_url = - ({ url: s, system: o }) => - async (i) => { - if (!s) return {}; - if ('function' != typeof o.configsActions?.getConfigByUrl) return {}; - const u = (() => { - const s = {}; - return ( - (s.promise = new Promise((o, i) => { - ((s.resolve = o), (s.reject = i)); - })), - s - ); - })(); - return ( - o.configsActions.getConfigByUrl( - { - url: s, - loadRemoteConfig: !0, - requestInterceptor: i.requestInterceptor, - responseInterceptor: i.responseInterceptor - }, - (s) => { - u.resolve(s); - } - ), - u.promise - ); - }, - runtime = () => () => { - const s = {}; - return ( - globalThis.location && - (s.oauth2RedirectUrl = `${globalThis.location.protocol}//${globalThis.location.host}${globalThis.location.pathname.substring(0, globalThis.location.pathname.lastIndexOf('/'))}/oauth2-redirect.html`), - s - ); - }, - FI = Object.freeze({ - dom_id: null, - domNode: null, - spec: {}, - url: '', - urls: null, - configUrl: null, - layout: 'BaseLayout', - docExpansion: 'list', - maxDisplayedTags: -1, - filter: !1, - validatorUrl: 'https://validator.swagger.io/validator', - oauth2RedirectUrl: void 0, - persistAuthorization: !1, - configs: {}, - displayOperationId: !1, - displayRequestDuration: !1, - deepLinking: !1, - tryItOutEnabled: !1, - requestInterceptor: (s) => ((s.curlOptions = []), s), - responseInterceptor: (s) => s, - showMutatedRequest: !0, - defaultModelRendering: 'example', - defaultModelExpandDepth: 1, - defaultModelsExpandDepth: 1, - showExtensions: !1, - showCommonExtensions: !1, - withCredentials: !1, - requestSnippetsEnabled: !1, - requestSnippets: { - generators: { - curl_bash: { title: 'cURL (bash)', syntax: 'bash' }, - curl_powershell: { title: 'cURL (PowerShell)', syntax: 'powershell' }, - curl_cmd: { title: 'cURL (CMD)', syntax: 'bash' } - }, - defaultExpanded: !0, - languages: null - }, - supportedSubmitMethods: [ - 'get', - 'put', - 'post', - 'delete', - 'options', - 'head', - 'patch', - 'trace' - ], - queryConfigEnabled: !1, - presets: [PresetApis], - plugins: [], - initialState: {}, - fn: {}, - components: {}, - syntaxHighlight: { activated: !0, theme: 'agate' }, - operationsSorter: null, - tagsSorter: null, - onComplete: null, - modelPropertyMacro: null, - parameterMacro: null - }); - var qI = __webpack_require__(61448), - $I = __webpack_require__.n(qI), - VI = __webpack_require__(77731), - UI = __webpack_require__.n(VI); - const type_casters_array = (s, o = []) => (Array.isArray(s) ? s : o), - type_casters_boolean = (s, o = !1) => - !0 === s || - 'true' === s || - 1 === s || - '1' === s || - (!1 !== s && 'false' !== s && 0 !== s && '0' !== s && o), - dom_node = (s) => (null === s || 'null' === s ? null : s), - type_casters_filter = (s) => { - const o = String(s); - return type_casters_boolean(s, o); - }, - type_casters_function = (s, o) => ('function' == typeof s ? s : o), - nullable_array = (s) => (Array.isArray(s) ? s : null), - nullable_function = (s) => ('function' == typeof s ? s : null), - nullable_string = (s) => (null === s || 'null' === s ? null : String(s)), - type_casters_number = (s, o = -1) => { - const i = parseInt(s, 10); - return Number.isNaN(i) ? o : i; - }, - type_casters_object = (s, o = {}) => (cI()(s) ? s : o), - sorter = (s) => ('function' == typeof s || 'string' == typeof s ? s : null), - type_casters_string = (s) => String(s), - syntax_highlight = (s, o) => - cI()(s) ? s : !1 === s || 'false' === s || 0 === s || '0' === s ? { activated: !1 } : o, - undefined_string = (s) => (void 0 === s || 'undefined' === s ? void 0 : String(s)), - zI = { - components: { typeCaster: type_casters_object }, - configs: { typeCaster: type_casters_object }, - configUrl: { typeCaster: nullable_string }, - deepLinking: { typeCaster: type_casters_boolean, defaultValue: FI.deepLinking }, - defaultModelExpandDepth: { - typeCaster: type_casters_number, - defaultValue: FI.defaultModelExpandDepth - }, - defaultModelRendering: { typeCaster: type_casters_string }, - defaultModelsExpandDepth: { - typeCaster: type_casters_number, - defaultValue: FI.defaultModelsExpandDepth - }, - displayOperationId: { - typeCaster: type_casters_boolean, - defaultValue: FI.displayOperationId - }, - displayRequestDuration: { - typeCaster: type_casters_boolean, - defaultValue: FI.displayRequestDuration - }, - docExpansion: { typeCaster: type_casters_string }, - dom_id: { typeCaster: nullable_string }, - domNode: { typeCaster: dom_node }, - filter: { typeCaster: type_casters_filter }, - fn: { typeCaster: type_casters_object }, - initialState: { typeCaster: type_casters_object }, - layout: { typeCaster: type_casters_string }, - maxDisplayedTags: { - typeCaster: type_casters_number, - defaultValue: FI.maxDisplayedTags - }, - modelPropertyMacro: { typeCaster: nullable_function }, - oauth2RedirectUrl: { typeCaster: undefined_string }, - onComplete: { typeCaster: nullable_function }, - operationsSorter: { typeCaster: sorter }, - paramaterMacro: { typeCaster: nullable_function }, - persistAuthorization: { - typeCaster: type_casters_boolean, - defaultValue: FI.persistAuthorization - }, - plugins: { typeCaster: type_casters_array, defaultValue: FI.plugins }, - presets: { typeCaster: type_casters_array, defaultValue: FI.presets }, - requestInterceptor: { - typeCaster: type_casters_function, - defaultValue: FI.requestInterceptor - }, - requestSnippets: { typeCaster: type_casters_object, defaultValue: FI.requestSnippets }, - requestSnippetsEnabled: { - typeCaster: type_casters_boolean, - defaultValue: FI.requestSnippetsEnabled - }, - responseInterceptor: { - typeCaster: type_casters_function, - defaultValue: FI.responseInterceptor - }, - showCommonExtensions: { - typeCaster: type_casters_boolean, - defaultValue: FI.showCommonExtensions - }, - showExtensions: { typeCaster: type_casters_boolean, defaultValue: FI.showExtensions }, - showMutatedRequest: { - typeCaster: type_casters_boolean, - defaultValue: FI.showMutatedRequest - }, - spec: { typeCaster: type_casters_object, defaultValue: FI.spec }, - supportedSubmitMethods: { - typeCaster: type_casters_array, - defaultValue: FI.supportedSubmitMethods - }, - syntaxHighlight: { typeCaster: syntax_highlight, defaultValue: FI.syntaxHighlight }, - 'syntaxHighlight.activated': { - typeCaster: type_casters_boolean, - defaultValue: FI.syntaxHighlight.activated - }, - 'syntaxHighlight.theme': { typeCaster: type_casters_string }, - tagsSorter: { typeCaster: sorter }, - tryItOutEnabled: { typeCaster: type_casters_boolean, defaultValue: FI.tryItOutEnabled }, - url: { typeCaster: type_casters_string }, - urls: { typeCaster: nullable_array }, - 'urls.primaryName': { typeCaster: type_casters_string }, - validatorUrl: { typeCaster: nullable_string }, - withCredentials: { typeCaster: type_casters_boolean, defaultValue: FI.withCredentials } - }, - type_cast = (s) => - Object.entries(zI).reduce( - (s, [o, { typeCaster: i, defaultValue: u }]) => { - if ($I()(s, o)) { - const _ = i(jn()(s, o), u); - s = UI()(o, _, s); - } - return s; - }, - { ...s } - ), - config_merge = (s, ...o) => { - let i = Symbol.for('domNode'), - u = Symbol.for('primaryName'); - const _ = []; - for (const s of o) { - const o = { ...s }; - (Object.hasOwn(o, 'domNode') && ((i = o.domNode), delete o.domNode), - Object.hasOwn(o, 'urls.primaryName') - ? ((u = o['urls.primaryName']), delete o['urls.primaryName']) - : Array.isArray(o.urls) && - Object.hasOwn(o.urls, 'primaryName') && - ((u = o.urls.primaryName), delete o.urls.primaryName), - _.push(o)); - } - const w = We()(s, ..._); - return ( - i !== Symbol.for('domNode') && (w.domNode = i), - u !== Symbol.for('primaryName') && Array.isArray(w.urls) && (w.urls.primaryName = u), - type_cast(w) - ); - }; - function SwaggerUI(s) { - const o = sources_query()(s), - i = runtime()(), - u = SwaggerUI.config.merge({}, SwaggerUI.config.defaults, i, s, o), - _ = factorization_system(u), - w = inline_plugin(u), - x = new Store(_); - x.register([u.plugins, w]); - const C = x.getSystem(), - persistConfigs = (s) => { - (x.setConfigs(s), C.configsActions.loaded()); - }, - updateSpec = (s) => { - !o.url && 'object' == typeof s.spec && Object.keys(s.spec).length > 0 - ? (C.specActions.updateUrl(''), - C.specActions.updateLoadingStatus('success'), - C.specActions.updateSpec(JSON.stringify(s.spec))) - : 'function' == typeof C.specActions.download && - s.url && - !s.urls && - (C.specActions.updateUrl(s.url), C.specActions.download(s.url)); - }, - render = (s) => { - if (s.domNode) C.render(s.domNode, 'App'); - else if (s.dom_id) { - const o = document.querySelector(s.dom_id); - C.render(o, 'App'); - } else - null === s.dom_id || - null === s.domNode || - console.error('Skipped rendering: no `dom_id` or `domNode` was specified'); - }; - return u.configUrl - ? ((async () => { - const { configUrl: s } = u, - i = await sources_url({ url: s, system: C })(u), - _ = SwaggerUI.config.merge({}, u, i, o); - (persistConfigs(_), null !== i && updateSpec(_), render(_)); - })(), - C) - : (persistConfigs(u), updateSpec(u), render(u), C); - } - ((SwaggerUI.System = Store), - (SwaggerUI.config = { - defaults: FI, - merge: config_merge, - typeCast: type_cast, - typeCastMappings: zI - }), - (SwaggerUI.presets = { base, apis: PresetApis }), - (SwaggerUI.plugins = { - Auth: auth, - Configs: configsPlugin, - DeepLining: deep_linking, - Err: err, - Filter: filter, - Icons: icons, - JSONSchema5: json_schema_5, - JSONSchema5Samples: json_schema_5_samples, - JSONSchema202012: json_schema_2020_12, - JSONSchema202012Samples: json_schema_2020_12_samples, - Layout: plugins_layout, - Logs: logs, - OpenAPI30: oas3, - OpenAPI31: oas3, - OnComplete: on_complete, - RequestSnippets: plugins_request_snippets, - Spec: plugins_spec, - SwaggerClient: swagger_client, - Util: util, - View: view, - ViewLegacy: view_legacy, - DownloadUrl: downloadUrlPlugin, - SyntaxHighlighting: syntax_highlighting, - Versions: versions, - SafeRender: safe_render - })); - const WI = SwaggerUI; - })(), - (_ = _.default) - ); - })() -); +!function webpackUniversalModuleDefinition(s,o){"object"==typeof exports&&"object"==typeof module?module.exports=o():"function"==typeof define&&define.amd?define([],o):"object"==typeof exports?exports.SwaggerUIBundle=o():s.SwaggerUIBundle=o()}(this,(()=>(()=>{var s={67526(s,o){"use strict";o.byteLength=function byteLength(s){var o=getLens(s),i=o[0],a=o[1];return 3*(i+a)/4-a},o.toByteArray=function toByteArray(s){var o,i,_=getLens(s),w=_[0],x=_[1],C=new u(function _byteLength(s,o,i){return 3*(o+i)/4-i}(0,w,x)),j=0,L=x>0?w-4:w;for(i=0;i>16&255,C[j++]=o>>8&255,C[j++]=255&o;2===x&&(o=a[s.charCodeAt(i)]<<2|a[s.charCodeAt(i+1)]>>4,C[j++]=255&o);1===x&&(o=a[s.charCodeAt(i)]<<10|a[s.charCodeAt(i+1)]<<4|a[s.charCodeAt(i+2)]>>2,C[j++]=o>>8&255,C[j++]=255&o);return C},o.fromByteArray=function fromByteArray(s){for(var o,a=s.length,u=a%3,_=[],w=16383,x=0,C=a-u;xC?C:x+w));1===u?(o=s[a-1],_.push(i[o>>2]+i[o<<4&63]+"==")):2===u&&(o=(s[a-2]<<8)+s[a-1],_.push(i[o>>10]+i[o>>4&63]+i[o<<2&63]+"="));return _.join("")};for(var i=[],a=[],u="undefined"!=typeof Uint8Array?Uint8Array:Array,_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",w=0;w<64;++w)i[w]=_[w],a[_.charCodeAt(w)]=w;function getLens(s){var o=s.length;if(o%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var i=s.indexOf("=");return-1===i&&(i=o),[i,i===o?0:4-i%4]}function encodeChunk(s,o,a){for(var u,_,w=[],x=o;x>18&63]+i[_>>12&63]+i[_>>6&63]+i[63&_]);return w.join("")}a["-".charCodeAt(0)]=62,a["_".charCodeAt(0)]=63},48287(s,o,i){"use strict";const a=i(67526),u=i(251),_="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;o.Buffer=Buffer,o.SlowBuffer=function SlowBuffer(s){+s!=s&&(s=0);return Buffer.alloc(+s)},o.INSPECT_MAX_BYTES=50;const w=2147483647;function createBuffer(s){if(s>w)throw new RangeError('The value "'+s+'" is invalid for option "size"');const o=new Uint8Array(s);return Object.setPrototypeOf(o,Buffer.prototype),o}function Buffer(s,o,i){if("number"==typeof s){if("string"==typeof o)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(s)}return from(s,o,i)}function from(s,o,i){if("string"==typeof s)return function fromString(s,o){"string"==typeof o&&""!==o||(o="utf8");if(!Buffer.isEncoding(o))throw new TypeError("Unknown encoding: "+o);const i=0|byteLength(s,o);let a=createBuffer(i);const u=a.write(s,o);u!==i&&(a=a.slice(0,u));return a}(s,o);if(ArrayBuffer.isView(s))return function fromArrayView(s){if(isInstance(s,Uint8Array)){const o=new Uint8Array(s);return fromArrayBuffer(o.buffer,o.byteOffset,o.byteLength)}return fromArrayLike(s)}(s);if(null==s)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s);if(isInstance(s,ArrayBuffer)||s&&isInstance(s.buffer,ArrayBuffer))return fromArrayBuffer(s,o,i);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(s,SharedArrayBuffer)||s&&isInstance(s.buffer,SharedArrayBuffer)))return fromArrayBuffer(s,o,i);if("number"==typeof s)throw new TypeError('The "value" argument must not be of type number. Received type number');const a=s.valueOf&&s.valueOf();if(null!=a&&a!==s)return Buffer.from(a,o,i);const u=function fromObject(s){if(Buffer.isBuffer(s)){const o=0|checked(s.length),i=createBuffer(o);return 0===i.length||s.copy(i,0,0,o),i}if(void 0!==s.length)return"number"!=typeof s.length||numberIsNaN(s.length)?createBuffer(0):fromArrayLike(s);if("Buffer"===s.type&&Array.isArray(s.data))return fromArrayLike(s.data)}(s);if(u)return u;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof s[Symbol.toPrimitive])return Buffer.from(s[Symbol.toPrimitive]("string"),o,i);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof s)}function assertSize(s){if("number"!=typeof s)throw new TypeError('"size" argument must be of type number');if(s<0)throw new RangeError('The value "'+s+'" is invalid for option "size"')}function allocUnsafe(s){return assertSize(s),createBuffer(s<0?0:0|checked(s))}function fromArrayLike(s){const o=s.length<0?0:0|checked(s.length),i=createBuffer(o);for(let a=0;a=w)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+w.toString(16)+" bytes");return 0|s}function byteLength(s,o){if(Buffer.isBuffer(s))return s.length;if(ArrayBuffer.isView(s)||isInstance(s,ArrayBuffer))return s.byteLength;if("string"!=typeof s)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof s);const i=s.length,a=arguments.length>2&&!0===arguments[2];if(!a&&0===i)return 0;let u=!1;for(;;)switch(o){case"ascii":case"latin1":case"binary":return i;case"utf8":case"utf-8":return utf8ToBytes(s).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*i;case"hex":return i>>>1;case"base64":return base64ToBytes(s).length;default:if(u)return a?-1:utf8ToBytes(s).length;o=(""+o).toLowerCase(),u=!0}}function slowToString(s,o,i){let a=!1;if((void 0===o||o<0)&&(o=0),o>this.length)return"";if((void 0===i||i>this.length)&&(i=this.length),i<=0)return"";if((i>>>=0)<=(o>>>=0))return"";for(s||(s="utf8");;)switch(s){case"hex":return hexSlice(this,o,i);case"utf8":case"utf-8":return utf8Slice(this,o,i);case"ascii":return asciiSlice(this,o,i);case"latin1":case"binary":return latin1Slice(this,o,i);case"base64":return base64Slice(this,o,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,o,i);default:if(a)throw new TypeError("Unknown encoding: "+s);s=(s+"").toLowerCase(),a=!0}}function swap(s,o,i){const a=s[o];s[o]=s[i],s[i]=a}function bidirectionalIndexOf(s,o,i,a,u){if(0===s.length)return-1;if("string"==typeof i?(a=i,i=0):i>2147483647?i=2147483647:i<-2147483648&&(i=-2147483648),numberIsNaN(i=+i)&&(i=u?0:s.length-1),i<0&&(i=s.length+i),i>=s.length){if(u)return-1;i=s.length-1}else if(i<0){if(!u)return-1;i=0}if("string"==typeof o&&(o=Buffer.from(o,a)),Buffer.isBuffer(o))return 0===o.length?-1:arrayIndexOf(s,o,i,a,u);if("number"==typeof o)return o&=255,"function"==typeof Uint8Array.prototype.indexOf?u?Uint8Array.prototype.indexOf.call(s,o,i):Uint8Array.prototype.lastIndexOf.call(s,o,i):arrayIndexOf(s,[o],i,a,u);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(s,o,i,a,u){let _,w=1,x=s.length,C=o.length;if(void 0!==a&&("ucs2"===(a=String(a).toLowerCase())||"ucs-2"===a||"utf16le"===a||"utf-16le"===a)){if(s.length<2||o.length<2)return-1;w=2,x/=2,C/=2,i/=2}function read(s,o){return 1===w?s[o]:s.readUInt16BE(o*w)}if(u){let a=-1;for(_=i;_x&&(i=x-C),_=i;_>=0;_--){let i=!0;for(let a=0;au&&(a=u):a=u;const _=o.length;let w;for(a>_/2&&(a=_/2),w=0;w>8,u=i%256,_.push(u),_.push(a);return _}(o,s.length-i),s,i,a)}function base64Slice(s,o,i){return 0===o&&i===s.length?a.fromByteArray(s):a.fromByteArray(s.slice(o,i))}function utf8Slice(s,o,i){i=Math.min(s.length,i);const a=[];let u=o;for(;u239?4:o>223?3:o>191?2:1;if(u+w<=i){let i,a,x,C;switch(w){case 1:o<128&&(_=o);break;case 2:i=s[u+1],128==(192&i)&&(C=(31&o)<<6|63&i,C>127&&(_=C));break;case 3:i=s[u+1],a=s[u+2],128==(192&i)&&128==(192&a)&&(C=(15&o)<<12|(63&i)<<6|63&a,C>2047&&(C<55296||C>57343)&&(_=C));break;case 4:i=s[u+1],a=s[u+2],x=s[u+3],128==(192&i)&&128==(192&a)&&128==(192&x)&&(C=(15&o)<<18|(63&i)<<12|(63&a)<<6|63&x,C>65535&&C<1114112&&(_=C))}}null===_?(_=65533,w=1):_>65535&&(_-=65536,a.push(_>>>10&1023|55296),_=56320|1023&_),a.push(_),u+=w}return function decodeCodePointsArray(s){const o=s.length;if(o<=x)return String.fromCharCode.apply(String,s);let i="",a=0;for(;aa.length?(Buffer.isBuffer(o)||(o=Buffer.from(o)),o.copy(a,u)):Uint8Array.prototype.set.call(a,o,u);else{if(!Buffer.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(a,u)}u+=o.length}return a},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const s=this.length;if(s%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let o=0;oi&&(s+=" ... "),""},_&&(Buffer.prototype[_]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(s,o,i,a,u){if(isInstance(s,Uint8Array)&&(s=Buffer.from(s,s.offset,s.byteLength)),!Buffer.isBuffer(s))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof s);if(void 0===o&&(o=0),void 0===i&&(i=s?s.length:0),void 0===a&&(a=0),void 0===u&&(u=this.length),o<0||i>s.length||a<0||u>this.length)throw new RangeError("out of range index");if(a>=u&&o>=i)return 0;if(a>=u)return-1;if(o>=i)return 1;if(this===s)return 0;let _=(u>>>=0)-(a>>>=0),w=(i>>>=0)-(o>>>=0);const x=Math.min(_,w),C=this.slice(a,u),j=s.slice(o,i);for(let s=0;s>>=0,isFinite(i)?(i>>>=0,void 0===a&&(a="utf8")):(a=i,i=void 0)}const u=this.length-o;if((void 0===i||i>u)&&(i=u),s.length>0&&(i<0||o<0)||o>this.length)throw new RangeError("Attempt to write outside buffer bounds");a||(a="utf8");let _=!1;for(;;)switch(a){case"hex":return hexWrite(this,s,o,i);case"utf8":case"utf-8":return utf8Write(this,s,o,i);case"ascii":case"latin1":case"binary":return asciiWrite(this,s,o,i);case"base64":return base64Write(this,s,o,i);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,s,o,i);default:if(_)throw new TypeError("Unknown encoding: "+a);a=(""+a).toLowerCase(),_=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const x=4096;function asciiSlice(s,o,i){let a="";i=Math.min(s.length,i);for(let u=o;ua)&&(i=a);let u="";for(let a=o;ai)throw new RangeError("Trying to access beyond buffer length")}function checkInt(s,o,i,a,u,_){if(!Buffer.isBuffer(s))throw new TypeError('"buffer" argument must be a Buffer instance');if(o>u||o<_)throw new RangeError('"value" argument is out of bounds');if(i+a>s.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(s,o,i,a,u){checkIntBI(o,a,u,s,i,7);let _=Number(o&BigInt(4294967295));s[i++]=_,_>>=8,s[i++]=_,_>>=8,s[i++]=_,_>>=8,s[i++]=_;let w=Number(o>>BigInt(32)&BigInt(4294967295));return s[i++]=w,w>>=8,s[i++]=w,w>>=8,s[i++]=w,w>>=8,s[i++]=w,i}function wrtBigUInt64BE(s,o,i,a,u){checkIntBI(o,a,u,s,i,7);let _=Number(o&BigInt(4294967295));s[i+7]=_,_>>=8,s[i+6]=_,_>>=8,s[i+5]=_,_>>=8,s[i+4]=_;let w=Number(o>>BigInt(32)&BigInt(4294967295));return s[i+3]=w,w>>=8,s[i+2]=w,w>>=8,s[i+1]=w,w>>=8,s[i]=w,i+8}function checkIEEE754(s,o,i,a,u,_){if(i+a>s.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("Index out of range")}function writeFloat(s,o,i,a,_){return o=+o,i>>>=0,_||checkIEEE754(s,0,i,4),u.write(s,o,i,a,23,4),i+4}function writeDouble(s,o,i,a,_){return o=+o,i>>>=0,_||checkIEEE754(s,0,i,8),u.write(s,o,i,a,52,8),i+8}Buffer.prototype.slice=function slice(s,o){const i=this.length;(s=~~s)<0?(s+=i)<0&&(s=0):s>i&&(s=i),(o=void 0===o?i:~~o)<0?(o+=i)<0&&(o=0):o>i&&(o=i),o>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=this[s],u=1,_=0;for(;++_>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=this[s+--o],u=1;for(;o>0&&(u*=256);)a+=this[s+--o]*u;return a},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(s,o){return s>>>=0,o||checkOffset(s,1,this.length),this[s]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(s,o){return s>>>=0,o||checkOffset(s,2,this.length),this[s]|this[s+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(s,o){return s>>>=0,o||checkOffset(s,2,this.length),this[s]<<8|this[s+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),(this[s]|this[s+1]<<8|this[s+2]<<16)+16777216*this[s+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),16777216*this[s]+(this[s+1]<<16|this[s+2]<<8|this[s+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(s){validateNumber(s>>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=o+256*this[++s]+65536*this[++s]+this[++s]*2**24,u=this[++s]+256*this[++s]+65536*this[++s]+i*2**24;return BigInt(a)+(BigInt(u)<>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=o*2**24+65536*this[++s]+256*this[++s]+this[++s],u=this[++s]*2**24+65536*this[++s]+256*this[++s]+i;return(BigInt(a)<>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=this[s],u=1,_=0;for(;++_=u&&(a-=Math.pow(2,8*o)),a},Buffer.prototype.readIntBE=function readIntBE(s,o,i){s>>>=0,o>>>=0,i||checkOffset(s,o,this.length);let a=o,u=1,_=this[s+--a];for(;a>0&&(u*=256);)_+=this[s+--a]*u;return u*=128,_>=u&&(_-=Math.pow(2,8*o)),_},Buffer.prototype.readInt8=function readInt8(s,o){return s>>>=0,o||checkOffset(s,1,this.length),128&this[s]?-1*(255-this[s]+1):this[s]},Buffer.prototype.readInt16LE=function readInt16LE(s,o){s>>>=0,o||checkOffset(s,2,this.length);const i=this[s]|this[s+1]<<8;return 32768&i?4294901760|i:i},Buffer.prototype.readInt16BE=function readInt16BE(s,o){s>>>=0,o||checkOffset(s,2,this.length);const i=this[s+1]|this[s]<<8;return 32768&i?4294901760|i:i},Buffer.prototype.readInt32LE=function readInt32LE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),this[s]|this[s+1]<<8|this[s+2]<<16|this[s+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),this[s]<<24|this[s+1]<<16|this[s+2]<<8|this[s+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(s){validateNumber(s>>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=this[s+4]+256*this[s+5]+65536*this[s+6]+(i<<24);return(BigInt(a)<>>=0,"offset");const o=this[s],i=this[s+7];void 0!==o&&void 0!==i||boundsError(s,this.length-8);const a=(o<<24)+65536*this[++s]+256*this[++s]+this[++s];return(BigInt(a)<>>=0,o||checkOffset(s,4,this.length),u.read(this,s,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(s,o){return s>>>=0,o||checkOffset(s,4,this.length),u.read(this,s,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(s,o){return s>>>=0,o||checkOffset(s,8,this.length),u.read(this,s,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(s,o){return s>>>=0,o||checkOffset(s,8,this.length),u.read(this,s,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(s,o,i,a){if(s=+s,o>>>=0,i>>>=0,!a){checkInt(this,s,o,i,Math.pow(2,8*i)-1,0)}let u=1,_=0;for(this[o]=255&s;++_>>=0,i>>>=0,!a){checkInt(this,s,o,i,Math.pow(2,8*i)-1,0)}let u=i-1,_=1;for(this[o+u]=255&s;--u>=0&&(_*=256);)this[o+u]=s/_&255;return o+i},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,1,255,0),this[o]=255&s,o+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,65535,0),this[o]=255&s,this[o+1]=s>>>8,o+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,65535,0),this[o]=s>>>8,this[o+1]=255&s,o+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,4294967295,0),this[o+3]=s>>>24,this[o+2]=s>>>16,this[o+1]=s>>>8,this[o]=255&s,o+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,4294967295,0),this[o]=s>>>24,this[o+1]=s>>>16,this[o+2]=s>>>8,this[o+3]=255&s,o+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(s,o=0){return wrtBigUInt64LE(this,s,o,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(s,o=0){return wrtBigUInt64BE(this,s,o,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(s,o,i,a){if(s=+s,o>>>=0,!a){const a=Math.pow(2,8*i-1);checkInt(this,s,o,i,a-1,-a)}let u=0,_=1,w=0;for(this[o]=255&s;++u>>=0,!a){const a=Math.pow(2,8*i-1);checkInt(this,s,o,i,a-1,-a)}let u=i-1,_=1,w=0;for(this[o+u]=255&s;--u>=0&&(_*=256);)s<0&&0===w&&0!==this[o+u+1]&&(w=1),this[o+u]=(s/_|0)-w&255;return o+i},Buffer.prototype.writeInt8=function writeInt8(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,1,127,-128),s<0&&(s=255+s+1),this[o]=255&s,o+1},Buffer.prototype.writeInt16LE=function writeInt16LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,32767,-32768),this[o]=255&s,this[o+1]=s>>>8,o+2},Buffer.prototype.writeInt16BE=function writeInt16BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,2,32767,-32768),this[o]=s>>>8,this[o+1]=255&s,o+2},Buffer.prototype.writeInt32LE=function writeInt32LE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,2147483647,-2147483648),this[o]=255&s,this[o+1]=s>>>8,this[o+2]=s>>>16,this[o+3]=s>>>24,o+4},Buffer.prototype.writeInt32BE=function writeInt32BE(s,o,i){return s=+s,o>>>=0,i||checkInt(this,s,o,4,2147483647,-2147483648),s<0&&(s=4294967295+s+1),this[o]=s>>>24,this[o+1]=s>>>16,this[o+2]=s>>>8,this[o+3]=255&s,o+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(s,o=0){return wrtBigUInt64LE(this,s,o,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(s,o=0){return wrtBigUInt64BE(this,s,o,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(s,o,i){return writeFloat(this,s,o,!0,i)},Buffer.prototype.writeFloatBE=function writeFloatBE(s,o,i){return writeFloat(this,s,o,!1,i)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(s,o,i){return writeDouble(this,s,o,!0,i)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(s,o,i){return writeDouble(this,s,o,!1,i)},Buffer.prototype.copy=function copy(s,o,i,a){if(!Buffer.isBuffer(s))throw new TypeError("argument should be a Buffer");if(i||(i=0),a||0===a||(a=this.length),o>=s.length&&(o=s.length),o||(o=0),a>0&&a=this.length)throw new RangeError("Index out of range");if(a<0)throw new RangeError("sourceEnd out of bounds");a>this.length&&(a=this.length),s.length-o>>=0,i=void 0===i?this.length:i>>>0,s||(s=0),"number"==typeof s)for(u=o;u=a+4;i-=3)o=`_${s.slice(i-3,i)}${o}`;return`${s.slice(0,i)}${o}`}function checkIntBI(s,o,i,a,u,_){if(s>i||s3?0===o||o===BigInt(0)?`>= 0${a} and < 2${a} ** ${8*(_+1)}${a}`:`>= -(2${a} ** ${8*(_+1)-1}${a}) and < 2 ** ${8*(_+1)-1}${a}`:`>= ${o}${a} and <= ${i}${a}`,new C.ERR_OUT_OF_RANGE("value",u,s)}!function checkBounds(s,o,i){validateNumber(o,"offset"),void 0!==s[o]&&void 0!==s[o+i]||boundsError(o,s.length-(i+1))}(a,u,_)}function validateNumber(s,o){if("number"!=typeof s)throw new C.ERR_INVALID_ARG_TYPE(o,"number",s)}function boundsError(s,o,i){if(Math.floor(s)!==s)throw validateNumber(s,i),new C.ERR_OUT_OF_RANGE(i||"offset","an integer",s);if(o<0)throw new C.ERR_BUFFER_OUT_OF_BOUNDS;throw new C.ERR_OUT_OF_RANGE(i||"offset",`>= ${i?1:0} and <= ${o}`,s)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(s){return s?`${s} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(s,o){return`The "${s}" argument must be of type number. Received type ${typeof o}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(s,o,i){let a=`The value of "${s}" is out of range.`,u=i;return Number.isInteger(i)&&Math.abs(i)>2**32?u=addNumericalSeparator(String(i)):"bigint"==typeof i&&(u=String(i),(i>BigInt(2)**BigInt(32)||i<-(BigInt(2)**BigInt(32)))&&(u=addNumericalSeparator(u)),u+="n"),a+=` It must be ${o}. Received ${u}`,a}),RangeError);const j=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(s,o){let i;o=o||1/0;const a=s.length;let u=null;const _=[];for(let w=0;w55295&&i<57344){if(!u){if(i>56319){(o-=3)>-1&&_.push(239,191,189);continue}if(w+1===a){(o-=3)>-1&&_.push(239,191,189);continue}u=i;continue}if(i<56320){(o-=3)>-1&&_.push(239,191,189),u=i;continue}i=65536+(u-55296<<10|i-56320)}else u&&(o-=3)>-1&&_.push(239,191,189);if(u=null,i<128){if((o-=1)<0)break;_.push(i)}else if(i<2048){if((o-=2)<0)break;_.push(i>>6|192,63&i|128)}else if(i<65536){if((o-=3)<0)break;_.push(i>>12|224,i>>6&63|128,63&i|128)}else{if(!(i<1114112))throw new Error("Invalid code point");if((o-=4)<0)break;_.push(i>>18|240,i>>12&63|128,i>>6&63|128,63&i|128)}}return _}function base64ToBytes(s){return a.toByteArray(function base64clean(s){if((s=(s=s.split("=")[0]).trim().replace(j,"")).length<2)return"";for(;s.length%4!=0;)s+="=";return s}(s))}function blitBuffer(s,o,i,a){let u;for(u=0;u=o.length||u>=s.length);++u)o[u+i]=s[u];return u}function isInstance(s,o){return s instanceof o||null!=s&&null!=s.constructor&&null!=s.constructor.name&&s.constructor.name===o.name}function numberIsNaN(s){return s!=s}const L=function(){const s="0123456789abcdef",o=new Array(256);for(let i=0;i<16;++i){const a=16*i;for(let u=0;u<16;++u)o[a+u]=s[i]+s[u]}return o}();function defineBigIntMethod(s){return"undefined"==typeof BigInt?BufferBigIntNotDefined:s}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},13144(s,o,i){"use strict";var a=i(66743),u=i(11002),_=i(10076),w=i(47119);s.exports=w||a.call(_,u)},12205(s,o,i){"use strict";var a=i(66743),u=i(11002),_=i(13144);s.exports=function applyBind(){return _(a,u,arguments)}},11002(s){"use strict";s.exports=Function.prototype.apply},10076(s){"use strict";s.exports=Function.prototype.call},73126(s,o,i){"use strict";var a=i(66743),u=i(69675),_=i(10076),w=i(13144);s.exports=function callBindBasic(s){if(s.length<1||"function"!=typeof s[0])throw new u("a function is required");return w(a,_,s)}},47119(s){"use strict";s.exports="undefined"!=typeof Reflect&&Reflect&&Reflect.apply},10487(s,o,i){"use strict";var a=i(96897),u=i(30655),_=i(73126),w=i(12205);s.exports=function callBind(s){var o=_(arguments),i=s.length-(arguments.length-1);return a(o,1+(i>0?i:0),!0)},u?u(s.exports,"apply",{value:w}):s.exports.apply=w},36556(s,o,i){"use strict";var a=i(70453),u=i(73126),_=u([a("%String.prototype.indexOf%")]);s.exports=function callBoundIntrinsic(s,o){var i=a(s,!!o);return"function"==typeof i&&_(s,".prototype.")>-1?u([i]):i}},17965(s,o,i){"use strict";var a=i(16426),u={"text/plain":"Text","text/html":"Url",default:"Text"};s.exports=function copy(s,o){var i,_,w,x,C,j,L=!1;o||(o={}),i=o.debug||!1;try{if(w=a(),x=document.createRange(),C=document.getSelection(),(j=document.createElement("span")).textContent=s,j.ariaHidden="true",j.style.all="unset",j.style.position="fixed",j.style.top=0,j.style.clip="rect(0, 0, 0, 0)",j.style.whiteSpace="pre",j.style.webkitUserSelect="text",j.style.MozUserSelect="text",j.style.msUserSelect="text",j.style.userSelect="text",j.addEventListener("copy",(function(a){if(a.stopPropagation(),o.format)if(a.preventDefault(),void 0===a.clipboardData){i&&console.warn("unable to use e.clipboardData"),i&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var _=u[o.format]||u.default;window.clipboardData.setData(_,s)}else a.clipboardData.clearData(),a.clipboardData.setData(o.format,s);o.onCopy&&(a.preventDefault(),o.onCopy(a.clipboardData))})),document.body.appendChild(j),x.selectNodeContents(j),C.addRange(x),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");L=!0}catch(a){i&&console.error("unable to copy using execCommand: ",a),i&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(o.format||"text",s),o.onCopy&&o.onCopy(window.clipboardData),L=!0}catch(a){i&&console.error("unable to copy using clipboardData: ",a),i&&console.error("falling back to prompt"),_=function format(s){var o=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return s.replace(/#{\s*key\s*}/g,o)}("message"in o?o.message:"Copy to clipboard: #{key}, Enter"),window.prompt(_,s)}}finally{C&&("function"==typeof C.removeRange?C.removeRange(x):C.removeAllRanges()),j&&document.body.removeChild(j),w()}return L}},2205(s,o,i){var a;a=void 0!==i.g?i.g:this,s.exports=function(s){if(s.CSS&&s.CSS.escape)return s.CSS.escape;var cssEscape=function(s){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var o,i=String(s),a=i.length,u=-1,_="",w=i.charCodeAt(0);++u=1&&o<=31||127==o||0==u&&o>=48&&o<=57||1==u&&o>=48&&o<=57&&45==w?"\\"+o.toString(16)+" ":0==u&&1==a&&45==o||!(o>=128||45==o||95==o||o>=48&&o<=57||o>=65&&o<=90||o>=97&&o<=122)?"\\"+i.charAt(u):i.charAt(u):_+="�";return _};return s.CSS||(s.CSS={}),s.CSS.escape=cssEscape,cssEscape}(a)},81919(s,o,i){"use strict";var a=i(48287).Buffer;function isSpecificValue(s){return s instanceof a||s instanceof Date||s instanceof RegExp}function cloneSpecificValue(s){if(s instanceof a){var o=a.alloc?a.alloc(s.length):new a(s.length);return s.copy(o),o}if(s instanceof Date)return new Date(s.getTime());if(s instanceof RegExp)return new RegExp(s);throw new Error("Unexpected situation")}function deepCloneArray(s){var o=[];return s.forEach((function(s,i){"object"==typeof s&&null!==s?Array.isArray(s)?o[i]=deepCloneArray(s):isSpecificValue(s)?o[i]=cloneSpecificValue(s):o[i]=u({},s):o[i]=s})),o}function safeGetProperty(s,o){return"__proto__"===o?void 0:s[o]}var u=s.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var s,o,i=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(a){"object"!=typeof a||null===a||Array.isArray(a)||Object.keys(a).forEach((function(_){return o=safeGetProperty(i,_),(s=safeGetProperty(a,_))===i?void 0:"object"!=typeof s||null===s?void(i[_]=s):Array.isArray(s)?void(i[_]=deepCloneArray(s)):isSpecificValue(s)?void(i[_]=cloneSpecificValue(s)):"object"!=typeof o||null===o||Array.isArray(o)?void(i[_]=u({},s)):void(i[_]=u(o,s))}))})),i}},14744(s){"use strict";var o=function isMergeableObject(s){return function isNonNullObject(s){return!!s&&"object"==typeof s}(s)&&!function isSpecial(s){var o=Object.prototype.toString.call(s);return"[object RegExp]"===o||"[object Date]"===o||function isReactElement(s){return s.$$typeof===i}(s)}(s)};var i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(s,o){return!1!==o.clone&&o.isMergeableObject(s)?deepmerge(function emptyTarget(s){return Array.isArray(s)?[]:{}}(s),s,o):s}function defaultArrayMerge(s,o,i){return s.concat(o).map((function(s){return cloneUnlessOtherwiseSpecified(s,i)}))}function getKeys(s){return Object.keys(s).concat(function getEnumerableOwnPropertySymbols(s){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(s).filter((function(o){return Object.propertyIsEnumerable.call(s,o)})):[]}(s))}function propertyIsOnObject(s,o){try{return o in s}catch(s){return!1}}function mergeObject(s,o,i){var a={};return i.isMergeableObject(s)&&getKeys(s).forEach((function(o){a[o]=cloneUnlessOtherwiseSpecified(s[o],i)})),getKeys(o).forEach((function(u){(function propertyIsUnsafe(s,o){return propertyIsOnObject(s,o)&&!(Object.hasOwnProperty.call(s,o)&&Object.propertyIsEnumerable.call(s,o))})(s,u)||(propertyIsOnObject(s,u)&&i.isMergeableObject(o[u])?a[u]=function getMergeFunction(s,o){if(!o.customMerge)return deepmerge;var i=o.customMerge(s);return"function"==typeof i?i:deepmerge}(u,i)(s[u],o[u],i):a[u]=cloneUnlessOtherwiseSpecified(o[u],i))})),a}function deepmerge(s,i,a){(a=a||{}).arrayMerge=a.arrayMerge||defaultArrayMerge,a.isMergeableObject=a.isMergeableObject||o,a.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var u=Array.isArray(i);return u===Array.isArray(s)?u?a.arrayMerge(s,i,a):mergeObject(s,i,a):cloneUnlessOtherwiseSpecified(i,a)}deepmerge.all=function deepmergeAll(s,o){if(!Array.isArray(s))throw new Error("first argument should be an array");return s.reduce((function(s,i){return deepmerge(s,i,o)}),{})};var a=deepmerge;s.exports=a},30041(s,o,i){"use strict";var a=i(30655),u=i(58068),_=i(69675),w=i(75795);s.exports=function defineDataProperty(s,o,i){if(!s||"object"!=typeof s&&"function"!=typeof s)throw new _("`obj` must be an object or a function`");if("string"!=typeof o&&"symbol"!=typeof o)throw new _("`property` must be a string or a symbol`");if(arguments.length>3&&"boolean"!=typeof arguments[3]&&null!==arguments[3])throw new _("`nonEnumerable`, if provided, must be a boolean or null");if(arguments.length>4&&"boolean"!=typeof arguments[4]&&null!==arguments[4])throw new _("`nonWritable`, if provided, must be a boolean or null");if(arguments.length>5&&"boolean"!=typeof arguments[5]&&null!==arguments[5])throw new _("`nonConfigurable`, if provided, must be a boolean or null");if(arguments.length>6&&"boolean"!=typeof arguments[6])throw new _("`loose`, if provided, must be a boolean");var x=arguments.length>3?arguments[3]:null,C=arguments.length>4?arguments[4]:null,j=arguments.length>5?arguments[5]:null,L=arguments.length>6&&arguments[6],B=!!w&&w(s,o);if(a)a(s,o,{configurable:null===j&&B?B.configurable:!j,enumerable:null===x&&B?B.enumerable:!x,value:i,writable:null===C&&B?B.writable:!C});else{if(!L&&(x||C||j))throw new u("This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.");s[o]=i}}},78004(s){"use strict";class SubRange{constructor(s,o){this.low=s,this.high=o,this.length=1+o-s}overlaps(s){return!(this.highs.high)}touches(s){return!(this.high+1s.high)}add(s){return new SubRange(Math.min(this.low,s.low),Math.max(this.high,s.high))}subtract(s){return s.low<=this.low&&s.high>=this.high?[]:s.low>this.low&&s.highs+o.length),0)}add(s,o){var _add=s=>{for(var o=0;o{for(var o=0;o{for(var o=0;o{for(var i=o.low;i<=o.high;)s.push(i),i++;return s}),[])}subranges(){return this.ranges.map((s=>({low:s.low,high:s.high,length:1+s.high-s.low})))}}s.exports=DRange},7176(s,o,i){"use strict";var a,u=i(73126),_=i(75795);try{a=[].__proto__===Array.prototype}catch(s){if(!s||"object"!=typeof s||!("code"in s)||"ERR_PROTO_ACCESS"!==s.code)throw s}var w=!!a&&_&&_(Object.prototype,"__proto__"),x=Object,C=x.getPrototypeOf;s.exports=w&&"function"==typeof w.get?u([w.get]):"function"==typeof C&&function getDunder(s){return C(null==s?s:x(s))}},30655(s){"use strict";var o=Object.defineProperty||!1;if(o)try{o({},"a",{value:1})}catch(s){o=!1}s.exports=o},41237(s){"use strict";s.exports=EvalError},69383(s){"use strict";s.exports=Error},79290(s){"use strict";s.exports=RangeError},79538(s){"use strict";s.exports=ReferenceError},58068(s){"use strict";s.exports=SyntaxError},69675(s){"use strict";s.exports=TypeError},35345(s){"use strict";s.exports=URIError},79612(s){"use strict";s.exports=Object},37007(s){"use strict";var o,i="object"==typeof Reflect?Reflect:null,a=i&&"function"==typeof i.apply?i.apply:function ReflectApply(s,o,i){return Function.prototype.apply.call(s,o,i)};o=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function ReflectOwnKeys(s){return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s))}:function ReflectOwnKeys(s){return Object.getOwnPropertyNames(s)};var u=Number.isNaN||function NumberIsNaN(s){return s!=s};function EventEmitter(){EventEmitter.init.call(this)}s.exports=EventEmitter,s.exports.once=function once(s,o){return new Promise((function(i,a){function errorListener(i){s.removeListener(o,resolver),a(i)}function resolver(){"function"==typeof s.removeListener&&s.removeListener("error",errorListener),i([].slice.call(arguments))}eventTargetAgnosticAddListener(s,o,resolver,{once:!0}),"error"!==o&&function addErrorHandlerIfEventEmitter(s,o,i){"function"==typeof s.on&&eventTargetAgnosticAddListener(s,"error",o,i)}(s,errorListener,{once:!0})}))},EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._eventsCount=0,EventEmitter.prototype._maxListeners=void 0;var _=10;function checkListener(s){if("function"!=typeof s)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof s)}function _getMaxListeners(s){return void 0===s._maxListeners?EventEmitter.defaultMaxListeners:s._maxListeners}function _addListener(s,o,i,a){var u,_,w;if(checkListener(i),void 0===(_=s._events)?(_=s._events=Object.create(null),s._eventsCount=0):(void 0!==_.newListener&&(s.emit("newListener",o,i.listener?i.listener:i),_=s._events),w=_[o]),void 0===w)w=_[o]=i,++s._eventsCount;else if("function"==typeof w?w=_[o]=a?[i,w]:[w,i]:a?w.unshift(i):w.push(i),(u=_getMaxListeners(s))>0&&w.length>u&&!w.warned){w.warned=!0;var x=new Error("Possible EventEmitter memory leak detected. "+w.length+" "+String(o)+" listeners added. Use emitter.setMaxListeners() to increase limit");x.name="MaxListenersExceededWarning",x.emitter=s,x.type=o,x.count=w.length,function ProcessEmitWarning(s){console&&console.warn&&console.warn(s)}(x)}return s}function onceWrapper(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function _onceWrap(s,o,i){var a={fired:!1,wrapFn:void 0,target:s,type:o,listener:i},u=onceWrapper.bind(a);return u.listener=i,a.wrapFn=u,u}function _listeners(s,o,i){var a=s._events;if(void 0===a)return[];var u=a[o];return void 0===u?[]:"function"==typeof u?i?[u.listener||u]:[u]:i?function unwrapListeners(s){for(var o=new Array(s.length),i=0;i0&&(w=o[0]),w instanceof Error)throw w;var x=new Error("Unhandled error."+(w?" ("+w.message+")":""));throw x.context=w,x}var C=_[s];if(void 0===C)return!1;if("function"==typeof C)a(C,this,o);else{var j=C.length,L=arrayClone(C,j);for(i=0;i=0;_--)if(i[_]===o||i[_].listener===o){w=i[_].listener,u=_;break}if(u<0)return this;0===u?i.shift():function spliceOne(s,o){for(;o+1=0;a--)this.removeListener(s,o[a]);return this},EventEmitter.prototype.listeners=function listeners(s){return _listeners(this,s,!0)},EventEmitter.prototype.rawListeners=function rawListeners(s){return _listeners(this,s,!1)},EventEmitter.listenerCount=function(s,o){return"function"==typeof s.listenerCount?s.listenerCount(o):listenerCount.call(s,o)},EventEmitter.prototype.listenerCount=listenerCount,EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?o(this._events):[]}},85587(s,o,i){"use strict";var a=i(26311),u=create(Error);function create(s){return FormattedError.displayName=s.displayName||s.name,FormattedError;function FormattedError(o){return o&&(o=a.apply(null,arguments)),new s(o)}}s.exports=u,u.eval=create(EvalError),u.range=create(RangeError),u.reference=create(ReferenceError),u.syntax=create(SyntaxError),u.type=create(TypeError),u.uri=create(URIError),u.create=create},82682(s,o,i){"use strict";var a=i(69600),u=Object.prototype.toString,_=Object.prototype.hasOwnProperty;s.exports=function forEach(s,o,i){if(!a(o))throw new TypeError("iterator must be a function");var w;arguments.length>=3&&(w=i),function isArray(s){return"[object Array]"===u.call(s)}(s)?function forEachArray(s,o,i){for(var a=0,u=s.length;a0?parseInt(i):null};x1&&"boolean"!=typeof o)throw new L('"allowMissing" argument must be a boolean');if(null===Xe(/^%?[^%]*%?$/,s))throw new j("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var i=function stringToPath(s){var o=Ye(s,0,1),i=Ye(s,-1);if("%"===o&&"%"!==i)throw new j("invalid intrinsic syntax, expected closing `%`");if("%"===i&&"%"!==o)throw new j("invalid intrinsic syntax, expected opening `%`");var a=[];return He(s,Qe,(function(s,o,i,u){a[a.length]=i?He(u,et,"$1"):o||s})),a}(s),a=i.length>0?i[0]:"",u=tt("%"+a+"%",o),_=u.name,w=u.value,x=!1,C=u.alias;C&&(a=C[0],We(i,ze([0,1],C)));for(var B=1,$=!0;B=i.length){var Y=ae(w,U);w=($=!!Y)&&"get"in Y&&!("originalValue"in Y.get)?Y.get:w[U]}else $=qe(w,U),w=w[U];$&&!x&&(xe[_]=w)}}return w}},71064(s,o,i){"use strict";var a=i(79612);s.exports=a.getPrototypeOf||null},48648(s){"use strict";s.exports="undefined"!=typeof Reflect&&Reflect.getPrototypeOf||null},93628(s,o,i){"use strict";var a=i(48648),u=i(71064),_=i(7176);s.exports=a?function getProto(s){return a(s)}:u?function getProto(s){if(!s||"object"!=typeof s&&"function"!=typeof s)throw new TypeError("getProto: not an object");return u(s)}:_?function getProto(s){return _(s)}:null},6549(s){"use strict";s.exports=Object.getOwnPropertyDescriptor},75795(s,o,i){"use strict";var a=i(6549);if(a)try{a([],"length")}catch(s){a=null}s.exports=a},30592(s,o,i){"use strict";var a=i(30655),u=function hasPropertyDescriptors(){return!!a};u.hasArrayLengthDefineBug=function hasArrayLengthDefineBug(){if(!a)return null;try{return 1!==a([],"length",{value:1}).length}catch(s){return!0}},s.exports=u},64039(s,o,i){"use strict";var a="undefined"!=typeof Symbol&&Symbol,u=i(41333);s.exports=function hasNativeSymbols(){return"function"==typeof a&&("function"==typeof Symbol&&("symbol"==typeof a("foo")&&("symbol"==typeof Symbol("bar")&&u())))}},41333(s){"use strict";s.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var s={},o=Symbol("test"),i=Object(o);if("string"==typeof o)return!1;if("[object Symbol]"!==Object.prototype.toString.call(o))return!1;if("[object Symbol]"!==Object.prototype.toString.call(i))return!1;for(var a in s[o]=42,s)return!1;if("function"==typeof Object.keys&&0!==Object.keys(s).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(s).length)return!1;var u=Object.getOwnPropertySymbols(s);if(1!==u.length||u[0]!==o)return!1;if(!Object.prototype.propertyIsEnumerable.call(s,o))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var _=Object.getOwnPropertyDescriptor(s,o);if(42!==_.value||!0!==_.enumerable)return!1}return!0}},49092(s,o,i){"use strict";var a=i(41333);s.exports=function hasToStringTagShams(){return a()&&!!Symbol.toStringTag}},9957(s,o,i){"use strict";var a=Function.prototype.call,u=Object.prototype.hasOwnProperty,_=i(66743);s.exports=_.call(a,u)},45981(s){function deepFreeze(s){return s instanceof Map?s.clear=s.delete=s.set=function(){throw new Error("map is read-only")}:s instanceof Set&&(s.add=s.clear=s.delete=function(){throw new Error("set is read-only")}),Object.freeze(s),Object.getOwnPropertyNames(s).forEach((function(o){var i=s[o];"object"!=typeof i||Object.isFrozen(i)||deepFreeze(i)})),s}var o=deepFreeze,i=deepFreeze;o.default=i;class Response{constructor(s){void 0===s.data&&(s.data={}),this.data=s.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function escapeHTML(s){return s.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit(s,...o){const i=Object.create(null);for(const o in s)i[o]=s[o];return o.forEach((function(s){for(const o in s)i[o]=s[o]})),i}const emitsWrappingTags=s=>!!s.kind;class HTMLRenderer{constructor(s,o){this.buffer="",this.classPrefix=o.classPrefix,s.walk(this)}addText(s){this.buffer+=escapeHTML(s)}openNode(s){if(!emitsWrappingTags(s))return;let o=s.kind;s.sublanguage||(o=`${this.classPrefix}${o}`),this.span(o)}closeNode(s){emitsWrappingTags(s)&&(this.buffer+="
    ")}value(){return this.buffer}span(s){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(s){this.top.children.push(s)}openNode(s){const o={kind:s,children:[]};this.add(o),this.stack.push(o)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(s){return this.constructor._walk(s,this.rootNode)}static _walk(s,o){return"string"==typeof o?s.addText(o):o.children&&(s.openNode(o),o.children.forEach((o=>this._walk(s,o))),s.closeNode(o)),s}static _collapse(s){"string"!=typeof s&&s.children&&(s.children.every((s=>"string"==typeof s))?s.children=[s.children.join("")]:s.children.forEach((s=>{TokenTree._collapse(s)})))}}class TokenTreeEmitter extends TokenTree{constructor(s){super(),this.options=s}addKeyword(s,o){""!==s&&(this.openNode(o),this.addText(s),this.closeNode())}addText(s){""!==s&&this.add(s)}addSublanguage(s,o){const i=s.root;i.kind=o,i.sublanguage=!0,this.add(i)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(s){return s?"string"==typeof s?s:s.source:null}const a=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const u="[a-zA-Z]\\w*",_="[a-zA-Z_]\\w*",w="\\b\\d+(\\.\\d+)?",x="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",C="\\b(0b[01]+)",j={begin:"\\\\[\\s\\S]",relevance:0},L={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[j]},B={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[j]},$={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(s,o,i={}){const a=inherit({className:"comment",begin:s,end:o,contains:[]},i);return a.contains.push($),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},U=COMMENT("//","$"),V=COMMENT("/\\*","\\*/"),z=COMMENT("#","$"),Y={className:"number",begin:w,relevance:0},Z={className:"number",begin:x,relevance:0},ee={className:"number",begin:C,relevance:0},ie={className:"number",begin:w+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},ae={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[j,{begin:/\[/,end:/\]/,relevance:0,contains:[j]}]}]},ce={className:"title",begin:u,relevance:0},le={className:"title",begin:_,relevance:0},pe={begin:"\\.\\s*"+_,relevance:0};var de=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:u,UNDERSCORE_IDENT_RE:_,NUMBER_RE:w,C_NUMBER_RE:x,BINARY_NUMBER_RE:C,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(s={})=>{const o=/^#![ ]*\//;return s.binary&&(s.begin=function concat(...s){return s.map((s=>source(s))).join("")}(o,/.*\b/,s.binary,/\b.*/)),inherit({className:"meta",begin:o,end:/$/,relevance:0,"on:begin":(s,o)=>{0!==s.index&&o.ignoreMatch()}},s)},BACKSLASH_ESCAPE:j,APOS_STRING_MODE:L,QUOTE_STRING_MODE:B,PHRASAL_WORDS_MODE:$,COMMENT,C_LINE_COMMENT_MODE:U,C_BLOCK_COMMENT_MODE:V,HASH_COMMENT_MODE:z,NUMBER_MODE:Y,C_NUMBER_MODE:Z,BINARY_NUMBER_MODE:ee,CSS_NUMBER_MODE:ie,REGEXP_MODE:ae,TITLE_MODE:ce,UNDERSCORE_TITLE_MODE:le,METHOD_GUARD:pe,END_SAME_AS_BEGIN:function(s){return Object.assign(s,{"on:begin":(s,o)=>{o.data._beginMatch=s[1]},"on:end":(s,o)=>{o.data._beginMatch!==s[1]&&o.ignoreMatch()}})}});function skipIfhasPrecedingDot(s,o){"."===s.input[s.index-1]&&o.ignoreMatch()}function beginKeywords(s,o){o&&s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",s.__beforeBegin=skipIfhasPrecedingDot,s.keywords=s.keywords||s.beginKeywords,delete s.beginKeywords,void 0===s.relevance&&(s.relevance=0))}function compileIllegal(s,o){Array.isArray(s.illegal)&&(s.illegal=function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}(...s.illegal))}function compileMatch(s,o){if(s.match){if(s.begin||s.end)throw new Error("begin & end are not supported with match");s.begin=s.match,delete s.match}}function compileRelevance(s,o){void 0===s.relevance&&(s.relevance=1)}const fe=["of","and","for","in","not","or","if","then","parent","list","value"];function compileKeywords(s,o,i="keyword"){const a={};return"string"==typeof s?compileList(i,s.split(" ")):Array.isArray(s)?compileList(i,s):Object.keys(s).forEach((function(i){Object.assign(a,compileKeywords(s[i],o,i))})),a;function compileList(s,i){o&&(i=i.map((s=>s.toLowerCase()))),i.forEach((function(o){const i=o.split("|");a[i[0]]=[s,scoreForKeyword(i[0],i[1])]}))}}function scoreForKeyword(s,o){return o?Number(o):function commonKeyword(s){return fe.includes(s.toLowerCase())}(s)?0:1}function compileLanguage(s,{plugins:o}){function langRe(o,i){return new RegExp(source(o),"m"+(s.case_insensitive?"i":"")+(i?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(s,o){o.position=this.position++,this.matchIndexes[this.matchAt]=o,this.regexes.push([o,s]),this.matchAt+=function countMatchGroups(s){return new RegExp(s.toString()+"|").exec("").length-1}(s)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const s=this.regexes.map((s=>s[1]));this.matcherRe=langRe(function join(s,o="|"){let i=0;return s.map((s=>{i+=1;const o=i;let u=source(s),_="";for(;u.length>0;){const s=a.exec(u);if(!s){_+=u;break}_+=u.substring(0,s.index),u=u.substring(s.index+s[0].length),"\\"===s[0][0]&&s[1]?_+="\\"+String(Number(s[1])+o):(_+=s[0],"("===s[0]&&i++)}return _})).map((s=>`(${s})`)).join(o)}(s),!0),this.lastIndex=0}exec(s){this.matcherRe.lastIndex=this.lastIndex;const o=this.matcherRe.exec(s);if(!o)return null;const i=o.findIndex(((s,o)=>o>0&&void 0!==s)),a=this.matchIndexes[i];return o.splice(0,i),Object.assign(o,a)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(s){if(this.multiRegexes[s])return this.multiRegexes[s];const o=new MultiRegex;return this.rules.slice(s).forEach((([s,i])=>o.addRule(s,i))),o.compile(),this.multiRegexes[s]=o,o}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(s,o){this.rules.push([s,o]),"begin"===o.type&&this.count++}exec(s){const o=this.getMatcher(this.regexIndex);o.lastIndex=this.lastIndex;let i=o.exec(s);if(this.resumingScanAtSamePosition())if(i&&i.index===this.lastIndex);else{const o=this.getMatcher(0);o.lastIndex=this.lastIndex+1,i=o.exec(s)}return i&&(this.regexIndex+=i.position+1,this.regexIndex===this.count&&this.considerAll()),i}}if(s.compilerExtensions||(s.compilerExtensions=[]),s.contains&&s.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return s.classNameAliases=inherit(s.classNameAliases||{}),function compileMode(o,i){const a=o;if(o.isCompiled)return a;[compileMatch].forEach((s=>s(o,i))),s.compilerExtensions.forEach((s=>s(o,i))),o.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((s=>s(o,i))),o.isCompiled=!0;let u=null;if("object"==typeof o.keywords&&(u=o.keywords.$pattern,delete o.keywords.$pattern),o.keywords&&(o.keywords=compileKeywords(o.keywords,s.case_insensitive)),o.lexemes&&u)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return u=u||o.lexemes||/\w+/,a.keywordPatternRe=langRe(u,!0),i&&(o.begin||(o.begin=/\B|\b/),a.beginRe=langRe(o.begin),o.endSameAsBegin&&(o.end=o.begin),o.end||o.endsWithParent||(o.end=/\B|\b/),o.end&&(a.endRe=langRe(o.end)),a.terminatorEnd=source(o.end)||"",o.endsWithParent&&i.terminatorEnd&&(a.terminatorEnd+=(o.end?"|":"")+i.terminatorEnd)),o.illegal&&(a.illegalRe=langRe(o.illegal)),o.contains||(o.contains=[]),o.contains=[].concat(...o.contains.map((function(s){return function expandOrCloneMode(s){s.variants&&!s.cachedVariants&&(s.cachedVariants=s.variants.map((function(o){return inherit(s,{variants:null},o)})));if(s.cachedVariants)return s.cachedVariants;if(dependencyOnParent(s))return inherit(s,{starts:s.starts?inherit(s.starts):null});if(Object.isFrozen(s))return inherit(s);return s}("self"===s?o:s)}))),o.contains.forEach((function(s){compileMode(s,a)})),o.starts&&compileMode(o.starts,i),a.matcher=function buildModeRegex(s){const o=new ResumableMultiRegex;return s.contains.forEach((s=>o.addRule(s.begin,{rule:s,type:"begin"}))),s.terminatorEnd&&o.addRule(s.terminatorEnd,{type:"end"}),s.illegal&&o.addRule(s.illegal,{type:"illegal"}),o}(a),a}(s)}function dependencyOnParent(s){return!!s&&(s.endsWithParent||dependencyOnParent(s.starts))}function BuildVuePlugin(s){const o={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!s.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let o={};return this.autoDetect?(o=s.highlightAuto(this.code),this.detectedLanguage=o.language):(o=s.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),o.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(s){return Boolean(s||""===s)}(this.autodetect)},ignoreIllegals:()=>!0},render(s){return s("pre",{},[s("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:o,VuePlugin:{install(s){s.component("highlightjs",o)}}}}const ye={"after:highlightElement":({el:s,result:o,text:i})=>{const a=nodeStream(s);if(!a.length)return;const u=document.createElement("div");u.innerHTML=o.value,o.value=function mergeStreams(s,o,i){let a=0,u="";const _=[];function selectStream(){return s.length&&o.length?s[0].offset!==o[0].offset?s[0].offset"}function close(s){u+=""}function render(s){("start"===s.event?open:close)(s.node)}for(;s.length||o.length;){let o=selectStream();if(u+=escapeHTML(i.substring(a,o[0].offset)),a=o[0].offset,o===s){_.reverse().forEach(close);do{render(o.splice(0,1)[0]),o=selectStream()}while(o===s&&o.length&&o[0].offset===a);_.reverse().forEach(open)}else"start"===o[0].event?_.push(o[0].node):_.pop(),render(o.splice(0,1)[0])}return u+escapeHTML(i.substr(a))}(a,nodeStream(u),i)}};function tag(s){return s.nodeName.toLowerCase()}function nodeStream(s){const o=[];return function _nodeStream(s,i){for(let a=s.firstChild;a;a=a.nextSibling)3===a.nodeType?i+=a.nodeValue.length:1===a.nodeType&&(o.push({event:"start",offset:i,node:a}),i=_nodeStream(a,i),tag(a).match(/br|hr|img|input/)||o.push({event:"stop",offset:i,node:a}));return i}(s,0),o}const be={},error=s=>{console.error(s)},warn=(s,...o)=>{console.log(`WARN: ${s}`,...o)},deprecated=(s,o)=>{be[`${s}/${o}`]||(console.log(`Deprecated as of ${s}. ${o}`),be[`${s}/${o}`]=!0)},Se=escapeHTML,_e=inherit,we=Symbol("nomatch");var xe=function(s){const i=Object.create(null),a=Object.create(null),u=[];let _=!0;const w=/(^(<[^>]+>|\t|)+|\n)/gm,x="Could not find the language '{}', did you forget to load/include a language module?",C={disableAutodetect:!0,name:"Plain text",contains:[]};let j={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(s){return j.noHighlightRe.test(s)}function highlight(s,o,i,a){let u="",_="";"object"==typeof o?(u=s,i=o.ignoreIllegals,_=o.language,a=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),_=s,u=o);const w={code:u,language:_};fire("before:highlight",w);const x=w.result?w.result:_highlight(w.language,w.code,i,a);return x.code=w.code,fire("after:highlight",x),x}function _highlight(s,o,a,w){function keywordData(s,o){const i=L.case_insensitive?o[0].toLowerCase():o[0];return Object.prototype.hasOwnProperty.call(s.keywords,i)&&s.keywords[i]}function processBuffer(){null!=U.subLanguage?function processSubLanguage(){if(""===Y)return;let s=null;if("string"==typeof U.subLanguage){if(!i[U.subLanguage])return void z.addText(Y);s=_highlight(U.subLanguage,Y,!0,V[U.subLanguage]),V[U.subLanguage]=s.top}else s=highlightAuto(Y,U.subLanguage.length?U.subLanguage:null);U.relevance>0&&(Z+=s.relevance),z.addSublanguage(s.emitter,s.language)}():function processKeywords(){if(!U.keywords)return void z.addText(Y);let s=0;U.keywordPatternRe.lastIndex=0;let o=U.keywordPatternRe.exec(Y),i="";for(;o;){i+=Y.substring(s,o.index);const a=keywordData(U,o);if(a){const[s,u]=a;if(z.addText(i),i="",Z+=u,s.startsWith("_"))i+=o[0];else{const i=L.classNameAliases[s]||s;z.addKeyword(o[0],i)}}else i+=o[0];s=U.keywordPatternRe.lastIndex,o=U.keywordPatternRe.exec(Y)}i+=Y.substr(s),z.addText(i)}(),Y=""}function startNewMode(s){return s.className&&z.openNode(L.classNameAliases[s.className]||s.className),U=Object.create(s,{parent:{value:U}}),U}function endOfMode(s,o,i){let a=function startsWith(s,o){const i=s&&s.exec(o);return i&&0===i.index}(s.endRe,i);if(a){if(s["on:end"]){const i=new Response(s);s["on:end"](o,i),i.isMatchIgnored&&(a=!1)}if(a){for(;s.endsParent&&s.parent;)s=s.parent;return s}}if(s.endsWithParent)return endOfMode(s.parent,o,i)}function doIgnore(s){return 0===U.matcher.regexIndex?(Y+=s[0],1):(ae=!0,0)}function doBeginMatch(s){const o=s[0],i=s.rule,a=new Response(i),u=[i.__beforeBegin,i["on:begin"]];for(const i of u)if(i&&(i(s,a),a.isMatchIgnored))return doIgnore(o);return i&&i.endSameAsBegin&&(i.endRe=function escape(s){return new RegExp(s.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(o)),i.skip?Y+=o:(i.excludeBegin&&(Y+=o),processBuffer(),i.returnBegin||i.excludeBegin||(Y=o)),startNewMode(i),i.returnBegin?0:o.length}function doEndMatch(s){const i=s[0],a=o.substr(s.index),u=endOfMode(U,s,a);if(!u)return we;const _=U;_.skip?Y+=i:(_.returnEnd||_.excludeEnd||(Y+=i),processBuffer(),_.excludeEnd&&(Y=i));do{U.className&&z.closeNode(),U.skip||U.subLanguage||(Z+=U.relevance),U=U.parent}while(U!==u.parent);return u.starts&&(u.endSameAsBegin&&(u.starts.endRe=u.endRe),startNewMode(u.starts)),_.returnEnd?0:i.length}let C={};function processLexeme(i,u){const w=u&&u[0];if(Y+=i,null==w)return processBuffer(),0;if("begin"===C.type&&"end"===u.type&&C.index===u.index&&""===w){if(Y+=o.slice(u.index,u.index+1),!_){const o=new Error("0 width match regex");throw o.languageName=s,o.badRule=C.rule,o}return 1}if(C=u,"begin"===u.type)return doBeginMatch(u);if("illegal"===u.type&&!a){const s=new Error('Illegal lexeme "'+w+'" for mode "'+(U.className||"")+'"');throw s.mode=U,s}if("end"===u.type){const s=doEndMatch(u);if(s!==we)return s}if("illegal"===u.type&&""===w)return 1;if(ie>1e5&&ie>3*u.index){throw new Error("potential infinite loop, way more iterations than matches")}return Y+=w,w.length}const L=getLanguage(s);if(!L)throw error(x.replace("{}",s)),new Error('Unknown language: "'+s+'"');const B=compileLanguage(L,{plugins:u});let $="",U=w||B;const V={},z=new j.__emitter(j);!function processContinuations(){const s=[];for(let o=U;o!==L;o=o.parent)o.className&&s.unshift(o.className);s.forEach((s=>z.openNode(s)))}();let Y="",Z=0,ee=0,ie=0,ae=!1;try{for(U.matcher.considerAll();;){ie++,ae?ae=!1:U.matcher.considerAll(),U.matcher.lastIndex=ee;const s=U.matcher.exec(o);if(!s)break;const i=processLexeme(o.substring(ee,s.index),s);ee=s.index+i}return processLexeme(o.substr(ee)),z.closeAllNodes(),z.finalize(),$=z.toHTML(),{relevance:Math.floor(Z),value:$,language:s,illegal:!1,emitter:z,top:U}}catch(i){if(i.message&&i.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:i.message,context:o.slice(ee-100,ee+100),mode:i.mode},sofar:$,relevance:0,value:Se(o),emitter:z};if(_)return{illegal:!1,relevance:0,value:Se(o),emitter:z,language:s,top:U,errorRaised:i};throw i}}function highlightAuto(s,o){o=o||j.languages||Object.keys(i);const a=function justTextHighlightResult(s){const o={relevance:0,emitter:new j.__emitter(j),value:Se(s),illegal:!1,top:C};return o.emitter.addText(s),o}(s),u=o.filter(getLanguage).filter(autoDetection).map((o=>_highlight(o,s,!1)));u.unshift(a);const _=u.sort(((s,o)=>{if(s.relevance!==o.relevance)return o.relevance-s.relevance;if(s.language&&o.language){if(getLanguage(s.language).supersetOf===o.language)return 1;if(getLanguage(o.language).supersetOf===s.language)return-1}return 0})),[w,x]=_,L=w;return L.second_best=x,L}const L={"before:highlightElement":({el:s})=>{j.useBR&&(s.innerHTML=s.innerHTML.replace(/\n/g,"").replace(//g,"\n"))},"after:highlightElement":({result:s})=>{j.useBR&&(s.value=s.value.replace(/\n/g,"
    "))}},B=/^(<[^>]+>|\t)+/gm,$={"after:highlightElement":({result:s})=>{j.tabReplace&&(s.value=s.value.replace(B,(s=>s.replace(/\t/g,j.tabReplace))))}};function highlightElement(s){let o=null;const i=function blockLanguage(s){let o=s.className+" ";o+=s.parentNode?s.parentNode.className:"";const i=j.languageDetectRe.exec(o);if(i){const o=getLanguage(i[1]);return o||(warn(x.replace("{}",i[1])),warn("Falling back to no-highlight mode for this block.",s)),o?i[1]:"no-highlight"}return o.split(/\s+/).find((s=>shouldNotHighlight(s)||getLanguage(s)))}(s);if(shouldNotHighlight(i))return;fire("before:highlightElement",{el:s,language:i}),o=s;const u=o.textContent,_=i?highlight(u,{language:i,ignoreIllegals:!0}):highlightAuto(u);fire("after:highlightElement",{el:s,result:_,text:u}),s.innerHTML=_.value,function updateClassName(s,o,i){const u=o?a[o]:i;s.classList.add("hljs"),u&&s.classList.add(u)}(s,i,_.language),s.result={language:_.language,re:_.relevance,relavance:_.relevance},_.second_best&&(s.second_best={language:_.second_best.language,re:_.second_best.relevance,relavance:_.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let U=!1;function highlightAll(){if("loading"===document.readyState)return void(U=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(s){return s=(s||"").toLowerCase(),i[s]||i[a[s]]}function registerAliases(s,{languageName:o}){"string"==typeof s&&(s=[s]),s.forEach((s=>{a[s.toLowerCase()]=o}))}function autoDetection(s){const o=getLanguage(s);return o&&!o.disableAutodetect}function fire(s,o){const i=s;u.forEach((function(s){s[i]&&s[i](o)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){U&&highlightAll()}),!1),Object.assign(s,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(s){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(s){return j.tabReplace||j.useBR?s.replace(w,(s=>"\n"===s?j.useBR?"
    ":s:j.tabReplace?s.replace(/\t/g,j.tabReplace):s)):s}(s)},highlightElement,highlightBlock:function deprecateHighlightBlock(s){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(s)},configure:function configure(s){s.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),j=_e(j,s)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),U=!0},registerLanguage:function registerLanguage(o,a){let u=null;try{u=a(s)}catch(s){if(error("Language definition for '{}' could not be registered.".replace("{}",o)),!_)throw s;error(s),u=C}u.name||(u.name=o),i[o]=u,u.rawDefinition=a.bind(null,s),u.aliases&®isterAliases(u.aliases,{languageName:o})},unregisterLanguage:function unregisterLanguage(s){delete i[s];for(const o of Object.keys(a))a[o]===s&&delete a[o]},listLanguages:function listLanguages(){return Object.keys(i)},getLanguage,registerAliases,requireLanguage:function requireLanguage(s){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const o=getLanguage(s);if(o)return o;throw new Error("The '{}' language is required, but not loaded.".replace("{}",s))},autoDetection,inherit:_e,addPlugin:function addPlugin(s){!function upgradePluginAPI(s){s["before:highlightBlock"]&&!s["before:highlightElement"]&&(s["before:highlightElement"]=o=>{s["before:highlightBlock"](Object.assign({block:o.el},o))}),s["after:highlightBlock"]&&!s["after:highlightElement"]&&(s["after:highlightElement"]=o=>{s["after:highlightBlock"](Object.assign({block:o.el},o))})}(s),u.push(s)},vuePlugin:BuildVuePlugin(s).VuePlugin}),s.debugMode=function(){_=!1},s.safeMode=function(){_=!0},s.versionString="10.7.3";for(const s in de)"object"==typeof de[s]&&o(de[s]);return Object.assign(s,de),s.addPlugin(L),s.addPlugin(ye),s.addPlugin($),s}({});s.exports=xe},35344(s){function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function bash(s){const o={},i={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[o]}]};Object.assign(o,{className:"variable",variants:[{begin:concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},i]});const a={className:"subst",begin:/\$\(/,end:/\)/,contains:[s.BACKSLASH_ESCAPE]},u={begin:/<<-?\s*(?=\w+)/,starts:{contains:[s.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},_={className:"string",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE,o,a]};a.contains.push(_);const w={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},s.NUMBER_MODE,o]},x=s.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),C={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[s.inherit(s.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[x,s.SHEBANG(),C,w,s.HASH_COMMENT_MODE,u,_,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},o]}}},73402(s){function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function http(s){const o="HTTP/(2|1\\.[01])",i={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},a=[i,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+o+" \\d{3})",end:/$/,contains:[{className:"meta",begin:o},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:a}},{begin:"(?=^[A-Z]+ (.*?) "+o+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:o},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:a}},s.inherit(i,{relevance:0})]}}},95089(s){const o="[A-Za-z$_][0-9A-Za-z$_]*",i=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],a=["true","false","null","undefined","NaN","Infinity"],u=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>function source(s){return s?"string"==typeof s?s:s.source:null}(s))).join("")}s.exports=function javascript(s){const _=o,w="<>",x="",C={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(s,o)=>{const i=s[0].length+s.index,a=s.input[i];"<"!==a?">"===a&&(((s,{after:o})=>{const i="",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:s.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:j,contains:ce}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:w,end:x},{begin:C.begin,"on:begin":C.isTrulyOpeningTag,end:C.end}],subLanguage:"xml",contains:[{begin:C.begin,end:C.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:j,contains:["self",s.inherit(s.TITLE_MODE,{begin:_}),le],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:s.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[le,s.inherit(s.TITLE_MODE,{begin:_})]},{variants:[{begin:"\\."+_},{begin:"\\$"+_}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},s.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[s.inherit(s.TITLE_MODE,{begin:_}),"self",le]},{begin:"(get|set)\\s+(?="+_+"\\()",end:/\{/,keywords:"get set",contains:[s.inherit(s.TITLE_MODE,{begin:_}),{begin:/\(\)/},le]},{begin:/\$[(.]/}]}}},65772(s){s.exports=function json(s){const o={literal:"true false null"},i=[s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE],a=[s.QUOTE_STRING_MODE,s.C_NUMBER_MODE],u={end:",",endsWithParent:!0,excludeEnd:!0,contains:a,keywords:o},_={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[s.BACKSLASH_ESCAPE],illegal:"\\n"},s.inherit(u,{begin:/:/})].concat(i),illegal:"\\S"},w={begin:"\\[",end:"\\]",contains:[s.inherit(u)],illegal:"\\S"};return a.push(_,w),i.forEach((function(s){a.push(s)})),{name:"JSON",contains:a,keywords:o,illegal:"\\S"}}},26571(s){s.exports=function powershell(s){const o={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},i={begin:"`[\\s\\S]",relevance:0},a={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},u={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[i,a,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},_={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},w=s.inherit(s.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),x={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},C={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[s.TITLE_MODE]},j={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[a]}]},L={begin:/using\s/,end:/$/,returnBegin:!0,contains:[u,_,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},B={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},$={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(o.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},s.inherit(s.TITLE_MODE,{endsParent:!0})]},U=[$,w,i,s.NUMBER_MODE,u,_,x,a,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],V={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",U,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return $.contains.unshift(V),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:o,contains:U.concat(C,j,L,B,V)}}},17285(s){function source(s){return s?"string"==typeof s?s:s.source:null}function lookahead(s){return concat("(?=",s,")")}function concat(...s){return s.map((s=>source(s))).join("")}function either(...s){return"("+s.map((s=>source(s))).join("|")+")"}s.exports=function xml(s){const o=concat(/[A-Z_]/,function optional(s){return concat("(",s,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),i={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},a={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},u=s.inherit(a,{begin:/\(/,end:/\)/}),_=s.inherit(s.APOS_STRING_MODE,{className:"meta-string"}),w=s.inherit(s.QUOTE_STRING_MODE,{className:"meta-string"}),x={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[a,w,_,u,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[a,u,w,_]}]}]},s.COMMENT(//,{relevance:10}),{begin://,relevance:10},i,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[x],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[x],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:o,relevance:0,starts:x}]},{className:"tag",begin:concat(/<\//,lookahead(concat(o,/>/))),contains:[{className:"name",begin:o,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},17533(s){s.exports=function yaml(s){var o="true false yes no null",i="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[s.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},u=s.inherit(a,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},w={end:",",endsWithParent:!0,excludeEnd:!0,keywords:o,relevance:0},x={begin:/\{/,end:/\}/,contains:[w],illegal:"\\n",relevance:0},C={begin:"\\[",end:"\\]",contains:[w],illegal:"\\n",relevance:0},j=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+i},{className:"type",begin:"!<"+i+">"},{className:"type",begin:"!"+i},{className:"type",begin:"!!"+i},{className:"meta",begin:"&"+s.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+s.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},s.HASH_COMMENT_MODE,{beginKeywords:o,keywords:{literal:o}},_,{className:"number",begin:s.C_NUMBER_RE+"\\b",relevance:0},x,C,a],L=[...j];return L.pop(),L.push(u),w.contains=L,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:j}}},251(s,o){o.read=function(s,o,i,a,u){var _,w,x=8*u-a-1,C=(1<>1,L=-7,B=i?u-1:0,$=i?-1:1,U=s[o+B];for(B+=$,_=U&(1<<-L)-1,U>>=-L,L+=x;L>0;_=256*_+s[o+B],B+=$,L-=8);for(w=_&(1<<-L)-1,_>>=-L,L+=a;L>0;w=256*w+s[o+B],B+=$,L-=8);if(0===_)_=1-j;else{if(_===C)return w?NaN:1/0*(U?-1:1);w+=Math.pow(2,a),_-=j}return(U?-1:1)*w*Math.pow(2,_-a)},o.write=function(s,o,i,a,u,_){var w,x,C,j=8*_-u-1,L=(1<>1,$=23===u?Math.pow(2,-24)-Math.pow(2,-77):0,U=a?0:_-1,V=a?1:-1,z=o<0||0===o&&1/o<0?1:0;for(o=Math.abs(o),isNaN(o)||o===1/0?(x=isNaN(o)?1:0,w=L):(w=Math.floor(Math.log(o)/Math.LN2),o*(C=Math.pow(2,-w))<1&&(w--,C*=2),(o+=w+B>=1?$/C:$*Math.pow(2,1-B))*C>=2&&(w++,C/=2),w+B>=L?(x=0,w=L):w+B>=1?(x=(o*C-1)*Math.pow(2,u),w+=B):(x=o*Math.pow(2,B-1)*Math.pow(2,u),w=0));u>=8;s[i+U]=255&x,U+=V,x/=256,u-=8);for(w=w<0;s[i+U]=255&w,U+=V,w/=256,j-=8);s[i+U-V]|=128*z}},9404(s){s.exports=function(){"use strict";var s=Array.prototype.slice;function createClass(s,o){o&&(s.prototype=Object.create(o.prototype)),s.prototype.constructor=s}function Iterable(s){return isIterable(s)?s:Seq(s)}function KeyedIterable(s){return isKeyed(s)?s:KeyedSeq(s)}function IndexedIterable(s){return isIndexed(s)?s:IndexedSeq(s)}function SetIterable(s){return isIterable(s)&&!isAssociative(s)?s:SetSeq(s)}function isIterable(s){return!(!s||!s[o])}function isKeyed(s){return!(!s||!s[i])}function isIndexed(s){return!(!s||!s[a])}function isAssociative(s){return isKeyed(s)||isIndexed(s)}function isOrdered(s){return!(!s||!s[u])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var o="@@__IMMUTABLE_ITERABLE__@@",i="@@__IMMUTABLE_KEYED__@@",a="@@__IMMUTABLE_INDEXED__@@",u="@@__IMMUTABLE_ORDERED__@@",_="delete",w=5,x=1<>>0;if(""+i!==o||4294967295===i)return NaN;o=i}return o<0?ensureSize(s)+o:o}function returnTrue(){return!0}function wholeSlice(s,o,i){return(0===s||void 0!==i&&s<=-i)&&(void 0===o||void 0!==i&&o>=i)}function resolveBegin(s,o){return resolveIndex(s,o,0)}function resolveEnd(s,o){return resolveIndex(s,o,o)}function resolveIndex(s,o,i){return void 0===s?i:s<0?Math.max(0,o+s):void 0===o?s:Math.min(o,s)}var $=0,U=1,V=2,z="function"==typeof Symbol&&Symbol.iterator,Y="@@iterator",Z=z||Y;function Iterator(s){this.next=s}function iteratorValue(s,o,i,a){var u=0===s?o:1===s?i:[o,i];return a?a.value=u:a={value:u,done:!1},a}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(s){return!!getIteratorFn(s)}function isIterator(s){return s&&"function"==typeof s.next}function getIterator(s){var o=getIteratorFn(s);return o&&o.call(s)}function getIteratorFn(s){var o=s&&(z&&s[z]||s[Y]);if("function"==typeof o)return o}function isArrayLike(s){return s&&"number"==typeof s.length}function Seq(s){return null==s?emptySequence():isIterable(s)?s.toSeq():seqFromValue(s)}function KeyedSeq(s){return null==s?emptySequence().toKeyedSeq():isIterable(s)?isKeyed(s)?s.toSeq():s.fromEntrySeq():keyedSeqFromValue(s)}function IndexedSeq(s){return null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s.toIndexedSeq():indexedSeqFromValue(s)}function SetSeq(s){return(null==s?emptySequence():isIterable(s)?isKeyed(s)?s.entrySeq():s:indexedSeqFromValue(s)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=$,Iterator.VALUES=U,Iterator.ENTRIES=V,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[Z]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(s,o){return seqIterate(this,s,o,!0)},Seq.prototype.__iterator=function(s,o){return seqIterator(this,s,o,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(s,o){return seqIterate(this,s,o,!1)},IndexedSeq.prototype.__iterator=function(s,o){return seqIterator(this,s,o,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var ee,ie,ae,ce="@@__IMMUTABLE_SEQ__@@";function ArraySeq(s){this._array=s,this.size=s.length}function ObjectSeq(s){var o=Object.keys(s);this._object=s,this._keys=o,this.size=o.length}function IterableSeq(s){this._iterable=s,this.size=s.length||s.size}function IteratorSeq(s){this._iterator=s,this._iteratorCache=[]}function isSeq(s){return!(!s||!s[ce])}function emptySequence(){return ee||(ee=new ArraySeq([]))}function keyedSeqFromValue(s){var o=Array.isArray(s)?new ArraySeq(s).fromEntrySeq():isIterator(s)?new IteratorSeq(s).fromEntrySeq():hasIterator(s)?new IterableSeq(s).fromEntrySeq():"object"==typeof s?new ObjectSeq(s):void 0;if(!o)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+s);return o}function indexedSeqFromValue(s){var o=maybeIndexedSeqFromValue(s);if(!o)throw new TypeError("Expected Array or iterable object of values: "+s);return o}function seqFromValue(s){var o=maybeIndexedSeqFromValue(s)||"object"==typeof s&&new ObjectSeq(s);if(!o)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+s);return o}function maybeIndexedSeqFromValue(s){return isArrayLike(s)?new ArraySeq(s):isIterator(s)?new IteratorSeq(s):hasIterator(s)?new IterableSeq(s):void 0}function seqIterate(s,o,i,a){var u=s._cache;if(u){for(var _=u.length-1,w=0;w<=_;w++){var x=u[i?_-w:w];if(!1===o(x[1],a?x[0]:w,s))return w+1}return w}return s.__iterateUncached(o,i)}function seqIterator(s,o,i,a){var u=s._cache;if(u){var _=u.length-1,w=0;return new Iterator((function(){var s=u[i?_-w:w];return w++>_?iteratorDone():iteratorValue(o,a?s[0]:w-1,s[1])}))}return s.__iteratorUncached(o,i)}function fromJS(s,o){return o?fromJSWith(o,s,"",{"":s}):fromJSDefault(s)}function fromJSWith(s,o,i,a){return Array.isArray(o)?s.call(a,i,IndexedSeq(o).map((function(i,a){return fromJSWith(s,i,a,o)}))):isPlainObj(o)?s.call(a,i,KeyedSeq(o).map((function(i,a){return fromJSWith(s,i,a,o)}))):o}function fromJSDefault(s){return Array.isArray(s)?IndexedSeq(s).map(fromJSDefault).toList():isPlainObj(s)?KeyedSeq(s).map(fromJSDefault).toMap():s}function isPlainObj(s){return s&&(s.constructor===Object||void 0===s.constructor)}function is(s,o){if(s===o||s!=s&&o!=o)return!0;if(!s||!o)return!1;if("function"==typeof s.valueOf&&"function"==typeof o.valueOf){if((s=s.valueOf())===(o=o.valueOf())||s!=s&&o!=o)return!0;if(!s||!o)return!1}return!("function"!=typeof s.equals||"function"!=typeof o.equals||!s.equals(o))}function deepEqual(s,o){if(s===o)return!0;if(!isIterable(o)||void 0!==s.size&&void 0!==o.size&&s.size!==o.size||void 0!==s.__hash&&void 0!==o.__hash&&s.__hash!==o.__hash||isKeyed(s)!==isKeyed(o)||isIndexed(s)!==isIndexed(o)||isOrdered(s)!==isOrdered(o))return!1;if(0===s.size&&0===o.size)return!0;var i=!isAssociative(s);if(isOrdered(s)){var a=s.entries();return o.every((function(s,o){var u=a.next().value;return u&&is(u[1],s)&&(i||is(u[0],o))}))&&a.next().done}var u=!1;if(void 0===s.size)if(void 0===o.size)"function"==typeof s.cacheResult&&s.cacheResult();else{u=!0;var _=s;s=o,o=_}var w=!0,x=o.__iterate((function(o,a){if(i?!s.has(o):u?!is(o,s.get(a,j)):!is(s.get(a,j),o))return w=!1,!1}));return w&&s.size===x}function Repeat(s,o){if(!(this instanceof Repeat))return new Repeat(s,o);if(this._value=s,this.size=void 0===o?1/0:Math.max(0,o),0===this.size){if(ie)return ie;ie=this}}function invariant(s,o){if(!s)throw new Error(o)}function Range(s,o,i){if(!(this instanceof Range))return new Range(s,o,i);if(invariant(0!==i,"Cannot step a Range by 0"),s=s||0,void 0===o&&(o=1/0),i=void 0===i?1:Math.abs(i),oa?iteratorDone():iteratorValue(s,u,i[o?a-u++:u++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(s,o){return void 0===o||this.has(s)?this._object[s]:o},ObjectSeq.prototype.has=function(s){return this._object.hasOwnProperty(s)},ObjectSeq.prototype.__iterate=function(s,o){for(var i=this._object,a=this._keys,u=a.length-1,_=0;_<=u;_++){var w=a[o?u-_:_];if(!1===s(i[w],w,this))return _+1}return _},ObjectSeq.prototype.__iterator=function(s,o){var i=this._object,a=this._keys,u=a.length-1,_=0;return new Iterator((function(){var w=a[o?u-_:_];return _++>u?iteratorDone():iteratorValue(s,w,i[w])}))},ObjectSeq.prototype[u]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(s,o){if(o)return this.cacheResult().__iterate(s,o);var i=getIterator(this._iterable),a=0;if(isIterator(i))for(var u;!(u=i.next()).done&&!1!==s(u.value,a++,this););return a},IterableSeq.prototype.__iteratorUncached=function(s,o){if(o)return this.cacheResult().__iterator(s,o);var i=getIterator(this._iterable);if(!isIterator(i))return new Iterator(iteratorDone);var a=0;return new Iterator((function(){var o=i.next();return o.done?o:iteratorValue(s,a++,o.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(s,o){if(o)return this.cacheResult().__iterate(s,o);for(var i,a=this._iterator,u=this._iteratorCache,_=0;_=a.length){var o=i.next();if(o.done)return o;a[u]=o.value}return iteratorValue(s,u,a[u++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(s,o){return this.has(s)?this._value:o},Repeat.prototype.includes=function(s){return is(this._value,s)},Repeat.prototype.slice=function(s,o){var i=this.size;return wholeSlice(s,o,i)?this:new Repeat(this._value,resolveEnd(o,i)-resolveBegin(s,i))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(s){return is(this._value,s)?0:-1},Repeat.prototype.lastIndexOf=function(s){return is(this._value,s)?this.size:-1},Repeat.prototype.__iterate=function(s,o){for(var i=0;i=0&&o=0&&ii?iteratorDone():iteratorValue(s,_++,w)}))},Range.prototype.equals=function(s){return s instanceof Range?this._start===s._start&&this._end===s._end&&this._step===s._step:deepEqual(this,s)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var le="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(s,o){var i=65535&(s|=0),a=65535&(o|=0);return i*a+((s>>>16)*a+i*(o>>>16)<<16>>>0)|0};function smi(s){return s>>>1&1073741824|3221225471&s}function hash(s){if(!1===s||null==s)return 0;if("function"==typeof s.valueOf&&(!1===(s=s.valueOf())||null==s))return 0;if(!0===s)return 1;var o=typeof s;if("number"===o){if(s!=s||s===1/0)return 0;var i=0|s;for(i!==s&&(i^=4294967295*s);s>4294967295;)i^=s/=4294967295;return smi(i)}if("string"===o)return s.length>_e?cachedHashString(s):hashString(s);if("function"==typeof s.hashCode)return s.hashCode();if("object"===o)return hashJSObj(s);if("function"==typeof s.toString)return hashString(s.toString());throw new Error("Value type "+o+" cannot be hashed.")}function cachedHashString(s){var o=Pe[s];return void 0===o&&(o=hashString(s),xe===we&&(xe=0,Pe={}),xe++,Pe[s]=o),o}function hashString(s){for(var o=0,i=0;i0)switch(s.nodeType){case 1:return s.uniqueID;case 9:return s.documentElement&&s.documentElement.uniqueID}}var fe,ye="function"==typeof WeakMap;ye&&(fe=new WeakMap);var be=0,Se="__immutablehash__";"function"==typeof Symbol&&(Se=Symbol(Se));var _e=16,we=255,xe=0,Pe={};function assertNotInfinite(s){invariant(s!==1/0,"Cannot perform this action with an infinite size.")}function Map(s){return null==s?emptyMap():isMap(s)&&!isOrdered(s)?s:emptyMap().withMutations((function(o){var i=KeyedIterable(s);assertNotInfinite(i.size),i.forEach((function(s,i){return o.set(i,s)}))}))}function isMap(s){return!(!s||!s[Re])}createClass(Map,KeyedCollection),Map.of=function(){var o=s.call(arguments,0);return emptyMap().withMutations((function(s){for(var i=0;i=o.length)throw new Error("Missing value for key: "+o[i]);s.set(o[i],o[i+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(s,o){return this._root?this._root.get(0,void 0,s,o):o},Map.prototype.set=function(s,o){return updateMap(this,s,o)},Map.prototype.setIn=function(s,o){return this.updateIn(s,j,(function(){return o}))},Map.prototype.remove=function(s){return updateMap(this,s,j)},Map.prototype.deleteIn=function(s){return this.updateIn(s,(function(){return j}))},Map.prototype.update=function(s,o,i){return 1===arguments.length?s(this):this.updateIn([s],o,i)},Map.prototype.updateIn=function(s,o,i){i||(i=o,o=void 0);var a=updateInDeepMap(this,forceIterator(s),o,i);return a===j?void 0:a},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(o){return mergeIntoMapWith(this,o,s.call(arguments,1))},Map.prototype.mergeIn=function(o){var i=s.call(arguments,1);return this.updateIn(o,emptyMap(),(function(s){return"function"==typeof s.merge?s.merge.apply(s,i):i[i.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(o){var i=s.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(o),i)},Map.prototype.mergeDeepIn=function(o){var i=s.call(arguments,1);return this.updateIn(o,emptyMap(),(function(s){return"function"==typeof s.mergeDeep?s.mergeDeep.apply(s,i):i[i.length-1]}))},Map.prototype.sort=function(s){return OrderedMap(sortFactory(this,s))},Map.prototype.sortBy=function(s,o){return OrderedMap(sortFactory(this,o,s))},Map.prototype.withMutations=function(s){var o=this.asMutable();return s(o),o.wasAltered()?o.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(s,o){return new MapIterator(this,s,o)},Map.prototype.__iterate=function(s,o){var i=this,a=0;return this._root&&this._root.iterate((function(o){return a++,s(o[1],o[0],i)}),o),a},Map.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeMap(this.size,this._root,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Map.isMap=isMap;var Te,Re="@@__IMMUTABLE_MAP__@@",$e=Map.prototype;function ArrayMapNode(s,o){this.ownerID=s,this.entries=o}function BitmapIndexedNode(s,o,i){this.ownerID=s,this.bitmap=o,this.nodes=i}function HashArrayMapNode(s,o,i){this.ownerID=s,this.count=o,this.nodes=i}function HashCollisionNode(s,o,i){this.ownerID=s,this.keyHash=o,this.entries=i}function ValueNode(s,o,i){this.ownerID=s,this.keyHash=o,this.entry=i}function MapIterator(s,o,i){this._type=o,this._reverse=i,this._stack=s._root&&mapIteratorFrame(s._root)}function mapIteratorValue(s,o){return iteratorValue(s,o[0],o[1])}function mapIteratorFrame(s,o){return{node:s,index:0,__prev:o}}function makeMap(s,o,i,a){var u=Object.create($e);return u.size=s,u._root=o,u.__ownerID=i,u.__hash=a,u.__altered=!1,u}function emptyMap(){return Te||(Te=makeMap(0))}function updateMap(s,o,i){var a,u;if(s._root){var _=MakeRef(L),w=MakeRef(B);if(a=updateNode(s._root,s.__ownerID,0,void 0,o,i,_,w),!w.value)return s;u=s.size+(_.value?i===j?-1:1:0)}else{if(i===j)return s;u=1,a=new ArrayMapNode(s.__ownerID,[[o,i]])}return s.__ownerID?(s.size=u,s._root=a,s.__hash=void 0,s.__altered=!0,s):a?makeMap(u,a):emptyMap()}function updateNode(s,o,i,a,u,_,w,x){return s?s.update(o,i,a,u,_,w,x):_===j?s:(SetRef(x),SetRef(w),new ValueNode(o,a,[u,_]))}function isLeafNode(s){return s.constructor===ValueNode||s.constructor===HashCollisionNode}function mergeIntoNode(s,o,i,a,u){if(s.keyHash===a)return new HashCollisionNode(o,a,[s.entry,u]);var _,x=(0===i?s.keyHash:s.keyHash>>>i)&C,j=(0===i?a:a>>>i)&C;return new BitmapIndexedNode(o,1<>>=1)w[C]=1&i?o[_++]:void 0;return w[a]=u,new HashArrayMapNode(s,_+1,w)}function mergeIntoMapWith(s,o,i){for(var a=[],u=0;u>1&1431655765))+(s>>2&858993459))+(s>>4)&252645135,s+=s>>8,127&(s+=s>>16)}function setIn(s,o,i,a){var u=a?s:arrCopy(s);return u[o]=i,u}function spliceIn(s,o,i,a){var u=s.length+1;if(a&&o+1===u)return s[o]=i,s;for(var _=new Array(u),w=0,x=0;x=qe)return createNodes(s,C,a,u);var U=s&&s===this.ownerID,V=U?C:arrCopy(C);return $?x?L===B-1?V.pop():V[L]=V.pop():V[L]=[a,u]:V.push([a,u]),U?(this.entries=V,this):new ArrayMapNode(s,V)}},BitmapIndexedNode.prototype.get=function(s,o,i,a){void 0===o&&(o=hash(i));var u=1<<((0===s?o:o>>>s)&C),_=this.bitmap;return _&u?this.nodes[popCount(_&u-1)].get(s+w,o,i,a):a},BitmapIndexedNode.prototype.update=function(s,o,i,a,u,_,x){void 0===i&&(i=hash(a));var L=(0===o?i:i>>>o)&C,B=1<=ze)return expandNodes(s,z,$,L,Z);if(U&&!Z&&2===z.length&&isLeafNode(z[1^V]))return z[1^V];if(U&&Z&&1===z.length&&isLeafNode(Z))return Z;var ee=s&&s===this.ownerID,ie=U?Z?$:$^B:$|B,ae=U?Z?setIn(z,V,Z,ee):spliceOut(z,V,ee):spliceIn(z,V,Z,ee);return ee?(this.bitmap=ie,this.nodes=ae,this):new BitmapIndexedNode(s,ie,ae)},HashArrayMapNode.prototype.get=function(s,o,i,a){void 0===o&&(o=hash(i));var u=(0===s?o:o>>>s)&C,_=this.nodes[u];return _?_.get(s+w,o,i,a):a},HashArrayMapNode.prototype.update=function(s,o,i,a,u,_,x){void 0===i&&(i=hash(a));var L=(0===o?i:i>>>o)&C,B=u===j,$=this.nodes,U=$[L];if(B&&!U)return this;var V=updateNode(U,s,o+w,i,a,u,_,x);if(V===U)return this;var z=this.count;if(U){if(!V&&--z0&&a=0&&s>>o&C;if(a>=this.array.length)return new VNode([],s);var u,_=0===a;if(o>0){var x=this.array[a];if((u=x&&x.removeBefore(s,o-w,i))===x&&_)return this}if(_&&!u)return this;var j=editableVNode(this,s);if(!_)for(var L=0;L>>o&C;if(u>=this.array.length)return this;if(o>0){var _=this.array[u];if((a=_&&_.removeAfter(s,o-w,i))===_&&u===this.array.length-1)return this}var x=editableVNode(this,s);return x.array.splice(u+1),a&&(x.array[u]=a),x};var Xe,Qe,et={};function iterateList(s,o){var i=s._origin,a=s._capacity,u=getTailOffset(a),_=s._tail;return iterateNodeOrLeaf(s._root,s._level,0);function iterateNodeOrLeaf(s,o,i){return 0===o?iterateLeaf(s,i):iterateNode(s,o,i)}function iterateLeaf(s,w){var C=w===u?_&&_.array:s&&s.array,j=w>i?0:i-w,L=a-w;return L>x&&(L=x),function(){if(j===L)return et;var s=o?--L:j++;return C&&C[s]}}function iterateNode(s,u,_){var C,j=s&&s.array,L=_>i?0:i-_>>u,B=1+(a-_>>u);return B>x&&(B=x),function(){for(;;){if(C){var s=C();if(s!==et)return s;C=null}if(L===B)return et;var i=o?--B:L++;C=iterateNodeOrLeaf(j&&j[i],u-w,_+(i<=s.size||o<0)return s.withMutations((function(s){o<0?setListBounds(s,o).set(0,i):setListBounds(s,0,o+1).set(o,i)}));o+=s._origin;var a=s._tail,u=s._root,_=MakeRef(B);return o>=getTailOffset(s._capacity)?a=updateVNode(a,s.__ownerID,0,o,i,_):u=updateVNode(u,s.__ownerID,s._level,o,i,_),_.value?s.__ownerID?(s._root=u,s._tail=a,s.__hash=void 0,s.__altered=!0,s):makeList(s._origin,s._capacity,s._level,u,a):s}function updateVNode(s,o,i,a,u,_){var x,j=a>>>i&C,L=s&&j0){var B=s&&s.array[j],$=updateVNode(B,o,i-w,a,u,_);return $===B?s:((x=editableVNode(s,o)).array[j]=$,x)}return L&&s.array[j]===u?s:(SetRef(_),x=editableVNode(s,o),void 0===u&&j===x.array.length-1?x.array.pop():x.array[j]=u,x)}function editableVNode(s,o){return o&&s&&o===s.ownerID?s:new VNode(s?s.array.slice():[],o)}function listNodeFor(s,o){if(o>=getTailOffset(s._capacity))return s._tail;if(o<1<0;)i=i.array[o>>>a&C],a-=w;return i}}function setListBounds(s,o,i){void 0!==o&&(o|=0),void 0!==i&&(i|=0);var a=s.__ownerID||new OwnerID,u=s._origin,_=s._capacity,x=u+o,j=void 0===i?_:i<0?_+i:u+i;if(x===u&&j===_)return s;if(x>=j)return s.clear();for(var L=s._level,B=s._root,$=0;x+$<0;)B=new VNode(B&&B.array.length?[void 0,B]:[],a),$+=1<<(L+=w);$&&(x+=$,u+=$,j+=$,_+=$);for(var U=getTailOffset(_),V=getTailOffset(j);V>=1<U?new VNode([],a):z;if(z&&V>U&&x<_&&z.array.length){for(var Z=B=editableVNode(B,a),ee=L;ee>w;ee-=w){var ie=U>>>ee&C;Z=Z.array[ie]=editableVNode(Z.array[ie],a)}Z.array[U>>>w&C]=z}if(j<_&&(Y=Y&&Y.removeAfter(a,0,j)),x>=V)x-=V,j-=V,L=w,B=null,Y=Y&&Y.removeBefore(a,0,x);else if(x>u||V>>L&C;if(ae!==V>>>L&C)break;ae&&($+=(1<u&&(B=B.removeBefore(a,L,x-$)),B&&Vu&&(u=x.size),isIterable(w)||(x=x.map((function(s){return fromJS(s)}))),a.push(x)}return u>s.size&&(s=s.setSize(u)),mergeIntoCollectionWith(s,o,a)}function getTailOffset(s){return s>>w<=x&&w.size>=2*_.size?(a=(u=w.filter((function(s,o){return void 0!==s&&C!==o}))).toKeyedSeq().map((function(s){return s[0]})).flip().toMap(),s.__ownerID&&(a.__ownerID=u.__ownerID=s.__ownerID)):(a=_.remove(o),u=C===w.size-1?w.pop():w.set(C,void 0))}else if(L){if(i===w.get(C)[1])return s;a=_,u=w.set(C,[o,i])}else a=_.set(o,w.size),u=w.set(w.size,[o,i]);return s.__ownerID?(s.size=a.size,s._map=a,s._list=u,s.__hash=void 0,s):makeOrderedMap(a,u)}function ToKeyedSequence(s,o){this._iter=s,this._useKeys=o,this.size=s.size}function ToIndexedSequence(s){this._iter=s,this.size=s.size}function ToSetSequence(s){this._iter=s,this.size=s.size}function FromEntriesSequence(s){this._iter=s,this.size=s.size}function flipFactory(s){var o=makeSequence(s);return o._iter=s,o.size=s.size,o.flip=function(){return s},o.reverse=function(){var o=s.reverse.apply(this);return o.flip=function(){return s.reverse()},o},o.has=function(o){return s.includes(o)},o.includes=function(o){return s.has(o)},o.cacheResult=cacheResultThrough,o.__iterateUncached=function(o,i){var a=this;return s.__iterate((function(s,i){return!1!==o(i,s,a)}),i)},o.__iteratorUncached=function(o,i){if(o===V){var a=s.__iterator(o,i);return new Iterator((function(){var s=a.next();if(!s.done){var o=s.value[0];s.value[0]=s.value[1],s.value[1]=o}return s}))}return s.__iterator(o===U?$:U,i)},o}function mapFactory(s,o,i){var a=makeSequence(s);return a.size=s.size,a.has=function(o){return s.has(o)},a.get=function(a,u){var _=s.get(a,j);return _===j?u:o.call(i,_,a,s)},a.__iterateUncached=function(a,u){var _=this;return s.__iterate((function(s,u,w){return!1!==a(o.call(i,s,u,w),u,_)}),u)},a.__iteratorUncached=function(a,u){var _=s.__iterator(V,u);return new Iterator((function(){var u=_.next();if(u.done)return u;var w=u.value,x=w[0];return iteratorValue(a,x,o.call(i,w[1],x,s),u)}))},a}function reverseFactory(s,o){var i=makeSequence(s);return i._iter=s,i.size=s.size,i.reverse=function(){return s},s.flip&&(i.flip=function(){var o=flipFactory(s);return o.reverse=function(){return s.flip()},o}),i.get=function(i,a){return s.get(o?i:-1-i,a)},i.has=function(i){return s.has(o?i:-1-i)},i.includes=function(o){return s.includes(o)},i.cacheResult=cacheResultThrough,i.__iterate=function(o,i){var a=this;return s.__iterate((function(s,i){return o(s,i,a)}),!i)},i.__iterator=function(o,i){return s.__iterator(o,!i)},i}function filterFactory(s,o,i,a){var u=makeSequence(s);return a&&(u.has=function(a){var u=s.get(a,j);return u!==j&&!!o.call(i,u,a,s)},u.get=function(a,u){var _=s.get(a,j);return _!==j&&o.call(i,_,a,s)?_:u}),u.__iterateUncached=function(u,_){var w=this,x=0;return s.__iterate((function(s,_,C){if(o.call(i,s,_,C))return x++,u(s,a?_:x-1,w)}),_),x},u.__iteratorUncached=function(u,_){var w=s.__iterator(V,_),x=0;return new Iterator((function(){for(;;){var _=w.next();if(_.done)return _;var C=_.value,j=C[0],L=C[1];if(o.call(i,L,j,s))return iteratorValue(u,a?j:x++,L,_)}}))},u}function countByFactory(s,o,i){var a=Map().asMutable();return s.__iterate((function(u,_){a.update(o.call(i,u,_,s),0,(function(s){return s+1}))})),a.asImmutable()}function groupByFactory(s,o,i){var a=isKeyed(s),u=(isOrdered(s)?OrderedMap():Map()).asMutable();s.__iterate((function(_,w){u.update(o.call(i,_,w,s),(function(s){return(s=s||[]).push(a?[w,_]:_),s}))}));var _=iterableClass(s);return u.map((function(o){return reify(s,_(o))}))}function sliceFactory(s,o,i,a){var u=s.size;if(void 0!==o&&(o|=0),void 0!==i&&(i===1/0?i=u:i|=0),wholeSlice(o,i,u))return s;var _=resolveBegin(o,u),w=resolveEnd(i,u);if(_!=_||w!=w)return sliceFactory(s.toSeq().cacheResult(),o,i,a);var x,C=w-_;C==C&&(x=C<0?0:C);var j=makeSequence(s);return j.size=0===x?x:s.size&&x||void 0,!a&&isSeq(s)&&x>=0&&(j.get=function(o,i){return(o=wrapIndex(this,o))>=0&&ox)return iteratorDone();var s=u.next();return a||o===U?s:iteratorValue(o,C-1,o===$?void 0:s.value[1],s)}))},j}function takeWhileFactory(s,o,i){var a=makeSequence(s);return a.__iterateUncached=function(a,u){var _=this;if(u)return this.cacheResult().__iterate(a,u);var w=0;return s.__iterate((function(s,u,x){return o.call(i,s,u,x)&&++w&&a(s,u,_)})),w},a.__iteratorUncached=function(a,u){var _=this;if(u)return this.cacheResult().__iterator(a,u);var w=s.__iterator(V,u),x=!0;return new Iterator((function(){if(!x)return iteratorDone();var s=w.next();if(s.done)return s;var u=s.value,C=u[0],j=u[1];return o.call(i,j,C,_)?a===V?s:iteratorValue(a,C,j,s):(x=!1,iteratorDone())}))},a}function skipWhileFactory(s,o,i,a){var u=makeSequence(s);return u.__iterateUncached=function(u,_){var w=this;if(_)return this.cacheResult().__iterate(u,_);var x=!0,C=0;return s.__iterate((function(s,_,j){if(!x||!(x=o.call(i,s,_,j)))return C++,u(s,a?_:C-1,w)})),C},u.__iteratorUncached=function(u,_){var w=this;if(_)return this.cacheResult().__iterator(u,_);var x=s.__iterator(V,_),C=!0,j=0;return new Iterator((function(){var s,_,L;do{if((s=x.next()).done)return a||u===U?s:iteratorValue(u,j++,u===$?void 0:s.value[1],s);var B=s.value;_=B[0],L=B[1],C&&(C=o.call(i,L,_,w))}while(C);return u===V?s:iteratorValue(u,_,L,s)}))},u}function concatFactory(s,o){var i=isKeyed(s),a=[s].concat(o).map((function(s){return isIterable(s)?i&&(s=KeyedIterable(s)):s=i?keyedSeqFromValue(s):indexedSeqFromValue(Array.isArray(s)?s:[s]),s})).filter((function(s){return 0!==s.size}));if(0===a.length)return s;if(1===a.length){var u=a[0];if(u===s||i&&isKeyed(u)||isIndexed(s)&&isIndexed(u))return u}var _=new ArraySeq(a);return i?_=_.toKeyedSeq():isIndexed(s)||(_=_.toSetSeq()),(_=_.flatten(!0)).size=a.reduce((function(s,o){if(void 0!==s){var i=o.size;if(void 0!==i)return s+i}}),0),_}function flattenFactory(s,o,i){var a=makeSequence(s);return a.__iterateUncached=function(a,u){var _=0,w=!1;function flatDeep(s,x){var C=this;s.__iterate((function(s,u){return(!o||x0}function zipWithFactory(s,o,i){var a=makeSequence(s);return a.size=new ArraySeq(i).map((function(s){return s.size})).min(),a.__iterate=function(s,o){for(var i,a=this.__iterator(U,o),u=0;!(i=a.next()).done&&!1!==s(i.value,u++,this););return u},a.__iteratorUncached=function(s,a){var u=i.map((function(s){return s=Iterable(s),getIterator(a?s.reverse():s)})),_=0,w=!1;return new Iterator((function(){var i;return w||(i=u.map((function(s){return s.next()})),w=i.some((function(s){return s.done}))),w?iteratorDone():iteratorValue(s,_++,o.apply(null,i.map((function(s){return s.value}))))}))},a}function reify(s,o){return isSeq(s)?o:s.constructor(o)}function validateEntry(s){if(s!==Object(s))throw new TypeError("Expected [K, V] tuple: "+s)}function resolveSize(s){return assertNotInfinite(s.size),ensureSize(s)}function iterableClass(s){return isKeyed(s)?KeyedIterable:isIndexed(s)?IndexedIterable:SetIterable}function makeSequence(s){return Object.create((isKeyed(s)?KeyedSeq:isIndexed(s)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(s,o){return s>o?1:s=0;i--)o={value:arguments[i],next:o};return this.__ownerID?(this.size=s,this._head=o,this.__hash=void 0,this.__altered=!0,this):makeStack(s,o)},Stack.prototype.pushAll=function(s){if(0===(s=IndexedIterable(s)).size)return this;assertNotInfinite(s.size);var o=this.size,i=this._head;return s.reverse().forEach((function(s){o++,i={value:s,next:i}})),this.__ownerID?(this.size=o,this._head=i,this.__hash=void 0,this.__altered=!0,this):makeStack(o,i)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(s){return this.pushAll(s)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(s,o){if(wholeSlice(s,o,this.size))return this;var i=resolveBegin(s,this.size);if(resolveEnd(o,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,s,o);for(var a=this.size-i,u=this._head;i--;)u=u.next;return this.__ownerID?(this.size=a,this._head=u,this.__hash=void 0,this.__altered=!0,this):makeStack(a,u)},Stack.prototype.__ensureOwner=function(s){return s===this.__ownerID?this:s?makeStack(this.size,this._head,s,this.__hash):(this.__ownerID=s,this.__altered=!1,this)},Stack.prototype.__iterate=function(s,o){if(o)return this.reverse().__iterate(s);for(var i=0,a=this._head;a&&!1!==s(a.value,i++,this);)a=a.next;return i},Stack.prototype.__iterator=function(s,o){if(o)return this.reverse().__iterator(s);var i=0,a=this._head;return new Iterator((function(){if(a){var o=a.value;return a=a.next,iteratorValue(s,i++,o)}return iteratorDone()}))},Stack.isStack=isStack;var at,ct="@@__IMMUTABLE_STACK__@@",lt=Stack.prototype;function makeStack(s,o,i,a){var u=Object.create(lt);return u.size=s,u._head=o,u.__ownerID=i,u.__hash=a,u.__altered=!1,u}function emptyStack(){return at||(at=makeStack(0))}function mixin(s,o){var keyCopier=function(i){s.prototype[i]=o[i]};return Object.keys(o).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(o).forEach(keyCopier),s}function isProtoKey(s){return"string"==typeof s&&("__proto__"===s||"constructor"===s)}lt[ct]=!0,lt.withMutations=$e.withMutations,lt.asMutable=$e.asMutable,lt.asImmutable=$e.asImmutable,lt.wasAltered=$e.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var s=new Array(this.size||0);return this.valueSeq().__iterate((function(o,i){s[i]=o})),s},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJS?s.toJS():s})).__toJS()},toJSON:function(){return this.toSeq().map((function(s){return s&&"function"==typeof s.toJSON?s.toJSON():s})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var s={};return this.__iterate((function(o,i){isProtoKey(i)||(s[i]=o)})),s},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(s,o){return 0===this.size?s+o:s+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+o},concat:function(){return reify(this,concatFactory(this,s.call(arguments,0)))},includes:function(s){return this.some((function(o){return is(o,s)}))},entries:function(){return this.__iterator(V)},every:function(s,o){assertNotInfinite(this.size);var i=!0;return this.__iterate((function(a,u,_){if(!s.call(o,a,u,_))return i=!1,!1})),i},filter:function(s,o){return reify(this,filterFactory(this,s,o,!0))},find:function(s,o,i){var a=this.findEntry(s,o);return a?a[1]:i},forEach:function(s,o){return assertNotInfinite(this.size),this.__iterate(o?s.bind(o):s)},join:function(s){assertNotInfinite(this.size),s=void 0!==s?""+s:",";var o="",i=!0;return this.__iterate((function(a){i?i=!1:o+=s,o+=null!=a?a.toString():""})),o},keys:function(){return this.__iterator($)},map:function(s,o){return reify(this,mapFactory(this,s,o))},reduce:function(s,o,i){var a,u;return assertNotInfinite(this.size),arguments.length<2?u=!0:a=o,this.__iterate((function(o,_,w){u?(u=!1,a=o):a=s.call(i,a,o,_,w)})),a},reduceRight:function(s,o,i){var a=this.toKeyedSeq().reverse();return a.reduce.apply(a,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(s,o){return reify(this,sliceFactory(this,s,o,!0))},some:function(s,o){return!this.every(not(s),o)},sort:function(s){return reify(this,sortFactory(this,s))},values:function(){return this.__iterator(U)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(s,o){return ensureSize(s?this.toSeq().filter(s,o):this)},countBy:function(s,o){return countByFactory(this,s,o)},equals:function(s){return deepEqual(this,s)},entrySeq:function(){var s=this;if(s._cache)return new ArraySeq(s._cache);var o=s.toSeq().map(entryMapper).toIndexedSeq();return o.fromEntrySeq=function(){return s.toSeq()},o},filterNot:function(s,o){return this.filter(not(s),o)},findEntry:function(s,o,i){var a=i;return this.__iterate((function(i,u,_){if(s.call(o,i,u,_))return a=[u,i],!1})),a},findKey:function(s,o){var i=this.findEntry(s,o);return i&&i[0]},findLast:function(s,o,i){return this.toKeyedSeq().reverse().find(s,o,i)},findLastEntry:function(s,o,i){return this.toKeyedSeq().reverse().findEntry(s,o,i)},findLastKey:function(s,o){return this.toKeyedSeq().reverse().findKey(s,o)},first:function(){return this.find(returnTrue)},flatMap:function(s,o){return reify(this,flatMapFactory(this,s,o))},flatten:function(s){return reify(this,flattenFactory(this,s,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(s,o){return this.find((function(o,i){return is(i,s)}),void 0,o)},getIn:function(s,o){for(var i,a=this,u=forceIterator(s);!(i=u.next()).done;){var _=i.value;if((a=a&&a.get?a.get(_,j):j)===j)return o}return a},groupBy:function(s,o){return groupByFactory(this,s,o)},has:function(s){return this.get(s,j)!==j},hasIn:function(s){return this.getIn(s,j)!==j},isSubset:function(s){return s="function"==typeof s.includes?s:Iterable(s),this.every((function(o){return s.includes(o)}))},isSuperset:function(s){return(s="function"==typeof s.isSubset?s:Iterable(s)).isSubset(this)},keyOf:function(s){return this.findKey((function(o){return is(o,s)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(s){return this.toKeyedSeq().reverse().keyOf(s)},max:function(s){return maxFactory(this,s)},maxBy:function(s,o){return maxFactory(this,o,s)},min:function(s){return maxFactory(this,s?neg(s):defaultNegComparator)},minBy:function(s,o){return maxFactory(this,o?neg(o):defaultNegComparator,s)},rest:function(){return this.slice(1)},skip:function(s){return this.slice(Math.max(0,s))},skipLast:function(s){return reify(this,this.toSeq().reverse().skip(s).reverse())},skipWhile:function(s,o){return reify(this,skipWhileFactory(this,s,o,!0))},skipUntil:function(s,o){return this.skipWhile(not(s),o)},sortBy:function(s,o){return reify(this,sortFactory(this,o,s))},take:function(s){return this.slice(0,Math.max(0,s))},takeLast:function(s){return reify(this,this.toSeq().reverse().take(s).reverse())},takeWhile:function(s,o){return reify(this,takeWhileFactory(this,s,o))},takeUntil:function(s,o){return this.takeWhile(not(s),o)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var ut=Iterable.prototype;ut[o]=!0,ut[Z]=ut.values,ut.__toJS=ut.toArray,ut.__toStringMapper=quoteString,ut.inspect=ut.toSource=function(){return this.toString()},ut.chain=ut.flatMap,ut.contains=ut.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(s,o){var i=this,a=0;return reify(this,this.toSeq().map((function(u,_){return s.call(o,[_,u],a++,i)})).fromEntrySeq())},mapKeys:function(s,o){var i=this;return reify(this,this.toSeq().flip().map((function(a,u){return s.call(o,a,u,i)})).flip())}});var pt=KeyedIterable.prototype;function keyMapper(s,o){return o}function entryMapper(s,o){return[o,s]}function not(s){return function(){return!s.apply(this,arguments)}}function neg(s){return function(){return-s.apply(this,arguments)}}function quoteString(s){return"string"==typeof s?JSON.stringify(s):String(s)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(s,o){return so?-1:0}function hashIterable(s){if(s.size===1/0)return 0;var o=isOrdered(s),i=isKeyed(s),a=o?1:0;return murmurHashOfSize(s.__iterate(i?o?function(s,o){a=31*a+hashMerge(hash(s),hash(o))|0}:function(s,o){a=a+hashMerge(hash(s),hash(o))|0}:o?function(s){a=31*a+hash(s)|0}:function(s){a=a+hash(s)|0}),a)}function murmurHashOfSize(s,o){return o=le(o,3432918353),o=le(o<<15|o>>>-15,461845907),o=le(o<<13|o>>>-13,5),o=le((o=o+3864292196^s)^o>>>16,2246822507),o=smi((o=le(o^o>>>13,3266489909))^o>>>16)}function hashMerge(s,o){return s^o+2654435769+(s<<6)+(s>>2)}return pt[i]=!0,pt[Z]=ut.entries,pt.__toJS=ut.toObject,pt.__toStringMapper=function(s,o){return JSON.stringify(o)+": "+quoteString(s)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(s,o){return reify(this,filterFactory(this,s,o,!1))},findIndex:function(s,o){var i=this.findEntry(s,o);return i?i[0]:-1},indexOf:function(s){var o=this.keyOf(s);return void 0===o?-1:o},lastIndexOf:function(s){var o=this.lastKeyOf(s);return void 0===o?-1:o},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(s,o){return reify(this,sliceFactory(this,s,o,!1))},splice:function(s,o){var i=arguments.length;if(o=Math.max(0|o,0),0===i||2===i&&!o)return this;s=resolveBegin(s,s<0?this.count():this.size);var a=this.slice(0,s);return reify(this,1===i?a:a.concat(arrCopy(arguments,2),this.slice(s+o)))},findLastIndex:function(s,o){var i=this.findLastEntry(s,o);return i?i[0]:-1},first:function(){return this.get(0)},flatten:function(s){return reify(this,flattenFactory(this,s,!1))},get:function(s,o){return(s=wrapIndex(this,s))<0||this.size===1/0||void 0!==this.size&&s>this.size?o:this.find((function(o,i){return i===s}),void 0,o)},has:function(s){return(s=wrapIndex(this,s))>=0&&(void 0!==this.size?this.size===1/0||s=o||i<0||B&&s-j>=_}function timerExpired(){var s=now();if(shouldInvoke(s))return trailingEdge(s);x=setTimeout(timerExpired,function remainingWait(s){var i=o-(s-C);return B?U(i,_-(s-j)):i}(s))}function trailingEdge(s){return x=void 0,V&&a?invokeFunc(s):(a=u=void 0,w)}function debounced(){var s=now(),i=shouldInvoke(s);if(a=arguments,u=this,C=s,i){if(void 0===x)return function leadingEdge(s){return j=s,x=setTimeout(timerExpired,o),L?invokeFunc(s):w}(C);if(B)return x=setTimeout(timerExpired,o),invokeFunc(C)}return void 0===x&&(x=setTimeout(timerExpired,o)),w}return o=toNumber(o)||0,isObject(i)&&(L=!!i.leading,_=(B="maxWait"in i)?$(toNumber(i.maxWait)||0,o):_,V="trailing"in i?!!i.trailing:V),debounced.cancel=function cancel(){void 0!==x&&clearTimeout(x),j=0,a=C=u=x=void 0},debounced.flush=function flush(){return void 0===x?w:trailingEdge(now())},debounced}},55580(s,o,i){var a=i(56110)(i(9325),"DataView");s.exports=a},21549(s,o,i){var a=i(22032),u=i(63862),_=i(66721),w=i(12749),x=i(35749);function Hash(s){var o=-1,i=null==s?0:s.length;for(this.clear();++o-1}},70695(s,o,i){var a=i(78096),u=i(72428),_=i(56449),w=i(3656),x=i(30361),C=i(37167),j=Object.prototype.hasOwnProperty;s.exports=function arrayLikeKeys(s,o){var i=_(s),L=!i&&u(s),B=!i&&!L&&w(s),$=!i&&!L&&!B&&C(s),U=i||L||B||$,V=U?a(s.length,String):[],z=V.length;for(var Y in s)!o&&!j.call(s,Y)||U&&("length"==Y||B&&("offset"==Y||"parent"==Y)||$&&("buffer"==Y||"byteLength"==Y||"byteOffset"==Y)||x(Y,z))||V.push(Y);return V}},34932(s){s.exports=function arrayMap(s,o){for(var i=-1,a=null==s?0:s.length,u=Array(a);++i0&&i(j)?o>1?baseFlatten(j,o-1,i,_,w):a(w,j):_||(w[w.length]=j)}return w}},86649(s,o,i){var a=i(83221)();s.exports=a},30641(s,o,i){var a=i(86649),u=i(95950);s.exports=function baseForOwn(s,o){return s&&a(s,o,u)}},47422(s,o,i){var a=i(31769),u=i(77797);s.exports=function baseGet(s,o){for(var i=0,_=(o=a(o,s)).length;null!=s&&i<_;)s=s[u(o[i++])];return i&&i==_?s:void 0}},82199(s,o,i){var a=i(14528),u=i(56449);s.exports=function baseGetAllKeys(s,o,i){var _=o(s);return u(s)?_:a(_,i(s))}},72552(s,o,i){var a=i(51873),u=i(659),_=i(59350),w=a?a.toStringTag:void 0;s.exports=function baseGetTag(s){return null==s?void 0===s?"[object Undefined]":"[object Null]":w&&w in Object(s)?u(s):_(s)}},20426(s){var o=Object.prototype.hasOwnProperty;s.exports=function baseHas(s,i){return null!=s&&o.call(s,i)}},28077(s){s.exports=function baseHasIn(s,o){return null!=s&&o in Object(s)}},96131(s,o,i){var a=i(2523),u=i(85463),_=i(76959);s.exports=function baseIndexOf(s,o,i){return o==o?_(s,o,i):a(s,u,i)}},27534(s,o,i){var a=i(72552),u=i(40346);s.exports=function baseIsArguments(s){return u(s)&&"[object Arguments]"==a(s)}},60270(s,o,i){var a=i(87068),u=i(40346);s.exports=function baseIsEqual(s,o,i,_,w){return s===o||(null==s||null==o||!u(s)&&!u(o)?s!=s&&o!=o:a(s,o,i,_,baseIsEqual,w))}},87068(s,o,i){var a=i(37217),u=i(25911),_=i(21986),w=i(50689),x=i(5861),C=i(56449),j=i(3656),L=i(37167),B="[object Arguments]",$="[object Array]",U="[object Object]",V=Object.prototype.hasOwnProperty;s.exports=function baseIsEqualDeep(s,o,i,z,Y,Z){var ee=C(s),ie=C(o),ae=ee?$:x(s),ce=ie?$:x(o),le=(ae=ae==B?U:ae)==U,pe=(ce=ce==B?U:ce)==U,de=ae==ce;if(de&&j(s)){if(!j(o))return!1;ee=!0,le=!1}if(de&&!le)return Z||(Z=new a),ee||L(s)?u(s,o,i,z,Y,Z):_(s,o,ae,i,z,Y,Z);if(!(1&i)){var fe=le&&V.call(s,"__wrapped__"),ye=pe&&V.call(o,"__wrapped__");if(fe||ye){var be=fe?s.value():s,Se=ye?o.value():o;return Z||(Z=new a),Y(be,Se,i,z,Z)}}return!!de&&(Z||(Z=new a),w(s,o,i,z,Y,Z))}},29172(s,o,i){var a=i(5861),u=i(40346);s.exports=function baseIsMap(s){return u(s)&&"[object Map]"==a(s)}},41799(s,o,i){var a=i(37217),u=i(60270);s.exports=function baseIsMatch(s,o,i,_){var w=i.length,x=w,C=!_;if(null==s)return!x;for(s=Object(s);w--;){var j=i[w];if(C&&j[2]?j[1]!==s[j[0]]:!(j[0]in s))return!1}for(;++wu?0:u+o),(i=i>u?u:i)<0&&(i+=u),u=o>i?0:i-o>>>0,o>>>=0;for(var _=Array(u);++a=u?s:a(s,o,i)}},49653(s,o,i){var a=i(37828);s.exports=function cloneArrayBuffer(s){var o=new s.constructor(s.byteLength);return new a(o).set(new a(s)),o}},93290(s,o,i){s=i.nmd(s);var a=i(9325),u=o&&!o.nodeType&&o,_=u&&s&&!s.nodeType&&s,w=_&&_.exports===u?a.Buffer:void 0,x=w?w.allocUnsafe:void 0;s.exports=function cloneBuffer(s,o){if(o)return s.slice();var i=s.length,a=x?x(i):new s.constructor(i);return s.copy(a),a}},76169(s,o,i){var a=i(49653);s.exports=function cloneDataView(s,o){var i=o?a(s.buffer):s.buffer;return new s.constructor(i,s.byteOffset,s.byteLength)}},73201(s){var o=/\w*$/;s.exports=function cloneRegExp(s){var i=new s.constructor(s.source,o.exec(s));return i.lastIndex=s.lastIndex,i}},93736(s,o,i){var a=i(51873),u=a?a.prototype:void 0,_=u?u.valueOf:void 0;s.exports=function cloneSymbol(s){return _?Object(_.call(s)):{}}},71961(s,o,i){var a=i(49653);s.exports=function cloneTypedArray(s,o){var i=o?a(s.buffer):s.buffer;return new s.constructor(i,s.byteOffset,s.length)}},91596(s){var o=Math.max;s.exports=function composeArgs(s,i,a,u){for(var _=-1,w=s.length,x=a.length,C=-1,j=i.length,L=o(w-x,0),B=Array(j+L),$=!u;++C1?i[_-1]:void 0,x=_>2?i[2]:void 0;for(w=s.length>3&&"function"==typeof w?(_--,w):void 0,x&&u(i[0],i[1],x)&&(w=_<3?void 0:w,_=1),o=Object(o);++a<_;){var C=i[a];C&&s(o,C,a,w)}return o}))}},38329(s,o,i){var a=i(64894);s.exports=function createBaseEach(s,o){return function(i,u){if(null==i)return i;if(!a(i))return s(i,u);for(var _=i.length,w=o?_:-1,x=Object(i);(o?w--:++w<_)&&!1!==u(x[w],w,x););return i}}},83221(s){s.exports=function createBaseFor(s){return function(o,i,a){for(var u=-1,_=Object(o),w=a(o),x=w.length;x--;){var C=w[s?x:++u];if(!1===i(_[C],C,_))break}return o}}},11842(s,o,i){var a=i(82819),u=i(9325);s.exports=function createBind(s,o,i){var _=1&o,w=a(s);return function wrapper(){return(this&&this!==u&&this instanceof wrapper?w:s).apply(_?i:this,arguments)}}},12507(s,o,i){var a=i(28754),u=i(49698),_=i(63912),w=i(13222);s.exports=function createCaseFirst(s){return function(o){o=w(o);var i=u(o)?_(o):void 0,x=i?i[0]:o.charAt(0),C=i?a(i,1).join(""):o.slice(1);return x[s]()+C}}},45539(s,o,i){var a=i(40882),u=i(50828),_=i(66645),w=RegExp("['’]","g");s.exports=function createCompounder(s){return function(o){return a(_(u(o).replace(w,"")),s,"")}}},82819(s,o,i){var a=i(39344),u=i(23805);s.exports=function createCtor(s){return function(){var o=arguments;switch(o.length){case 0:return new s;case 1:return new s(o[0]);case 2:return new s(o[0],o[1]);case 3:return new s(o[0],o[1],o[2]);case 4:return new s(o[0],o[1],o[2],o[3]);case 5:return new s(o[0],o[1],o[2],o[3],o[4]);case 6:return new s(o[0],o[1],o[2],o[3],o[4],o[5]);case 7:return new s(o[0],o[1],o[2],o[3],o[4],o[5],o[6])}var i=a(s.prototype),_=s.apply(i,o);return u(_)?_:i}}},77078(s,o,i){var a=i(91033),u=i(82819),_=i(37471),w=i(18073),x=i(11287),C=i(36306),j=i(9325);s.exports=function createCurry(s,o,i){var L=u(s);return function wrapper(){for(var u=arguments.length,B=Array(u),$=u,U=x(wrapper);$--;)B[$]=arguments[$];var V=u<3&&B[0]!==U&&B[u-1]!==U?[]:C(B,U);return(u-=V.length)-1?x[C?o[j]:j]:void 0}}},37471(s,o,i){var a=i(91596),u=i(53320),_=i(58523),w=i(82819),x=i(18073),C=i(11287),j=i(68294),L=i(36306),B=i(9325);s.exports=function createHybrid(s,o,i,$,U,V,z,Y,Z,ee){var ie=128&o,ae=1&o,ce=2&o,le=24&o,pe=512&o,de=ce?void 0:w(s);return function wrapper(){for(var fe=arguments.length,ye=Array(fe),be=fe;be--;)ye[be]=arguments[be];if(le)var Se=C(wrapper),_e=_(ye,Se);if($&&(ye=a(ye,$,U,le)),V&&(ye=u(ye,V,z,le)),fe-=_e,le&&fe1&&ye.reverse(),ie&&ZL))return!1;var $=C.get(s),U=C.get(o);if($&&U)return $==o&&U==s;var V=-1,z=!0,Y=2&i?new a:void 0;for(C.set(s,o),C.set(o,s);++V1?"& ":"")+i[u],i=i.join(a>2?", ":" "),s.replace(o,"{\n/* [wrapped with "+i+"] */\n")}},45891(s,o,i){var a=i(51873),u=i(72428),_=i(56449),w=a?a.isConcatSpreadable:void 0;s.exports=function isFlattenable(s){return _(s)||u(s)||!!(w&&s&&s[w])}},30361(s){var o=/^(?:0|[1-9]\d*)$/;s.exports=function isIndex(s,i){var a=typeof s;return!!(i=null==i?9007199254740991:i)&&("number"==a||"symbol"!=a&&o.test(s))&&s>-1&&s%1==0&&s-1}},31175(s,o,i){var a=i(26025);s.exports=function listCacheSet(s,o){var i=this.__data__,u=a(i,s);return u<0?(++this.size,i.push([s,o])):i[u][1]=o,this}},63040(s,o,i){var a=i(21549),u=i(80079),_=i(68223);s.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new a,map:new(_||u),string:new a}}},17670(s,o,i){var a=i(12651);s.exports=function mapCacheDelete(s){var o=a(this,s).delete(s);return this.size-=o?1:0,o}},90289(s,o,i){var a=i(12651);s.exports=function mapCacheGet(s){return a(this,s).get(s)}},4509(s,o,i){var a=i(12651);s.exports=function mapCacheHas(s){return a(this,s).has(s)}},72949(s,o,i){var a=i(12651);s.exports=function mapCacheSet(s,o){var i=a(this,s),u=i.size;return i.set(s,o),this.size+=i.size==u?0:1,this}},20317(s){s.exports=function mapToArray(s){var o=-1,i=Array(s.size);return s.forEach((function(s,a){i[++o]=[a,s]})),i}},67197(s){s.exports=function matchesStrictComparable(s,o){return function(i){return null!=i&&(i[s]===o&&(void 0!==o||s in Object(i)))}}},62224(s,o,i){var a=i(50104);s.exports=function memoizeCapped(s){var o=a(s,(function(s){return 500===i.size&&i.clear(),s})),i=o.cache;return o}},3209(s,o,i){var a=i(91596),u=i(53320),_=i(36306),w="__lodash_placeholder__",x=128,C=Math.min;s.exports=function mergeData(s,o){var i=s[1],j=o[1],L=i|j,B=L<131,$=j==x&&8==i||j==x&&256==i&&s[7].length<=o[8]||384==j&&o[7].length<=o[8]&&8==i;if(!B&&!$)return s;1&j&&(s[2]=o[2],L|=1&i?0:4);var U=o[3];if(U){var V=s[3];s[3]=V?a(V,U,o[4]):U,s[4]=V?_(s[3],w):o[4]}return(U=o[5])&&(V=s[5],s[5]=V?u(V,U,o[6]):U,s[6]=V?_(s[5],w):o[6]),(U=o[7])&&(s[7]=U),j&x&&(s[8]=null==s[8]?o[8]:C(s[8],o[8])),null==s[9]&&(s[9]=o[9]),s[0]=o[0],s[1]=L,s}},48152(s,o,i){var a=i(28303),u=a&&new a;s.exports=u},81042(s,o,i){var a=i(56110)(Object,"create");s.exports=a},3650(s,o,i){var a=i(74335)(Object.keys,Object);s.exports=a},90181(s){s.exports=function nativeKeysIn(s){var o=[];if(null!=s)for(var i in Object(s))o.push(i);return o}},86009(s,o,i){s=i.nmd(s);var a=i(34840),u=o&&!o.nodeType&&o,_=u&&s&&!s.nodeType&&s,w=_&&_.exports===u&&a.process,x=function(){try{var s=_&&_.require&&_.require("util").types;return s||w&&w.binding&&w.binding("util")}catch(s){}}();s.exports=x},59350(s){var o=Object.prototype.toString;s.exports=function objectToString(s){return o.call(s)}},74335(s){s.exports=function overArg(s,o){return function(i){return s(o(i))}}},56757(s,o,i){var a=i(91033),u=Math.max;s.exports=function overRest(s,o,i){return o=u(void 0===o?s.length-1:o,0),function(){for(var _=arguments,w=-1,x=u(_.length-o,0),C=Array(x);++w0){if(++i>=800)return arguments[0]}else i=0;return s.apply(void 0,arguments)}}},51420(s,o,i){var a=i(80079);s.exports=function stackClear(){this.__data__=new a,this.size=0}},90938(s){s.exports=function stackDelete(s){var o=this.__data__,i=o.delete(s);return this.size=o.size,i}},63605(s){s.exports=function stackGet(s){return this.__data__.get(s)}},29817(s){s.exports=function stackHas(s){return this.__data__.has(s)}},80945(s,o,i){var a=i(80079),u=i(68223),_=i(53661);s.exports=function stackSet(s,o){var i=this.__data__;if(i instanceof a){var w=i.__data__;if(!u||w.length<199)return w.push([s,o]),this.size=++i.size,this;i=this.__data__=new _(w)}return i.set(s,o),this.size=i.size,this}},76959(s){s.exports=function strictIndexOf(s,o,i){for(var a=i-1,u=s.length;++a=o||i<0||Y&&s-V>=L}function timerExpired(){var s=u();if(shouldInvoke(s))return trailingEdge(s);$=setTimeout(timerExpired,function remainingWait(s){var i=o-(s-U);return Y?x(i,L-(s-V)):i}(s))}function trailingEdge(s){return $=void 0,Z&&C?invokeFunc(s):(C=j=void 0,B)}function debounced(){var s=u(),i=shouldInvoke(s);if(C=arguments,j=this,U=s,i){if(void 0===$)return function leadingEdge(s){return V=s,$=setTimeout(timerExpired,o),z?invokeFunc(s):B}(U);if(Y)return clearTimeout($),$=setTimeout(timerExpired,o),invokeFunc(U)}return void 0===$&&($=setTimeout(timerExpired,o)),B}return o=_(o)||0,a(i)&&(z=!!i.leading,L=(Y="maxWait"in i)?w(_(i.maxWait)||0,o):L,Z="trailing"in i?!!i.trailing:Z),debounced.cancel=function cancel(){void 0!==$&&clearTimeout($),V=0,C=U=j=$=void 0},debounced.flush=function flush(){return void 0===$?B:trailingEdge(u())},debounced}},50828(s,o,i){var a=i(24647),u=i(13222),_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,w=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");s.exports=function deburr(s){return(s=u(s))&&s.replace(_,a).replace(w,"")}},75288(s){s.exports=function eq(s,o){return s===o||s!=s&&o!=o}},60680(s,o,i){var a=i(13222),u=/[\\^$.*+?()[\]{}|]/g,_=RegExp(u.source);s.exports=function escapeRegExp(s){return(s=a(s))&&_.test(s)?s.replace(u,"\\$&"):s}},7309(s,o,i){var a=i(62006)(i(24713));s.exports=a},24713(s,o,i){var a=i(2523),u=i(15389),_=i(61489),w=Math.max;s.exports=function findIndex(s,o,i){var x=null==s?0:s.length;if(!x)return-1;var C=null==i?0:_(i);return C<0&&(C=w(x+C,0)),a(s,u(o,3),C)}},35970(s,o,i){var a=i(83120);s.exports=function flatten(s){return(null==s?0:s.length)?a(s,1):[]}},73424(s,o,i){var a=i(16962),u=i(2874),_=Array.prototype.push;function baseAry(s,o){return 2==o?function(o,i){return s(o,i)}:function(o){return s(o)}}function cloneArray(s){for(var o=s?s.length:0,i=Array(o);o--;)i[o]=s[o];return i}function wrapImmutable(s,o){return function(){var i=arguments.length;if(i){for(var a=Array(i);i--;)a[i]=arguments[i];var u=a[0]=o.apply(void 0,a);return s.apply(void 0,a),u}}}s.exports=function baseConvert(s,o,i,w){var x="function"==typeof o,C=o===Object(o);if(C&&(w=i,i=o,o=void 0),null==i)throw new TypeError;w||(w={});var j=!("cap"in w)||w.cap,L=!("curry"in w)||w.curry,B=!("fixed"in w)||w.fixed,$=!("immutable"in w)||w.immutable,U=!("rearg"in w)||w.rearg,V=x?i:u,z="curry"in w&&w.curry,Y="fixed"in w&&w.fixed,Z="rearg"in w&&w.rearg,ee=x?i.runInContext():void 0,ie=x?i:{ary:s.ary,assign:s.assign,clone:s.clone,curry:s.curry,forEach:s.forEach,isArray:s.isArray,isError:s.isError,isFunction:s.isFunction,isWeakMap:s.isWeakMap,iteratee:s.iteratee,keys:s.keys,rearg:s.rearg,toInteger:s.toInteger,toPath:s.toPath},ae=ie.ary,ce=ie.assign,le=ie.clone,pe=ie.curry,de=ie.forEach,fe=ie.isArray,ye=ie.isError,be=ie.isFunction,Se=ie.isWeakMap,_e=ie.keys,we=ie.rearg,xe=ie.toInteger,Pe=ie.toPath,Te=_e(a.aryMethod),Re={castArray:function(s){return function(){var o=arguments[0];return fe(o)?s(cloneArray(o)):s.apply(void 0,arguments)}},iteratee:function(s){return function(){var o=arguments[1],i=s(arguments[0],o),a=i.length;return j&&"number"==typeof o?(o=o>2?o-2:1,a&&a<=o?i:baseAry(i,o)):i}},mixin:function(s){return function(o){var i=this;if(!be(i))return s(i,Object(o));var a=[];return de(_e(o),(function(s){be(o[s])&&a.push([s,i.prototype[s]])})),s(i,Object(o)),de(a,(function(s){var o=s[1];be(o)?i.prototype[s[0]]=o:delete i.prototype[s[0]]})),i}},nthArg:function(s){return function(o){var i=o<0?1:xe(o)+1;return pe(s(o),i)}},rearg:function(s){return function(o,i){var a=i?i.length:0;return pe(s(o,i),a)}},runInContext:function(o){return function(i){return baseConvert(s,o(i),w)}}};function castCap(s,o){if(j){var i=a.iterateeRearg[s];if(i)return function iterateeRearg(s,o){return overArg(s,(function(s){var i=o.length;return function baseArity(s,o){return 2==o?function(o,i){return s.apply(void 0,arguments)}:function(o){return s.apply(void 0,arguments)}}(we(baseAry(s,i),o),i)}))}(o,i);var u=!x&&a.iterateeAry[s];if(u)return function iterateeAry(s,o){return overArg(s,(function(s){return"function"==typeof s?baseAry(s,o):s}))}(o,u)}return o}function castFixed(s,o,i){if(B&&(Y||!a.skipFixed[s])){var u=a.methodSpread[s],w=u&&u.start;return void 0===w?ae(o,i):function flatSpread(s,o){return function(){for(var i=arguments.length,a=i-1,u=Array(i);i--;)u[i]=arguments[i];var w=u[o],x=u.slice(0,o);return w&&_.apply(x,w),o!=a&&_.apply(x,u.slice(o+1)),s.apply(this,x)}}(o,w)}return o}function castRearg(s,o,i){return U&&i>1&&(Z||!a.skipRearg[s])?we(o,a.methodRearg[s]||a.aryRearg[i]):o}function cloneByPath(s,o){for(var i=-1,a=(o=Pe(o)).length,u=a-1,_=le(Object(s)),w=_;null!=w&&++i1?pe(o,i):o}(0,u=castCap(_,u),s),!1}})),!u})),u||(u=w),u==o&&(u=z?pe(u,1):function(){return o.apply(this,arguments)}),u.convert=createConverter(_,o),u.placeholder=o.placeholder=i,u}if(!C)return wrap(o,i,V);var $e=i,qe=[];return de(Te,(function(s){de(a.aryMethod[s],(function(s){var o=$e[a.remap[s]||s];o&&qe.push([s,wrap(s,o,$e)])}))})),de(_e($e),(function(s){var o=$e[s];if("function"==typeof o){for(var i=qe.length;i--;)if(qe[i][0]==s)return;o.convert=createConverter(s,o),qe.push([s,o])}})),de(qe,(function(s){$e[s[0]]=s[1]})),$e.convert=function convertLib(s){return $e.runInContext.convert(s)(void 0)},$e.placeholder=$e,de(_e($e),(function(s){de(a.realToAlias[s]||[],(function(o){$e[o]=$e[s]}))})),$e}},16962(s,o){o.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},o.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},o.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},o.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},o.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},o.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},o.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},o.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},o.realToAlias=function(){var s=Object.prototype.hasOwnProperty,i=o.aliasToReal,a={};for(var u in i){var _=i[u];s.call(a,_)?a[_].push(u):a[_]=[u]}return a}(),o.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},o.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},o.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},47934(s,o,i){s.exports={ary:i(64626),assign:i(74733),clone:i(32629),curry:i(49747),forEach:i(83729),isArray:i(56449),isError:i(23546),isFunction:i(1882),isWeakMap:i(47886),iteratee:i(33855),keys:i(88984),rearg:i(84195),toInteger:i(61489),toPath:i(42072)}},56367(s,o,i){s.exports=i(77731)},79920(s,o,i){var a=i(73424),u=i(47934);s.exports=function convert(s,o,i){return a(u,s,o,i)}},2874(s){s.exports={}},77731(s,o,i){var a=i(79920)("set",i(63560));a.placeholder=i(2874),s.exports=a},58156(s,o,i){var a=i(47422);s.exports=function get(s,o,i){var u=null==s?void 0:a(s,o);return void 0===u?i:u}},61448(s,o,i){var a=i(20426),u=i(49326);s.exports=function has(s,o){return null!=s&&u(s,o,a)}},80631(s,o,i){var a=i(28077),u=i(49326);s.exports=function hasIn(s,o){return null!=s&&u(s,o,a)}},83488(s){s.exports=function identity(s){return s}},72428(s,o,i){var a=i(27534),u=i(40346),_=Object.prototype,w=_.hasOwnProperty,x=_.propertyIsEnumerable,C=a(function(){return arguments}())?a:function(s){return u(s)&&w.call(s,"callee")&&!x.call(s,"callee")};s.exports=C},56449(s){var o=Array.isArray;s.exports=o},64894(s,o,i){var a=i(1882),u=i(30294);s.exports=function isArrayLike(s){return null!=s&&u(s.length)&&!a(s)}},83693(s,o,i){var a=i(64894),u=i(40346);s.exports=function isArrayLikeObject(s){return u(s)&&a(s)}},53812(s,o,i){var a=i(72552),u=i(40346);s.exports=function isBoolean(s){return!0===s||!1===s||u(s)&&"[object Boolean]"==a(s)}},3656(s,o,i){s=i.nmd(s);var a=i(9325),u=i(89935),_=o&&!o.nodeType&&o,w=_&&s&&!s.nodeType&&s,x=w&&w.exports===_?a.Buffer:void 0,C=(x?x.isBuffer:void 0)||u;s.exports=C},62193(s,o,i){var a=i(88984),u=i(5861),_=i(72428),w=i(56449),x=i(64894),C=i(3656),j=i(55527),L=i(37167),B=Object.prototype.hasOwnProperty;s.exports=function isEmpty(s){if(null==s)return!0;if(x(s)&&(w(s)||"string"==typeof s||"function"==typeof s.splice||C(s)||L(s)||_(s)))return!s.length;var o=u(s);if("[object Map]"==o||"[object Set]"==o)return!s.size;if(j(s))return!a(s).length;for(var i in s)if(B.call(s,i))return!1;return!0}},2404(s,o,i){var a=i(60270);s.exports=function isEqual(s,o){return a(s,o)}},23546(s,o,i){var a=i(72552),u=i(40346),_=i(11331);s.exports=function isError(s){if(!u(s))return!1;var o=a(s);return"[object Error]"==o||"[object DOMException]"==o||"string"==typeof s.message&&"string"==typeof s.name&&!_(s)}},1882(s,o,i){var a=i(72552),u=i(23805);s.exports=function isFunction(s){if(!u(s))return!1;var o=a(s);return"[object Function]"==o||"[object GeneratorFunction]"==o||"[object AsyncFunction]"==o||"[object Proxy]"==o}},30294(s){s.exports=function isLength(s){return"number"==typeof s&&s>-1&&s%1==0&&s<=9007199254740991}},87730(s,o,i){var a=i(29172),u=i(27301),_=i(86009),w=_&&_.isMap,x=w?u(w):a;s.exports=x},5187(s){s.exports=function isNull(s){return null===s}},98023(s,o,i){var a=i(72552),u=i(40346);s.exports=function isNumber(s){return"number"==typeof s||u(s)&&"[object Number]"==a(s)}},23805(s){s.exports=function isObject(s){var o=typeof s;return null!=s&&("object"==o||"function"==o)}},40346(s){s.exports=function isObjectLike(s){return null!=s&&"object"==typeof s}},11331(s,o,i){var a=i(72552),u=i(28879),_=i(40346),w=Function.prototype,x=Object.prototype,C=w.toString,j=x.hasOwnProperty,L=C.call(Object);s.exports=function isPlainObject(s){if(!_(s)||"[object Object]"!=a(s))return!1;var o=u(s);if(null===o)return!0;var i=j.call(o,"constructor")&&o.constructor;return"function"==typeof i&&i instanceof i&&C.call(i)==L}},38440(s,o,i){var a=i(16038),u=i(27301),_=i(86009),w=_&&_.isSet,x=w?u(w):a;s.exports=x},85015(s,o,i){var a=i(72552),u=i(56449),_=i(40346);s.exports=function isString(s){return"string"==typeof s||!u(s)&&_(s)&&"[object String]"==a(s)}},44394(s,o,i){var a=i(72552),u=i(40346);s.exports=function isSymbol(s){return"symbol"==typeof s||u(s)&&"[object Symbol]"==a(s)}},37167(s,o,i){var a=i(4901),u=i(27301),_=i(86009),w=_&&_.isTypedArray,x=w?u(w):a;s.exports=x},47886(s,o,i){var a=i(5861),u=i(40346);s.exports=function isWeakMap(s){return u(s)&&"[object WeakMap]"==a(s)}},33855(s,o,i){var a=i(9999),u=i(15389);s.exports=function iteratee(s){return u("function"==typeof s?s:a(s,1))}},95950(s,o,i){var a=i(70695),u=i(88984),_=i(64894);s.exports=function keys(s){return _(s)?a(s):u(s)}},37241(s,o,i){var a=i(70695),u=i(72903),_=i(64894);s.exports=function keysIn(s){return _(s)?a(s,!0):u(s)}},68090(s){s.exports=function last(s){var o=null==s?0:s.length;return o?s[o-1]:void 0}},50104(s,o,i){var a=i(53661);function memoize(s,o){if("function"!=typeof s||null!=o&&"function"!=typeof o)throw new TypeError("Expected a function");var memoized=function(){var i=arguments,a=o?o.apply(this,i):i[0],u=memoized.cache;if(u.has(a))return u.get(a);var _=s.apply(this,i);return memoized.cache=u.set(a,_)||u,_};return memoized.cache=new(memoize.Cache||a),memoized}memoize.Cache=a,s.exports=memoize},55364(s,o,i){var a=i(85250),u=i(20999)((function(s,o,i){a(s,o,i)}));s.exports=u},6048(s){s.exports=function negate(s){if("function"!=typeof s)throw new TypeError("Expected a function");return function(){var o=arguments;switch(o.length){case 0:return!s.call(this);case 1:return!s.call(this,o[0]);case 2:return!s.call(this,o[0],o[1]);case 3:return!s.call(this,o[0],o[1],o[2])}return!s.apply(this,o)}}},63950(s){s.exports=function noop(){}},10124(s,o,i){var a=i(9325);s.exports=function(){return a.Date.now()}},90179(s,o,i){var a=i(34932),u=i(9999),_=i(19931),w=i(31769),x=i(21791),C=i(53138),j=i(38816),L=i(83349),B=j((function(s,o){var i={};if(null==s)return i;var j=!1;o=a(o,(function(o){return o=w(o,s),j||(j=o.length>1),o})),x(s,L(s),i),j&&(i=u(i,7,C));for(var B=o.length;B--;)_(i,o[B]);return i}));s.exports=B},50583(s,o,i){var a=i(47237),u=i(17255),_=i(28586),w=i(77797);s.exports=function property(s){return _(s)?a(w(s)):u(s)}},84195(s,o,i){var a=i(66977),u=i(38816),_=u((function(s,o){return a(s,256,void 0,void 0,void 0,o)}));s.exports=_},40860(s,o,i){var a=i(40882),u=i(80909),_=i(15389),w=i(85558),x=i(56449);s.exports=function reduce(s,o,i){var C=x(s)?a:w,j=arguments.length<3;return C(s,_(o,4),i,j,u)}},63560(s,o,i){var a=i(73170);s.exports=function set(s,o,i){return null==s?s:a(s,o,i)}},42426(s,o,i){var a=i(14248),u=i(15389),_=i(90916),w=i(56449),x=i(36800);s.exports=function some(s,o,i){var C=w(s)?a:_;return i&&x(s,o,i)&&(o=void 0),C(s,u(o,3))}},63345(s){s.exports=function stubArray(){return[]}},89935(s){s.exports=function stubFalse(){return!1}},17400(s,o,i){var a=i(99374),u=1/0;s.exports=function toFinite(s){return s?(s=a(s))===u||s===-1/0?17976931348623157e292*(s<0?-1:1):s==s?s:0:0===s?s:0}},61489(s,o,i){var a=i(17400);s.exports=function toInteger(s){var o=a(s),i=o%1;return o==o?i?o-i:o:0}},80218(s,o,i){var a=i(13222);s.exports=function toLower(s){return a(s).toLowerCase()}},99374(s,o,i){var a=i(54128),u=i(23805),_=i(44394),w=/^[-+]0x[0-9a-f]+$/i,x=/^0b[01]+$/i,C=/^0o[0-7]+$/i,j=parseInt;s.exports=function toNumber(s){if("number"==typeof s)return s;if(_(s))return NaN;if(u(s)){var o="function"==typeof s.valueOf?s.valueOf():s;s=u(o)?o+"":o}if("string"!=typeof s)return 0===s?s:+s;s=a(s);var i=x.test(s);return i||C.test(s)?j(s.slice(2),i?2:8):w.test(s)?NaN:+s}},42072(s,o,i){var a=i(34932),u=i(23007),_=i(56449),w=i(44394),x=i(61802),C=i(77797),j=i(13222);s.exports=function toPath(s){return _(s)?a(s,C):w(s)?[s]:u(x(j(s)))}},69884(s,o,i){var a=i(21791),u=i(37241);s.exports=function toPlainObject(s){return a(s,u(s))}},13222(s,o,i){var a=i(77556);s.exports=function toString(s){return null==s?"":a(s)}},55808(s,o,i){var a=i(12507)("toUpperCase");s.exports=a},66645(s,o,i){var a=i(1733),u=i(45434),_=i(13222),w=i(22225);s.exports=function words(s,o,i){return s=_(s),void 0===(o=i?void 0:o)?u(s)?w(s):a(s):s.match(o)||[]}},53758(s,o,i){var a=i(30980),u=i(56017),_=i(94033),w=i(56449),x=i(40346),C=i(80257),j=Object.prototype.hasOwnProperty;function lodash(s){if(x(s)&&!w(s)&&!(s instanceof a)){if(s instanceof u)return s;if(j.call(s,"__wrapped__"))return C(s)}return new u(s)}lodash.prototype=_.prototype,lodash.prototype.constructor=lodash,s.exports=lodash},47248(s,o,i){var a=i(16547),u=i(51234);s.exports=function zipObject(s,o){return u(s||[],o||[],a)}},43768(s,o,i){"use strict";var a=i(45981),u=i(85587);o.highlight=highlight,o.highlightAuto=function highlightAuto(s,o){var i,w,x,C,j=o||{},L=j.subset||a.listLanguages(),B=j.prefix,$=L.length,U=-1;null==B&&(B=_);if("string"!=typeof s)throw u("Expected `string` for value, got `%s`",s);w={relevance:0,language:null,value:[]},i={relevance:0,language:null,value:[]};for(;++U<$;)C=L[U],a.getLanguage(C)&&((x=highlight(C,s,o)).language=C,x.relevance>w.relevance&&(w=x),x.relevance>i.relevance&&(w=i,i=x));w.language&&(i.secondBest=w);return i},o.registerLanguage=function registerLanguage(s,o){a.registerLanguage(s,o)},o.listLanguages=function listLanguages(){return a.listLanguages()},o.registerAlias=function registerAlias(s,o){var i,u=s;o&&((u={})[s]=o);for(i in u)a.registerAliases(u[i],{languageName:i})},Emitter.prototype.addText=function text(s){var o,i,a=this.stack;if(""===s)return;o=a[a.length-1],(i=o.children[o.children.length-1])&&"text"===i.type?i.value+=s:o.children.push({type:"text",value:s})},Emitter.prototype.addKeyword=function addKeyword(s,o){this.openNode(o),this.addText(s),this.closeNode()},Emitter.prototype.addSublanguage=function addSublanguage(s,o){var i=this.stack,a=i[i.length-1],u=s.rootNode.children,_=o?{type:"element",tagName:"span",properties:{className:[o]},children:u}:u;a.children=a.children.concat(_)},Emitter.prototype.openNode=function open(s){var o=this.stack,i=this.options.classPrefix+s,a=o[o.length-1],u={type:"element",tagName:"span",properties:{className:[i]},children:[]};a.children.push(u),o.push(u)},Emitter.prototype.closeNode=function close(){this.stack.pop()},Emitter.prototype.closeAllNodes=noop,Emitter.prototype.finalize=noop,Emitter.prototype.toHTML=function toHtmlNoop(){return""};var _="hljs-";function highlight(s,o,i){var w,x=a.configure({}),C=(i||{}).prefix;if("string"!=typeof s)throw u("Expected `string` for name, got `%s`",s);if(!a.getLanguage(s))throw u("Unknown language: `%s` is not registered",s);if("string"!=typeof o)throw u("Expected `string` for value, got `%s`",o);if(null==C&&(C=_),a.configure({__emitter:Emitter,classPrefix:C}),w=a.highlight(o,{language:s,ignoreIllegals:!0}),a.configure(x||{}),w.errorRaised)throw w.errorRaised;return{relevance:w.relevance,language:w.language,value:w.emitter.rootNode.children}}function Emitter(s){this.options=s,this.rootNode={children:[]},this.stack=[this.rootNode]}function noop(){}},71514(s){"use strict";s.exports=Math.abs},58968(s){"use strict";s.exports=Math.floor},94459(s){"use strict";s.exports=Number.isNaN||function isNaN(s){return s!=s}},6188(s){"use strict";s.exports=Math.max},68002(s){"use strict";s.exports=Math.min},75880(s){"use strict";s.exports=Math.pow},70414(s){"use strict";s.exports=Math.round},73093(s,o,i){"use strict";var a=i(94459);s.exports=function sign(s){return a(s)||0===s?s:s<0?-1:1}},92340(s,o,i){const a=i(6048);function coerceElementMatchingCallback(s){return"string"==typeof s?o=>o.element===s:s.constructor&&s.extend?o=>o instanceof s:s}class ArraySlice{constructor(s){this.elements=s||[]}toValue(){return this.elements.map((s=>s.toValue()))}map(s,o){return this.elements.map(s,o)}flatMap(s,o){return this.map(s,o).reduce(((s,o)=>s.concat(o)),[])}compactMap(s,o){const i=[];return this.forEach((a=>{const u=s.bind(o)(a);u&&i.push(u)})),i}filter(s,o){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(s,o))}reject(s,o){return s=coerceElementMatchingCallback(s),new ArraySlice(this.elements.filter(a(s),o))}find(s,o){return s=coerceElementMatchingCallback(s),this.elements.find(s,o)}forEach(s,o){this.elements.forEach(s,o)}reduce(s,o){return this.elements.reduce(s,o)}includes(s){return this.elements.some((o=>o.equals(s)))}shift(){return this.elements.shift()}unshift(s){this.elements.unshift(this.refract(s))}push(s){return this.elements.push(this.refract(s)),this}add(s){this.push(s)}get(s){return this.elements[s]}getValue(s){const o=this.elements[s];if(o)return o.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),s.exports=ArraySlice},55973(s){class KeyValuePair{constructor(s,o){this.key=s,this.value=o}clone(){const s=new KeyValuePair;return this.key&&(s.key=this.key.clone()),this.value&&(s.value=this.value.clone()),s}}s.exports=KeyValuePair},3110(s,o,i){const a=i(5187),u=i(85015),_=i(98023),w=i(53812),x=i(23805),C=i(85105),j=i(86804);class Namespace{constructor(s){this.elementMap={},this.elementDetection=[],this.Element=j.Element,this.KeyValuePair=j.KeyValuePair,s&&s.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(s){return s.namespace&&s.namespace({base:this}),s.load&&s.load({base:this}),this}useDefault(){return this.register("null",j.NullElement).register("string",j.StringElement).register("number",j.NumberElement).register("boolean",j.BooleanElement).register("array",j.ArrayElement).register("object",j.ObjectElement).register("member",j.MemberElement).register("ref",j.RefElement).register("link",j.LinkElement),this.detect(a,j.NullElement,!1).detect(u,j.StringElement,!1).detect(_,j.NumberElement,!1).detect(w,j.BooleanElement,!1).detect(Array.isArray,j.ArrayElement,!1).detect(x,j.ObjectElement,!1),this}register(s,o){return this._elements=void 0,this.elementMap[s]=o,this}unregister(s){return this._elements=void 0,delete this.elementMap[s],this}detect(s,o,i){return void 0===i||i?this.elementDetection.unshift([s,o]):this.elementDetection.push([s,o]),this}toElement(s){if(s instanceof this.Element)return s;let o;for(let i=0;i{const o=s[0].toUpperCase()+s.substr(1);this._elements[o]=this.elementMap[s]}))),this._elements}get serialiser(){return new C(this)}}C.prototype.Namespace=Namespace,s.exports=Namespace},10866(s,o,i){const a=i(6048),u=i(92340);class ObjectSlice extends u{map(s,o){return this.elements.map((i=>s.bind(o)(i.value,i.key,i)))}filter(s,o){return new ObjectSlice(this.elements.filter((i=>s.bind(o)(i.value,i.key,i))))}reject(s,o){return this.filter(a(s.bind(o)))}forEach(s,o){return this.elements.forEach(((i,a)=>{s.bind(o)(i.value,i.key,i,a)}))}keys(){return this.map(((s,o)=>o.toValue()))}values(){return this.map((s=>s.toValue()))}}s.exports=ObjectSlice},86804(s,o,i){const a=i(10316),u=i(41067),_=i(71167),w=i(40239),x=i(12242),C=i(6233),j=i(87726),L=i(61045),B=i(86303),$=i(14540),U=i(92340),V=i(10866),z=i(55973);function refract(s){if(s instanceof a)return s;if("string"==typeof s)return new _(s);if("number"==typeof s)return new w(s);if("boolean"==typeof s)return new x(s);if(null===s)return new u;if(Array.isArray(s))return new C(s.map(refract));if("object"==typeof s){return new L(s)}return s}a.prototype.ObjectElement=L,a.prototype.RefElement=$,a.prototype.MemberElement=j,a.prototype.refract=refract,U.prototype.refract=refract,s.exports={Element:a,NullElement:u,StringElement:_,NumberElement:w,BooleanElement:x,ArrayElement:C,MemberElement:j,ObjectElement:L,LinkElement:B,RefElement:$,refract,ArraySlice:U,ObjectSlice:V,KeyValuePair:z}},86303(s,o,i){const a=i(10316);s.exports=class LinkElement extends a{constructor(s,o,i){super(s||[],o,i),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(s){this.attributes.set("relation",s)}get href(){return this.attributes.get("href")}set href(s){this.attributes.set("href",s)}}},14540(s,o,i){const a=i(10316);s.exports=class RefElement extends a{constructor(s,o,i){super(s||[],o,i),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(s){this.attributes.set("path",s)}}},34035(s,o,i){const a=i(3110),u=i(86804);o.g$=a,o.KeyValuePair=i(55973),o.G6=u.ArraySlice,o.ot=u.ObjectSlice,o.Hg=u.Element,o.Om=u.StringElement,o.kT=u.NumberElement,o.bd=u.BooleanElement,o.Os=u.NullElement,o.wE=u.ArrayElement,o.Sh=u.ObjectElement,o.Pr=u.MemberElement,o.sI=u.RefElement,o.Ft=u.LinkElement,o.e=u.refract,i(85105),i(75147)},6233(s,o,i){const a=i(6048),u=i(10316),_=i(92340);class ArrayElement extends u{constructor(s,o,i){super(s||[],o,i),this.element="array"}primitive(){return"array"}get(s){return this.content[s]}getValue(s){const o=this.get(s);if(o)return o.toValue()}getIndex(s){return this.content[s]}set(s,o){return this.content[s]=this.refract(o),this}remove(s){const o=this.content.splice(s,1);return o.length?o[0]:null}map(s,o){return this.content.map(s,o)}flatMap(s,o){return this.map(s,o).reduce(((s,o)=>s.concat(o)),[])}compactMap(s,o){const i=[];return this.forEach((a=>{const u=s.bind(o)(a);u&&i.push(u)})),i}filter(s,o){return new _(this.content.filter(s,o))}reject(s,o){return this.filter(a(s),o)}reduce(s,o){let i,a;void 0!==o?(i=0,a=this.refract(o)):(i=1,a="object"===this.primitive()?this.first.value:this.first);for(let o=i;o{s.bind(o)(i,this.refract(a))}))}shift(){return this.content.shift()}unshift(s){this.content.unshift(this.refract(s))}push(s){return this.content.push(this.refract(s)),this}add(s){this.push(s)}findElements(s,o){const i=o||{},a=!!i.recursive,u=void 0===i.results?[]:i.results;return this.forEach(((o,i,_)=>{a&&void 0!==o.findElements&&o.findElements(s,{results:u,recursive:a}),s(o,i,_)&&u.push(o)})),u}find(s){return new _(this.findElements(s,{recursive:!0}))}findByElement(s){return this.find((o=>o.element===s))}findByClass(s){return this.find((o=>o.classes.includes(s)))}getById(s){return this.find((o=>o.id.toValue()===s)).first}includes(s){return this.content.some((o=>o.equals(s)))}contains(s){return this.includes(s)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(s){return new this.constructor(this.content.concat(s.content))}"fantasy-land/concat"(s){return this.concat(s)}"fantasy-land/map"(s){return new this.constructor(this.map(s))}"fantasy-land/chain"(s){return this.map((o=>s(o)),this).reduce(((s,o)=>s.concat(o)),this.empty())}"fantasy-land/filter"(s){return new this.constructor(this.content.filter(s))}"fantasy-land/reduce"(s,o){return this.content.reduce(s,o)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),s.exports=ArrayElement},12242(s,o,i){const a=i(10316);s.exports=class BooleanElement extends a{constructor(s,o,i){super(s,o,i),this.element="boolean"}primitive(){return"boolean"}}},10316(s,o,i){const a=i(2404),u=i(55973),_=i(92340);class Element{constructor(s,o,i){o&&(this.meta=o),i&&(this.attributes=i),this.content=s}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((s=>{s.parent=this,s.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const s=new this.constructor;return s.element=this.element,this.meta.length&&(s._meta=this.meta.clone()),this.attributes.length&&(s._attributes=this.attributes.clone()),this.content?this.content.clone?s.content=this.content.clone():Array.isArray(this.content)?s.content=this.content.map((s=>s.clone())):s.content=this.content:s.content=this.content,s}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof u?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((s=>s.toValue()),this):this.content}toRef(s){if(""===this.id.toValue())throw Error("Cannot create reference to an element that does not contain an ID");const o=new this.RefElement(this.id.toValue());return s&&(o.path=s),o}findRecursive(...s){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const o=s.pop();let i=new _;const append=(s,o)=>(s.push(o),s),checkElement=(s,i)=>{i.element===o&&s.push(i);const a=i.findRecursive(o);return a&&a.reduce(append,s),i.content instanceof u&&(i.content.key&&checkElement(s,i.content.key),i.content.value&&checkElement(s,i.content.value)),s};return this.content&&(this.content.element&&checkElement(i,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,i)),s.isEmpty||(i=i.filter((o=>{let i=o.parents.map((s=>s.element));for(const o in s){const a=s[o],u=i.indexOf(a);if(-1===u)return!1;i=i.splice(0,u)}return!0}))),i}set(s){return this.content=s,this}equals(s){return a(this.toValue(),s)}getMetaProperty(s,o){if(!this.meta.hasKey(s)){if(this.isFrozen){const s=this.refract(o);return s.freeze(),s}this.meta.set(s,o)}return this.meta.get(s)}setMetaProperty(s,o){this.meta.set(s,o)}get element(){return this._storedElement||"element"}set element(s){this._storedElement=s}get content(){return this._content}set content(s){if(s instanceof Element)this._content=s;else if(s instanceof _)this.content=s.elements;else if("string"==typeof s||"number"==typeof s||"boolean"==typeof s||"null"===s||null==s)this._content=s;else if(s instanceof u)this._content=s;else if(Array.isArray(s))this._content=s.map(this.refract);else{if("object"!=typeof s)throw new Error("Cannot set content to given value");this._content=Object.keys(s).map((o=>new this.MemberElement(o,s[o])))}}get meta(){if(!this._meta){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._meta=new this.ObjectElement}return this._meta}set meta(s){s instanceof this.ObjectElement?this._meta=s:this.meta.set(s||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const s=new this.ObjectElement;return s.freeze(),s}this._attributes=new this.ObjectElement}return this._attributes}set attributes(s){s instanceof this.ObjectElement?this._attributes=s:this.attributes.set(s||{})}get id(){return this.getMetaProperty("id","")}set id(s){this.setMetaProperty("id",s)}get classes(){return this.getMetaProperty("classes",[])}set classes(s){this.setMetaProperty("classes",s)}get title(){return this.getMetaProperty("title","")}set title(s){this.setMetaProperty("title",s)}get description(){return this.getMetaProperty("description","")}set description(s){this.setMetaProperty("description",s)}get links(){return this.getMetaProperty("links",[])}set links(s){this.setMetaProperty("links",s)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:s}=this;const o=new _;for(;s;)o.push(s),s=s.parent;return o}get children(){if(Array.isArray(this.content))return new _(this.content);if(this.content instanceof u){const s=new _([this.content.key]);return this.content.value&&s.push(this.content.value),s}return this.content instanceof Element?new _([this.content]):new _}get recursiveChildren(){const s=new _;return this.children.forEach((o=>{s.push(o),o.recursiveChildren.forEach((o=>{s.push(o)}))})),s}}s.exports=Element},87726(s,o,i){const a=i(55973),u=i(10316);s.exports=class MemberElement extends u{constructor(s,o,i,u){super(new a,i,u),this.element="member",this.key=s,this.value=o}get key(){return this.content.key}set key(s){this.content.key=this.refract(s)}get value(){return this.content.value}set value(s){this.content.value=this.refract(s)}}},41067(s,o,i){const a=i(10316);s.exports=class NullElement extends a{constructor(s,o,i){super(s||null,o,i),this.element="null"}primitive(){return"null"}set(){return new Error("Cannot set the value of null")}}},40239(s,o,i){const a=i(10316);s.exports=class NumberElement extends a{constructor(s,o,i){super(s,o,i),this.element="number"}primitive(){return"number"}}},61045(s,o,i){const a=i(6048),u=i(23805),_=i(6233),w=i(87726),x=i(10866);s.exports=class ObjectElement extends _{constructor(s,o,i){super(s||[],o,i),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((s,o)=>(s[o.key.toValue()]=o.value?o.value.toValue():void 0,s)),{})}get(s){const o=this.getMember(s);if(o)return o.value}getMember(s){if(void 0!==s)return this.content.find((o=>o.key.toValue()===s))}remove(s){let o=null;return this.content=this.content.filter((i=>i.key.toValue()!==s||(o=i,!1))),o}getKey(s){const o=this.getMember(s);if(o)return o.key}set(s,o){if(u(s))return Object.keys(s).forEach((o=>{this.set(o,s[o])})),this;const i=s,a=this.getMember(i);return a?a.value=o:this.content.push(new w(i,o)),this}keys(){return this.content.map((s=>s.key.toValue()))}values(){return this.content.map((s=>s.value.toValue()))}hasKey(s){return this.content.some((o=>o.key.equals(s)))}items(){return this.content.map((s=>[s.key.toValue(),s.value.toValue()]))}map(s,o){return this.content.map((i=>s.bind(o)(i.value,i.key,i)))}compactMap(s,o){const i=[];return this.forEach(((a,u,_)=>{const w=s.bind(o)(a,u,_);w&&i.push(w)})),i}filter(s,o){return new x(this.content).filter(s,o)}reject(s,o){return this.filter(a(s),o)}forEach(s,o){return this.content.forEach((i=>s.bind(o)(i.value,i.key,i)))}}},71167(s,o,i){const a=i(10316);s.exports=class StringElement extends a{constructor(s,o,i){super(s,o,i),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},75147(s,o,i){const a=i(85105);s.exports=class JSON06Serialiser extends a{serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);let o;s._attributes&&s.attributes.get("variable")&&(o=s.attributes.get("variable"));const i={element:s.element};s._meta&&s._meta.length>0&&(i.meta=this.serialiseObject(s.meta));const a="enum"===s.element||-1!==s.attributes.keys().indexOf("enumerations");if(a){const o=this.enumSerialiseAttributes(s);o&&(i.attributes=o)}else if(s._attributes&&s._attributes.length>0){let{attributes:a}=s;a.get("metadata")&&(a=a.clone(),a.set("meta",a.get("metadata")),a.remove("metadata")),"member"===s.element&&o&&(a=a.clone(),a.remove("variable")),a.length>0&&(i.attributes=this.serialiseObject(a))}if(a)i.content=this.enumSerialiseContent(s,i);else if(this[`${s.element}SerialiseContent`])i.content=this[`${s.element}SerialiseContent`](s,i);else if(void 0!==s.content){let a;o&&s.content.key?(a=s.content.clone(),a.key.attributes.set("variable",o),a=this.serialiseContent(a)):a=this.serialiseContent(s.content),this.shouldSerialiseContent(s,a)&&(i.content=a)}else this.shouldSerialiseContent(s,s.content)&&s instanceof this.namespace.elements.Array&&(i.content=[]);return i}shouldSerialiseContent(s,o){return"parseResult"===s.element||"httpRequest"===s.element||"httpResponse"===s.element||"category"===s.element||"link"===s.element||void 0!==o&&(!Array.isArray(o)||0!==o.length)}refSerialiseContent(s,o){return delete o.attributes,{href:s.toValue(),path:s.path.toValue()}}sourceMapSerialiseContent(s){return s.toValue()}dataStructureSerialiseContent(s){return[this.serialiseContent(s.content)]}enumSerialiseAttributes(s){const o=s.attributes.clone(),i=o.remove("enumerations")||new this.namespace.elements.Array([]),a=o.get("default");let u=o.get("samples")||new this.namespace.elements.Array([]);if(a&&a.content&&(a.content.attributes&&a.content.attributes.remove("typeAttributes"),o.set("default",new this.namespace.elements.Array([a.content]))),u.forEach((s=>{s.content&&s.content.element&&s.content.attributes.remove("typeAttributes")})),s.content&&0!==i.length&&u.unshift(s.content),u=u.map((s=>s instanceof this.namespace.elements.Array?[s]:new this.namespace.elements.Array([s.content]))),u.length&&o.set("samples",u),o.length>0)return this.serialiseObject(o)}enumSerialiseContent(s){if(s._attributes){const o=s.attributes.get("enumerations");if(o&&o.length>0)return o.content.map((s=>{const o=s.clone();return o.attributes.remove("typeAttributes"),this.serialise(o)}))}if(s.content){const o=s.content.clone();return o.attributes.remove("typeAttributes"),[this.serialise(o)]}return[]}deserialise(s){if("string"==typeof s)return new this.namespace.elements.String(s);if("number"==typeof s)return new this.namespace.elements.Number(s);if("boolean"==typeof s)return new this.namespace.elements.Boolean(s);if(null===s)return new this.namespace.elements.Null;if(Array.isArray(s))return new this.namespace.elements.Array(s.map(this.deserialise,this));const o=this.namespace.getElementClass(s.element),i=new o;i.element!==s.element&&(i.element=s.element),s.meta&&this.deserialiseObject(s.meta,i.meta),s.attributes&&this.deserialiseObject(s.attributes,i.attributes);const a=this.deserialiseContent(s.content);if(void 0===a&&null!==i.content||(i.content=a),"enum"===i.element){i.content&&i.attributes.set("enumerations",i.content);let s=i.attributes.get("samples");if(i.attributes.remove("samples"),s){const a=s;s=new this.namespace.elements.Array,a.forEach((a=>{a.forEach((a=>{const u=new o(a);u.element=i.element,s.push(u)}))}));const u=s.shift();i.content=u?u.content:void 0,i.attributes.set("samples",s)}else i.content=void 0;let a=i.attributes.get("default");if(a&&a.length>0){a=a.get(0);const s=new o(a);s.element=i.element,i.attributes.set("default",s)}}else if("dataStructure"===i.element&&Array.isArray(i.content))[i.content]=i.content;else if("category"===i.element){const s=i.attributes.get("meta");s&&(i.attributes.set("metadata",s),i.attributes.remove("meta"))}else"member"===i.element&&i.key&&i.key._attributes&&i.key._attributes.getValue("variable")&&(i.attributes.set("variable",i.key.attributes.get("variable")),i.key.attributes.remove("variable"));return i}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const o={key:this.serialise(s.key)};return s.value&&(o.value=this.serialise(s.value)),o}return s&&s.map?s.map(this.serialise,this):s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const o=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(o.value=this.deserialise(s.value)),o}if(s.map)return s.map(this.deserialise,this)}return s}shouldRefract(s){return!!(s._attributes&&s.attributes.keys().length||s._meta&&s.meta.keys().length)||"enum"!==s.element&&(s.element!==s.primitive()||"member"===s.element)}convertKeyToRefract(s,o){return this.shouldRefract(o)?this.serialise(o):"enum"===o.element?this.serialiseEnum(o):"array"===o.element?o.map((o=>this.shouldRefract(o)||"default"===s?this.serialise(o):"array"===o.element||"object"===o.element||"enum"===o.element?o.children.map((s=>this.serialise(s))):o.toValue())):"object"===o.element?(o.content||[]).map(this.serialise,this):o.toValue()}serialiseEnum(s){return s.children.map((s=>this.serialise(s)))}serialiseObject(s){const o={};return s.forEach(((s,i)=>{if(s){const a=i.toValue();o[a]=this.convertKeyToRefract(a,s)}})),o}deserialiseObject(s,o){Object.keys(s).forEach((i=>{o.set(i,this.deserialise(s[i]))}))}}},85105(s){s.exports=class JSONSerialiser{constructor(s){this.namespace=s||new this.Namespace}serialise(s){if(!(s instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${s}\` is not an Element instance`);const o={element:s.element};s._meta&&s._meta.length>0&&(o.meta=this.serialiseObject(s.meta)),s._attributes&&s._attributes.length>0&&(o.attributes=this.serialiseObject(s.attributes));const i=this.serialiseContent(s.content);return void 0!==i&&(o.content=i),o}deserialise(s){if(!s.element)throw new Error("Given value is not an object containing an element name");const o=new(this.namespace.getElementClass(s.element));o.element!==s.element&&(o.element=s.element),s.meta&&this.deserialiseObject(s.meta,o.meta),s.attributes&&this.deserialiseObject(s.attributes,o.attributes);const i=this.deserialiseContent(s.content);return void 0===i&&null!==o.content||(o.content=i),o}serialiseContent(s){if(s instanceof this.namespace.elements.Element)return this.serialise(s);if(s instanceof this.namespace.KeyValuePair){const o={key:this.serialise(s.key)};return s.value&&(o.value=this.serialise(s.value)),o}if(s&&s.map){if(0===s.length)return;return s.map(this.serialise,this)}return s}deserialiseContent(s){if(s){if(s.element)return this.deserialise(s);if(s.key){const o=new this.namespace.KeyValuePair(this.deserialise(s.key));return s.value&&(o.value=this.deserialise(s.value)),o}if(s.map)return s.map(this.deserialise,this)}return s}serialiseObject(s){const o={};if(s.forEach(((s,i)=>{s&&(o[i.toValue()]=this.serialise(s))})),0!==Object.keys(o).length)return o}deserialiseObject(s,o){Object.keys(s).forEach((i=>{o.set(i,this.deserialise(s[i]))}))}}},76578(s){"use strict";s.exports=["Float16Array","Float32Array","Float64Array","Int8Array","Int16Array","Int32Array","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array"]},65606(s){var o,i,a=s.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(s){if(o===setTimeout)return setTimeout(s,0);if((o===defaultSetTimout||!o)&&setTimeout)return o=setTimeout,setTimeout(s,0);try{return o(s,0)}catch(i){try{return o.call(null,s,0)}catch(i){return o.call(this,s,0)}}}!function(){try{o="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(s){o=defaultSetTimout}try{i="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(s){i=defaultClearTimeout}}();var u,_=[],w=!1,x=-1;function cleanUpNextTick(){w&&u&&(w=!1,u.length?_=u.concat(_):x=-1,_.length&&drainQueue())}function drainQueue(){if(!w){var s=runTimeout(cleanUpNextTick);w=!0;for(var o=_.length;o;){for(u=_,_=[];++x1)for(var i=1;i_)throw new RangeError("requested too many random bytes");var i=w.allocUnsafe(s);if(s>0)if(s>u)for(var C=0;C=0||(u[i]=s[i]);return u}(s,o);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);for(a=0;a<_.length;a++)i=_[a],o.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(s,i)&&(u[i]=s[i])}return u}function _defineProperties(s,o){for(var i=0;i=0||(u[i]=s[i]);return u}(s,o);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(s);for(a=0;a<_.length;a++)i=_[a],o.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(s,i)&&(u[i]=s[i])}return u}function ownKeys(s,o){var i=Object.keys(s);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(s);o&&(a=a.filter((function(o){return Object.getOwnPropertyDescriptor(s,o).enumerable}))),i.push.apply(i,a)}return i}function _objectSpread(s){for(var o=1;o=a?i.notify(s):o.length>u.length&&i.notify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(i),"onKeyDown",(function(s){"Enter"===s.key&&i.forceNotify(s);var o=i.props.onKeyDown;o&&(s.persist(),o(s))})),_defineProperty(_assertThisInitialized(i),"onBlur",(function(s){i.forceNotify(s);var o=i.props.onBlur;o&&(s.persist(),o(s))})),_defineProperty(_assertThisInitialized(i),"createNotifier",(function(s){if(s<0)i.notify=function(){return null};else if(0===s)i.notify=i.doNotify;else{var o=(0,u.default)((function(s){i.isDebouncing=!1,i.doNotify(s)}),s);i.notify=function(s){i.isDebouncing=!0,o(s)},i.flush=function(){return o.flush()},i.cancel=function(){i.isDebouncing=!1,o.cancel()}}})),_defineProperty(_assertThisInitialized(i),"doNotify",(function(){i.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(i),"forceNotify",(function(s){var o=i.props.debounceTimeout;if(i.isDebouncing||!(o>0)){i.cancel&&i.cancel();var a=i.state.value,u=i.props.minLength;a.length>=u?i.doNotify(s):i.doNotify(_objectSpread(_objectSpread({},s),{},{target:_objectSpread(_objectSpread({},s.target),{},{value:a})}))}})),i.isDebouncing=!1,i.state={value:void 0===s.value||null===s.value?"":s.value};var a=i.props.debounceTimeout;return i.createNotifier(a),i}return function _createClass(s,o,i){return o&&_defineProperties(s.prototype,o),i&&_defineProperties(s,i),Object.defineProperty(s,"prototype",{writable:!1}),s}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(s){if(!this.isDebouncing){var o=this.props,i=o.value,a=o.debounceTimeout,u=s.debounceTimeout,_=s.value,w=this.state.value;void 0!==i&&_!==i&&w!==i&&this.setState({value:i}),a!==u&&this.createNotifier(a)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var s,o,i=this.props,u=i.element,w=(i.onChange,i.value,i.minLength,i.debounceTimeout,i.forceNotifyByEnter),x=i.forceNotifyOnBlur,C=i.onKeyDown,j=i.onBlur,L=i.inputRef,B=_objectWithoutProperties(i,_),$=this.state.value;s=w?{onKeyDown:this.onKeyDown}:C?{onKeyDown:C}:{},o=x?{onBlur:this.onBlur}:j?{onBlur:j}:{};var U=L?{ref:L}:{};return a.default.createElement(u,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},B),{},{onChange:this.onChange,value:$},s),o),U))}}]),DebounceInput}(a.default.PureComponent);o.DebounceInput=w,_defineProperty(w,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},24677(s,o,i){"use strict";var a=i(81214).DebounceInput;a.DebounceInput=a,s.exports=a},22551(s,o,i){"use strict";var a=i(96540),u=i(69982);function p(s){for(var o="https://reactjs.org/docs/error-decoder.html?invariant="+s,i=1;i